@tylertech/forge 3.10.5 → 3.12.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 (257) hide show
  1. package/custom-elements.json +594 -226
  2. package/dist/app-bar/forge-app-bar.css +13 -5
  3. package/dist/button/forge-button.css +14 -6
  4. package/dist/checkbox/forge-checkbox.css +23 -17
  5. package/dist/chips/forge-chips.css +12 -4
  6. package/dist/field/forge-field.css +7 -5
  7. package/dist/floating-action-button/forge-floating-action-button.css +12 -6
  8. package/dist/forge.css +6 -1
  9. package/dist/icon-button/forge-icon-button.css +12 -4
  10. package/dist/lib.js +22 -22
  11. package/dist/lib.js.map +4 -4
  12. package/dist/list/forge-list.css +59 -3
  13. package/dist/radio/forge-radio.css +22 -12
  14. package/dist/skip-link/forge-skip-link.css +38 -32
  15. package/dist/state-layer/forge-state-layer.css +2 -0
  16. package/dist/switch/forge-switch.css +9 -5
  17. package/dist/table/forge-table.css +6 -1
  18. package/dist/vscode.html-custom-data.json +104 -79
  19. package/esm/accordion/accordion.d.ts +2 -0
  20. package/esm/accordion/accordion.js +2 -0
  21. package/esm/app-bar/app-bar/app-bar-adapter.js +2 -2
  22. package/esm/app-bar/app-bar/app-bar.d.ts +1 -1
  23. package/esm/app-bar/app-bar/app-bar.js +1 -1
  24. package/esm/app-bar/help-button/app-bar-help-button.d.ts +1 -1
  25. package/esm/app-bar/help-button/app-bar-help-button.js +1 -1
  26. package/esm/app-bar/menu-button/app-bar-menu-button.d.ts +1 -1
  27. package/esm/app-bar/menu-button/app-bar-menu-button.js +1 -1
  28. package/esm/app-bar/notification-button/app-bar-notification-button.d.ts +2 -0
  29. package/esm/app-bar/notification-button/app-bar-notification-button.js +2 -0
  30. package/esm/app-bar/profile-button/app-bar-profile-button-adapter.d.ts +2 -1
  31. package/esm/app-bar/profile-button/app-bar-profile-button-adapter.js +2 -0
  32. package/esm/app-bar/profile-button/app-bar-profile-button.d.ts +2 -0
  33. package/esm/app-bar/profile-button/app-bar-profile-button.js +2 -0
  34. package/esm/app-bar/search/app-bar-search.d.ts +2 -0
  35. package/esm/app-bar/search/app-bar-search.js +2 -0
  36. package/esm/autocomplete/autocomplete-core.js +16 -3
  37. package/esm/autocomplete/autocomplete.d.ts +2 -0
  38. package/esm/autocomplete/autocomplete.js +2 -0
  39. package/esm/avatar/avatar.d.ts +1 -1
  40. package/esm/avatar/avatar.js +1 -1
  41. package/esm/backdrop/backdrop.d.ts +2 -0
  42. package/esm/backdrop/backdrop.js +2 -0
  43. package/esm/badge/badge.d.ts +2 -0
  44. package/esm/badge/badge.js +2 -0
  45. package/esm/banner/banner.d.ts +1 -1
  46. package/esm/banner/banner.js +1 -1
  47. package/esm/button/base/base-button-adapter.js +2 -2
  48. package/esm/button/button.d.ts +1 -6
  49. package/esm/button/button.js +1 -6
  50. package/esm/button-area/button-area-adapter.js +2 -2
  51. package/esm/button-area/button-area.d.ts +1 -4
  52. package/esm/button-area/button-area.js +1 -4
  53. package/esm/button-toggle/button-toggle/button-toggle-adapter.js +2 -2
  54. package/esm/button-toggle/button-toggle/button-toggle.d.ts +2 -0
  55. package/esm/button-toggle/button-toggle/button-toggle.js +2 -0
  56. package/esm/button-toggle/button-toggle-group/button-toggle-group.d.ts +1 -1
  57. package/esm/button-toggle/button-toggle-group/button-toggle-group.js +1 -1
  58. package/esm/calendar/calendar-menu/calendar-menu.js +1 -1
  59. package/esm/calendar/calendar.d.ts +2 -0
  60. package/esm/calendar/calendar.js +3 -1
  61. package/esm/card/card.d.ts +2 -0
  62. package/esm/card/card.js +2 -0
  63. package/esm/chip-field/chip-field.d.ts +2 -0
  64. package/esm/chip-field/chip-field.js +2 -0
  65. package/esm/chips/chip/chip-adapter.d.ts +3 -0
  66. package/esm/chips/chip/chip-adapter.js +14 -4
  67. package/esm/chips/chip/chip-constants.d.ts +2 -0
  68. package/esm/chips/chip/chip-constants.js +2 -1
  69. package/esm/chips/chip/chip-core.d.ts +4 -0
  70. package/esm/chips/chip/chip-core.js +9 -0
  71. package/esm/chips/chip/chip.d.ts +6 -0
  72. package/esm/chips/chip/chip.js +10 -0
  73. package/esm/chips/chip-set/chip-set.d.ts +1 -1
  74. package/esm/chips/chip-set/chip-set.js +1 -1
  75. package/esm/circular-progress/circular-progress.d.ts +1 -2
  76. package/esm/circular-progress/circular-progress.js +1 -2
  77. package/esm/color-picker/color-picker.d.ts +2 -0
  78. package/esm/color-picker/color-picker.js +3 -1
  79. package/esm/core/utils/a11y-utils.js +17 -0
  80. package/esm/core/utils/utils.js +8 -2
  81. package/esm/date-picker/date-picker.d.ts +2 -0
  82. package/esm/date-picker/date-picker.js +2 -0
  83. package/esm/date-range-picker/date-range-picker.d.ts +2 -0
  84. package/esm/date-range-picker/date-range-picker.js +2 -0
  85. package/esm/deprecated/button/deprecated-button.js +3 -3
  86. package/esm/deprecated/icon-button/deprecated-icon-button.js +2 -2
  87. package/esm/dialog/dialog.d.ts +1 -1
  88. package/esm/dialog/dialog.js +1 -1
  89. package/esm/divider/divider.d.ts +1 -1
  90. package/esm/divider/divider.js +1 -1
  91. package/esm/drawer/base/base-drawer-adapter.d.ts +2 -0
  92. package/esm/drawer/base/base-drawer-adapter.js +3 -0
  93. package/esm/drawer/base/base-drawer-core.js +3 -0
  94. package/esm/drawer/drawer/drawer.d.ts +2 -0
  95. package/esm/drawer/drawer/drawer.js +3 -1
  96. package/esm/drawer/mini-drawer/mini-drawer.d.ts +2 -0
  97. package/esm/drawer/mini-drawer/mini-drawer.js +3 -1
  98. package/esm/drawer/modal-drawer/modal-drawer.d.ts +2 -0
  99. package/esm/drawer/modal-drawer/modal-drawer.js +3 -1
  100. package/esm/expansion-panel/expansion-panel.d.ts +1 -1
  101. package/esm/expansion-panel/expansion-panel.js +1 -1
  102. package/esm/field/field-adapter.js +2 -2
  103. package/esm/field/field-core.d.ts +3 -3
  104. package/esm/field/field.d.ts +1 -2
  105. package/esm/field/field.js +1 -2
  106. package/esm/file-picker/file-picker.d.ts +2 -3
  107. package/esm/file-picker/file-picker.js +2 -3
  108. package/esm/floating-action-button/floating-action-button.d.ts +1 -1
  109. package/esm/floating-action-button/floating-action-button.js +1 -1
  110. package/esm/focus-indicator/focus-indicator-constants.d.ts +1 -11
  111. package/esm/focus-indicator/focus-indicator-constants.js +2 -17
  112. package/esm/focus-indicator/focus-indicator.d.ts +53 -26
  113. package/esm/focus-indicator/focus-indicator.js +139 -62
  114. package/esm/focus-indicator/index.d.ts +0 -2
  115. package/esm/focus-indicator/index.js +0 -2
  116. package/esm/icon/icon.d.ts +1 -1
  117. package/esm/icon/icon.js +1 -1
  118. package/esm/icon-button/icon-button.d.ts +2 -0
  119. package/esm/icon-button/icon-button.js +2 -0
  120. package/esm/inline-message/inline-message.d.ts +1 -1
  121. package/esm/inline-message/inline-message.js +1 -1
  122. package/esm/keyboard-shortcut/keyboard-shortcut.d.ts +2 -0
  123. package/esm/keyboard-shortcut/keyboard-shortcut.js +2 -0
  124. package/esm/label/label.d.ts +1 -1
  125. package/esm/label/label.js +1 -1
  126. package/esm/label-value/label-value.d.ts +1 -1
  127. package/esm/label-value/label-value.js +1 -1
  128. package/esm/linear-progress/linear-progress.d.ts +1 -2
  129. package/esm/linear-progress/linear-progress.js +1 -2
  130. package/esm/list/list/list.d.ts +1 -1
  131. package/esm/list/list/list.js +2 -2
  132. package/esm/list/list-item/list-item-constants.js +1 -1
  133. package/esm/list/list-item/list-item-core.d.ts +2 -0
  134. package/esm/list/list-item/list-item-core.js +29 -6
  135. package/esm/list/list-item/list-item.d.ts +1 -0
  136. package/esm/list/list-item/list-item.js +2 -1
  137. package/esm/list-dropdown/list-dropdown-constants.d.ts +11 -1
  138. package/esm/list-dropdown/list-dropdown-constants.js +6 -1
  139. package/esm/list-dropdown/list-dropdown-utils.d.ts +3 -1
  140. package/esm/list-dropdown/list-dropdown-utils.js +69 -21
  141. package/esm/menu/menu-adapter.d.ts +2 -0
  142. package/esm/menu/menu-adapter.js +12 -8
  143. package/esm/menu/menu-constants.d.ts +1 -0
  144. package/esm/menu/menu-constants.js +3 -2
  145. package/esm/menu/menu-core.d.ts +5 -0
  146. package/esm/menu/menu-core.js +41 -2
  147. package/esm/menu/menu.d.ts +17 -0
  148. package/esm/menu/menu.js +15 -1
  149. package/esm/open-icon/open-icon.d.ts +2 -1
  150. package/esm/open-icon/open-icon.js +2 -1
  151. package/esm/overlay/overlay.d.ts +1 -2
  152. package/esm/overlay/overlay.js +1 -2
  153. package/esm/page-state/page-state.d.ts +2 -1
  154. package/esm/page-state/page-state.js +2 -1
  155. package/esm/paginator/paginator-core.d.ts +16 -0
  156. package/esm/paginator/paginator-core.js +29 -9
  157. package/esm/paginator/paginator.d.ts +38 -0
  158. package/esm/paginator/paginator.js +46 -0
  159. package/esm/popover/popover-adapter.js +1 -1
  160. package/esm/popover/popover-constants.d.ts +4 -0
  161. package/esm/popover/popover-constants.js +4 -2
  162. package/esm/popover/popover-core.d.ts +5 -1
  163. package/esm/popover/popover-core.js +13 -0
  164. package/esm/popover/popover.d.ts +6 -2
  165. package/esm/popover/popover.js +10 -2
  166. package/esm/profile-card/profile-card.d.ts +3 -0
  167. package/esm/profile-card/profile-card.js +3 -0
  168. package/esm/radio/radio/radio.d.ts +1 -2
  169. package/esm/radio/radio/radio.js +1 -2
  170. package/esm/scaffold/scaffold.d.ts +1 -1
  171. package/esm/scaffold/scaffold.js +1 -1
  172. package/esm/select/core/base-select-constants.d.ts +4 -0
  173. package/esm/select/core/base-select-core.d.ts +22 -2
  174. package/esm/select/core/base-select-core.js +217 -40
  175. package/esm/select/option/option.d.ts +2 -0
  176. package/esm/select/option/option.js +2 -0
  177. package/esm/select/option-group/option-group.d.ts +2 -0
  178. package/esm/select/option-group/option-group.js +2 -0
  179. package/esm/select/select/select-constants.d.ts +5 -0
  180. package/esm/select/select/select-constants.js +5 -2
  181. package/esm/select/select/select.d.ts +14 -2
  182. package/esm/select/select/select.js +23 -2
  183. package/esm/select/select-dropdown/select-dropdown.d.ts +2 -0
  184. package/esm/select/select-dropdown/select-dropdown.js +2 -0
  185. package/esm/skeleton/skeleton.d.ts +1 -1
  186. package/esm/skeleton/skeleton.js +1 -1
  187. package/esm/skip-link/skip-link.d.ts +1 -1
  188. package/esm/skip-link/skip-link.js +1 -1
  189. package/esm/slider/slider.d.ts +1 -1
  190. package/esm/slider/slider.js +1 -1
  191. package/esm/split-button/split-button.d.ts +1 -1
  192. package/esm/split-button/split-button.js +2 -2
  193. package/esm/split-view/split-view/split-view.d.ts +2 -0
  194. package/esm/split-view/split-view/split-view.js +2 -0
  195. package/esm/split-view/split-view-panel/split-view-panel.d.ts +2 -0
  196. package/esm/split-view/split-view-panel/split-view-panel.js +3 -1
  197. package/esm/stack/stack.d.ts +1 -8
  198. package/esm/stack/stack.js +1 -8
  199. package/esm/state-layer/state-layer.d.ts +1 -1
  200. package/esm/state-layer/state-layer.js +2 -2
  201. package/esm/stepper/step/step.d.ts +2 -0
  202. package/esm/stepper/step/step.js +3 -1
  203. package/esm/stepper/stepper/stepper.d.ts +2 -0
  204. package/esm/stepper/stepper/stepper.js +2 -0
  205. package/esm/table/table-adapter.d.ts +4 -4
  206. package/esm/table/table-adapter.js +4 -4
  207. package/esm/table/table-core.js +2 -2
  208. package/esm/table/table-utils.d.ts +2 -2
  209. package/esm/table/table-utils.js +25 -18
  210. package/esm/table/table.d.ts +3 -1
  211. package/esm/table/table.js +4 -1
  212. package/esm/tabs/tab/tab-adapter.js +2 -2
  213. package/esm/tabs/tab/tab.d.ts +2 -0
  214. package/esm/tabs/tab/tab.js +2 -0
  215. package/esm/tabs/tab-bar/tab-bar.d.ts +1 -1
  216. package/esm/tabs/tab-bar/tab-bar.js +1 -1
  217. package/esm/text-field/text-field-adapter.d.ts +6 -4
  218. package/esm/text-field/text-field-adapter.js +11 -4
  219. package/esm/text-field/text-field-core.d.ts +4 -0
  220. package/esm/text-field/text-field-core.js +13 -2
  221. package/esm/text-field/text-field.d.ts +1 -1
  222. package/esm/text-field/text-field.js +1 -1
  223. package/esm/time-picker/time-picker-adapter.js +1 -0
  224. package/esm/time-picker/time-picker-core.js +3 -3
  225. package/esm/time-picker/time-picker.d.ts +2 -0
  226. package/esm/time-picker/time-picker.js +2 -0
  227. package/esm/toast/toast-adapter.d.ts +20 -0
  228. package/esm/toast/toast-adapter.js +30 -0
  229. package/esm/toast/toast-core.d.ts +17 -0
  230. package/esm/toast/toast-core.js +66 -0
  231. package/esm/toast/toast.d.ts +9 -2
  232. package/esm/toast/toast.js +10 -1
  233. package/esm/toolbar/toolbar.d.ts +1 -3
  234. package/esm/toolbar/toolbar.js +1 -3
  235. package/esm/tooltip/tooltip-adapter.d.ts +6 -0
  236. package/esm/tooltip/tooltip-adapter.js +9 -0
  237. package/esm/tooltip/tooltip-constants.d.ts +1 -0
  238. package/esm/tooltip/tooltip-constants.js +2 -1
  239. package/esm/tooltip/tooltip-core.d.ts +20 -0
  240. package/esm/tooltip/tooltip-core.js +96 -2
  241. package/esm/tooltip/tooltip.d.ts +1 -1
  242. package/esm/tooltip/tooltip.js +2 -2
  243. package/esm/view-switcher/view/view.d.ts +2 -0
  244. package/esm/view-switcher/view/view.js +2 -0
  245. package/esm/view-switcher/view-switcher.d.ts +2 -0
  246. package/esm/view-switcher/view-switcher.js +2 -0
  247. package/package.json +4 -4
  248. package/sass/focus-indicator/focus-indicator.scss +1 -1
  249. package/sass/icon-button/forge-icon-button.scss +3 -3
  250. package/sass/list/forge-list.scss +6 -6
  251. package/sass/state-layer/_core.scss +2 -0
  252. package/sass/table/_core.scss +13 -1
  253. package/sass/tooltip/_core.scss +0 -2
  254. package/esm/focus-indicator/focus-indicator-adapter.d.ts +0 -29
  255. package/esm/focus-indicator/focus-indicator-adapter.js +0 -37
  256. package/esm/focus-indicator/focus-indicator-core.d.ts +0 -48
  257. package/esm/focus-indicator/focus-indicator-core.js +0 -129
