@aquera/nile-elements 0.1.33-beta-1.1 → 0.1.33

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 (114) hide show
  1. package/README.md +6 -13
  2. package/demo/index.html +27 -262
  3. package/dist/{fixture-d5b55278.cjs.js → fixture-161dee0b.cjs.js} +3 -3
  4. package/dist/fixture-161dee0b.cjs.js.map +1 -0
  5. package/dist/{fixture-df8b52d7.esm.js → fixture-372df3b0.esm.js} +1 -1
  6. package/dist/index.cjs.js +1 -1
  7. package/dist/index.esm.js +1 -1
  8. package/dist/internal/animate.cjs.js +1 -1
  9. package/dist/internal/animate.cjs.js.map +1 -1
  10. package/dist/internal/animate.esm.js +1 -1
  11. package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
  12. package/dist/nile-accordion/nile-accordian.test.esm.js +1 -1
  13. package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
  14. package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
  15. package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
  16. package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
  17. package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
  18. package/dist/nile-badge/nile-badge.test.esm.js +1 -1
  19. package/dist/nile-button/nile-button.test.cjs.js +1 -1
  20. package/dist/nile-button/nile-button.test.esm.js +1 -1
  21. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
  22. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.esm.js +1 -1
  23. package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
  24. package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
  25. package/dist/nile-card/nile-card.test.cjs.js +1 -1
  26. package/dist/nile-card/nile-card.test.esm.js +1 -1
  27. package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
  28. package/dist/nile-checkbox/nile-checkbox.test.esm.js +1 -1
  29. package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
  30. package/dist/nile-chip/nile-chip.test.esm.js +1 -1
  31. package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
  32. package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
  33. package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
  34. package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
  35. package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
  36. package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
  37. package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
  38. package/dist/nile-empty-state/nile-empty-state.test.esm.js +1 -1
  39. package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
  40. package/dist/nile-error-message/nile-error-message.test.esm.js +1 -1
  41. package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
  42. package/dist/nile-form-group/nile-form-group.test.esm.js +1 -1
  43. package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
  44. package/dist/nile-form-help-text/nile-form-help-text.test.esm.js +1 -1
  45. package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
  46. package/dist/nile-hero/nile-hero.test.esm.js +1 -1
  47. package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
  48. package/dist/nile-icon/nile-icon.test.esm.js +1 -1
  49. package/dist/nile-input/nile-input.css.cjs.js +1 -1
  50. package/dist/nile-input/nile-input.css.cjs.js.map +1 -1
  51. package/dist/nile-input/nile-input.css.esm.js +0 -8
  52. package/dist/nile-input/nile-input.test.cjs.js +1 -1
  53. package/dist/nile-input/nile-input.test.esm.js +1 -1
  54. package/dist/nile-link/nile-link.test.cjs.js +1 -1
  55. package/dist/nile-link/nile-link.test.esm.js +1 -1
  56. package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
  57. package/dist/nile-loader/nile-loader.test.esm.js +1 -1
  58. package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
  59. package/dist/nile-popover/nile-popover.test.esm.js +1 -1
  60. package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
  61. package/dist/nile-popup/nile-popup.test.esm.js +1 -1
  62. package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
  63. package/dist/nile-progress-bar/nile-progress-bar.test.esm.js +1 -1
  64. package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
  65. package/dist/nile-radio/nile-radio.test.esm.js +1 -1
  66. package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
  67. package/dist/nile-radio-group/nile-radio-group.test.esm.js +1 -1
  68. package/dist/nile-select/nile-select.test.cjs.js +1 -1
  69. package/dist/nile-select/nile-select.test.esm.js +1 -1
  70. package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
  71. package/dist/nile-slide-toggle/nile-slide-toggle.test.esm.js +1 -1
  72. package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
  73. package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
  74. package/dist/nile-table/nile-table.cjs.js.map +1 -1
  75. package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
  76. package/dist/nile-textarea/nile-textarea.test.esm.js +1 -1
  77. package/dist/nile-tooltip/index.cjs.js +1 -1
  78. package/dist/nile-tooltip/index.esm.js +1 -1
  79. package/dist/nile-tooltip/nile-tooltip.cjs.js +1 -1
  80. package/dist/nile-tooltip/nile-tooltip.cjs.js.map +1 -1
  81. package/dist/nile-tooltip/nile-tooltip.css.cjs.js +1 -1
  82. package/dist/nile-tooltip/nile-tooltip.css.cjs.js.map +1 -1
  83. package/dist/nile-tooltip/nile-tooltip.css.esm.js +56 -59
  84. package/dist/nile-tooltip/nile-tooltip.esm.js +28 -23
  85. package/dist/src/nile-input/nile-input.css.js +0 -8
  86. package/dist/src/nile-input/nile-input.css.js.map +1 -1
  87. package/dist/src/nile-table/nile-table.js.map +1 -1
  88. package/dist/src/nile-tooltip/nile-tooltip.css.js +45 -48
  89. package/dist/src/nile-tooltip/nile-tooltip.css.js.map +1 -1
  90. package/dist/src/nile-tooltip/nile-tooltip.d.ts +44 -23
  91. package/dist/src/nile-tooltip/nile-tooltip.js +227 -157
  92. package/dist/src/nile-tooltip/nile-tooltip.js.map +1 -1
  93. package/dist/tsconfig.tsbuildinfo +1 -1
  94. package/package.json +1 -1
  95. package/src/nile-input/nile-input.css.ts +0 -8
  96. package/src/nile-table/nile-table.ts +2 -2
  97. package/src/nile-tooltip/nile-tooltip.css.ts +46 -49
  98. package/src/nile-tooltip/nile-tooltip.ts +237 -155
  99. package/vscode-html-custom-data.json +81 -81
  100. package/dist/fixture-d5b55278.cjs.js.map +0 -1
  101. package/dist/nile-tooltip/nile-tooltip-utils.cjs.js +0 -2
  102. package/dist/nile-tooltip/nile-tooltip-utils.cjs.js.map +0 -1
  103. package/dist/nile-tooltip/nile-tooltip-utils.esm.js +0 -1
  104. package/dist/nile-tooltip/nile-tooltip.test.cjs.js +0 -2
  105. package/dist/nile-tooltip/nile-tooltip.test.cjs.js.map +0 -1
  106. package/dist/nile-tooltip/nile-tooltip.test.esm.js +0 -51
  107. package/dist/src/nile-tooltip/nile-tooltip-utils.d.ts +0 -18
  108. package/dist/src/nile-tooltip/nile-tooltip-utils.js +0 -151
  109. package/dist/src/nile-tooltip/nile-tooltip-utils.js.map +0 -1
  110. package/dist/src/nile-tooltip/nile-tooltip.test.d.ts +0 -1
  111. package/dist/src/nile-tooltip/nile-tooltip.test.js +0 -158
  112. package/dist/src/nile-tooltip/nile-tooltip.test.js.map +0 -1
  113. package/src/nile-tooltip/nile-tooltip-utils.ts +0 -190
  114. package/src/nile-tooltip/nile-tooltip.test.ts +0 -178
