@tylertech/forge 3.6.4 → 3.8.0-dev.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 (143) hide show
  1. package/custom-elements.json +435 -350
  2. package/dist/button/forge-button.css +3 -2
  3. package/dist/dialog/forge-dialog.css +3 -0
  4. package/dist/lib.js +23 -15
  5. package/dist/lib.js.map +4 -4
  6. package/dist/list/forge-list.css +5 -1
  7. package/dist/switch/forge-switch.css +1 -1
  8. package/dist/vscode.css-custom-data.json +36 -20
  9. package/dist/vscode.html-custom-data.json +27 -48
  10. package/esm/app-bar/notification-button/app-bar-notification-button-adapter.js +4 -5
  11. package/esm/app-bar/notification-button/app-bar-notification-button.js +6 -3
  12. package/esm/app-bar/profile-button/app-bar-profile-button.js +1 -1
  13. package/esm/autocomplete/autocomplete-adapter.js +1 -1
  14. package/esm/avatar/avatar-constants.d.ts +1 -0
  15. package/esm/avatar/avatar-constants.js +1 -0
  16. package/esm/avatar/avatar.d.ts +1 -1
  17. package/esm/avatar/avatar.js +1 -1
  18. package/esm/badge/badge-component-delegate.js +1 -2
  19. package/esm/badge/badge-constants.d.ts +1 -0
  20. package/esm/badge/badge-constants.js +1 -0
  21. package/esm/badge/badge.d.ts +20 -23
  22. package/esm/badge/badge.js +57 -47
  23. package/esm/badge/index.js +3 -3
  24. package/esm/bottom-sheet/bottom-sheet-constants.d.ts +1 -1
  25. package/esm/bottom-sheet/bottom-sheet.d.ts +3 -1
  26. package/esm/button/button.js +1 -1
  27. package/esm/button-toggle/button-toggle-group/button-toggle-group-adapter.js +1 -2
  28. package/esm/button-toggle/button-toggle-group/button-toggle-group.d.ts +6 -6
  29. package/esm/button-toggle/button-toggle-group/button-toggle-group.js +6 -6
  30. package/esm/card/card-constants.d.ts +1 -0
  31. package/esm/card/card-constants.js +1 -0
  32. package/esm/card/card.d.ts +12 -13
  33. package/esm/card/card.js +25 -34
  34. package/esm/card/index.js +3 -3
  35. package/esm/checkbox/checkbox.d.ts +5 -1
  36. package/esm/chips/chip/chip-constants.d.ts +1 -1
  37. package/esm/core/delegates/base-component-delegate.d.ts +1 -1
  38. package/esm/core/mask/date-input-mask.d.ts +3 -3
  39. package/esm/core/mask/date-input-mask.js +7 -8
  40. package/esm/core/mask/intermediate-time-parser.d.ts +2 -2
  41. package/esm/core/mask/intermediate-time-parser.js +2 -3
  42. package/esm/core/mask/time-input-mask.d.ts +3 -3
  43. package/esm/core/mask/time-input-mask.js +4 -5
  44. package/esm/core/mixins/label/with-label-aware.d.ts +4 -1
  45. package/esm/core/utils/a11y-utils.d.ts +0 -8
  46. package/esm/core/utils/a11y-utils.js +5 -25
  47. package/esm/core/utils/dismissible-stack.d.ts +7 -0
  48. package/esm/core/utils/position-utils.d.ts +1 -2
  49. package/esm/core/utils/position-utils.js +7 -22
  50. package/esm/core/utils/utils.d.ts +14 -0
  51. package/esm/core/utils/utils.js +44 -1
  52. package/esm/date-picker/base/base-date-picker-constants.d.ts +2 -2
  53. package/esm/deprecated/button/deprecated-button.js +1 -1
  54. package/esm/dialog/dialog-core.js +2 -2
  55. package/esm/dialog/dialog.d.ts +2 -0
  56. package/esm/dialog/dialog.js +1 -1
  57. package/esm/expansion-panel/expansion-panel-adapter.d.ts +31 -0
  58. package/esm/expansion-panel/expansion-panel-adapter.js +60 -1
  59. package/esm/expansion-panel/expansion-panel-constants.d.ts +4 -0
  60. package/esm/expansion-panel/expansion-panel-constants.js +4 -1
  61. package/esm/expansion-panel/expansion-panel-core.d.ts +13 -1
  62. package/esm/expansion-panel/expansion-panel-core.js +63 -1
  63. package/esm/expansion-panel/expansion-panel.d.ts +9 -0
  64. package/esm/expansion-panel/expansion-panel.js +14 -0
  65. package/esm/field/base/base-field.d.ts +1 -0
  66. package/esm/field/base/base-field.js +1 -0
  67. package/esm/field/field-constants.d.ts +1 -0
  68. package/esm/field/field-constants.js +1 -0
  69. package/esm/field/field.d.ts +1 -0
  70. package/esm/field/field.js +3 -2
  71. package/esm/floating-action-button/floating-action-button-constants.d.ts +1 -1
  72. package/esm/icon/icon-constants.d.ts +1 -1
  73. package/esm/icon/icon-registry.d.ts +6 -0
  74. package/esm/icon-button/icon-button-constants.d.ts +1 -1
  75. package/esm/label/label-adapter.js +1 -1
  76. package/esm/list/list-item/list-item.js +1 -1
  77. package/esm/list-dropdown/list-dropdown-constants.d.ts +11 -0
  78. package/esm/list-dropdown/list-dropdown-utils.js +18 -0
  79. package/esm/menu/menu-constants.d.ts +0 -1
  80. package/esm/menu/menu-constants.js +1 -2
  81. package/esm/menu/menu-core.js +1 -1
  82. package/esm/menu/menu.js +2 -1
  83. package/esm/meter/meter/meter.js +2 -1
  84. package/esm/meter/meter-group/meter-group.js +2 -1
  85. package/esm/overlay/base/base-overlay-core.d.ts +3 -3
  86. package/esm/overlay/base/base-overlay.d.ts +3 -3
  87. package/esm/overlay/base/base-overlay.js +11 -1
  88. package/esm/overlay/base/overlay-aware-core.d.ts +3 -3
  89. package/esm/overlay/base/overlay-aware-core.js +2 -1
  90. package/esm/overlay/overlay-adapter.d.ts +2 -2
  91. package/esm/overlay/overlay-adapter.js +6 -14
  92. package/esm/overlay/overlay-constants.d.ts +2 -5
  93. package/esm/overlay/overlay-constants.js +2 -23
  94. package/esm/overlay/overlay-core.d.ts +3 -3
  95. package/esm/overlay/overlay-core.js +13 -3
  96. package/esm/overlay/overlay.d.ts +2 -2
  97. package/esm/overlay/overlay.js +2 -2
  98. package/esm/popover/popover-adapter.js +2 -2
  99. package/esm/popover/popover.js +1 -1
  100. package/esm/profile-card/profile-card-core.js +4 -4
  101. package/esm/radio/core/radio-group-manager.d.ts +2 -1
  102. package/esm/radio/radio/radio.d.ts +1 -0
  103. package/esm/select/core/base-select-adapter.js +2 -1
  104. package/esm/select/option/option-constants.d.ts +1 -0
  105. package/esm/select/option/option-constants.js +1 -0
  106. package/esm/select/option/option-core.d.ts +4 -1
  107. package/esm/select/option/option-core.js +8 -0
  108. package/esm/select/option/option.d.ts +5 -1
  109. package/esm/select/option/option.js +8 -1
  110. package/esm/select/select/select-core.js +1 -3
  111. package/esm/select/select/select.d.ts +1 -0
  112. package/esm/select/select/select.js +1 -0
  113. package/esm/split-button/split-button-constants.d.ts +2 -2
  114. package/esm/split-view/split-view-panel/split-view-panel.js +1 -1
  115. package/esm/stepper/stepper/stepper-constants.d.ts +15 -1
  116. package/esm/switch/switch.d.ts +6 -2
  117. package/esm/switch/switch.js +1 -1
  118. package/esm/table/table-core.js +10 -2
  119. package/esm/table/table-utils.js +8 -4
  120. package/esm/tabs/tab-bar/tab-bar-core.js +3 -0
  121. package/esm/text-field/text-field.d.ts +1 -0
  122. package/esm/text-field/text-field.js +1 -0
  123. package/esm/time-picker/time-picker-adapter.js +0 -1
  124. package/esm/time-picker/time-picker-constants.d.ts +2 -2
  125. package/esm/toast/toast-constants.d.ts +1 -1
  126. package/esm/tooltip/tooltip-constants.d.ts +1 -1
  127. package/package.json +4 -4
  128. package/sass/badge/badge.scss +10 -10
  129. package/sass/button/_core.scss +1 -0
  130. package/sass/calendar/_variables.scss +3 -2
  131. package/sass/card/card.scss +1 -1
  132. package/sass/core/styles/tokens/button/_tokens.scss +2 -2
  133. package/sass/core/styles/tokens/slider/_tokens.scss +10 -4
  134. package/sass/core/styles/tokens/switch/_tokens.scss +1 -1
  135. package/sass/dialog/dialog.scss +8 -0
  136. package/sass/dialog/forge-dialog.scss +4 -0
  137. package/sass/field/_core.scss +1 -1
  138. package/sass/field/field.scss +1 -1
  139. package/sass/linear-progress/linear-progress.scss +7 -3
  140. package/sass/list/list-item/_core.scss +9 -1
  141. package/sass/list/list-item/list-item.scss +5 -1
  142. package/sass/popover/popover.scss +0 -1
  143. package/sass/slider/_core.scss +2 -3