@@ -15,7 +15,10 @@ import { IconRegistry, IconComponent } from '../icon';
15
15
  import { BaseComponent } from '../core/base/base-component';
16
16
  import { CellAlign } from './types';
17
17
  import { TooltipComponent } from '../tooltip';
18
+ import { FocusIndicatorComponent } from '../focus-indicator';
18
19
  /**
20
+ * @summary Tables are used to display sets of data. They organize information into rows and columns, making it easier to read, compare, and analyze. The Forge table provides a configuration-based approach to building data tables with means for sorting, filtering, selecting, and customizing the display of tabular data.
21
+ *
19
22
  * @tag forge-table
20
23
  *
21
24
  * @dependency forge-expansion-panel
@@ -309,7 +312,7 @@ __decorate([
309
312
  TableComponent = __decorate([
310
313
  customElement({
311
314
  name: TABLE_CONSTANTS.elementName,
312
- dependencies: [ExpansionPanelComponent, IconComponent, CheckboxComponent, TooltipComponent]
315
+ dependencies: [ExpansionPanelComponent, IconComponent, CheckboxComponent, TooltipComponent, FocusIndicatorComponent]
313
316
  })
314
317
  ], TableComponent);
315
318
  export { TableComponent };
@@ -8,12 +8,12 @@ import { STATE_LAYER_CONSTANTS } from '../../state-layer';
8
8
  import { BaseAdapter } from '../../core/base/base-adapter';
9
9
  import { TAB_BAR_CONSTANTS } from '../tab-bar/tab-bar-constants';
10
10
  import { TAB_CONSTANTS } from './tab-constants';
11
- import { FOCUS_INDICATOR_CONSTANTS } from '../../focus-indicator';
11
+ import { FOCUS_INDICATOR_TAG_NAME } from '../../focus-indicator';
12
12
  export class TabAdapter extends BaseAdapter {
13
13
  constructor(component) {
14
14
  super(component);
15
15
  this._tabIndicatorElement = getShadowElement(this._component, TAB_CONSTANTS.selectors.INDICATOR);
16
- this._focusIndicatorElement = getShadowElement(this._component, FOCUS_INDICATOR_CONSTANTS.elementName);
16
+ this._focusIndicatorElement = getShadowElement(this._component, FOCUS_INDICATOR_TAG_NAME);
17
17
  this._stateLayerElement = getShadowElement(this._component, STATE_LAYER_CONSTANTS.elementName);
18
18
  }
19
19
  initialize() {
@@ -26,6 +26,8 @@ declare global {
26
26
  /**
27
27
  * @tag forge-tab
28
28
  *
29
+ * @summary Tab components represent a single tab inside a tab bar.
30
+ *
29
31
  * @dependency forge-focus-indicator
30
32
  * @dependency forge-state-layer
31
33
  *
@@ -16,6 +16,8 @@ const styles = ':host{display:inline-flex;outline:0;-webkit-tap-highlight-color:
16
16
  /**
17
17
  * @tag forge-tab
18
18
  *
19
+ * @summary Tab components represent a single tab inside a tab bar.
20
+ *
19
21
  * @dependency forge-focus-indicator
20
22
  * @dependency forge-state-layer
21
23
  *
@@ -31,7 +31,7 @@ declare const TabBarComponent_base: import("../../constants").AbstractConstructo
31
31
  /**
32
32
  * @tag forge-tab-bar
33
33
  *
34
- * @summary Tabs organize content across different screens and views.
34
+ * @summary Tab bars organize a set of tabs, holding selection state and enabling navigation between different views or sections of content.
35
35
  *
36
36
  * @description
37
37
  * Use tabs to group content into helpful categories. Tabs are typically placed
@@ -21,7 +21,7 @@ const styles = ':host{position:relative;display:block}:host([hidden]){display:no
21
21
  /**
22
22
  * @tag forge-tab-bar
23
23
  *
24
- * @summary Tabs organize content across different screens and views.
24
+ * @summary Tab bars organize a set of tabs, holding selection state and enabling navigation between different views or sections of content.
25
25
  *
26
26
  * @description
27
27
  * Use tabs to group content into helpful categories. Tabs are typically placed
@@ -12,13 +12,14 @@ export interface ITextFieldAdapter extends IBaseFieldAdapter {
12
12
  addRootListener(name: keyof HTMLElementEventMap, listener: EventListener): void;
13
13
  removeRootListener(name: keyof HTMLElementEventMap, listener: EventListener): void;
14
14
  disableInput(disabled: boolean): void;
15
+ setInvalid(value: boolean): void;
15
16
  handleDefaultSlotChange(listener: TextFieldInputAttributeObserver): void;
16
17
  tryAddValueChangeListener(context: unknown, listener: TextFieldValueChangeListener): void;
17
18
  removeValueChangeListener(): void;
18
19
  tryFloatLabel(force?: boolean): void;
19
20
  tryConnectSlottedLabel(): void;
20
- connectClearButton(listener: EventListener): void;
21
- disconnectClearButton(listener: EventListener): void;
21
+ connectClearButton(clickListener: EventListener, mouseDownListener: EventListener): void;
22
+ disconnectClearButton(clickListener: EventListener, mouseDownListener: EventListener): void;
22
23
  toggleClearButtonVisibility(visible: boolean): void;
23
24
  clearInput(): void;
24
25
  getAllSlotElements(): HTMLSlotElement[];
@@ -39,6 +40,7 @@ export declare class TextFieldAdapter extends BaseFieldAdapter implements ITextF
39
40
  addRootListener(name: keyof HTMLElementEventMap, listener: EventListener): void;
40
41
  removeRootListener(name: keyof HTMLElementEventMap, listener: EventListener): void;
41
42
  disableInput(disabled: boolean): void;
43
+ setInvalid(value: boolean): void;
42
44
  inputIsDisabled(): boolean;
43
45
  click(): void;
44
46
  applyLabel(value: string | null): void;
@@ -47,8 +49,8 @@ export declare class TextFieldAdapter extends BaseFieldAdapter implements ITextF
47
49
  removeValueChangeListener(): void;
48
50
  tryFloatLabel(force?: boolean): void;
49
51
  tryConnectSlottedLabel(): void;
50
- connectClearButton(listener: EventListener): void;
51
- disconnectClearButton(listener: EventListener): void;
52
+ connectClearButton(clickListener: EventListener, mouseDownListener: EventListener): void;
53
+ disconnectClearButton(clickListener: EventListener, mouseDownListener: EventListener): void;
52
54
  toggleClearButtonVisibility(visible: boolean): void;
53
55
  clearInput(): void;
54
56
  getAllSlotElements(): HTMLSlotElement[];
@@ -40,6 +40,9 @@ export class TextFieldAdapter extends BaseFieldAdapter {
40
40
  disableInput(disabled) {
41
41
  this._inputElements.forEach(el => (el.disabled = disabled));
42
42
  }
43
+ setInvalid(value) {
44
+ this._inputElements.forEach(el => toggleAttribute(el, value, 'aria-invalid', 'true'));
45
+ }
43
46
  inputIsDisabled() {
44
47
  return this._inputElements.some(el => el.disabled);
45
48
  }
@@ -130,11 +133,15 @@ export class TextFieldAdapter extends BaseFieldAdapter {
130
133
  inputElement.id = id;
131
134
  label.htmlFor = id;
132
135
  }
133
- connectClearButton(listener) {
134
- this._clearButtonSlotElement.addEventListener('click', listener);
136
+ connectClearButton(clickListener, mouseDownListener) {
137
+ this._clearButtonSlotElement.addEventListener('click', clickListener);
138
+ if (mouseDownListener) {
139
+ this._clearButtonSlotElement.addEventListener('mousedown', mouseDownListener);
140
+ }
135
141
  }
136
- disconnectClearButton(listener) {
137
- this._clearButtonSlotElement.removeEventListener('click', listener);
142
+ disconnectClearButton(clickListener, mouseDownListener) {
143
+ this._clearButtonSlotElement.removeEventListener('click', clickListener);
144
+ this._clearButtonSlotElement.removeEventListener('mousedown', mouseDownListener);
138
145
  }
139
146
  toggleClearButtonVisibility(visible) {
140
147
  if (visible) {
@@ -18,6 +18,7 @@ export declare class TextFieldCore extends BaseFieldCore<ITextFieldAdapter> impl
18
18
  private _valueChangeListener;
19
19
  private _inputListener;
20
20
  private _clearButtonClickListener;
21
+ private _clearButtonMouseDownListener;
21
22
  constructor(_adapter: TextFieldAdapter);
22
23
  initialize(): void;
23
24
  destroy(): void;
@@ -27,6 +28,7 @@ export declare class TextFieldCore extends BaseFieldCore<ITextFieldAdapter> impl
27
28
  private _handleSlotChange;
28
29
  private _onInputAttributeChange;
29
30
  private _onClearButtonClick;
31
+ private _onClearButtonMouseDown;
30
32
  /** Responds to the `input` event from the <input> element. */