@@ -4,8 +4,10 @@
4
4
  * This source code is licensed under the BSD-3-Clause license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
- import { CSSResultArray } from 'lit';
7
+ import { CSSResultArray, TemplateResult } from 'lit';
8
+ import '../nile-popup/nile-popup';
8
9
  import NileElement from '../internal/nile-element';
10
+ import type NilePopup from '../nile-popup/nile-popup';
9
11
  /**
10
12
  * Nile icon component.
11
13
  *
@@ -13,45 +15,64 @@ import NileElement from '../internal/nile-element';
13
15
  *
14
16
  */
15
17
  export declare class NileTooltip extends NileElement {
18
+ /**
19
+ * The styles for Tooltip
20
+ * @remarks If you are extending this class you can extend the base styles with super. Eg `return [super(), myCustomStyles]`
21
+ */
22
+ static get styles(): CSSResultArray;
23
+ private hoverTimeout;
24
+ defaultSlot: HTMLSlotElement;
25
+ body: HTMLElement;
26
+ popup: NilePopup;
27
+ /** The tooltip's content. If you need to display HTML, use the `content` slot instead. */
16
28
  content: string;
29
+ /** Size Property to decide the tool tip size */
17
30
  size: 'small' | 'large';
31
+ /**
32
+ * The preferred placement of the tooltip. Note that the actual placement may vary as needed to keep the tooltip
33
+ * inside of the viewport.
34
+ */
18
35
  placement: 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end';
36
+ /** Disables the tooltip so it won't show when triggered. */
19
37
  disabled: boolean;
38
+ /** The distance in pixels from which to offset the tooltip away from its target. */
39
+ distance: number;
40
+ /** Indicates whether or not the tooltip is open. You can use this in lieu of the show/hide methods. */
20
41
  open: boolean;
42
+ /** The distance in pixels from which to offset the tooltip along its target. */
43
+ skidding: number;
21
44
  /**
22
45
  * Controls how the tooltip is activated. Possible options include `click`, `hover`, `focus`, and `manual`. Multiple
23
46
  * options can be passed by separating them with a space. When manual is used, the tooltip must be activated
24
47
  * programmatically.
25
48
  */
26
49
  trigger: string;
27
- distance: number;
28
- private readonly SHIFT_OFFSET;
29
- /** The distance in pixels from which to offset the tooltip along its target. */
30
- skidding: number;
50
+ /**
51
+ * Enable this option to prevent the tooltip from being clipped when the component is placed inside a container with
52
+ * `overflow: auto|hidden|scroll`. Hoisting uses a fixed positioning strategy that works in many, but not all,
53
+ * scenarios.
54
+ */
31
55
  hoist: boolean;
32
- tooltip: HTMLElement;
33
- triggerContainer: HTMLElement;
34
- caret: HTMLElement;
35
- tooltipSlot: HTMLSlotElement;
36
- private hasTooltipSlot;
37
- private hoverTimeout;
38
- private caretSize;
39
- private originalPlacement;
40
- static get styles(): CSSResultArray;
41
56
  connectedCallback(): void;
42
- updated(changedProps: Map<string, unknown>): void;
57
+ firstUpdated(): void;
43
58
  disconnectedCallback(): void;
44
- private handleTooltipSlotChange;
45
- private updateTooltipPosition;
46
- private showTooltip;
47
- private hideTooltip;
48
- private handleMouseOver;
49
- private handleMouseOut;
59
+ private handleBlur;
50
60
  private handleClick;
51
61
  private handleFocus;
52
- private handleBlur;
53
- render(): import("lit-html").TemplateResult<1>;
62
+ private handleKeyDown;
63
+ private handleMouseOver;
64
+ private handleMouseOut;
65
+ private hasTrigger;
66
+ handleOpenChange(): Promise<void>;
67
+ handleOptionsChange(): Promise<void>;
68
+ handleDisabledChange(): void;
69
+ /** Shows the tooltip. */
70
+ show(): Promise<void>;
71
+ /** Hides the tooltip */
72
+ hide(): Promise<void>;
73
+ render(): TemplateResult<1>;
54
74
  }