@@ -42,7 +42,17 @@ export class BaseOverlay extends BaseComponent {
42
42
  this.persistent = coerceBoolean(newValue);
43
43
  break;
44
44
  case OVERLAY_CONSTANTS.observedAttributes.SHIFT:
45
- this.shift = coerceBoolean(newValue);
45
+ // Handle legacy boolean attributes for shift by converting to corresponding type values
46
+ // TODO: Remove support for boolean attribute conversion in v4
47
+ if (newValue === '' || newValue?.trim() === 'true') {
48
+ this.shift = 'auto';
49
+ }
50
+ else if (newValue == null || newValue?.trim() === 'false') {
51
+ this.shift = 'never';
52
+ }
53
+ else {
54
+ this.shift = newValue;
55
+ }
46
56
  break;
47
57
  case OVERLAY_CONSTANTS.observedAttributes.FLIP:
48
58
  this.flip = newValue;
@@ -6,7 +6,7 @@
6
6
  import { IBaseOverlayCore } from './base-overlay-core';
7
7
  import { IOverlayComponent } from '../overlay';
8
8
  import { IOverlayAwareAdapter } from './overlay-aware-adapter';
9
- import { IOverlayOffset, OverlayFlipState, OverlayHideState, OverlayPlacement, OverlayPositionStrategy } from '../overlay-constants';
9
+ import { IOverlayOffset, OverlayFlipState, OverlayHideState, OverlayPlacement, OverlayPositionStrategy, OverlayShiftState } from '../overlay-constants';
10
10
  import { PositionPlacement, VirtualElement } from '../../core/utils/position-utils';
11
11
  export interface IOverlayAwareCore extends IBaseOverlayCore {
12
12
  readonly overlayElement: IOverlayComponent;
@@ -39,8 +39,8 @@ export declare abstract class OverlayAwareCore<T extends IOverlayAwareAdapter> i
39
39
  set hide(value: OverlayHideState);
40
40
  get persistent(): boolean;
41
41
  set persistent(value: boolean);
42
- get shift(): boolean;
43
- set shift(value: boolean);
42
+ get shift(): OverlayShiftState;
43
+ set shift(value: OverlayShiftState);
44
44
  get flip(): OverlayFlipState;
45
45
  set flip(value: OverlayFlipState);
46
46
  get boundary(): string | null;
@@ -4,6 +4,7 @@
4
4
  * License: Apache-2.0
5
5
  */
6
6
  import { OVERLAY_CONSTANTS } from '../overlay-constants';
7
+ import { toggleAttribute } from '@tylertech/forge-core';
7
8
  export class OverlayAwareCore {
8
9
  constructor(_adapter) {
9
10
  this._adapter = _adapter;
@@ -115,7 +116,7 @@ export class OverlayAwareCore {
115
116
  set shift(value) {
116
117
  if (this._adapter.overlayElement.shift !== value) {
117
118
  this._adapter.overlayElement.shift = value;
118
- this._adapter.toggleHostAttribute(OVERLAY_CONSTANTS.attributes.SHIFT, this._adapter.overlayElement.shift);
119
+ toggleAttribute(this._adapter.hostElement, this._adapter.overlayElement.shift !== OVERLAY_CONSTANTS.defaults.SHIFT, OVERLAY_CONSTANTS.attributes.SHIFT, String(this._adapter.overlayElement.shift));
119
120
  }
120
121
  }
121
122
  get flip() {
@@ -6,7 +6,7 @@
6
6
  import { BaseAdapter, IBaseAdapter } from '../core/base/base-adapter';
7
7
  import { PositionPlacement, VirtualElement } from '../core/utils/position-utils';
8
8
  import { IOverlayComponent } from './overlay';
9
- import { IOverlayOffset, OverlayFlipState, OverlayHideState, OverlayLightDismissReason, OverlayPositionStrategy } from './overlay-constants';
9
+ import { IOverlayOffset, OverlayFlipState, OverlayHideState, OverlayLightDismissReason, OverlayPositionStrategy, OverlayShiftState } from './overlay-constants';
10
10
  export interface IOverlayAdapter extends IBaseAdapter<IOverlayComponent> {
11
11
  show(): void;
12
12
  hide(): void;
@@ -24,7 +24,7 @@ export interface IPositionElementConfig {
24
24
  placement: PositionPlacement;
25
25
  hide: OverlayHideState;
26
26
  offset: IOverlayOffset;
27
- shift: boolean;
27
+ shift: OverlayShiftState;
28
28
  flip: OverlayFlipState;
29
29
  boundary: string | null;
30
30
  boundaryElement: HTMLElement | null;
@@ -6,10 +6,10 @@
6
6
  import { autoUpdate } from '@floating-ui/dom';
7
7
  import { getShadowElement } from '@tylertech/forge-core';
8
8
  import { BaseAdapter } from '../core/base/base-adapter';
9
- import { DEFAULT_FALLBACK_PLACEMENTS, positionElementAsync, VirtualElement } from '../core/utils/position-utils';
10
- import { locateElementById, roundByDPR } from '../core/utils/utils';
9
+ import { positionElementAsync, VirtualElement } from '../core/utils/position-utils';
10
+ import { locateElementById } from '../core/utils/utils';
11
11
  import { OverlayComponent } from './overlay';
12
- import { overlayStack, OVERLAY_CONSTANTS, OVERLAY_FALLBACK_PLACEMENT_MAP, SUPPORTS_POPOVER } from './overlay-constants';
12
+ import { OVERLAY_CONSTANTS, overlayStack, SUPPORTS_POPOVER } from './overlay-constants';
13
13
  export class OverlayAdapter extends BaseAdapter {
14
14
  constructor(component) {
15
15
  super(component);
@@ -73,14 +73,14 @@ export class OverlayAdapter extends BaseAdapter {
73
73
  strategy,
74
74
  placement,
75
75
  hide: hide !== 'never',
76
- shift,
76
+ shift: shift !== 'never',
77
77
  shiftOptions: {
78
78
  boundary: boundaryEl
79
79
  },
80
80
  flip: flip !== 'never',
81
81
  flipOptions: {
82
- fallbackStrategy: 'bestFit',
83
- fallbackPlacements: fallbackPlacements ?? OVERLAY_FALLBACK_PLACEMENT_MAP[placement] ?? DEFAULT_FALLBACK_PLACEMENTS,
82
+ boundary: boundaryEl,
83
+ fallbackPlacements,
84
84
  crossAxis: flip === 'cross' || flip === 'auto',
85
85
  mainAxis: flip === 'main' || flip === 'auto'
86
86
  },
@@ -117,14 +117,6 @@ export class OverlayAdapter extends BaseAdapter {
117
117
  // Update the clipped attributes to allow for state-based clipping adjustments by consumers
118
118
  this._component.toggleAttribute(OVERLAY_CONSTANTS.attributes.CLIPPED_X, isClippedX);
119
119
  this._component.toggleAttribute(OVERLAY_CONSTANTS.attributes.CLIPPED_Y, isClippedY);
120
- // If clipped, adjust the position by the clipping delta on each axis
121
- if (isClippedX || isClippedY) {
122
- const { x, y } = result;
123
- const { height, width } = overlayRect;
124
- const clippedDeltaX = isClippedX ? x + width - viewportWidth : 0;
125
- const clippedDeltaY = isClippedY ? y + height - viewportHeight : 0;
126
- this._rootElement.style.translate = `${roundByDPR(x - clippedDeltaX)}px ${roundByDPR(y - clippedDeltaY)}px`;
127
- }
128
120
  });
129
121
  }
130
122
  tryCleanupAutoUpdate() {
@@ -50,6 +50,7 @@ export declare const OVERLAY_CONSTANTS: {
50
50
  defaults: {
51
51
  readonly HIDE: "anchor-hidden";
52
52
  readonly FLIP: "auto";
53
+ readonly SHIFT: "auto";
53
54
  };
54
55
  };
55
56
  export declare const SUPPORTS_POPOVER: boolean;
@@ -62,6 +63,7 @@ export type OverlayPositionStrategy = 'absolute' | 'fixed';
62
63
  export type OverlayPlacement = PositionPlacement;
63
64
  export type OverlayHideState = 'anchor-hidden' | 'never';
64
65
  export type OverlayFlipState = 'auto' | 'main' | 'cross' | 'never';
66
+ export type OverlayShiftState = 'auto' | 'never' | boolean;
65
67
  export type OverlayLightDismissReason = 'click' | 'escape';
66
68
  export interface IOverlayToggleEvent extends Event {
67
69
  newState: 'closed' | 'open';
@@ -71,8 +73,3 @@ export interface OverlayLightDismissEventData {
71
73
  reason: OverlayLightDismissReason;
72
74
  }
73
75
  export declare const overlayStack: unique symbol;
74
- /**
75
- * This is a map of fallback placements for each placement. The fallback placements are used when the
76
- * original placement is not possible due to the boundary or other constraints.
77
- */
78
- export declare const OVERLAY_FALLBACK_PLACEMENT_MAP: Record<OverlayPlacement, OverlayPlacement[]>;
@@ -38,7 +38,8 @@ const events = {
38
38
  };
39
39
  const defaults = {
40
40
  HIDE: 'anchor-hidden',
41
- FLIP: 'auto'
41
+ FLIP: 'auto',
42
+ SHIFT: 'auto'
42
43
  };
43
44
  export const OVERLAY_CONSTANTS = {
44
45
  elementName,
@@ -51,25 +52,3 @@ export const OVERLAY_CONSTANTS = {
51
52
  };
52
53
  export const SUPPORTS_POPOVER = supportsPopover();
53
54
  export const overlayStack = Symbol('overlayStack');
54
- /**
55
- * This is a map of fallback placements for each placement. The fallback placements are used when the
56
- * original placement is not possible due to the boundary or other constraints.
57
- */
58
- export const OVERLAY_FALLBACK_PLACEMENT_MAP = {
59
- // Left
60
- left: ['right', 'bottom', 'top', 'top-start', 'top-end', 'left-start', 'left-end', 'right-start', 'right-end'],
61
- 'left-start': ['left-end', 'right-start', 'right-end', 'bottom', 'top'],
62
- 'left-end': ['left-start', 'right-end', 'right-start', 'bottom', 'top', 'bottom-start', 'bottom-end'],
63
- // Right
64
- right: ['left', 'bottom', 'top', 'top-start', 'top-end', 'left-start', 'left-end', 'right-start', 'right-end'],
65
- 'right-start': ['right-end', 'left-start', 'left-end', 'bottom', 'top'],
66
- 'right-end': ['right-start', 'left-end', 'left-start', 'bottom', 'top', 'bottom-start', 'bottom-end'],
67
- // Top
68
- top: ['bottom', 'left', 'right', 'bottom-start', 'left-start', 'left-end', 'right-start', 'right-end'],
69
- 'top-start': ['bottom-start', 'left', 'right', 'left-start', 'left-end', 'right-start', 'right-end'],
70
- 'top-end': ['bottom-end', 'left', 'right', 'right-start', 'right-end', 'left-start', 'left-end'],
71
- // Bottom
72
- bottom: ['top', 'left', 'right', 'top-start', 'left-start', 'left-end', 'right-start', 'right-end'],
73
- 'bottom-start': ['top-start', 'left', 'right', 'left-start', 'left-end', 'right-start', 'right-end'],
74
- 'bottom-end': ['top-end', 'left', 'right', 'right-start', 'right-end', 'left-start', 'left-end']
75
- };
@@ -6,7 +6,7 @@
6
6
  import { PositionPlacement } from '../core/utils/position-utils';
7
7
  import { IBaseOverlayCore, BaseOverlayCore } from './base/base-overlay-core';
8
8
  import { IOverlayAdapter } from './overlay-adapter';
9
- import { IOverlayOffset, OverlayPlacement, OverlayPositionStrategy, OverlayFlipState, OverlayHideState } from './overlay-constants';
9
+ import { IOverlayOffset, OverlayPlacement, OverlayPositionStrategy, OverlayFlipState, OverlayHideState, OverlayShiftState } from './overlay-constants';
10
10
  export interface IOverlayCore extends IBaseOverlayCore {
11
11
  arrowElement: HTMLElement;
12
12
  arrowElementOffset: number;
@@ -59,8 +59,8 @@ export declare class OverlayCore extends BaseOverlayCore<IOverlayAdapter> implem
59
59
  set positionStrategy(value: OverlayPositionStrategy);
60
60
  get offset(): IOverlayOffset;
61
61
  set offset(value: IOverlayOffset);
62
- get shift(): boolean;
63
- set shift(value: boolean);
62
+ get shift(): OverlayShiftState;
63
+ set shift(value: OverlayShiftState);
64
64
  get hide(): OverlayHideState;
65
65
  set hide(value: OverlayHideState);
66
66
  get persistent(): boolean;
@@ -14,7 +14,7 @@ export class OverlayCore extends BaseOverlayCore {
14
14
  this._placement = 'bottom';
15
15
  this._positionStrategy = 'fixed';
16
16
  this._offset = {};
17
- this._shift = false;
17
+ this._shift = OVERLAY_CONSTANTS.defaults.SHIFT;
18
18
  this._hide = OVERLAY_CONSTANTS.defaults.HIDE;
19
19
  this._flip = OVERLAY_CONSTANTS.defaults.FLIP;
20
20
  this._fallbackPlacements = null;
@@ -215,13 +215,23 @@ export class OverlayCore extends BaseOverlayCore {
215
215
  return this._shift;
216
216
  }
217
217
  set shift(value) {
218
- value = Boolean(value);
218
+ // Handle legacy boolean values for shift by converting them to the corresponding type value
219
+ // TODO: Remove support for boolean values in v4
220
+ if (value === true) {
221
+ value = 'auto';
222
+ }
223
+ else if (value === false) {
224
+ value = 'never';
225
+ }
226
+ else if (!['auto', 'never'].includes(value)) {
227
+ value = OVERLAY_CONSTANTS.defaults.SHIFT;
228
+ }
219
229
  if (this._shift !== value) {
220
230
  this._shift = value;
221
231
  if (this._open) {
222
232
  this.position();
223
233
  }
224
- this._adapter.toggleHostAttribute(OVERLAY_CONSTANTS.attributes.SHIFT, this._shift);
234
+ this._adapter.setHostAttribute(OVERLAY_CONSTANTS.attributes.SHIFT, this._shift);
225
235
  }
226
236
  }
227
237
  get hide() {
@@ -39,7 +39,7 @@ declare global {
39
39
  * @property {OverlayPlacement} [placement="bottom"] - The placement of the overlay relative to the anchor element.
40
40
  * @property {OverlayPositionStrategy} [positionStrategy="fixed"] - The positioning strategy to use for the overlay. Valid values are `'fixed'` and `'absolute'`.
41
41
  * @property {IOverlayPosition} offset - The offset to apply to the overlay position relative to the anchor element.
42
- * @property {boolean} [shift=false] - Whether or not the anchor element should shift along the side of the overlay when scrolling.
42
+ * @property {OverlayShiftState} [shift="auto"] - Whether or not the anchor element should shift along the side of the overlay when scrolling.
43
43
  * @property {OverlayHideState} [hide="anchor-hidden"] - Whether or not the overlay should hide itself when the anchor element is out of view.
44
44
  * @property {boolean} persistent - Whether or not the overlay handles light dismiss itself or not.
45
45
  * @property {OverlayFlipState} [flip="auto"] - Whether or not the overlay should flip to the opposite placement when not enough room.
@@ -64,7 +64,7 @@ declare global {
64
64
  * @attribute {string} [position-strategy="fixed"] - The positioning strategy to use for the overlay. Valid values are `'fixed'` and `'absolute'`.
65
65
  * @attribute {string} [hide="anchor-hidden"] - Whether or not the overlay should hide itself when the anchor element is out of view.
66
66
  * @attribute {string} persistent - Whether or not the overlay handles light dismiss itself or not.
67
- * @attribute {string} [shift=false] - Whether or not the anchor element should shift along the side of the overlay when scrolling.
67
+ * @attribute {OverlayShiftState} [shift="auto"] - Whether or not the anchor element should shift along the side of the overlay when scrolling.
68
68
  * @attribute {OverlayFlipState} [flip="auto"] - Tells the overlay not to flip to the opposite placement when not enough room.
69
69
  * @attribute {string} position-placement - The placement of the overlay around the anchor element **after** dynamic positioning. This is a read-only attribute that is only available when open.
70
70
  * @attribute {string} boundary - The id of the element to use as the boundary for the overlay.
@@ -33,7 +33,7 @@ const styles = ':host{display:contents}:host([hidden]){display:none}.forge-overl
33
33
  * @property {OverlayPlacement} [placement="bottom"] - The placement of the overlay relative to the anchor element.
34
34
  * @property {OverlayPositionStrategy} [positionStrategy="fixed"] - The positioning strategy to use for the overlay. Valid values are `'fixed'` and `'absolute'`.
35
35
  * @property {IOverlayPosition} offset - The offset to apply to the overlay position relative to the anchor element.
36
- * @property {boolean} [shift=false] - Whether or not the anchor element should shift along the side of the overlay when scrolling.
36
+ * @property {OverlayShiftState} [shift="auto"] - Whether or not the anchor element should shift along the side of the overlay when scrolling.
37
37
  * @property {OverlayHideState} [hide="anchor-hidden"] - Whether or not the overlay should hide itself when the anchor element is out of view.
38
38
  * @property {boolean} persistent - Whether or not the overlay handles light dismiss itself or not.
39
39
  * @property {OverlayFlipState} [flip="auto"] - Whether or not the overlay should flip to the opposite placement when not enough room.
@@ -58,7 +58,7 @@ const styles = ':host{display:contents}:host([hidden]){display:none}.forge-overl
58
58
  * @attribute {string} [position-strategy="fixed"] - The positioning strategy to use for the overlay. Valid values are `'fixed'` and `'absolute'`.
59
59
  * @attribute {string} [hide="anchor-hidden"] - Whether or not the overlay should hide itself when the anchor element is out of view.
60
60
  * @attribute {string} persistent - Whether or not the overlay handles light dismiss itself or not.
61
- * @attribute {string} [shift=false] - Whether or not the anchor element should shift along the side of the overlay when scrolling.
61
+ * @attribute {OverlayShiftState} [shift="auto"] - Whether or not the anchor element should shift along the side of the overlay when scrolling.
62
62
  * @attribute {OverlayFlipState} [flip="auto"] - Tells the overlay not to flip to the opposite placement when not enough room.
63
63
  * @attribute {string} position-placement - The placement of the overlay around the anchor element **after** dynamic positioning. This is a read-only attribute that is only available when open.
64
64
  * @attribute {string} boundary - The id of the element to use as the boundary for the overlay.
@@ -6,7 +6,7 @@
6
6
  import { getShadowElement } from '@tylertech/forge-core';
7
7
  import { prefersReducedMotion } from '../core/utils/feature-detection';
8
8
  import { VirtualElement } from '../core/utils/position-utils';
9
- import { frame } from '../core/utils/utils';
9
+ import { checkVisibility, frame } from '../core/utils/utils';
10
10
  import { OVERLAY_CONSTANTS } from '../overlay';
11
11
  import { OverlayAwareAdapter } from '../overlay/base/overlay-aware-adapter';
12
12
  import { POPOVER_CONSTANTS } from './popover-constants';
@@ -63,7 +63,7 @@ export class PopoverAdapter extends OverlayAwareAdapter {
63
63
  return Promise.resolve();
64
64
  }
65
65
  await frame();
66
- if (!this._surfaceElement.checkVisibility()) {
66
+ if (!checkVisibility(this._surfaceElement)) {
67
67
  this._overlayElement.open = false;
68
68
  this._updateAnchorExpandedState(false);
69
69
  return Promise.resolve();
@@ -13,7 +13,7 @@ import { OverlayAware } from '../overlay/base/overlay-aware';
13
13
  import { coerceStringToArray } from '../core/utils/utils';
14
14
  import { tryDismiss } from '../core/utils/dismissible-stack';
15
15
  const template = '<template><forge-overlay exportparts=\"root:overlay\"><div class=\"forge-popover\" part=\"surface\"><slot></slot></div></forge-overlay></template>';
16
- const styles = '@keyframes zoomin{from{transform:scale(.8)}to{transform:scale(1)}}@keyframes zoomout{from{transform:scale(1)}to{transform:scale(.8)}}@keyframes slidein{from{transform:translateX(var(--_popover-slidein-x)) translateY(var(--_popover-slidein-y))}to{transform:translateX(0) translateY(0)}}@keyframes slideout{from{transform:translateX(0) translateY(0)}to{transform:translateX(var(--_popover-slidein-x)) translateY(var(--_popover-slidein-y))}}@keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadeout{from{opacity:1}to{opacity:0}}@layer base,animation,preset,reduced-motion; @layer base{:host{display:contents;--forge-theme-surface:var(--forge-theme-surface-bright, #ffffff)}:host([hidden]){display:none}forge-overlay{--_popover-width:var(--forge-popover-width, auto);--_popover-height:var(--forge-popover-height, auto);--_popover-min-width:var(--forge-popover-min-width, none);--_popover-max-width:var(--forge-popover-max-width, none);--_popover-min-height:var(--forge-popover-min-height, none);--_popover-max-height:var(--forge-popover-max-height, none);--_popover-background:var(--forge-popover-background, var(--forge-theme-surface-bright, #ffffff));--_popover-border-radius:var(--forge-popover-border-radius, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));--_popover-box-shadow:var(--forge-popover-box-shadow, var(--forge-theme-surface-bright-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)));--_popover-border-width:var(--forge-popover-border-width, 0);--_popover-border-style:var(--forge-popover-border-style, solid);--_popover-border-color:var(--forge-popover-border-color, var(--forge-theme-outline, #e0e0e0));--_popover-overflow:var(--forge-popover-overflow, initial);--_popover-arrow-size:var(--forge-popover-arrow-size, 12px);--_popover-arrow-height:var(--forge-popover-arrow-height, var(--_popover-arrow-size));--_popover-arrow-width:var(--forge-popover-arrow-width, var(--_popover-arrow-size));--_popover-arrow-background-color:var(--forge-popover-arrow-background-color, var(--_popover-background));--_popover-arrow-top-rotation:var(--forge-popover-arrow-top-rotation, 135deg);--_popover-arrow-right-rotation:var(--forge-popover-arrow-right-rotation, 225deg);--_popover-arrow-bottom-rotation:var(--forge-popover-arrow-bottom-rotation, 315deg);--_popover-arrow-left-rotation:var(--forge-popover-arrow-left-rotation, 45deg);--_popover-arrow-border-width:var(--forge-popover-arrow-border-width, var(--forge-border-thin, 1px));--_popover-animation-enter-duration:var(--forge-popover-animation-enter-duration, var(--forge-animation-duration-short3, 150ms));--_popover-animation-enter-timing:var(--forge-popover-animation-enter-timing, var(--forge-animation-easing-decelerate, cubic-bezier(0, 0, 0, 1)));--_popover-animation-exit-duration:var(--forge-popover-animation-exit-duration, var(--forge-animation-duration-short2, 100ms));--_popover-animation-exit-timing:var(--forge-popover-animation-exit-timing, var(--forge-animation-easing-accelerate, cubic-bezier(0.3, 0, 1, 1)));--_popover-zoom-enter-duration:var(--forge-popover-zoom-enter-duration, var(--_popover-animation-enter-duration));--_popover-zoom-enter-timing:var(--forge-popover-zoom-enter-timing, var(--_popover-animation-enter-timing));--_popover-zoom-exit-duration:var(--forge-popover-zoom-exit-duration, var(--_popover-animation-exit-duration));--_popover-zoom-exit-timing:var(--forge-popover-zoom-exit-timing, var(--_popover-animation-exit-timing));--_popover-slide-enter-duration:var(--forge-popover-slide-enter-duration, var(--_popover-animation-enter-duration));--_popover-slide-enter-timing:var(--forge-popover-slide-enter-timing, var(--_popover-animation-enter-timing));--_popover-slide-exit-duration:var(--forge-popover-slide-exit-duration, var(--_popover-animation-exit-duration));--_popover-slide-exit-timing:var(--forge-popover-slide-exit-timing, var(--_popover-animation-exit-timing));--_popover-slide-offset:var(--forge-popover-slide-offset, 24px);--_popover-fade-enter-duration:var(--forge-popover-fade-enter-duration, var(--forge-animation-duration-medium2, 300ms));--_popover-fade-enter-timing:var(--forge-popover-fade-enter-timing, var(--_popover-animation-enter-timing));--_popover-fade-exit-duration:var(--forge-popover-fade-exit-duration, var(--_popover-animation-exit-duration));--_popover-fade-exit-timing:var(--forge-popover-fade-exit-timing, var(--_popover-animation-exit-timing));--_popover-position-inline-start:var(--forge-popover-position-inline-start, auto);--_popover-position-inline-end:var(--forge-popover-position-inline-end, auto);--_popover-position-block-start:var(--forge-popover-position-block-start, auto);--_popover-position-block-end:var(--forge-popover-position-block-end, auto);--_popover-preset-dropdown-max-height:var(--forge-popover-preset-dropdown-max-height, 256px);--_popover-preset-dropdown-overflow:var(--forge-popover-preset-dropdown-overflow, auto visible);--_popover-preset-dropdown-padding-block:var(--forge-popover-preset-dropdown-padding-block, var(--forge-spacing-xsmall, 8px));--_popover-preset-list-padding-block:var(--forge-popover-preset-list-padding-block, var(--forge-spacing-xsmall, 8px))}.forge-popover{--_popover-arrow-translate-x:0;--_popover-arrow-translate-y:0;--_popover-arrow-rotation:0;--_popover-slidein-x:0;--_popover-slidein-y:0;--_popover-zoomin-origin:50% 50% 0;--_popover-arrow-clip-path:polygon(calc(var(--_popover-border-width) * -1) calc(var(--_popover-border-width) * -1), calc(100% + var(--_popover-border-width)) calc(var(--_popover-border-width) * -1), calc(100% + var(--_popover-border-width)) calc(100% + var(--_popover-border-width)))}.forge-popover{position:relative;overflow:var(--_popover-overflow);box-sizing:border-box;background:var(--_popover-background);border-radius:var(--_popover-border-radius);box-shadow:var(--_popover-box-shadow);border-width:var(--_popover-border-width);border-style:var(--_popover-border-style);border-color:var(--_popover-border-color);width:var(--_popover-width);height:var(--_popover-height);min-width:var(--_popover-min-width);max-width:var(--_popover-max-width);min-height:var(--_popover-min-height);max-height:var(--_popover-max-height)}.forge-popover::-webkit-scrollbar{height:var(--forge-scrollbar-height,16px);width:var(--forge-scrollbar-width,16px)}.forge-popover::-webkit-scrollbar-track{background-color:var(--forge-scrollbar-track-container,var(--forge-theme-surface-container-low,#ebebeb))}.forge-popover::-webkit-scrollbar-track:hover{background-color:var(--forge-scrollbar-track-container-hover,var(--forge-theme-surface-container-low,#ebebeb))}.forge-popover::-webkit-scrollbar-corner{background-color:var(--forge-scrollbar-track-container,var(--forge-theme-surface-container-low,#ebebeb))}.forge-popover::-webkit-scrollbar-thumb{height:var(--forge-scrollbar-thumb-min-height,32px);width:var(--forge-scrollbar-thumb-min-width,32px);border-radius:var(--forge-scrollbar-border-radius,calc(var(--forge-shape-full,9999px) * var(--forge-shape-factor,1)));border-width:var(--forge-scrollbar-border-width,3px);border-style:solid;border-color:transparent;background-color:var(--forge-scrollbar-thumb-container,var(--forge-theme-surface-container-medium,#c2c2c2));background-clip:content-box}.forge-popover::-webkit-scrollbar-thumb:hover{background-color:var(--forge-scrollbar-thumb-container-hover,var(--forge-theme-surface-container-high,#9e9e9e))}:host([open][no-anchor]) forge-overlay{--forge-overlay-position-inline-start:var(--_popover-position-inline-start);--forge-overlay-position-inline-end:var(--_popover-position-inline-end);--forge-overlay-position-block-start:var(--_popover-position-block-start);--forge-overlay-position-block-end:var(--_popover-position-block-end)}:host([arrow]) .forge-popover{--_popover-border-width:var(--_popover-arrow-border-width)}:host([arrow]) .arrow{position:absolute;background-color:var(--_popover-arrow-background-color);height:var(--_popover-arrow-height);width:var(--_popover-arrow-width);box-shadow:var(--_popover-box-shadow);border-width:var(--_popover-border-width);border-style:var(--_popover-border-style);border-color:var(--_popover-border-color);transform:translate(var(--_popover-arrow-translate-x),var(--_popover-arrow-translate-y)) rotate(var(--_popover-arrow-rotation));clip-path:var(--_popover-arrow-clip-path)}:host([arrow]) forge-overlay[position-placement^=top] .arrow{--_popover-arrow-translate-y:var(--forge-popover-arrow-translate-y, calc(var(--_popover-border-width) * -1));--_popover-arrow-rotation:var(--forge-popover-arrow-rotation, var(--_popover-arrow-top-rotation))}:host([arrow]) forge-overlay[position-placement^=right] .arrow{--_popover-arrow-translate-x:var(--forge-popover-arrow-translate-x, var(--_popover-border-width));--_popover-arrow-rotation:var(--forge-popover-arrow-rotation, var(--_popover-arrow-right-rotation))}:host([arrow]) forge-overlay[position-placement^=bottom] .arrow{--_popover-arrow-translate-y:var(--forge-popover-arrow-translate-y, var(--_popover-border-width));--_popover-arrow-rotation:var(--forge-popover-arrow-rotation, var(--_popover-arrow-bottom-rotation))}:host([arrow]) forge-overlay[position-placement^=left] .arrow{--_popover-arrow-translate-x:var(--forge-popover-arrow-translate-x, calc(var(--_popover-border-width) * -1));--_popover-arrow-rotation:var(--forge-popover-arrow-rotation, var(--_popover-arrow-left-rotation))}}@layer preset{:host([preset=dropdown]) .forge-popover{--_popover-max-height:var(--_popover-preset-dropdown-max-height);--_popover-overflow:var(--_popover-preset-dropdown-overflow);padding-block:var(--_popover-preset-dropdown-padding-block)}:host([preset=list]) .forge-popover{padding-block:var(--_popover-preset-list-padding-block)}:host([constrain-viewport-width]) .forge-popover{--_popover-max-width:var(--forge-popover-max-width, 100vw)}}@layer animation{:host(:not([animation-type])) .forge-popover,:host([animation-type=zoom]) .forge-popover{animation-duration:var(--_popover-zoom-enter-duration);animation-timing-function:var(--_popover-zoom-enter-timing);animation-name:fadein,zoomin;transform-origin:var(--_popover-zoomin-origin)}:host(:not([animation-type])) forge-overlay[open][position-placement^=top]:not([position-placement*=\"-\"]) .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=top]:not([position-placement*=\"-\"]) .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, bottom center)}:host(:not([animation-type])) forge-overlay[open][position-placement^=top][position-placement$=-start] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=top][position-placement$=-start] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, bottom left)}:host(:not([animation-type])) forge-overlay[open][position-placement^=top][position-placement$=-end] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=top][position-placement$=-end] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, bottom right)}:host(:not([animation-type])) forge-overlay[open][position-placement^=right]:not([position-placement*=\"-\"]) .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=right]:not([position-placement*=\"-\"]) .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, left center)}:host(:not([animation-type])) forge-overlay[open][position-placement^=right][position-placement$=-start] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=right][position-placement$=-start] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, left top)}:host(:not([animation-type])) forge-overlay[open][position-placement^=right][position-placement$=-end] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=right][position-placement$=-end] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, left bottom)}:host(:not([animation-type])) forge-overlay[open][position-placement^=bottom]:not([position-placement*=\"-\"]) .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=bottom]:not([position-placement*=\"-\"]) .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, top center)}:host(:not([animation-type])) forge-overlay[open][position-placement^=bottom][position-placement$=-start] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=bottom][position-placement$=-start] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, top left)}:host(:not([animation-type])) forge-overlay[open][position-placement^=bottom][position-placement$=-end] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=bottom][position-placement$=-end] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, top right)}:host(:not([animation-type])) forge-overlay[open][position-placement^=left]:not([position-placement*=\"-\"]) .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=left]:not([position-placement*=\"-\"]) .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, right center)}:host(:not([animation-type])) forge-overlay[open][position-placement^=left][position-placement$=-start] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=left][position-placement$=-start] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, right top)}:host(:not([animation-type])) forge-overlay[open][position-placement^=left][position-placement$=-end] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=left][position-placement$=-end] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, right bottom)}:host(:not([animation-type])) forge-overlay[open] .forge-popover.exiting,:host([animation-type=zoom]) forge-overlay[open] .forge-popover.exiting{animation-duration:var(--_popover-zoom-exit-duration);animation-timing-function:var(--_popover-zoom-exit-timing);animation-name:fadeout,zoomout}:host([animation-type=slide]) .forge-popover{animation-duration:var(--_popover-slide-enter-duration);animation-timing-function:var(--_popover-slide-enter-timing);animation-name:fadein,slidein}:host([animation-type=slide]) forge-overlay[open][position-placement^=top] .forge-popover{--_popover-slidein-y:var(--forge-popover-slidein-y, var(--_popover-slide-offset))}:host([animation-type=slide]) forge-overlay[open][position-placement^=right] .forge-popover{--_popover-slidein-x:var(--forge-popover-slidein-x, calc(var(--_popover-slide-offset) * -1))}:host([animation-type=slide]) forge-overlay[open][position-placement^=bottom] .forge-popover{--_popover-slidein-y:var(--forge-popover-slidein-y, calc(var(--_popover-slide-offset) * -1))}:host([animation-type=slide]) forge-overlay[open][position-placement^=left] .forge-popover{--_popover-slidein-x:var(--forge-popover-slidein-x, var(--_popover-slide-offset))}:host([animation-type=slide]) forge-overlay[open] .forge-popover.exiting{animation-duration:var(--_popover-slide-exit-duration);animation-timing-function:var(--_popover-slide-exit-timing);animation-name:fadeout,slideout}:host([animation-type=fade]) .forge-popover{animation-duration:var(--_popover-fade-enter-duration);animation-timing-function:var(--_popover-fade-enter-timing);animation-name:fadein}:host([animation-type=fade]) .forge-popover.exiting{animation-duration:var(--_popover-fade-exit-duration);animation-timing-function:var(--_popover-fade-exit-timing);animation-name:fadeout}}forge-overlay[clipped-x] .forge-popover{width:auto;min-width:0;max-width:100vw;overflow-x:auto}forge-overlay[clipped-y] .forge-popover{height:auto;min-height:0;max-height:100vh;overflow-y:auto}@layer reduced-motion{@media (prefers-reduced-motion:reduce){.forge-popover{animation:none}.forge-popover.exiting{animation:none}}}';
16
+ const styles = '@keyframes zoomin{from{transform:scale(.8)}to{transform:scale(1)}}@keyframes zoomout{from{transform:scale(1)}to{transform:scale(.8)}}@keyframes slidein{from{transform:translateX(var(--_popover-slidein-x)) translateY(var(--_popover-slidein-y))}to{transform:translateX(0) translateY(0)}}@keyframes slideout{from{transform:translateX(0) translateY(0)}to{transform:translateX(var(--_popover-slidein-x)) translateY(var(--_popover-slidein-y))}}@keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadeout{from{opacity:1}to{opacity:0}}@layer base,animation,preset,reduced-motion; @layer base{:host{display:contents;--forge-theme-surface:var(--forge-theme-surface-bright, #ffffff)}:host([hidden]){display:none}forge-overlay{--_popover-width:var(--forge-popover-width, auto);--_popover-height:var(--forge-popover-height, auto);--_popover-min-width:var(--forge-popover-min-width, none);--_popover-max-width:var(--forge-popover-max-width, none);--_popover-min-height:var(--forge-popover-min-height, none);--_popover-max-height:var(--forge-popover-max-height, none);--_popover-background:var(--forge-popover-background, var(--forge-theme-surface-bright, #ffffff));--_popover-border-radius:var(--forge-popover-border-radius, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));--_popover-box-shadow:var(--forge-popover-box-shadow, var(--forge-theme-surface-bright-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)));--_popover-border-width:var(--forge-popover-border-width, 0);--_popover-border-style:var(--forge-popover-border-style, solid);--_popover-border-color:var(--forge-popover-border-color, var(--forge-theme-outline, #e0e0e0));--_popover-overflow:var(--forge-popover-overflow, initial);--_popover-arrow-size:var(--forge-popover-arrow-size, 12px);--_popover-arrow-height:var(--forge-popover-arrow-height, var(--_popover-arrow-size));--_popover-arrow-width:var(--forge-popover-arrow-width, var(--_popover-arrow-size));--_popover-arrow-background-color:var(--forge-popover-arrow-background-color, var(--_popover-background));--_popover-arrow-top-rotation:var(--forge-popover-arrow-top-rotation, 135deg);--_popover-arrow-right-rotation:var(--forge-popover-arrow-right-rotation, 225deg);--_popover-arrow-bottom-rotation:var(--forge-popover-arrow-bottom-rotation, 315deg);--_popover-arrow-left-rotation:var(--forge-popover-arrow-left-rotation, 45deg);--_popover-arrow-border-width:var(--forge-popover-arrow-border-width, var(--forge-border-thin, 1px));--_popover-animation-enter-duration:var(--forge-popover-animation-enter-duration, var(--forge-animation-duration-short3, 150ms));--_popover-animation-enter-timing:var(--forge-popover-animation-enter-timing, var(--forge-animation-easing-decelerate, cubic-bezier(0, 0, 0, 1)));--_popover-animation-exit-duration:var(--forge-popover-animation-exit-duration, var(--forge-animation-duration-short2, 100ms));--_popover-animation-exit-timing:var(--forge-popover-animation-exit-timing, var(--forge-animation-easing-accelerate, cubic-bezier(0.3, 0, 1, 1)));--_popover-zoom-enter-duration:var(--forge-popover-zoom-enter-duration, var(--_popover-animation-enter-duration));--_popover-zoom-enter-timing:var(--forge-popover-zoom-enter-timing, var(--_popover-animation-enter-timing));--_popover-zoom-exit-duration:var(--forge-popover-zoom-exit-duration, var(--_popover-animation-exit-duration));--_popover-zoom-exit-timing:var(--forge-popover-zoom-exit-timing, var(--_popover-animation-exit-timing));--_popover-slide-enter-duration:var(--forge-popover-slide-enter-duration, var(--_popover-animation-enter-duration));--_popover-slide-enter-timing:var(--forge-popover-slide-enter-timing, var(--_popover-animation-enter-timing));--_popover-slide-exit-duration:var(--forge-popover-slide-exit-duration, var(--_popover-animation-exit-duration));--_popover-slide-exit-timing:var(--forge-popover-slide-exit-timing, var(--_popover-animation-exit-timing));--_popover-slide-offset:var(--forge-popover-slide-offset, 24px);--_popover-fade-enter-duration:var(--forge-popover-fade-enter-duration, var(--forge-animation-duration-medium2, 300ms));--_popover-fade-enter-timing:var(--forge-popover-fade-enter-timing, var(--_popover-animation-enter-timing));--_popover-fade-exit-duration:var(--forge-popover-fade-exit-duration, var(--_popover-animation-exit-duration));--_popover-fade-exit-timing:var(--forge-popover-fade-exit-timing, var(--_popover-animation-exit-timing));--_popover-position-inline-start:var(--forge-popover-position-inline-start, auto);--_popover-position-inline-end:var(--forge-popover-position-inline-end, auto);--_popover-position-block-start:var(--forge-popover-position-block-start, auto);--_popover-position-block-end:var(--forge-popover-position-block-end, auto);--_popover-preset-dropdown-max-height:var(--forge-popover-preset-dropdown-max-height, 256px);--_popover-preset-dropdown-overflow:var(--forge-popover-preset-dropdown-overflow, auto visible);--_popover-preset-dropdown-padding-block:var(--forge-popover-preset-dropdown-padding-block, var(--forge-spacing-xsmall, 8px));--_popover-preset-list-padding-block:var(--forge-popover-preset-list-padding-block, var(--forge-spacing-xsmall, 8px))}.forge-popover{--_popover-arrow-translate-x:0;--_popover-arrow-translate-y:0;--_popover-arrow-rotation:0;--_popover-slidein-x:0;--_popover-slidein-y:0;--_popover-zoomin-origin:50% 50% 0;--_popover-arrow-clip-path:polygon(calc(var(--_popover-border-width) * -1) calc(var(--_popover-border-width) * -1), calc(100% + var(--_popover-border-width)) calc(var(--_popover-border-width) * -1), calc(100% + var(--_popover-border-width)) calc(100% + var(--_popover-border-width)))}.forge-popover{position:relative;overflow:var(--_popover-overflow);box-sizing:border-box;background:var(--_popover-background);border-radius:var(--_popover-border-radius);box-shadow:var(--_popover-box-shadow);border-width:var(--_popover-border-width);border-style:var(--_popover-border-style);border-color:var(--_popover-border-color);width:var(--_popover-width);height:var(--_popover-height);min-width:var(--_popover-min-width);max-width:var(--_popover-max-width);min-height:var(--_popover-min-height);max-height:var(--_popover-max-height)}.forge-popover::-webkit-scrollbar{height:var(--forge-scrollbar-height,16px);width:var(--forge-scrollbar-width,16px)}.forge-popover::-webkit-scrollbar-track{background-color:var(--forge-scrollbar-track-container,var(--forge-theme-surface-container-low,#ebebeb))}.forge-popover::-webkit-scrollbar-track:hover{background-color:var(--forge-scrollbar-track-container-hover,var(--forge-theme-surface-container-low,#ebebeb))}.forge-popover::-webkit-scrollbar-corner{background-color:var(--forge-scrollbar-track-container,var(--forge-theme-surface-container-low,#ebebeb))}.forge-popover::-webkit-scrollbar-thumb{height:var(--forge-scrollbar-thumb-min-height,32px);width:var(--forge-scrollbar-thumb-min-width,32px);border-radius:var(--forge-scrollbar-border-radius,calc(var(--forge-shape-full,9999px) * var(--forge-shape-factor,1)));border-width:var(--forge-scrollbar-border-width,3px);border-style:solid;border-color:transparent;background-color:var(--forge-scrollbar-thumb-container,var(--forge-theme-surface-container-medium,#c2c2c2));background-clip:content-box}.forge-popover::-webkit-scrollbar-thumb:hover{background-color:var(--forge-scrollbar-thumb-container-hover,var(--forge-theme-surface-container-high,#9e9e9e))}:host([open][no-anchor]) forge-overlay{--forge-overlay-position-inline-start:var(--_popover-position-inline-start);--forge-overlay-position-inline-end:var(--_popover-position-inline-end);--forge-overlay-position-block-start:var(--_popover-position-block-start);--forge-overlay-position-block-end:var(--_popover-position-block-end)}:host([arrow]) .forge-popover{--_popover-border-width:var(--_popover-arrow-border-width)}:host([arrow]) .arrow{position:absolute;background-color:var(--_popover-arrow-background-color);height:var(--_popover-arrow-height);width:var(--_popover-arrow-width);box-shadow:var(--_popover-box-shadow);border-width:var(--_popover-border-width);border-style:var(--_popover-border-style);border-color:var(--_popover-border-color);transform:translate(var(--_popover-arrow-translate-x),var(--_popover-arrow-translate-y)) rotate(var(--_popover-arrow-rotation));clip-path:var(--_popover-arrow-clip-path)}:host([arrow]) forge-overlay[position-placement^=top] .arrow{--_popover-arrow-translate-y:var(--forge-popover-arrow-translate-y, calc(var(--_popover-border-width) * -1));--_popover-arrow-rotation:var(--forge-popover-arrow-rotation, var(--_popover-arrow-top-rotation))}:host([arrow]) forge-overlay[position-placement^=right] .arrow{--_popover-arrow-translate-x:var(--forge-popover-arrow-translate-x, var(--_popover-border-width));--_popover-arrow-rotation:var(--forge-popover-arrow-rotation, var(--_popover-arrow-right-rotation))}:host([arrow]) forge-overlay[position-placement^=bottom] .arrow{--_popover-arrow-translate-y:var(--forge-popover-arrow-translate-y, var(--_popover-border-width));--_popover-arrow-rotation:var(--forge-popover-arrow-rotation, var(--_popover-arrow-bottom-rotation))}:host([arrow]) forge-overlay[position-placement^=left] .arrow{--_popover-arrow-translate-x:var(--forge-popover-arrow-translate-x, calc(var(--_popover-border-width) * -1));--_popover-arrow-rotation:var(--forge-popover-arrow-rotation, var(--_popover-arrow-left-rotation))}}@layer preset{:host([preset=dropdown]) .forge-popover{--_popover-max-height:var(--_popover-preset-dropdown-max-height);--_popover-overflow:var(--_popover-preset-dropdown-overflow);padding-block:var(--_popover-preset-dropdown-padding-block)}:host([preset=list]) .forge-popover{padding-block:var(--_popover-preset-list-padding-block)}:host([constrain-viewport-width]) .forge-popover{--_popover-max-width:var(--forge-popover-max-width, 100vw)}}@layer animation{:host(:not([animation-type])) .forge-popover,:host([animation-type=zoom]) .forge-popover{animation-duration:var(--_popover-zoom-enter-duration);animation-timing-function:var(--_popover-zoom-enter-timing);animation-name:fadein,zoomin;transform-origin:var(--_popover-zoomin-origin)}:host(:not([animation-type])) forge-overlay[open][position-placement^=top]:not([position-placement*=\"-\"]) .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=top]:not([position-placement*=\"-\"]) .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, bottom center)}:host(:not([animation-type])) forge-overlay[open][position-placement^=top][position-placement$=-start] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=top][position-placement$=-start] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, bottom left)}:host(:not([animation-type])) forge-overlay[open][position-placement^=top][position-placement$=-end] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=top][position-placement$=-end] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, bottom right)}:host(:not([animation-type])) forge-overlay[open][position-placement^=right]:not([position-placement*=\"-\"]) .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=right]:not([position-placement*=\"-\"]) .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, left center)}:host(:not([animation-type])) forge-overlay[open][position-placement^=right][position-placement$=-start] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=right][position-placement$=-start] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, left top)}:host(:not([animation-type])) forge-overlay[open][position-placement^=right][position-placement$=-end] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=right][position-placement$=-end] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, left bottom)}:host(:not([animation-type])) forge-overlay[open][position-placement^=bottom]:not([position-placement*=\"-\"]) .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=bottom]:not([position-placement*=\"-\"]) .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, top center)}:host(:not([animation-type])) forge-overlay[open][position-placement^=bottom][position-placement$=-start] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=bottom][position-placement$=-start] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, top left)}:host(:not([animation-type])) forge-overlay[open][position-placement^=bottom][position-placement$=-end] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=bottom][position-placement$=-end] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, top right)}:host(:not([animation-type])) forge-overlay[open][position-placement^=left]:not([position-placement*=\"-\"]) .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=left]:not([position-placement*=\"-\"]) .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, right center)}:host(:not([animation-type])) forge-overlay[open][position-placement^=left][position-placement$=-start] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=left][position-placement$=-start] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, right top)}:host(:not([animation-type])) forge-overlay[open][position-placement^=left][position-placement$=-end] .forge-popover,:host([animation-type=zoom]) forge-overlay[open][position-placement^=left][position-placement$=-end] .forge-popover{--_popover-zoomin-origin:var(--forge-popover-zoomin-origin, right bottom)}:host(:not([animation-type])) forge-overlay[open] .forge-popover.exiting,:host([animation-type=zoom]) forge-overlay[open] .forge-popover.exiting{animation-duration:var(--_popover-zoom-exit-duration);animation-timing-function:var(--_popover-zoom-exit-timing);animation-name:fadeout,zoomout}:host([animation-type=slide]) .forge-popover{animation-duration:var(--_popover-slide-enter-duration);animation-timing-function:var(--_popover-slide-enter-timing);animation-name:fadein,slidein}:host([animation-type=slide]) forge-overlay[open][position-placement^=top] .forge-popover{--_popover-slidein-y:var(--forge-popover-slidein-y, var(--_popover-slide-offset))}:host([animation-type=slide]) forge-overlay[open][position-placement^=right] .forge-popover{--_popover-slidein-x:var(--forge-popover-slidein-x, calc(var(--_popover-slide-offset) * -1))}:host([animation-type=slide]) forge-overlay[open][position-placement^=bottom] .forge-popover{--_popover-slidein-y:var(--forge-popover-slidein-y, calc(var(--_popover-slide-offset) * -1))}:host([animation-type=slide]) forge-overlay[open][position-placement^=left] .forge-popover{--_popover-slidein-x:var(--forge-popover-slidein-x, var(--_popover-slide-offset))}:host([animation-type=slide]) forge-overlay[open] .forge-popover.exiting{animation-duration:var(--_popover-slide-exit-duration);animation-timing-function:var(--_popover-slide-exit-timing);animation-name:fadeout,slideout}:host([animation-type=fade]) .forge-popover{animation-duration:var(--_popover-fade-enter-duration);animation-timing-function:var(--_popover-fade-enter-timing);animation-name:fadein}:host([animation-type=fade]) .forge-popover.exiting{animation-duration:var(--_popover-fade-exit-duration);animation-timing-function:var(--_popover-fade-exit-timing);animation-name:fadeout}}forge-overlay[clipped-x] .forge-popover{width:auto;min-width:0;max-width:100vw;overflow-x:auto}forge-overlay[clipped-y] .forge-popover{height:auto;min-height:0;overflow-y:auto}@layer reduced-motion{@media (prefers-reduced-motion:reduce){.forge-popover{animation:none}.forge-popover.exiting{animation:none}}}';
17
17
  /**
18
18
  * @tag forge-popover
19
19
  *
@@ -19,12 +19,12 @@ export class ProfileCardCore {
19
19
  this._adapter.setSignOutButtonListener(this._signOutListener);
20
20
  }
21
21
  focus(options) {
22
- if (this._showSignOutButton) {
23
- this._adapter.requestSignOutButtonFocus({ ...options, focusVisible: true });
24
- }
25
- else if (this._showProfileButton) {
22
+ if (this._showProfileButton) {
26
23
  this._adapter.requestProfileButtonFocus({ ...options, focusVisible: true });
27
24
  }
25
+ else if (this._showSignOutButton) {
26
+ this._adapter.requestSignOutButtonFocus({ ...options, focusVisible: true });
27
+ }
28
28
  }
29
29
  _setActionVisibility() {
30
30
  const showActionToolbar = this._showSignOutButton || this._showProfileButton;
@@ -4,6 +4,7 @@
4
4
  * License: Apache-2.0
5
5
  */
6
6
  import { IRadioComponent } from '../radio';
7
+ import { IRadioGroupComponent } from '../radio-group';
7
8
  /**
8
9
  * A class for coordinating the states of radio components within a radio group.
9
10
  */
@@ -47,7 +48,7 @@ export declare class RadioGroupManager {
47
48
  * @param el A radio component within the group.
48
49
  * @returns The radio group element containing the given radio component or null if there is none.
49
50
  */
50
- static getRadioGroupElement(el: IRadioComponent): HTMLElement | null;
51
+ static getRadioGroupElement(el: IRadioComponent): IRadioGroupComponent | null;
51
52
  /**
52
53
  * Sets the selected radio in a radio group.
53
54
  *
@@ -19,6 +19,7 @@ export interface IRadioComponent extends IWithFormAssociation, IWithFocusable, I
19
19
  required: boolean;
20
20
  dense: boolean;
21
21
  labelPosition: RadioLabelPosition;
22
+ [tryCheck](): boolean;
22
23
  }
23
24
  declare global {
24
25
  interface HTMLElementTagNameMap {
@@ -81,7 +81,8 @@ export class BaseSelectAdapter extends BaseAdapter {
81
81
  : o.trailingIconType,
82
82
  trailingIconComponentProps: o.trailingIconComponentProps,
83
83
  leadingBuilder: o.leadingBuilder,
84
- trailingBuilder: o.trailingBuilder
84
+ trailingBuilder: o.trailingBuilder,
85
+ tooltip: o.tooltip
85
86
  };
86
87
  });
87
88
  }
@@ -17,6 +17,7 @@ export declare const OPTION_CONSTANTS: {
17
17
  TRAILING_ICON_CLASS: string;
18
18
  TRAILING_ICON_TYPE: string;
19
19
  TRAILING_ICON: string;
20
+ TOOLTIP: string;
20
21
  VALUE: string;
21
22
  };
22
23
  events: {
@@ -17,6 +17,7 @@ const attributes = {
17
17
  TRAILING_ICON_CLASS: 'trailing-icon-class',
18
18
  TRAILING_ICON_TYPE: 'trailing-icon-type',
19
19
  TRAILING_ICON: 'trailing-icon',
20
+ TOOLTIP: 'tooltip',
20
21
  VALUE: 'value'
21
22
  };
22
23
  const events = {
@@ -4,7 +4,7 @@
4
4
  * License: Apache-2.0
5
5
  */
6
6
  import type { IIconComponent } from '../../icon/icon';
7
- import { IBaseListDropdownOption, ListDropdownIconType } from '../../list-dropdown/list-dropdown-constants';
7
+ import { IBaseListDropdownOption, ListDropdownIconType, ListDropdownTooltipConfig } from '../../list-dropdown/list-dropdown-constants';
8
8
  import { IOptionAdapter } from './option-adapter';
9
9
  export interface IOptionCore extends Required<IBaseListDropdownOption> {
10
10
  }
@@ -26,6 +26,7 @@ export declare class OptionCore implements IOptionCore {
26
26
  private _trailingIconComponentProps;
27
27
  private _leadingBuilder;
28
28
  private _trailingBuilder;
29
+ private _tooltip;
29
30
  constructor(_adapter: IOptionAdapter);
30
31
  /** Gets/sets the value of this option. */
31
32
  get value(): any;
@@ -75,4 +76,6 @@ export declare class OptionCore implements IOptionCore {
75
76
  /** Gets/sets the trailing builder of this option. */
76
77
  get trailingBuilder(): () => HTMLElement;
77
78
  set trailingBuilder(value: () => HTMLElement);
79
+ get tooltip(): ListDropdownTooltipConfig;
80
+ set tooltip(value: ListDropdownTooltipConfig);
78
81
  }
@@ -174,4 +174,12 @@ export class OptionCore {
174
174
  this._trailingBuilder = value;
175
175
  }
176
176
  }
177
+ get tooltip() {
178
+ return this._tooltip;
179
+ }
180
+ set tooltip(value) {
181
+ if (this._tooltip !== value) {
182
+ this._tooltip = value;
183
+ }
184
+ }
177
185
  }
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import { IIconComponent } from '../../icon';
7
7
  import { BaseComponent, IBaseComponent } from '../../core/base/base-component';
8
- import { IBaseListDropdownOption, ListDropdownIconType } from '../../list-dropdown/list-dropdown-constants';
8
+ import { IBaseListDropdownOption, ListDropdownIconType, ListDropdownTooltipConfig } from '../../list-dropdown/list-dropdown-constants';
9
9
  export interface IOptionComponent extends IBaseComponent, Required<IBaseListDropdownOption> {
10
10
  }
11
11
  declare global {
@@ -101,4 +101,8 @@ export declare class OptionComponent extends BaseComponent implements IOptionCom
101
101
  * Gets/sets the trailing builder of this option.
102
102
  */
103
103
  trailingBuilder: () => HTMLElement;
104
+ /**
105
+ * Gets/sets the tooltip configuration for this option.
106
+ */
107
+ tooltip: ListDropdownTooltipConfig;
104
108
  }
@@ -26,7 +26,8 @@ let OptionComponent = class OptionComponent extends BaseComponent {
26
26
  OPTION_CONSTANTS.attributes.LEADING_ICON_TYPE,
27
27
  OPTION_CONSTANTS.attributes.TRAILING_ICON,
28
28
  OPTION_CONSTANTS.attributes.TRAILING_ICON_CLASS,
29
- OPTION_CONSTANTS.attributes.TRAILING_ICON_TYPE
29
+ OPTION_CONSTANTS.attributes.TRAILING_ICON_TYPE,
30
+ OPTION_CONSTANTS.attributes.TOOLTIP
30
31
  ];
31
32
  }
32
33
  constructor() {
@@ -71,6 +72,9 @@ let OptionComponent = class OptionComponent extends BaseComponent {
71
72
  case OPTION_CONSTANTS.attributes.TRAILING_ICON_TYPE:
72
73
  this.trailingIconType = newValue;
73
74
  break;
75
+ case OPTION_CONSTANTS.attributes.TOOLTIP:
76
+ this.tooltip = newValue ? { text: newValue } : undefined;
77
+ break;
74
78
  }
75
79
  }
76
80
  };
@@ -122,6 +126,9 @@ __decorate([
122
126
  __decorate([
123
127
  coreProperty()
124
128
  ], OptionComponent.prototype, "trailingBuilder", void 0);
129
+ __decorate([
130
+ coreProperty()
131
+ ], OptionComponent.prototype, "tooltip", void 0);
125
132
  OptionComponent = __decorate([
126
133
  customElement({
127
134
  name: OPTION_CONSTANTS.elementName
@@ -119,9 +119,7 @@ export class SelectCore extends BaseSelectCore {
119
119
  // Update the state of the component based on the existence of a selected value
120
120
  const text = this._getSelectedText();
121
121
  this._adapter.setSelectedText(text);
122
- if (!this._open) {
123
- this._tryFloatLabel();
124
- }
122
+ this._tryFloatLabel();
125
123
  }
126
124
  /** Gets/sets the label text. */
127
125
  get label() {
@@ -125,6 +125,7 @@ declare const SelectComponent_base: import("../../constants").AbstractConstructo
125
125
  * @csspart support-text - The support text element.
126
126
  * @csspart support-text - The element containing the support text slot.
127
127
  * @csspart support-text-end - The element containing the support text end slot.
128
+ * @csspart outline - The element containing the forge-focus-indicator element.
128
129
  * @csspart focus-indicator - The focus indicator element.
129
130
  *
130
131
  * @slot value - The selected text to display
@@ -122,6 +122,7 @@ const styles = ':host{display:block;outline:0}:host([hidden]){display:none}forge
122
122
  * @csspart support-text - The support text element.
123
123
  * @csspart support-text - The element containing the support text slot.
124
124
  * @csspart support-text-end - The element containing the support text end slot.
125
+ * @csspart outline - The element containing the forge-focus-indicator element.
125
126
  * @csspart focus-indicator - The focus indicator element.
126
127
  *
127
128
  * @slot value - The selected text to display
@@ -3,7 +3,7 @@
3
3
  * Copyright Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
- import { ButtonVariant } from '../button';
6
+ import { ButtonTheme, ButtonVariant } from '../button';
7
7
  export declare const SPLIT_BUTTON_CONSTANTS: {
8
8
  elementName: "forge-split-button";
9
9
  attributes: {
@@ -15,7 +15,7 @@ export declare const SPLIT_BUTTON_CONSTANTS: {
15
15
  };
16
16
  defaults: {
17
17
  DEFAULT_VARIANT: SplitButtonVariant;
18
- DEFAULT_THEME: import("../constants").Theme;
18
+ DEFAULT_THEME: ButtonTheme;
19
19
  };
20
20
  };
21
21
  export type SplitButtonVariant = Extract<ButtonVariant, 'text' | 'outlined' | 'tonal' | 'filled' | 'raised'>;