31
33
  private _onInputChange;
32
34
  /** Called from the `value` property setter on the <input> element. */
@@ -35,6 +37,8 @@ export declare class TextFieldCore extends BaseFieldCore<ITextFieldAdapter> impl
35
37
  private _toggleClearButtonVisibility;
36
38
  get showClear(): boolean;
37
39
  set showClear(value: boolean);
40
+ get invalid(): boolean;
41
+ set invalid(value: boolean);
38
42
  get disabled(): boolean;
39
43
  set disabled(value: boolean);
40
44
  get labelPosition(): FieldLabelPosition;
@@ -17,6 +17,7 @@ export class TextFieldCore extends BaseFieldCore {
17
17
  this._valueChangeListener = this._onValueChange.bind(this);
18
18
  this._inputListener = this._onInputChange.bind(this);
19
19
  this._clearButtonClickListener = (evt) => this._onClearButtonClick(evt);
20
+ this._clearButtonMouseDownListener = (evt) => this._onClearButtonMouseDown(evt);
20
21
  }
21
22
  initialize() {
22
23
  this._adapter.tryApplyGlobalConfiguration(['labelPosition', 'variant']);
@@ -72,6 +73,9 @@ export class TextFieldCore extends BaseFieldCore {
72
73
  this._adapter.clearInput();
73
74
  }
74
75
  }