75
+ export default NileTooltip;
55
76
  declare global {
56
77
  interface HTMLElementTagNameMap {
57
78
  'nile-tooltip': NileTooltip;
@@ -1,16 +1,21 @@
1
- import { __decorate } from "tslib";
2
1
  /**
3
2
  * Copyright Aquera Inc 2023
4
3
  *
5
4
  * This source code is licensed under the BSD-3-Clause license found in the
6
5
  * LICENSE file in the root directory of this source tree.
7
6
  */
8
- import { html } from 'lit';
9
- import { customElement, property, query } from 'lit/decorators.js';
10
- import { classMap } from 'lit/directives/class-map.js';
7
+ import { __decorate } from "tslib";
11
8
  import { styles } from './nile-tooltip.css';
9
+ import '../nile-popup/nile-popup';
10
+ import { animateTo, parseDuration, stopAnimations } from '../internal/animate';
11
+ import { classMap } from 'lit/directives/class-map.js';
12
+ import { customElement, property, query } from 'lit/decorators.js';
13
+ import { getAnimation, setDefaultAnimation, } from '../utilities/animation-registry';
14
+ import { html } from 'lit';
15
+ // import { LocalizeController } from '../utilities/localize';
16
+ import { waitForEvent } from '../internal/event';
17
+ import { watch } from '../internal/watch';
12
18
  import NileElement from '../internal/nile-element';
13
- import { isInViewport, getValidTooltipPosition, getCaretPosition } from './nile-tooltip-utils';
14
19
  /**
15
20
  * Nile icon component.
16
21
  *
@@ -20,214 +25,279 @@ import { isInViewport, getValidTooltipPosition, getCaretPosition } from './nile-
20
25
  let NileTooltip = class NileTooltip extends NileElement {
21
26
  constructor() {
22
27
  super(...arguments);
28
+ /** The tooltip's content. If you need to display HTML, use the `content` slot instead. */
23
29
  this.content = '';
30
+ /** Size Property to decide the tool tip size */
24
31
  this.size = 'small';
25
- this.placement = 'bottom';
32
+ /**
33
+ * The preferred placement of the tooltip. Note that the actual placement may vary as needed to keep the tooltip
34
+ * inside of the viewport.
35
+ */
36
+ this.placement = 'top';
37
+ /** Disables the tooltip so it won't show when triggered. */
26
38
  this.disabled = false;
39
+ /** The distance in pixels from which to offset the tooltip away from its target. */
40
+ this.distance = 8;
41
+ /** Indicates whether or not the tooltip is open. You can use this in lieu of the show/hide methods. */
27
42
  this.open = false;
43
+ /** The distance in pixels from which to offset the tooltip along its target. */
44
+ this.skidding = 0;
28
45
  /**
29
46
  * Controls how the tooltip is activated. Possible options include `click`, `hover`, `focus`, and `manual`. Multiple
30
47
  * options can be passed by separating them with a space. When manual is used, the tooltip must be activated
31
48
  * programmatically.
32
49
  */
33
50
  this.trigger = 'hover focus';
34
- this.distance = 8;
35
- this.SHIFT_OFFSET = 16;
36
- /** The distance in pixels from which to offset the tooltip along its target. */
37
- this.skidding = 0;
51
+ /**
52
+ * Enable this option to prevent the tooltip from being clipped when the component is placed inside a container with
53
+ * `overflow: auto|hidden|scroll`. Hoisting uses a fixed positioning strategy that works in many, but not all,
54
+ * scenarios.
55
+ */
38
56
  this.hoist = false;
39
- this.hasTooltipSlot = false;
40
- this.hoverTimeout = 0;
41
- this.caretSize = 6;
42
- this.originalPlacement = this.placement;
43
- this.updateTooltipPosition = () => {
44
- if (!isInViewport(this.triggerContainer)) {
45
- this.open = false;
46
- return;
47
- }
48
- const triggerRect = this.triggerContainer.getBoundingClientRect();
49
- const tooltipRect = this.tooltip.getBoundingClientRect();
50
- const viewportWidth = window.innerWidth;
51
- const viewportHeight = window.innerHeight;
52
- const { top, left, placement } = getValidTooltipPosition(triggerRect, tooltipRect, this.originalPlacement, this.distance, this.skidding, this.caretSize, viewportWidth, viewportHeight);
53
- this.setAttribute('placement', placement);
54
- this.tooltip.style.top = `${top}px`;
55
- this.tooltip.style.left = `${left}px`;
56
- const { caretLeft, caretTop } = getCaretPosition({
57
- placement,
58
- tooltipRect,
59
- triggerRect,
60
- caretSize: this.caretSize,
61
- left,
62
- top
63
- });
64
- this.caret.style.left = `${caretLeft}px`;
65
- this.caret.style.top = `${caretTop}px`;
66
- };
67
- this.showTooltip = () => {
68
- const trimmedContent = this.content.trim();
69
- if (!trimmedContent && !this.hasTooltipSlot) {
70
- return;
71
- }
72
- if (!this.disabled && isInViewport(this.triggerContainer)) {
73
- this.emit('nile-show');
74
- this.open = true;
75
- this.updateComplete.then(() => {
76
- this.updateTooltipPosition();
77
- this.emit('nile-after-show');
78
- });
79
- }
80
- else {
81
- this.open = false;
82
- }
83
- };
84
- this.hideTooltip = () => {
85
- this.emit('nile-hide');
86
- this.open = false;
87
- setTimeout(() => {
88
- this.emit('nile-after-hide');
89
- }, 200);
90
- };
91
- this.handleMouseOver = () => {
92
- if (this.trigger.includes('hover')) {
93
- clearTimeout(this.hoverTimeout);
94
- this.hoverTimeout = window.setTimeout(() => this.showTooltip(), 150);
95
- }
96
- };
97
- this.handleMouseOut = () => {
98
- if (this.trigger.includes('hover')) {
99
- clearTimeout(this.hoverTimeout);
100
- this.hoverTimeout = window.setTimeout(() => this.hideTooltip(), 0);
101
- }
102
- };
103
- this.handleClick = () => {
104
- if (this.trigger.includes('click')) {
105
- if (!this.open && isInViewport(this.triggerContainer)) {
106
- this.showTooltip();
107
- }
108
- else {
109
- this.hideTooltip();
110
- }
111
- }
112
- };
113
- this.handleFocus = () => {
114
- if (this.trigger.includes('focus')) {
115
- this.showTooltip();
116
- }
117
- };
118
- this.handleBlur = () => {
119
- if (this.trigger.includes('focus')) {
120
- this.hideTooltip();
121
- }
122
- };
123
57
  }
58
+ /**
59
+ * The styles for Tooltip
60
+ * @remarks If you are extending this class you can extend the base styles with super. Eg `return [super(), myCustomStyles]`
61
+ */
124
62
  static get styles() {
125
63
  return [styles];
126
64
  }
127
65
  connectedCallback() {
128
66
  super.connectedCallback();
129
- this.originalPlacement = this.placement;
130
- window.addEventListener('resize', this.updateTooltipPosition);
131
- window.addEventListener('scroll', this.updateTooltipPosition, true);
132
- }
133
- updated(changedProps) {
134
- super.updated?.(changedProps);
135
- const validPlacements = [
136
- 'top', 'top-start', 'top-end',
137
- 'right', 'right-start', 'right-end',
138
- 'bottom', 'bottom-start', 'bottom-end',
139
- 'left', 'left-start', 'left-end'
140
- ];
141
- if (!validPlacements.includes(this.placement)) {
142
- console.warn(`[nile-tooltip] Invalid placement "${this.placement}", defaulting to "bottom".`);
143
- this.placement = 'bottom';
144
- }
145
- if (!validPlacements.includes(this.originalPlacement)) {
146
- this.originalPlacement = 'bottom';
67
+ this.handleBlur = this.handleBlur.bind(this);
68
+ this.handleClick = this.handleClick.bind(this);
69
+ this.handleFocus = this.handleFocus.bind(this);
70
+ this.handleKeyDown = this.handleKeyDown.bind(this);
71
+ this.handleMouseOver = this.handleMouseOver.bind(this);
72
+ this.handleMouseOut = this.handleMouseOut.bind(this);
73
+ this.updateComplete.then(() => {
74
+ this.addEventListener('blur', this.handleBlur, true);
75
+ this.addEventListener('focus', this.handleFocus, true);
76
+ this.addEventListener('click', this.handleClick);
77
+ this.addEventListener('keydown', this.handleKeyDown);
78
+ this.addEventListener('mouseover', this.handleMouseOver);
79
+ this.addEventListener('mouseout', this.handleMouseOut);
80
+ });
81
+ }
82
+ firstUpdated() {
83
+ this.body.hidden = !this.open;
84
+ // If the tooltip is visible on init, update its position
85
+ if (this.open) {
86
+ this.popup.active = true;
87
+ this.popup.reposition();
147
88
  }
148
89
  }
149
90
  disconnectedCallback() {
150
91
  super.disconnectedCallback();
151
- window.removeEventListener('resize', this.updateTooltipPosition);
152
- window.removeEventListener('scroll', this.updateTooltipPosition, true);
92
+ this.removeEventListener('blur', this.handleBlur, true);
93
+ this.removeEventListener('focus', this.handleFocus, true);
94
+ this.removeEventListener('click', this.handleClick);
95
+ this.removeEventListener('keydown', this.handleKeyDown);
96
+ this.removeEventListener('mouseover', this.handleMouseOver);
97
+ this.removeEventListener('mouseout', this.handleMouseOut);
98
+ }
99
+ handleBlur() {
100
+ if (this.hasTrigger('focus')) {
101
+ this.hide();
102
+ }
103
+ }
104
+ handleClick() {
105
+ if (this.hasTrigger('click')) {
106
+ if (this.open) {
107
+ this.hide();
108
+ }
109
+ else {
110
+ this.show();
111
+ }
112
+ }
113
+ }
114
+ handleFocus() {
115
+ if (this.hasTrigger('focus')) {
116
+ this.show();
117
+ }
118
+ }
119
+ handleKeyDown(event) {
120
+ // Pressing escape when the target element has focus should dismiss the tooltip
121
+ if (this.open && event.key === 'Escape') {
122
+ event.stopPropagation();
123
+ this.hide();
124
+ }
125
+ }
126
+ handleMouseOver() {
127
+ if (this.hasTrigger('hover')) {
128
+ const delay = parseDuration(getComputedStyle(this).getPropertyValue('--show-delay'));
129
+ clearTimeout(this.hoverTimeout);
130
+ this.hoverTimeout = window.setTimeout(() => this.show(), delay);
131
+ }
132
+ }
133
+ handleMouseOut() {
134
+ if (this.hasTrigger('hover')) {
135
+ const delay = parseDuration(getComputedStyle(this).getPropertyValue('--hide-delay'));
136
+ clearTimeout(this.hoverTimeout);
137
+ this.hoverTimeout = window.setTimeout(() => this.hide(), delay);
138
+ }
139
+ }
140
+ hasTrigger(triggerType) {
141
+ const triggers = this.trigger.split(' ');
142
+ return triggers.includes(triggerType);
143
+ }
144
+ async handleOpenChange() {
145
+ if (this.open) {
146
+ if (this.disabled) {
147
+ return;
148
+ }
149
+ // Show
150
+ this.emit('nile-show');
151
+ await stopAnimations(this.body);
152
+ this.body.hidden = false;
153
+ this.popup.active = true;
154
+ const { keyframes, options } = getAnimation(this, 'tooltip.show', {
155
+ dir: '',
156
+ });
157
+ await animateTo(this.popup.popup, keyframes, options);
158
+ this.emit('nile-after-show');
159
+ }
160
+ else {
161
+ // Hide
162
+ this.emit('nile-hide');
163
+ await stopAnimations(this.body);
164
+ const { keyframes, options } = getAnimation(this, 'tooltip.hide', {
165
+ dir: '',
166
+ });
167
+ await animateTo(this.popup.popup, keyframes, options);
168
+ this.popup.active = false;
169
+ this.body.hidden = true;
170
+ this.emit('nile-after-hide');
171
+ }
153
172
  }
154
- handleTooltipSlotChange() {
155
- const nodes = this.tooltipSlot.assignedNodes({ flatten: true });
156
- this.hasTooltipSlot = nodes.length > 0;
157
- this.requestUpdate();
173
+ async handleOptionsChange() {
174
+ if (this.hasUpdated) {
175
+ await this.updateComplete;
176
+ this.popup.reposition();
177
+ }
178
+ }
179
+ handleDisabledChange() {
180
+ if (this.disabled && this.open) {
181
+ this.hide();
182
+ }
183
+ }
184
+ /** Shows the tooltip. */
185
+ async show() {
186
+ if (this.open || !this.content?.trim().length) {
187
+ return undefined;
188
+ }
189
+ this.open = true;
190
+ return waitForEvent(this, 'nile-after-show');
191
+ }
192
+ /** Hides the tooltip */
193
+ async hide() {
194
+ if (!this.open) {
195
+ return undefined;
196
+ }
197
+ this.open = false;
198
+ return waitForEvent(this, 'nile-after-hide');
158
199
  }
159
200
  render() {
160
201
  return html `
161
- <div
202
+ <nile-popup
203
+ part="base"
204
+ exportparts="
205
+ popup:base__popup,
206
+ arrow:base__arrow
207
+ "
162
208
  class=${classMap({
163
209
  tooltip: true,
164
- 'tooltip__body--large': this.size === 'large',
210
+ 'tooltip--open': this.open,
165
211
  })}
166
- id="tooltip"
212
+ placement=${this.placement}
213
+ distance=${this.distance}
214
+ skidding=${this.skidding}
215
+ strategy=${this.hoist ? 'fixed' : 'absolute'}
216
+ flip
217
+ shift
218
+ arrow
167
219
  >
168
- <div class="tooltip-content" part="content">
169
- <slot name="content" @slotchange=${this.handleTooltipSlotChange}></slot>
170
- ${!this.hasTooltipSlot ? html `${this.content}` : null}
171
- </div>
172
- <div class="tooltip-caret" style="--caret-size: ${this.caretSize}px;"></div>
173
- </div>
220
+ <slot slot="anchor" aria-describedby="tooltip"></slot>
174
221
 
175
- <div
176
- class="trigger-container"
177
- tabindex="0"
178
- @mouseover=${this.handleMouseOver}
179
- @mouseout=${this.handleMouseOut}
180
- @click=${this.handleClick}
181
- @focusin=${this.handleFocus}
182
- @focusout=${this.handleBlur}
183
- aria-describedby="tooltip"
184
- >
185
- <slot></slot>
186
- </div>
222
+ <slot
223
+ name="content"
224
+ part="body"
225
+ id="tooltip"
226
+ class=${classMap({
227
+ tooltip__body: true,
228
+ 'tooltip__body--large': this.size === 'large',
229
+ })}
230
+ role="tooltip"
231
+ aria-live=${this.open ? 'polite' : 'off'}
232
+ >
233
+ ${this.content}
234
+ </slot>
235
+ </nile-popup>
187
236
  `;
188
237
  }
189
238
  };
190
239
  __decorate([
191
- property({ type: String })
240
+ query('slot:not([name])')
241
+ ], NileTooltip.prototype, "defaultSlot", void 0);
242
+ __decorate([
243
+ query('.tooltip__body')
244
+ ], NileTooltip.prototype, "body", void 0);
245
+ __decorate([
246
+ query('nile-popup')
247
+ ], NileTooltip.prototype, "popup", void 0);
248
+ __decorate([
249
+ property({ type: String, reflect: true })
192
250
  ], NileTooltip.prototype, "content", void 0);
193
251
  __decorate([
194
252
  property({ reflect: true })
195
253
  ], NileTooltip.prototype, "size", void 0);
196
254
  __decorate([
197
- property({ type: String })
255
+ property()
198
256
  ], NileTooltip.prototype, "placement", void 0);
199
257
  __decorate([
200
258
  property({ type: Boolean, reflect: true })
201
259
  ], NileTooltip.prototype, "disabled", void 0);
202
- __decorate([
203
- property({ type: Boolean, reflect: true })
204
- ], NileTooltip.prototype, "open", void 0);
205
- __decorate([
206
- property()
207
- ], NileTooltip.prototype, "trigger", void 0);
208
260
  __decorate([
209
261
  property({ type: Number })
210
262
  ], NileTooltip.prototype, "distance", void 0);
263
+ __decorate([
264
+ property({ type: Boolean, reflect: true })
265
+ ], NileTooltip.prototype, "open", void 0);
211
266
  __decorate([
212
267
  property({ type: Number })
213
268
  ], NileTooltip.prototype, "skidding", void 0);
214
269
  __decorate([
215
- property({ type: Boolean, reflect: true })
216
- ], NileTooltip.prototype, "hoist", void 0);
270
+ property()
271
+ ], NileTooltip.prototype, "trigger", void 0);
217
272
  __decorate([
218
- query('.tooltip')
219
- ], NileTooltip.prototype, "tooltip", void 0);
273
+ property({ type: Boolean })
274
+ ], NileTooltip.prototype, "hoist", void 0);
220
275
  __decorate([
221
- query('.trigger-container')
222
- ], NileTooltip.prototype, "triggerContainer", void 0);
276
+ watch('open', { waitUntilFirstUpdate: true })
277
+ ], NileTooltip.prototype, "handleOpenChange", null);
223
278
  __decorate([
224
- query('.tooltip-caret')
225
- ], NileTooltip.prototype, "caret", void 0);
279
+ watch(['content', 'distance', 'hoist', 'placement', 'skidding'])
280
+ ], NileTooltip.prototype, "handleOptionsChange", null);
226
281
  __decorate([
227
- query('slot[name="content"]')
228
- ], NileTooltip.prototype, "tooltipSlot", void 0);
282
+ watch('disabled')
283
+ ], NileTooltip.prototype, "handleDisabledChange", null);
229
284
  NileTooltip = __decorate([
230
285
  customElement('nile-tooltip')
231
286
  ], NileTooltip);
