@tylertech/forge 3.3.1 → 3.3.3

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 (48) hide show
  1. package/custom-elements.json +23 -14
  2. package/dist/card/forge-card.css +1 -1
  3. package/dist/expansion-panel/forge-expansion-panel.css +0 -1
  4. package/dist/lib.js +1 -1
  5. package/dist/lib.js.map +3 -3
  6. package/dist/scaffold/forge-scaffold.css +2 -2
  7. package/dist/vscode.html-custom-data.json +1 -1
  8. package/esm/accordion/accordion-constants.d.ts +3 -0
  9. package/esm/accordion/accordion-constants.js +5 -1
  10. package/esm/accordion/accordion-core.js +5 -2
  11. package/esm/accordion/accordion.d.ts +2 -0
  12. package/esm/accordion/accordion.js +2 -0
  13. package/esm/card/card.js +1 -1
  14. package/esm/chip-field/chip-field-adapter.d.ts +2 -0
  15. package/esm/chip-field/chip-field-adapter.js +3 -0
  16. package/esm/chip-field/chip-field-core.js +4 -1
  17. package/esm/expansion-panel/expansion-panel-adapter.d.ts +5 -0
  18. package/esm/expansion-panel/expansion-panel-adapter.js +7 -0
  19. package/esm/expansion-panel/expansion-panel-constants.d.ts +2 -0
  20. package/esm/expansion-panel/expansion-panel-constants.js +2 -0
  21. package/esm/expansion-panel/expansion-panel-core.d.ts +2 -1
  22. package/esm/expansion-panel/expansion-panel-core.js +9 -3
  23. package/esm/expansion-panel/expansion-panel.d.ts +7 -1
  24. package/esm/expansion-panel/expansion-panel.js +14 -2
  25. package/esm/field/field-adapter.d.ts +1 -0
  26. package/esm/field/field-adapter.js +10 -1
  27. package/esm/field/field-constants.d.ts +1 -0
  28. package/esm/field/field-constants.js +1 -0
  29. package/esm/field/field.js +1 -1
  30. package/esm/list-dropdown/list-dropdown-adapter.d.ts +2 -2
  31. package/esm/list-dropdown/list-dropdown-adapter.js +11 -10
  32. package/esm/overlay/overlay-adapter.js +22 -2
  33. package/esm/overlay/overlay-constants.d.ts +2 -0
  34. package/esm/overlay/overlay-constants.js +3 -1
  35. package/esm/popover/popover.js +1 -1
  36. package/esm/scaffold/scaffold.js +1 -1
  37. package/esm/text-field/text-field-component-delegate.js +0 -3
  38. package/esm/toolbar/toolbar.js +1 -1
  39. package/package.json +1 -1
  40. package/sass/core/styles/tokens/card/_tokens.scss +1 -1
  41. package/sass/core/styles/tokens/scaffold/_tokens.scss +1 -1
  42. package/sass/expansion-panel/_core.scss +0 -2
  43. package/sass/expansion-panel/expansion-panel.scss +6 -0
  44. package/sass/expansion-panel/forge-expansion-panel.scss +2 -0
  45. package/sass/field/field.scss +2 -1
  46. package/sass/popover/popover.scss +22 -0
  47. package/sass/scaffold/_core.scss +1 -1
  48. package/sass/scaffold/forge-scaffold.scss +1 -1
@@ -6,7 +6,7 @@
6
6
  .forge-scaffold {
7
7
  --_scaffold-height: var(--forge-scaffold-height, 100%);
8
8
  --_scaffold-width: var(--forge-scaffold-width, 100%);
9
- --_scaffold-overflow: var(--forge-scaffold-overflow, hidden);
9
+ --_scaffold-overflow: var(--forge-scaffold-overflow, initial);
10
10
  --_scaffold-body-position: var(--forge-scaffold-body-position, relative);
11
11
  }
12
12
 
@@ -40,7 +40,7 @@
40
40
  grid-area: body;
41
41
  min-width: 0;
42
42
  min-height: 0;
43
- overflow: hidden;
43
+ overflow: var(--_scaffold-overflow);
44
44
  }