76
+ _onClearButtonMouseDown(evt) {
77
+ evt.preventDefault(); // Prevent focus change to avoid blur event
78
+ }
75
79
  /** Responds to the `input` event from the <input> element. */
76
80
  _onInputChange(evt) {
77
81
  let floatLabel;
@@ -101,14 +105,21 @@ export class TextFieldCore extends BaseFieldCore {
101
105
  this._showClear = value;
102
106
  this._adapter.toggleHostAttribute(TEXT_FIELD_CONSTANTS.attributes.SHOW_CLEAR, value);
103
107
  if (value) {
104
- this._adapter.connectClearButton(this._clearButtonClickListener);
108
+ this._adapter.connectClearButton(this._clearButtonClickListener, this._clearButtonMouseDownListener);
105
109
  }
106
110
  else {
107
- this._adapter.disconnectClearButton(this._clearButtonClickListener);
111
+ this._adapter.disconnectClearButton(this._clearButtonClickListener, this._clearButtonMouseDownListener);
108
112
  }
109
113
  this._toggleClearButtonVisibility();
110
114
  }
111
115
  }
116
+ get invalid() {
117
+ return super.invalid;
118
+ }
119
+ set invalid(value) {
120
+ super.invalid = value;
121
+ this._adapter.setInvalid(value);
122
+ }
112
123
  get disabled() {
113
124
  return super.disabled;
114
125
  }