232
287
  export { NileTooltip };
288
+ setDefaultAnimation('tooltip.show', {
289
+ keyframes: [
290
+ { opacity: 0, scale: 0.8 },
291
+ { opacity: 1, scale: 1 },
292
+ ],
293
+ options: { duration: 150, easing: 'ease' },
294
+ });
295
+ setDefaultAnimation('tooltip.hide', {
296
+ keyframes: [
297
+ { opacity: 1, scale: 1 },
298
+ { opacity: 0, scale: 0.8 },
299
+ ],
300
+ options: { duration: 150, easing: 'ease' },
301
+ });
302
+ export default NileTooltip;
233
303
  //# sourceMappingURL=nile-tooltip.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nile-tooltip.js","sourceRoot":"","sources":["../../../src/nile-tooltip/nile-tooltip.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Copyright Aquera Inc 2023\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { LitElement, html, css, CSSResultArray } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styles } from './nile-tooltip.css';\nimport NileElement from '../internal/nile-element';\nimport { isInViewport, getValidTooltipPosition, getCaretPosition } from './nile-tooltip-utils';\n/**\n * Nile icon component.\n *\n * @tag nile-tooltip\n *\n */\n\n@customElement('nile-tooltip')\nexport class NileTooltip extends NileElement {\n @property({ type: String }) content = '';\n @property({ reflect: true }) size: 'small' | 'large' = 'small';\n @property({ type: String })\n placement:\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end' = 'bottom';\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean, reflect: true }) open = false;\n /**\n * Controls how the tooltip is activated. Possible options include `click`, `hover`, `focus`, and `manual`. Multiple\n * options can be passed by separating them with a space. When manual is used, the tooltip must be activated\n * programmatically.\n */\n @property() trigger = 'hover focus'; \n @property({ type: Number }) distance = 8;\n private readonly SHIFT_OFFSET = 16;\n/** The distance in pixels from which to offset the tooltip along its target. */\n @property({ type: Number }) skidding = 0;\n @property({ type: Boolean, reflect: true }) hoist = false;\n\n @query('.tooltip') tooltip!: HTMLElement;\n @query('.trigger-container') triggerContainer!: HTMLElement;\n @query('.tooltip-caret') caret!: HTMLElement;\n @query('slot[name=\"content\"]') tooltipSlot!: HTMLSlotElement;\n\n private hasTooltipSlot = false;\n private hoverTimeout: number = 0;\n private caretSize = 6;\n private originalPlacement: string = this.placement;\n\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.originalPlacement = this.placement;\n window.addEventListener('resize', this.updateTooltipPosition);\n window.addEventListener('scroll', this.updateTooltipPosition, true);\n }\n\n updated(changedProps: Map<string, unknown>) {\n super.updated?.(changedProps);\n\n const validPlacements = [\n 'top', 'top-start', 'top-end',\n 'right', 'right-start', 'right-end',\n 'bottom', 'bottom-start', 'bottom-end',\n 'left', 'left-start', 'left-end'\n ];\n\n if (!validPlacements.includes(this.placement)) {\n console.warn(`[nile-tooltip] Invalid placement \"${this.placement}\", defaulting to \"bottom\".`);\n this.placement = 'bottom';\n }\n\n if (!validPlacements.includes(this.originalPlacement)) {\n this.originalPlacement = 'bottom';\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener('resize', this.updateTooltipPosition);\n window.removeEventListener('scroll', this.updateTooltipPosition, true);\n }\n\n private handleTooltipSlotChange() {\n const nodes = this.tooltipSlot.assignedNodes({ flatten: true });\n this.hasTooltipSlot = nodes.length > 0;\n this.requestUpdate();\n }\n\n private updateTooltipPosition = () => {\n if (!isInViewport(this.triggerContainer)) {\n this.open = false;\n return;\n }\n\n const triggerRect = this.triggerContainer.getBoundingClientRect();\n const tooltipRect = this.tooltip.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const { top, left, placement } = getValidTooltipPosition(\n triggerRect,\n tooltipRect,\n this.originalPlacement,\n this.distance,\n this.skidding,\n this.caretSize,\n viewportWidth,\n viewportHeight\n );\n\n this.setAttribute('placement', placement);\n this.tooltip.style.top = `${top}px`;\n this.tooltip.style.left = `${left}px`;\n\n const { caretLeft, caretTop } = getCaretPosition({\n placement,\n tooltipRect,\n triggerRect,\n caretSize: this.caretSize,\n left,\n top\n });\n\n this.caret.style.left = `${caretLeft}px`;\n this.caret.style.top = `${caretTop}px`;\n };\n\n private showTooltip = () => {\n const trimmedContent = this.content.trim();\n if (!trimmedContent && !this.hasTooltipSlot) {\n return;\n }\n if (!this.disabled && isInViewport(this.triggerContainer)) {\n this.emit('nile-show');\n this.open = true;\n this.updateComplete.then(() => {\n this.updateTooltipPosition();\n this.emit('nile-after-show');\n });\n } else {\n this.open = false;\n }\n };\n\n private hideTooltip = () => {\n this.emit('nile-hide');\n this.open = false;\n setTimeout(() => {\n this.emit('nile-after-hide');\n }, 200);\n };\n\n private handleMouseOver = () => {\n if (this.trigger.includes('hover')) {\n clearTimeout(this.hoverTimeout);\n this.hoverTimeout = window.setTimeout(() => this.showTooltip(), 150);\n }\n };\n\n private handleMouseOut = () => {\n if (this.trigger.includes('hover')) {\n clearTimeout(this.hoverTimeout);\n this.hoverTimeout = window.setTimeout(() => this.hideTooltip(), 0);\n }\n };\n\n private handleClick = () => {\n if (this.trigger.includes('click')) {\n if (!this.open && isInViewport(this.triggerContainer)) {\n this.showTooltip();\n } else {\n this.hideTooltip();\n }\n }\n };\n\n private handleFocus = () => {\n if (this.trigger.includes('focus')) {\n this.showTooltip();\n }\n };\n\n private handleBlur = () => {\n if (this.trigger.includes('focus')) {\n this.hideTooltip();\n }\n };\n\n render() {\n return html`\n <div\n class=${classMap({\n tooltip: true,\n 'tooltip__body--large': this.size === 'large',\n })}\n id=\"tooltip\"\n >\n <div class=\"tooltip-content\" part=\"content\">\n <slot name=\"content\" @slotchange=${this.handleTooltipSlotChange}></slot>\n ${!this.hasTooltipSlot ? html`${this.content}` : null}\n </div>\n <div class=\"tooltip-caret\" style=\"--caret-size: ${this.caretSize}px;\"></div>\n </div>\n\n <div\n class=\"trigger-container\"\n tabindex=\"0\"\n @mouseover=${this.handleMouseOver}\n @mouseout=${this.handleMouseOut}\n @click=${this.handleClick}\n @focusin=${this.handleFocus}\n @focusout=${this.handleBlur}\n aria-describedby=\"tooltip\"\n >\n <slot></slot>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-tooltip': NileTooltip;\n }\n}\n\n"]}