45
45
  .forge-scaffold__body > * {
46
46
  overflow: auto;
@@ -4,7 +4,7 @@
4
4
  "tags": [
5
5
  {
6
6
  "name": "forge-accordion",
7
- "description": "\n---\n",
7
+ "description": "\n---\n\n\n### **Events:**\n - **forge-accordion-toggle** - Dispatched when a child expansion panel is toggled. Includes the related expansion panel element in the event detail.",
8
8
  "attributes": [
9
9
  {
10
10
  "name": "panel-selector",
@@ -8,4 +8,7 @@ export declare const ACCORDION_CONSTANTS: {
8
8
  attributes: {
9
9
  PANEL_SELECTOR: string;
10
10
  };
11
+ events: {
12
+ TOGGLE: string;
13
+ };
11
14
  };
@@ -8,7 +8,11 @@ const elementName = `${COMPONENT_NAME_PREFIX}accordion`;
8
8
  const attributes = {
9
9
  PANEL_SELECTOR: 'panel-selector'
10
10
  };
11
+ const events = {
12
+ TOGGLE: `${elementName}-toggle`
13
+ };
11
14
  export const ACCORDION_CONSTANTS = {
12
15
  elementName,
13
- attributes
16
+ attributes,
17
+ events
14
18
  };
@@ -3,7 +3,7 @@
3
3
  * Copyright Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
- import { EXPANSION_PANEL_CONSTANTS } from '../expansion-panel/expansion-panel-constants';
6
+ import { EXPANSION_PANEL_CONSTANTS, emulateUserToggle } from '../expansion-panel/expansion-panel-constants';
7
7
  import { ACCORDION_CONSTANTS } from './accordion-constants';
8
8
  export class AccordionCore {
9
9
  constructor(_adapter) {
@@ -27,9 +27,12 @@ export class AccordionCore {
27
27
  const panels = this._adapter.getChildPanels(this._panelSelector);
28
28
  panels.forEach(panel => {
29
29
  if (evt.target !== panel && !this._adapter.isNestedPanel(panel)) {
30
- panel.open = false;
30
+ if (panel.open) {
31
+ panel[emulateUserToggle](false);
32
+ }
31
33
  }
32
34
  });
35
+ this._adapter.dispatchHostEvent(new CustomEvent(ACCORDION_CONSTANTS.events.TOGGLE, { detail: evt.target, bubbles: true, composed: true }));
33
36
  }
34
37
  get panelSelector() {
35
38
  return this._panelSelector;
@@ -16,6 +16,8 @@ declare global {
16
16
  * @tag forge-accordion
17
17
  *
18
18
  * @dependency forge-expansion-panel
19
+ *
20
+ * @fires {CustomEvent<IExpansionPanelComponent>} forge-accordion-toggle - Dispatched when a child expansion panel is toggled. Includes the related expansion panel element in the event detail.
19
21
  */
20
22
  export declare class AccordionComponent extends BaseComponent implements IAccordionComponent {
21
23
  static get observedAttributes(): string[];
@@ -14,6 +14,8 @@ import { AccordionCore } from './accordion-core';
14
14
  * @tag forge-accordion
15
15
  *
16
16
  * @dependency forge-expansion-panel
17
+ *
18
+ * @fires {CustomEvent<IExpansionPanelComponent>} forge-accordion-toggle - Dispatched when a child expansion panel is toggled. Includes the related expansion panel element in the event detail.
17
19
  */
18
20
  let AccordionComponent = class AccordionComponent extends BaseComponent {
19
21
  static get observedAttributes() {
package/esm/card/card.js CHANGED
@@ -8,7 +8,7 @@ import { customElement, attachShadowTemplate, coerceBoolean } from '@tylertech/f
8
8
  import { BaseComponent } from '../core/base/base-component';
9
9
  import { CARD_CONSTANTS } from './card-constants';
10
10
  const template = '<template><div class=\"forge-card\" part=\"root\"><slot></slot></div></template>';
11
- const styles = ':host{display:block}:host([hidden]){display:none}.forge-card{--_card-background:var(--forge-card-background, var(--forge-theme-surface, #ffffff));--_card-height:var(--forge-card-height, 100%);--_card-width:var(--forge-card-width, 100%);--_card-outline-color:var(--forge-card-outline-color, var(--forge-theme-outline, #e0e0e0));--_card-outline-width:var(--forge-card-outline-width, var(--forge-border-thin, 1px));--_card-outline-style:var(--forge-card-outline-style, solid);--_card-elevation:var(--forge-card-elevation, none);--_card-padding:var(--forge-card-padding, var(--forge-spacing-medium, 16px));--_card-shape:var(--forge-card-shape, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));--_card-overflow:var(--forge-card-overflow, hidden);--_card-raised-elevation:var(--forge-card-raised-elevation, 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12));--_card-raised-outline-width:var(--forge-card-raised-outline-width, 0)}.forge-card{background:var(--_card-background);border-color:var(--_card-outline-color);border-width:var(--_card-outline-width);border-style:var(--_card-outline-style);border-radius:var(--_card-shape);box-shadow:var(--_card-elevation);box-sizing:border-box;padding:var(--_card-padding);overflow:var(--_card-overflow);height:var(--_card-height);width:var(--_card-width);-webkit-tap-highlight-color:transparent}:host([raised]) .forge-card{--_card-elevation:var(--_card-raised-elevation);--_card-outline-width:var(--_card-raised-outline-width)}:host([no-padding]) .forge-card{--_card-padding:var(--forge-card-padding, 0)}';
11
+ const styles = ':host{display:block}:host([hidden]){display:none}.forge-card{--_card-background:var(--forge-card-background, var(--forge-theme-surface, #ffffff));--_card-height:var(--forge-card-height, 100%);--_card-width:var(--forge-card-width, 100%);--_card-outline-color:var(--forge-card-outline-color, var(--forge-theme-outline, #e0e0e0));--_card-outline-width:var(--forge-card-outline-width, var(--forge-border-thin, 1px));--_card-outline-style:var(--forge-card-outline-style, solid);--_card-elevation:var(--forge-card-elevation, none);--_card-padding:var(--forge-card-padding, var(--forge-spacing-medium, 16px));--_card-shape:var(--forge-card-shape, calc(var(--forge-shape-medium, 4px) * var(--forge-shape-factor, 1)));--_card-overflow:var(--forge-card-overflow, initial);--_card-raised-elevation:var(--forge-card-raised-elevation, 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12));--_card-raised-outline-width:var(--forge-card-raised-outline-width, 0)}.forge-card{background:var(--_card-background);border-color:var(--_card-outline-color);border-width:var(--_card-outline-width);border-style:var(--_card-outline-style);border-radius:var(--_card-shape);box-shadow:var(--_card-elevation);box-sizing:border-box;padding:var(--_card-padding);overflow:var(--_card-overflow);height:var(--_card-height);width:var(--_card-width);-webkit-tap-highlight-color:transparent}:host([raised]) .forge-card{--_card-elevation:var(--_card-raised-elevation);--_card-outline-width:var(--_card-raised-outline-width)}:host([no-padding]) .forge-card{--_card-padding:var(--forge-card-padding, 0)}';
12
12
  /**
13
13
  * @tag forge-card
14
14
  *
@@ -11,6 +11,7 @@ export interface IChipFieldAdapter extends IBaseFieldAdapter {
11
11
  readonly popoverTargetElement: HTMLElement;
12
12
  readonly hasInputValue: boolean;
13
13
  readonly inputHasFocus: boolean;
14
+ readonly inputElement: HTMLInputElement | undefined;
14
15
  initialize(): void;
15
16
  addRootListener(type: string, listener: EventListener, options?: EventListenerOptions): void;
16
17
  removeRootListener(type: string, listener: EventListener, options?: EventListenerOptions): void;
@@ -38,6 +39,7 @@ export declare class ChipFieldAdapter extends BaseFieldAdapter implements IChipF
38
39
  get hasPlaceholder(): boolean;
39
40
  get hasInputValue(): boolean;
40
41
  get inputHasFocus(): boolean;
42
+ get inputElement(): HTMLInputElement | undefined;
41
43
  get popoverTargetElement(): HTMLElement;
42
44
  constructor(component: IChipFieldComponent);
43
45
  initialize(): void;
@@ -22,6 +22,9 @@ export class ChipFieldAdapter extends BaseFieldAdapter {
22
22
  get inputHasFocus() {
23
23
  return !!this._inputElement?.matches(':focus');
24
24
  }
25
+ get inputElement() {
26
+ return this._inputElement;
27
+ }
25
28
  get popoverTargetElement() {
26
29
  if (!this._popoverTargetElement) {
27
30
  this._popoverTargetElement = getShadowElement(this._fieldElement, FIELD_CONSTANTS.selectors.POPOVER_TARGET);
@@ -56,10 +56,13 @@ export class ChipFieldCore extends BaseFieldCore {
56
56
  return;
57
57
  }
58
58
  }
59
- _onClick(_evt) {
59
+ _onClick(evt) {
60
60
  if (this._disabled) {
61
61
  return;
62
62
  }
63
+ if (evt.target === this._adapter.inputElement) {
64
+ return;
65
+ }
63
66
  this._adapter.focusInput();
64
67
  this._adapter.clickInput();
65
68
  }
@@ -10,10 +10,13 @@ export interface IExpansionPanelAdapter extends IBaseAdapter {
10
10
  addHeaderListener(type: keyof HTMLElementEventMap, listener: EventListener): void;
11
11
  tryToggleOpenIcon(value: boolean): void;
12
12
  setContentVisibility(visible: boolean): void;
13
+ animationStart(): void;
14
+ animationEnd(): void;
13
15
  }
14
16
  export declare class ExpansionPanelAdapter extends BaseAdapter<IExpansionPanelComponent> implements IExpansionPanelAdapter {
15
17
  private _headerElement;
16
18
  private _contentElement;
19
+ private _innerElement;
17
20
  private _transitionStartListener;
18
21
  private _transitionEndListener;
19
22
  private _transitionCompleteListener;
@@ -24,4 +27,6 @@ export declare class ExpansionPanelAdapter extends BaseAdapter<IExpansionPanelCo
24
27
  setContentVisibility(visible: boolean): void;
25
28
  private _onTransitionStart;
26
29
  private _onTransitionEnd;
30
+ animationStart(): void;
31
+ animationEnd(): void;
27
32
  }
@@ -13,6 +13,7 @@ export class ExpansionPanelAdapter extends BaseAdapter {
13
13
  this._transitionEndListener = this._onTransitionEnd.bind(this);
14
14
  this._headerElement = getShadowElement(this._component, EXPANSION_PANEL_CONSTANTS.selectors.HEADER);
15
15
  this._contentElement = getShadowElement(this._component, EXPANSION_PANEL_CONSTANTS.selectors.CONTENT);
16
+ this._innerElement = getShadowElement(this._component, EXPANSION_PANEL_CONSTANTS.selectors.INNER);
16
17
  }
17
18
  setAnimationCompleteListener(listener) {
18
19
  this._transitionCompleteListener = listener;
@@ -42,4 +43,10 @@ export class ExpansionPanelAdapter extends BaseAdapter {
42
43
  this._transitionCompleteListener();
43
44
  }
44
45
  }
46
+ animationStart() {
47
+ this._innerElement.style.overflow = 'hidden';
48
+ }
49
+ animationEnd() {
50
+ this._innerElement.style.removeProperty('overflow');
51
+ }
45
52
  }
@@ -22,6 +22,7 @@ export declare const EXPANSION_PANEL_CONSTANTS: {
22
22
  selectors: {
23
23
  HEADER: string;
24
24
  CONTENT: string;
25
+ INNER: string;
25
26
  IGNORE: string;
26
27
  OPEN_ICON: string;
27
28
  };
@@ -32,3 +33,4 @@ export declare const EXPANSION_PANEL_CONSTANTS: {
32
33
  };
33
34
  export type ExpansionPanelOrientation = 'horizontal' | 'vertical';
34
35
  export type ExpansionPanelAnimationType = 'default' | 'none';
36
+ export declare const emulateUserToggle: unique symbol;
@@ -21,6 +21,7 @@ const classes = {
21
21
  const selectors = {
22
22
  HEADER: '.header',
23
23
  CONTENT: '.content',
24
+ INNER: '.inner',
24
25
  IGNORE: ':is([data-forge-ignore],[forge-ignore])',
25
26
  OPEN_ICON: `:is([slot=header] ${OPEN_ICON_CONSTANTS.elementName}, ${OPEN_ICON_CONSTANTS.elementName}[slot^=header])`
26
27
  };
@@ -36,3 +37,4 @@ export const EXPANSION_PANEL_CONSTANTS = {
36
37
  selectors,
37
38
  events
38
39
  };
40
+ export const emulateUserToggle = Symbol('emulateUserToggle');
@@ -9,6 +9,7 @@ export interface IExpansionPanelCore {
9
9
  open: boolean;
10
10
  orientation: ExpansionPanelOrientation;
11
11
  animationType: ExpansionPanelAnimationType;
12
+ dispatchToggleEvent(): void;
12
13
  }
13
14
  export declare class ExpansionPanelCore implements IExpansionPanelCore {
14
15
  private _adapter;
@@ -24,7 +25,7 @@ export declare class ExpansionPanelCore implements IExpansionPanelCore {
24
25
  private _onKeydown;
25
26
  private _onAnimationComplete;
26
27
  private _togglePanel;
27
- private _dispatchToggleEvent;
28
+ dispatchToggleEvent(): void;
28
29
  private _toggle;
29
30
  get open(): boolean;
30
31
  set open(value: boolean);
@@ -28,30 +28,36 @@ export class ExpansionPanelCore {
28
28
  }
29
29
  evt.stopPropagation();
30
30
  this._toggle();
31
- this._dispatchToggleEvent();
31
+ this.dispatchToggleEvent();
32
32
  }
33
33
  _onKeydown(evt) {
34
34
  if (evt.key === ' ' || evt.key === 'Enter') {
35
35
  evt.stopPropagation();
36
36
  evt.preventDefault();
37
37
  this._toggle();
38
- this._dispatchToggleEvent();
38
+ this.dispatchToggleEvent();
39
39
  }
40
40
  }
41
41
  _onAnimationComplete() {
42
42
  if (!this._open) {
43
43
  this._adapter.setContentVisibility(false);
44
44
  }
45
+ else if (this._animationType !== 'none') {
46
+ this._adapter.animationEnd();
47
+ }
45
48
  this._adapter.dispatchHostEvent(new CustomEvent(EXPANSION_PANEL_CONSTANTS.events.ANIMATION_COMPLETE, { detail: this._open }));
46
49
  }
47
50
  _togglePanel() {
48
51
  this._adapter.toggleHostAttribute(EXPANSION_PANEL_CONSTANTS.attributes.OPEN, this._open);
49
52
  this._adapter.tryToggleOpenIcon(this._open);
50
53
  if (this._open) {
54
+ if (this._animationType !== 'none') {
55
+ this._adapter.animationStart();
56
+ }
51
57
  this._adapter.setContentVisibility(true);
52
58
  }
53
59
  }
54
- _dispatchToggleEvent() {
60
+ dispatchToggleEvent() {
55
61
  const evt = new CustomEvent(EXPANSION_PANEL_CONSTANTS.events.TOGGLE, {
56
62
  detail: this._open,
57
63
  bubbles: true,
@@ -4,7 +4,7 @@
4
4
  * License: Apache-2.0
5
5
  */
6
6
  import { BaseComponent, IBaseComponent } from '../core/base/base-component';
7
- import { ExpansionPanelAnimationType, ExpansionPanelOrientation } from './expansion-panel-constants';
7
+ import { ExpansionPanelAnimationType, ExpansionPanelOrientation, emulateUserToggle } from './expansion-panel-constants';
8
8
  export interface IExpansionPanelComponent extends IBaseComponent {
9
9
  open: boolean;
10
10
  orientation: ExpansionPanelOrientation;
@@ -63,4 +63,10 @@ export declare class ExpansionPanelComponent extends BaseComponent implements IE
63
63
  * Toggles the open state of the panel.
64
64
  */
65
65
  toggle(): void;
66
+ /**
67
+ * @internal
68
+ *
69
+ * Emulates a user toggle of the panel, by also dispatching the toggle event.
70
+ */
71
+ [emulateUserToggle](open: boolean): void;
66
72
  }
@@ -7,10 +7,10 @@ import { __decorate } from "tslib";
7
7
  import { attachShadowTemplate, coerceBoolean, customElement, coreProperty } from '@tylertech/forge-core';
8
8
  import { BaseComponent } from '../core/base/base-component';
9
9
  import { ExpansionPanelAdapter } from './expansion-panel-adapter';
10
- import { EXPANSION_PANEL_CONSTANTS } from './expansion-panel-constants';
10
+ import { EXPANSION_PANEL_CONSTANTS, emulateUserToggle } from './expansion-panel-constants';
11
11
  import { ExpansionPanelCore } from './expansion-panel-core';
12
12
  const template = '<template><div class=\"forge-expansion-panel\" part=\"root\"><div class=\"header\" part=\"header\"><slot name=\"header\"></slot></div><div class=\"content hidden\" part=\"content\"><div class=\"inner\"><slot></slot></div></div></div></template>';
13
- const styles = ':host{display:block}:host([hidden]){display:none}.forge-expansion-panel{--_expansion-panel-animation-duration:var(--forge-expansion-panel-animation-duration, var(--forge-animation-duration-medium4, 400ms));--_expansion-panel-animation-easing:var(--forge-expansion-panel-animation-easing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)))}.header{outline:0;-webkit-tap-highlight-color:transparent;cursor:pointer}.content{display:grid;grid-template-rows:0fr;transition-property:visibility,opacity,grid-template-rows;transition-duration:var(--_expansion-panel-animation-duration);transition-timing-function:var(--_expansion-panel-animation-easing);min-height:0;overflow:hidden;opacity:0}.content .inner{display:grid;grid-template-rows:1fr;overflow:hidden}.hidden{visibility:hidden}@media (prefers-reduced-motion:reduce){.content{transition:none}}:host([open]) .content{opacity:1}:host([open]:is(:not([orientation]),[orientation=vertical])) .content{grid-template-rows:1fr}:host([open][orientation=horizontal]) .content{grid-template-columns:1fr}:host([orientation=horizontal]) .forge-expansion-panel{display:grid;grid-template-columns:auto 1fr}:host([orientation=horizontal]) .content{transition-property:opacity,grid-template-columns;grid-template-rows:none;grid-template-columns:0fr}:host([animation-type=none]) .content{transition:none}';
13
+ const styles = ':host{display:block}:host([hidden]){display:none}.forge-expansion-panel{--_expansion-panel-animation-duration:var(--forge-expansion-panel-animation-duration, var(--forge-animation-duration-medium4, 400ms));--_expansion-panel-animation-easing:var(--forge-expansion-panel-animation-easing, var(--forge-animation-easing-standard, cubic-bezier(0.2, 0, 0, 1)))}.header{outline:0;-webkit-tap-highlight-color:transparent;cursor:pointer}.content{display:grid;grid-template-rows:0fr;transition-property:visibility,opacity,grid-template-rows;transition-duration:var(--_expansion-panel-animation-duration);transition-timing-function:var(--_expansion-panel-animation-easing);min-height:0;opacity:0}.content .inner{display:grid;grid-template-rows:1fr}.hidden{visibility:hidden}@media (prefers-reduced-motion:reduce){.content{transition:none}}:host(:not([open])) .inner{overflow:hidden}:host([open]) .content{opacity:1}:host([open]:is(:not([orientation]),[orientation=vertical])) .content{grid-template-rows:1fr}:host([open][orientation=horizontal]) .content{grid-template-columns:1fr}:host([orientation=horizontal]) .forge-expansion-panel{display:grid;grid-template-columns:auto 1fr}:host([orientation=horizontal]) .content{transition-property:opacity,grid-template-columns;grid-template-rows:none;grid-template-columns:0fr}:host([animation-type=none]) .content{transition:none}';
14
14
  /**
15
15
  * @tag forge-expansion-panel
16
16
  *
@@ -72,6 +72,18 @@ let ExpansionPanelComponent = class ExpansionPanelComponent extends BaseComponen
72
72
  toggle() {
73
73
  this.open = !this.open;
74
74
  }
75
+ /**
76
+ * @internal
77
+ *
78
+ * Emulates a user toggle of the panel, by also dispatching the toggle event.
79
+ */
80
+ [emulateUserToggle](open) {
81
+ if (this.open === open) {
82
+ return;
83
+ }
84
+ this.open = open;
85
+ this._core.dispatchToggleEvent();
86
+ }
75
87
  };
76
88
  __decorate([
77
89
  coreProperty()
@@ -20,6 +20,7 @@ export interface IFieldAdapter extends IBaseAdapter<IFieldComponent> {
20
20
  export declare class FieldAdapter extends BaseAdapter<IFieldComponent> implements IFieldAdapter {
21
21
  private readonly _rootElement;
22
22
  private readonly _containerElement;
23
+ private readonly _inputContainerElement;
23
24
  private readonly _labelElement;
24
25
  private readonly _popoverIconElement;
25
26
  private readonly _focusIndicatorElement;
@@ -15,6 +15,7 @@ export class FieldAdapter extends BaseAdapter {
15
15
  super(component);
16
16
  this._rootElement = getShadowElement(component, FIELD_CONSTANTS.selectors.ROOT);
17
17
  this._containerElement = getShadowElement(component, FIELD_CONSTANTS.selectors.CONTAINER);
18
+ this._inputContainerElement = getShadowElement(component, FIELD_CONSTANTS.selectors.INPUT_CONTAINER);
18
19
  this._labelElement = getShadowElement(component, FIELD_CONSTANTS.selectors.LABEL);
19
20
  this._popoverIconElement = getShadowElement(component, FIELD_CONSTANTS.selectors.POPOVER_ICON);
20
21
  this._focusIndicatorElement = getShadowElement(component, FOCUS_INDICATOR_CONSTANTS.elementName);
@@ -45,14 +46,22 @@ export class FieldAdapter extends BaseAdapter {
45
46
  * Adds or removes animation classes on the root element.
46
47
  */
47
48
  setFloatingLabel(value, skipAnimation = false) {
48
- if (skipAnimation) {
49
+ if (skipAnimation || !this._labelElement) {
49
50
  return;
50
51
  }
52
+ // Temporarily lock the input container element width to its current width before the animation starts
53
+ // to ensure that the element cannot collapse while the animation is executing. The width will be
54
+ // removed after the animation completes.
55
+ const { width: inputContainerWidth } = this._inputContainerElement.getBoundingClientRect();
56
+ if (inputContainerWidth > 0) {
57
+ this._inputContainerElement.style.setProperty('width', `${inputContainerWidth}px`);
58
+ }
51
59
  const className = value ? FIELD_CONSTANTS.classes.FLOATING_IN : FIELD_CONSTANTS.classes.FLOATING_OUT;
52
60
  const animationName = value ? FIELD_CONSTANTS.animations.FLOAT_IN_LABEL : FIELD_CONSTANTS.animations.FLOAT_OUT_LABEL;
53
61
  const animationEndListener = (evt) => {
54
62
  if (evt.animationName === animationName) {
55
63
  removeClass(className, this._rootElement);
64
+ this._inputContainerElement.style.removeProperty('width');
56
65
  this._rootElement.removeEventListener('animationend', animationEndListener);
57
66
  }
58
67
  };
@@ -59,6 +59,7 @@ export declare const FIELD_CONSTANTS: {
59
59
  selectors: {
60
60
  ROOT: string;
61
61
  CONTAINER: string;
62
+ INPUT_CONTAINER: string;
62
63
  LABEL: string;
63
64
  POPOVER_ICON: string;
64
65
  LABEL_ELEMENTS: string;
@@ -30,6 +30,7 @@ const classes = {
30
30
  const selectors = {
31
31
  ROOT: '#root',
32
32
  CONTAINER: '#container',
33
+ INPUT_CONTAINER: '#input',
33
34
  LABEL: '#label',
34
35
  POPOVER_ICON: '#popover-icon',
35
36
  LABEL_ELEMENTS: `:where(label, ${LABEL_CONSTANTS.elementName})`,