@@ -20,7 +20,7 @@ declare global {
20
20
  /**
21
21
  * @tag forge-text-field
22
22
  *
23
- * @summary The Forge Text Field component wraps and styles an input or textarea element.
23
+ * @summary The Forge Text Field component is an input field used to capture user text input. It requires a child `<input>` or `<textarea>` element to function properly, and an optional `<label>` element can be used to provide a label for the `<input>`.
24
24
  *
25
25
  * @dependency forge-field
26
26
  * @dependency forge-icon-button
@@ -19,7 +19,7 @@ const styles = ':host{display:block}:host([hidden]){display:none}forge-field{dis
19
19
  /**
20
20
  * @tag forge-text-field
21
21
  *
22
- * @summary The Forge Text Field component wraps and styles an input or textarea element.
22
+ * @summary The Forge Text Field component is an input field used to capture user text input. It requires a child `<input>` or `<textarea>` element to function properly, and an optional `<label>` element can be used to provide a label for the `<input>`.
23
23
  *
24
24
  * @dependency forge-field
25
25
  * @dependency forge-icon-button
@@ -189,6 +189,7 @@ export class TimePickerAdapter extends BaseAdapter {
189
189
  this._toggleElement.setAttribute('aria-disabled', value.toString());
190
190
  if ('disabled' in this._toggleElement) {
191
191
  this._toggleElement.disabled = value;
192
+ this._toggleElement.tabIndex = -1;
192
193
  }
193
194
  else {
194
195
  const button = this._toggleElement.querySelector('button');
@@ -579,7 +579,7 @@ export class TimePickerCore {
579
579
  for (let totalMinutes = minMinutes; totalMinutes < TIME_PICKER_CONSTANTS.numbers.MAX_DAY_MINUTES; totalMinutes += minuteStep) {
580
580
  const millis = minutesToMillis(totalMinutes);
581
581
  const disabled = this._restrictedTimes.includes(millis);
582
- const label = millisToTimeString(millis, this._use24HourTime, false) || '';
582
+ const label = millisToTimeString(millis, this._use24HourTime, this._allowSeconds) || '';
583
583
  const value = { time: millis };
584
584
  times.push({ label, value, disabled });
585
585
  }
@@ -587,7 +587,7 @@ export class TimePickerCore {
587
587
  for (let totalMinutes = 0; totalMinutes <= maxMinutes; totalMinutes += minuteStep) {
588
588
  const millis = minutesToMillis(totalMinutes);
589
589
  const disabled = this._restrictedTimes.includes(millis);
590
- const label = millisToTimeString(millis, this._use24HourTime, false) || '';
590
+ const label = millisToTimeString(millis, this._use24HourTime, this._allowSeconds) || '';
591
591
  const value = { time: millis };
592
592
  times.push({ label, value, disabled });
593
593
  }
@@ -602,7 +602,7 @@ export class TimePickerCore {
602
602
  }
603
603
  const millis = minutesToMillis(totalMinutes);
604
604
  const disabled = this._restrictedTimes.includes(millis);
605
- const label = millisToTimeString(millis, this._use24HourTime, false) || '';
605
+ const label = millisToTimeString(millis, this._use24HourTime, this._allowSeconds) || '';
606
606
  const value = { time: millis };
607
607
  times.push({ label, value, disabled });
608
608
  }
@@ -44,6 +44,8 @@ declare global {
44
44
  }
45
45
  }
46
46
  /**
47
+ * @summary A time input component with integrated dropdown for selecting time values with support for various formats, masking, and validation options.
48
+ *
47
49
  * @tag forge-time-picker
48
50
  */
49
51
  export declare class TimePickerComponent extends BaseComponent implements ITimePickerComponent {
@@ -18,6 +18,8 @@ import { PopoverComponent } from '../popover/popover';
18
18
  const template = '<template><slot></slot></template>';
19
19
  const styles = ':host{display:block}:host([hidden]){display:none}';
20
20
  /**
21
+ * @summary A time input component with integrated dropdown for selecting time values with support for various formats, masking, and validation options.
22
+ *
21
23
  * @tag forge-time-picker
22
24
  */
23
25
  let TimePickerComponent = class TimePickerComponent extends BaseComponent {
@@ -14,6 +14,16 @@ export interface IToastAdapter extends IBaseAdapter<IToastComponent> {
14
14
  removeActionListener(listener: EventListener): void;
15
15
  setDismissLabel(label: string): void;
16
16
  setActionText(text: string): void;
17
+ addPointerEnterListener(listener: EventListener): void;
18
+ removePointerEnterListener(listener: EventListener): void;
19
+ addPointerLeaveListener(listener: EventListener): void;
20
+ removePointerLeaveListener(listener: EventListener): void;
21
+ addFocusInListener(listener: EventListener): void;
22
+ removeFocusInListener(listener: EventListener): void;
23
+ addFocusOutListener(listener: EventListener): void;
24
+ removeFocusOutListener(listener: EventListener): void;
25
+ addKeyboardListener(listener: EventListener): void;
26
+ removeKeyboardListener(listener: EventListener): void;
17
27
  }
18
28
  export declare class ToastAdapter extends BaseAdapter<IToastComponent> implements IToastAdapter {
19
29
  private _overlayElement;
@@ -29,4 +39,14 @@ export declare class ToastAdapter extends BaseAdapter<IToastComponent> implement
29
39
  removeActionListener(listener: EventListener): void;
30
40
  setDismissLabel(label: string): void;
31
41
  setActionText(text: string): void;
42
+ addPointerEnterListener(listener: EventListener): void;
43
+ removePointerEnterListener(listener: EventListener): void;
44
+ addPointerLeaveListener(listener: EventListener): void;
45
+ removePointerLeaveListener(listener: EventListener): void;
46
+ addFocusInListener(listener: EventListener): void;
47
+ removeFocusInListener(listener: EventListener): void;
48
+ addFocusOutListener(listener: EventListener): void;
49
+ removeFocusOutListener(listener: EventListener): void;
50
+ addKeyboardListener(listener: EventListener): void;
51
+ removeKeyboardListener(listener: EventListener): void;
32
52
  }
@@ -46,4 +46,34 @@ export class ToastAdapter extends BaseAdapter {
46
46
  this._actionButtonElement.setAttribute('hidden', '');
47
47
  }
48
48
  }
49
+ addPointerEnterListener(listener) {
50
+ this._component.addEventListener('pointerenter', listener);
51
+ }
52
+ removePointerEnterListener(listener) {
53
+ this._component.removeEventListener('pointerenter', listener);
54
+ }
55
+ addPointerLeaveListener(listener) {
56
+ this._component.addEventListener('pointerleave', listener);
57
+ }
58
+ removePointerLeaveListener(listener) {
59
+ this._component.removeEventListener('pointerleave', listener);
60
+ }
61
+ addFocusInListener(listener) {
62
+ this._component.addEventListener('focusin', listener);
63
+ }
64
+ removeFocusInListener(listener) {
65
+ this._component.removeEventListener('focusin', listener);
66
+ }
67
+ addFocusOutListener(listener) {
68
+ this._component.addEventListener('focusout', listener);
69
+ }
70
+ removeFocusOutListener(listener) {
71
+ this._component.removeEventListener('focusout', listener);
72
+ }
73
+ addKeyboardListener(listener) {
74
+ this._component.addEventListener('keydown', listener);
75
+ }
76
+ removeKeyboardListener(listener) {
77
+ this._component.removeEventListener('keydown', listener);
78
+ }
49
79
  }
@@ -3,6 +3,7 @@
3
3
  * Copyright Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
+ import { IDismissibleStackState, tryDismiss } from '../core/utils/dismissible-stack';
6
7
  import { IToastAdapter } from './toast-adapter';
7
8
  import { ToastPlacement, ToastTheme } from './toast-constants';
8
9
  export interface IToastCore {
@@ -26,6 +27,13 @@ export declare class ToastCore implements IToastCore {
26
27
  private _hideTimeout;
27
28
  private _actionListener;
28
29
  private _closeListener;
30
+ private _isHovered;
31
+ private _isFocused;
32
+ private _pointerEnterListener;
33
+ private _pointerLeaveListener;
34
+ private _focusInListener;
35
+ private _focusOutListener;
36
+ private _keyboardListener;
29
37
  constructor(_adapter: IToastAdapter);
30
38
  initialize(): void;
31
39
  show(): void;
@@ -34,6 +42,15 @@ export declare class ToastCore implements IToastCore {
34
42
  }): Promise<void>;
35
43
  private _onAction;
36
44
  private _onClose;
45
+ private _handlePointerEnter;
46
+ private _handlePointerLeave;
47
+ private _handleFocusIn;
48
+ private _handleFocusOut;
49
+ private _handleKeyboard;
50
+ private _updateTimerState;
51
+ private _pauseTimer;
52
+ private _resumeTimer;
53
+ [tryDismiss](state?: IDismissibleStackState): boolean;
37
54
  get open(): boolean;
38
55
  set open(value: boolean);
39
56
  get duration(): number;
@@ -3,6 +3,7 @@
3
3
  * Copyright Tyler Technologies, Inc.
4
4
  * License: Apache-2.0
5
5
  */
6
+ import { DismissibleStack, tryDismiss } from '../core/utils/dismissible-stack';
6
7
  import { TOAST_CONSTANTS } from './toast-constants';
7
8
  export class ToastCore {
8
9
  constructor(_adapter) {
@@ -14,15 +15,28 @@ export class ToastCore {
14
15
  this._theme = TOAST_CONSTANTS.defaults.THEME;
15
16
  this._actionListener = this._onAction.bind(this);
16
17
  this._closeListener = this._onClose.bind(this);
18
+ this._isHovered = false;
19
+ this._isFocused = false;
20
+ this._pointerEnterListener = this._handlePointerEnter.bind(this);
21
+ this._pointerLeaveListener = this._handlePointerLeave.bind(this);
22
+ this._focusInListener = this._handleFocusIn.bind(this);
23
+ this._focusOutListener = this._handleFocusOut.bind(this);
24
+ this._keyboardListener = this._handleKeyboard.bind(this);
17
25
  }
18
26
  initialize() {
19
27
  this._adapter.tryApplyGlobalConfiguration(['duration', 'placement', 'dismissible']);
28
+ this._adapter.addPointerEnterListener(this._pointerEnterListener);
29
+ this._adapter.addPointerLeaveListener(this._pointerLeaveListener);
30
+ this._adapter.addFocusInListener(this._focusInListener);
31
+ this._adapter.addFocusOutListener(this._focusOutListener);
32
+ this._adapter.addKeyboardListener(this._keyboardListener);
20
33
  if (this._open) {
21
34
  this.show();
22
35
  }
23
36
  }
24
37
  show() {
25
38
  this._adapter.show();
39
+ DismissibleStack.instance.add(this._adapter.hostElement);
26
40
  if (isFinite(this._duration) && this._duration > 0) {
27
41
  /* c8 ignore next 3 */
28
42
  if (this._hideTimeout) {
@@ -38,6 +52,9 @@ export class ToastCore {
38
52
  window.clearTimeout(this._hideTimeout);
39
53
  this._hideTimeout = undefined;
40
54
  }
55
+ this._isHovered = false;
56
+ this._isFocused = false;
57
+ DismissibleStack.instance.remove(this._adapter.hostElement);
41
58
  await this._adapter.hide();
42
59
  this._open = false;
43
60
  this._adapter.toggleHostAttribute(TOAST_CONSTANTS.attributes.OPEN, this._open);
@@ -52,6 +69,55 @@ export class ToastCore {
52
69
  _onClose(_evt) {
53
70
  this.hide();
54
71
  }
72
+ _handlePointerEnter() {
73
+ this._isHovered = true;
74
+ this._updateTimerState();
75
+ }
76
+ _handlePointerLeave() {
77
+ this._isHovered = false;
78
+ this._updateTimerState();
79
+ }
80
+ _handleFocusIn() {
81
+ this._isFocused = true;
82
+ this._updateTimerState();
83
+ }
84
+ _handleFocusOut() {
85
+ this._isFocused = false;
86
+ this._updateTimerState();
87
+ }
88
+ _handleKeyboard(event) {
89
+ if (event.key === 'Escape' && this._open) {
90
+ event.stopPropagation();
91
+ DismissibleStack.instance.dismiss(this._adapter.hostElement, { reason: 'escape' });
92
+ }
93
+ }
94
+ _updateTimerState() {
95
+ const shouldPause = this._isHovered || this._isFocused;
96
+ if (shouldPause && this._hideTimeout) {
97
+ this._pauseTimer();
98
+ }
99
+ else if (!shouldPause && !this._hideTimeout) {
100
+ this._resumeTimer();
101
+ }
102
+ }
103
+ _pauseTimer() {
104
+ if (this._hideTimeout) {
105
+ window.clearTimeout(this._hideTimeout);
106
+ this._hideTimeout = undefined;
107
+ }
108
+ }
109
+ _resumeTimer() {
110
+ if (isFinite(this._duration) && this._duration > 0) {
111
+ this._hideTimeout = window.setTimeout(() => this.hide(), this._duration);
112
+ }
113
+ }
114
+ [tryDismiss](state) {
115
+ if (state?.reason === 'escape') {
116
+ this.hide();
117
+ return true;
118
+ }
119
+ return false;
120
+ }
55
121
  get open() {
56
122
  return this._open;
57
123
  }
@@ -6,6 +6,7 @@
6
6
  import { BaseComponent } from '../core/base/base-component';
7
7
  import { IWithDefaultAria } from '../core/mixins/internals/with-default-aria';
8
8
  import { IWithElementInternals } from '../core/mixins/internals/with-element-internals';
9
+ import { IDismissible, IDismissibleStackState, tryDismiss } from '../core/utils/dismissible-stack';
9
10
  import { IIconProperties } from '../icon';
10
11
  import { ToastPlacement, ToastTheme } from './toast-constants';
11
12
  export interface IToastProperties {
@@ -24,7 +25,7 @@ export interface IToastPresentConfiguration extends Partial<IToastProperties> {
24
25
  icon?: Partial<IIconProperties>;
25
26
  topLayer?: boolean;
26
27
  }
27
- export interface IToastComponent extends IToastProperties, IWithElementInternals, IWithDefaultAria {
28
+ export interface IToastComponent extends IToastProperties, IWithElementInternals, IWithDefaultAria, IDismissible {
28
29
  show(): void;
29
30
  hide(): Promise<void>;
30
31
  }
@@ -41,7 +42,7 @@ declare const ToastComponent_base: import("../constants").AbstractConstructor<im
41
42
  /**
42
43
  * @tag forge-toast
43
44
  *
44
- * @summary Toasts are non-modal notifications that appear in response to user interactions.
45
+ * @summary Toasts are non-modal notifications that appear in response to user interactions. Use toasts to provide brief messages about app processes at the bottom or top of the screen. They automatically disappear after a timeout, but can also include an action button and a dismiss button.
45
46
  *
46
47
  * @dependency forge-overlay
47
48
  * @dependency forge-button
@@ -117,6 +118,12 @@ export declare class ToastComponent extends ToastComponent_base implements IToas
117
118
  * @returns A promise that resolves when the toast animation completes.
118
119
  */
119
120
  hide(): Promise<void>;
121
+ /**
122
+ * Attempts to dismiss the toast.
123
+ * @param state The dismiss state.
124
+ * @returns True if the toast was dismissed, false otherwise.
125
+ */
126
+ [tryDismiss](state?: IDismissibleStackState): boolean;
120
127
  /**
121
128
  * Presents a toast notification.
122
129
  * @param config The configuration for the toast.
@@ -11,6 +11,7 @@ import { setDefaultAria } from '../constants';
11
11
  import { BaseComponent } from '../core/base/base-component';
12
12
  import { WithDefaultAria } from '../core/mixins/internals/with-default-aria';
13
13
  import { WithElementInternals } from '../core/mixins/internals/with-element-internals';
14
+ import { tryDismiss } from '../core/utils/dismissible-stack';
14
15
  import { DialogComponent, dialogStack } from '../dialog';
15
16
  import { IconComponent, IconRegistry } from '../icon';
16
17
  import { IconButtonComponent } from '../icon-button';
@@ -23,7 +24,7 @@ const styles = '@keyframes slidein{from{transform:translateY(var(--_toast-slide-
23
24
  /**
24
25
  * @tag forge-toast
25
26
  *
26
- * @summary Toasts are non-modal notifications that appear in response to user interactions.
27
+ * @summary Toasts are non-modal notifications that appear in response to user interactions. Use toasts to provide brief messages about app processes at the bottom or top of the screen. They automatically disappear after a timeout, but can also include an action button and a dismiss button.
27
28
  *
28
29
  * @dependency forge-overlay
29
30
  * @dependency forge-button
@@ -138,6 +139,14 @@ let ToastComponent = class ToastComponent extends WithElementInternals(WithDefau
138
139
  hide() {
139
140
  return this._core.hide();
140
141
  }
142
+ /**
143
+ * Attempts to dismiss the toast.
144
+ * @param state The dismiss state.
145
+ * @returns True if the toast was dismissed, false otherwise.
146
+ */
147
+ [tryDismiss](state) {
148
+ return this._core[tryDismiss](state);
149
+ }
141
150
  /**
142
151
  * Presents a toast notification.
143
152
  * @param config The configuration for the toast.
@@ -15,9 +15,7 @@ declare global {
15
15
  /**
16
16
  * @tag forge-toolbar
17
17
  *
18
- * @summary
19
- * Toolbars allow you to place titles and actions within a container and align them to the start, center, or end of the toolbar.
20
- * This component is useful as headers and footers within pages, dialogs, sections... etc. to ensure consistent layout and alignment.
18
+ * @summary Toolbars allow you to place titles and actions within a container and align them to the start, center, or end of the toolbar. This component is useful as headers and footers within pages, dialogs, sections... etc. to ensure consistent layout and alignment.
21
19
  *
22
20
  * @property {boolean} [inverted=false] - Controls whether a bottom divider (default) or top divider (true) is used.
23
21
  *
@@ -12,9 +12,7 @@ const styles = ':host{display:block}:host([hidden]){display:none}.forge-toolbar{
12
12
  /**
13
13
  * @tag forge-toolbar
14
14
  *
15
- * @summary
16
- * Toolbars allow you to place titles and actions within a container and align them to the start, center, or end of the toolbar.
17
- * This component is useful as headers and footers within pages, dialogs, sections... etc. to ensure consistent layout and alignment.
15
+ * @summary Toolbars allow you to place titles and actions within a container and align them to the start, center, or end of the toolbar. This component is useful as headers and footers within pages, dialogs, sections... etc. to ensure consistent layout and alignment.
18
16
  *
19
17
  * @property {boolean} [inverted=false] - Controls whether a bottom divider (default) or top divider (true) is used.
20
18
  *
@@ -17,6 +17,9 @@ export interface ITooltipAdapter extends IBaseAdapter<ITooltipComponent> {
17
17
  removeAnchorListener(type: string, listener: EventListener): void;
18
18
  addLightDismissListener(listener: EventListener): void;
19
19
  removeLightDismissListener(listener: EventListener): void;
20
+ addTooltipListener(type: string, listener: EventListener, opts?: AddEventListenerOptions): void;
21
+ removeTooltipListener(type: string, listener: EventListener): void;
22
+ isKeyboardFocused(): boolean;
20
23
  show(): void;
21
24
  hide(): void;
22
25
  }
@@ -41,6 +44,9 @@ export declare class TooltipAdapter extends BaseAdapter<ITooltipComponent> imple
41
44
  removeAnchorListener(type: string, listener: EventListener): void;
42
45
  addLightDismissListener(listener: EventListener): void;
43
46
  removeLightDismissListener(listener: EventListener): void;
47
+ addTooltipListener(type: string, listener: EventListener, opts?: AddEventListenerOptions): void;
48
+ removeTooltipListener(type: string, listener: EventListener): void;
49
+ isKeyboardFocused(): boolean;
44
50
  show(): void;
45
51
  hide(): void;
46
52
  /**
@@ -80,6 +80,15 @@ export class TooltipAdapter extends BaseAdapter {
80
80
  removeLightDismissListener(listener) {
81
81
  this._overlayElement?.removeEventListener(OVERLAY_CONSTANTS.events.LIGHT_DISMISS, listener);
82
82
  }
83
+ addTooltipListener(type, listener, opts) {
84
+ this.hostElement?.addEventListener(type, listener, opts);
85
+ }
86
+ removeTooltipListener(type, listener) {
87
+ this.hostElement?.removeEventListener(type, listener);
88
+ }
89
+ isKeyboardFocused() {
90
+ return !!this._anchorElement?.matches(':focus-visible');
91
+ }
83
92
  show() {
84
93
  // Tooltips are shown above all content via <forge-overlay>
85
94
  // We do this by dynamically creating an overlay element and appending it to the shadow root
@@ -39,6 +39,7 @@ export declare const TOOLTIP_CONSTANTS: {
39
39
  };
40
40
  numbers: {
41
41
  LONGPRESS_VISIBILITY_DURATION: number;
42
+ HOVER_OUTSIDE_THRESHOLD: number;
42
43
  };
43
44
  defaults: {
44
45
  DELAY: number;
@@ -24,7 +24,8 @@ const attributes = {
24
24
  ...observedAttributes
25
25
  };
26
26
  const numbers = {
27
- LONGPRESS_VISIBILITY_DURATION: 3000
27
+ LONGPRESS_VISIBILITY_DURATION: 3000,
28
+ HOVER_OUTSIDE_THRESHOLD: 100
28
29
  };
29
30
  const defaults = {
30
31
  DELAY: 500,