1
+ {"version":3,"file":"nile-tooltip.js","sourceRoot":"","sources":["../../../src/nile-tooltip/nile-tooltip.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,8DAA8D;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,WAAW,MAAM,0BAA0B,CAAC;AAGnD;;;;;GAKG;AAEI,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,WAAW;IAArC;;QAgBL,0FAA0F;QAC/C,YAAO,GAAG,EAAE,CAAC;QAExD,gDAAgD;QACnB,SAAI,GAAsB,OAAO,CAAC;QAE/D;;;WAGG;QACS,cAAS,GAYJ,KAAK,CAAC;QAEvB,4DAA4D;QAChB,aAAQ,GAAG,KAAK,CAAC;QAE7D,oFAAoF;QACxD,aAAQ,GAAG,CAAC,CAAC;QAEzC,uGAAuG;QAC3D,SAAI,GAAG,KAAK,CAAC;QAEzD,gFAAgF;QACpD,aAAQ,GAAG,CAAC,CAAC;QAEzC;;;;WAIG;QACS,YAAO,GAAG,aAAa,CAAC;QAEpC;;;;WAIG;QAC0B,UAAK,GAAG,KAAK,CAAC;IA4M7C,CAAC;IA3QC;;;OAGG;IACI,MAAM,KAAK,MAAM;QACtB,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IA2DD,iBAAiB;QACf,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAErD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACrD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YACvD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACjD,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACzD,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAE9B,yDAAyD;QACzD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5D,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5D,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,KAAoB;QACxC,+EAA+E;QAC/E,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACxC,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,aAAa,CACzB,gBAAgB,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,cAAc,CAAC,CACxD,CAAC;YACF,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,aAAa,CACzB,gBAAgB,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,cAAc,CAAC,CACxD,CAAC;YACF,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,WAAmB;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAGK,AAAN,KAAK,CAAC,gBAAgB;QACpB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YAED,OAAO;YACP,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEvB,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;YACzB,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE;gBAChE,GAAG,EAAE,EAAE;aACR,CAAC,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAEtD,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,OAAO;YACP,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEvB,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE;gBAChE,GAAG,EAAE,EAAE;aACR,CAAC,CAAC;YACH,MAAM,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YAExB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAGK,AAAN,KAAK,CAAC,mBAAmB;QACvB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAGD,oBAAoB;QAClB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YAC9C,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,OAAO,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC/C,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,OAAO,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;;;;;gBAOC,QAAQ,CAAC;YACf,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,IAAI,CAAC,IAAI;SAC3B,CAAC;oBACU,IAAI,CAAC,SAAS;mBACf,IAAI,CAAC,QAAQ;mBACb,IAAI,CAAC,QAAQ;mBACb,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;;;;;;;;;;;kBAWlC,QAAQ,CAAC;YACf,aAAa,EAAE,IAAI;YACnB,sBAAsB,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO;SAC9C,CAAC;;sBAEU,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK;;YAEtC,IAAI,CAAC,OAAO;;;KAGnB,CAAC;IACJ,CAAC;CACF,CAAA;AAhQ4B;IAA1B,KAAK,CAAC,kBAAkB,CAAC;gDAA8B;AAC/B;IAAxB,KAAK,CAAC,gBAAgB,CAAC;yCAAmB;AACtB;IAApB,KAAK,CAAC,YAAY,CAAC;0CAAkB;AAGK;IAA1C,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;4CAAc;AAG3B;IAA5B,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;yCAAmC;AAMnD;IAAX,QAAQ,EAAE;8CAYY;AAGqB;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;6CAAkB;AAGjC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAc;AAGG;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;yCAAc;AAG7B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAc;AAO7B;IAAX,QAAQ,EAAE;4CAAyB;AAOP;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0CAAe;AAiGrC;IADL,KAAK,CAAC,MAAM,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;mDAiC7C;AAGK;IADL,KAAK,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;sDAMhE;AAGD;IADC,KAAK,CAAC,UAAU,CAAC;uDAKjB;AAhNU,WAAW;IADvB,aAAa,CAAC,cAAc,CAAC;GACjB,WAAW,CA4QvB;;AAED,mBAAmB,CAAC,cAAc,EAAE;IAClC,SAAS,EAAE;QACT,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;QAC1B,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KACzB;IACD,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;CAC3C,CAAC,CAAC;AAEH,mBAAmB,CAAC,cAAc,EAAE;IAClC,SAAS,EAAE;QACT,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;QACxB,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;KAC3B;IACD,OAAO,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE;CAC3C,CAAC,CAAC;AAEH,eAAe,WAAW,CAAC","sourcesContent":["/**\n * Copyright Aquera Inc 2023\n *\n * This source code is licensed under the BSD-3-Clause license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { LitElement, CSSResultArray, TemplateResult } from 'lit';\nimport { styles } from './nile-tooltip.css';\nimport '../nile-popup/nile-popup';\nimport { animateTo, parseDuration, stopAnimations } from '../internal/animate';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport {\n getAnimation,\n setDefaultAnimation,\n} from '../utilities/animation-registry';\nimport { html } from 'lit';\n// import { LocalizeController } from '../utilities/localize';\nimport { waitForEvent } from '../internal/event';\nimport { watch } from '../internal/watch';\nimport NileElement from '../internal/nile-element';\nimport type { CSSResultGroup } from 'lit';\nimport type NilePopup from '../nile-popup/nile-popup';\n/**\n * Nile icon component.\n *\n * @tag nile-tooltip\n *\n */\n@customElement('nile-tooltip')\nexport class NileTooltip extends NileElement {\n /**\n * The styles for Tooltip\n * @remarks If you are extending this class you can extend the base styles with super. Eg `return [super(), myCustomStyles]`\n */\n public static get styles(): CSSResultArray {\n return [styles];\n }\n\n private hoverTimeout: number;\n // private readonly localize = new LocalizeController(this);\n\n @query('slot:not([name])') defaultSlot: HTMLSlotElement;\n @query('.tooltip__body') body: HTMLElement;\n @query('nile-popup') popup: NilePopup;\n\n /** The tooltip's content. If you need to display HTML, use the `content` slot instead. */\n @property({ type: String, reflect: true }) content = '';\n\n /** Size Property to decide the tool tip size */\n @property({ reflect: true }) size: 'small' | 'large' = 'small';\n\n /**\n * The preferred placement of the tooltip. Note that the actual placement may vary as needed to keep the tooltip\n * inside of the viewport.\n */\n @property() placement:\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'right'\n | 'right-start'\n | 'right-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'left-start'\n | 'left-end' = 'top';\n\n /** Disables the tooltip so it won't show when triggered. */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** The distance in pixels from which to offset the tooltip away from its target. */\n @property({ type: Number }) distance = 8;\n\n /** Indicates whether or not the tooltip is open. You can use this in lieu of the show/hide methods. */\n @property({ type: Boolean, reflect: true }) open = false;\n\n /** The distance in pixels from which to offset the tooltip along its target. */\n @property({ type: Number }) skidding = 0;\n\n /**\n * Controls how the tooltip is activated. Possible options include `click`, `hover`, `focus`, and `manual`. Multiple\n * options can be passed by separating them with a space. When manual is used, the tooltip must be activated\n * programmatically.\n */\n @property() trigger = 'hover focus';\n\n /**\n * Enable this option to prevent the tooltip from being clipped when the component is placed inside a container with\n * `overflow: auto|hidden|scroll`. Hoisting uses a fixed positioning strategy that works in many, but not all,\n * scenarios.\n */\n @property({ type: Boolean }) hoist = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.handleBlur = this.handleBlur.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMouseOver = this.handleMouseOver.bind(this);\n this.handleMouseOut = this.handleMouseOut.bind(this);\n\n this.updateComplete.then(() => {\n this.addEventListener('blur', this.handleBlur, true);\n this.addEventListener('focus', this.handleFocus, true);\n this.addEventListener('click', this.handleClick);\n this.addEventListener('keydown', this.handleKeyDown);\n this.addEventListener('mouseover', this.handleMouseOver);\n this.addEventListener('mouseout', this.handleMouseOut);\n });\n }\n\n firstUpdated() {\n this.body.hidden = !this.open;\n\n // If the tooltip is visible on init, update its position\n if (this.open) {\n this.popup.active = true;\n this.popup.reposition();\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('blur', this.handleBlur, true);\n this.removeEventListener('focus', this.handleFocus, true);\n this.removeEventListener('click', this.handleClick);\n this.removeEventListener('keydown', this.handleKeyDown);\n this.removeEventListener('mouseover', this.handleMouseOver);\n this.removeEventListener('mouseout', this.handleMouseOut);\n }\n\n private handleBlur() {\n if (this.hasTrigger('focus')) {\n this.hide();\n }\n }\n\n private handleClick() {\n if (this.hasTrigger('click')) {\n if (this.open) {\n this.hide();\n } else {\n this.show();\n }\n }\n }\n\n private handleFocus() {\n if (this.hasTrigger('focus')) {\n this.show();\n }\n }\n\n private handleKeyDown(event: KeyboardEvent) {\n // Pressing escape when the target element has focus should dismiss the tooltip\n if (this.open && event.key === 'Escape') {\n event.stopPropagation();\n this.hide();\n }\n }\n\n private handleMouseOver() {\n if (this.hasTrigger('hover')) {\n const delay = parseDuration(\n getComputedStyle(this).getPropertyValue('--show-delay')\n );\n clearTimeout(this.hoverTimeout);\n this.hoverTimeout = window.setTimeout(() => this.show(), delay);\n }\n }\n\n private handleMouseOut() {\n if (this.hasTrigger('hover')) {\n const delay = parseDuration(\n getComputedStyle(this).getPropertyValue('--hide-delay')\n );\n clearTimeout(this.hoverTimeout);\n this.hoverTimeout = window.setTimeout(() => this.hide(), delay);\n }\n }\n\n private hasTrigger(triggerType: string) {\n const triggers = this.trigger.split(' ');\n return triggers.includes(triggerType);\n }\n\n @watch('open', { waitUntilFirstUpdate: true })\n async handleOpenChange() {\n if (this.open) {\n if (this.disabled) {\n return;\n }\n\n // Show\n this.emit('nile-show');\n\n await stopAnimations(this.body);\n this.body.hidden = false;\n this.popup.active = true;\n const { keyframes, options } = getAnimation(this, 'tooltip.show', {\n dir: '',\n });\n await animateTo(this.popup.popup, keyframes, options);\n\n this.emit('nile-after-show');\n } else {\n // Hide\n this.emit('nile-hide');\n\n await stopAnimations(this.body);\n const { keyframes, options } = getAnimation(this, 'tooltip.hide', {\n dir: '',\n });\n await animateTo(this.popup.popup, keyframes, options);\n this.popup.active = false;\n this.body.hidden = true;\n\n this.emit('nile-after-hide');\n }\n }\n\n @watch(['content', 'distance', 'hoist', 'placement', 'skidding'])\n async handleOptionsChange() {\n if (this.hasUpdated) {\n await this.updateComplete;\n this.popup.reposition();\n }\n }\n\n @watch('disabled')\n handleDisabledChange() {\n if (this.disabled && this.open) {\n this.hide();\n }\n }\n\n /** Shows the tooltip. */\n async show() {\n if (this.open || !this.content?.trim().length) {\n return undefined;\n }\n\n this.open = true;\n return waitForEvent(this, 'nile-after-show');\n }\n\n /** Hides the tooltip */\n async hide() {\n if (!this.open) {\n return undefined;\n }\n\n this.open = false;\n return waitForEvent(this, 'nile-after-hide');\n }\n\n render() {\n return html`\n <nile-popup\n part=\"base\"\n exportparts=\"\n popup:base__popup,\n arrow:base__arrow\n \"\n class=${classMap({\n tooltip: true,\n 'tooltip--open': this.open,\n })}\n placement=${this.placement}\n distance=${this.distance}\n skidding=${this.skidding}\n strategy=${this.hoist ? 'fixed' : 'absolute'}\n flip\n shift\n arrow\n >\n <slot slot=\"anchor\" aria-describedby=\"tooltip\"></slot>\n\n <slot\n name=\"content\"\n part=\"body\"\n id=\"tooltip\"\n class=${classMap({\n tooltip__body: true,\n 'tooltip__body--large': this.size === 'large',\n })}\n role=\"tooltip\"\n aria-live=${this.open ? 'polite' : 'off'}\n >\n ${this.content}\n </slot>\n </nile-popup>\n `;\n }\n}\n\nsetDefaultAnimation('tooltip.show', {\n keyframes: [\n { opacity: 0, scale: 0.8 },\n { opacity: 1, scale: 1 },\n ],\n options: { duration: 150, easing: 'ease' },\n});\n\nsetDefaultAnimation('tooltip.hide', {\n keyframes: [\n { opacity: 1, scale: 1 },\n { opacity: 0, scale: 0.8 },\n ],\n options: { duration: 150, easing: 'ease' },\n});\n\nexport default NileTooltip;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'nile-tooltip': NileTooltip;\n }\n}\n"]}