@aquera/nile-elements 0.1.31 → 0.1.32-beta-1.1

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 (168) hide show
  1. package/README.md +21 -5
  2. package/demo/index.html +5 -9
  3. package/dist/axe.min-5bf06036.esm.js +12 -0
  4. package/dist/axe.min-ff35bfba.cjs.js +12 -0
  5. package/dist/axe.min-ff35bfba.cjs.js.map +1 -0
  6. package/dist/{fixture-161dee0b.cjs.js → fixture-3acb409b.cjs.js} +2 -2
  7. package/dist/{fixture-161dee0b.cjs.js.map → fixture-3acb409b.cjs.js.map} +1 -1
  8. package/dist/{fixture-372df3b0.esm.js → fixture-db35a8ae.esm.js} +1 -1
  9. package/dist/index.cjs.js +1 -1
  10. package/dist/index.esm.js +1 -1
  11. package/dist/internal/animate.cjs.js +1 -1
  12. package/dist/internal/animate.cjs.js.map +1 -1
  13. package/dist/internal/animate.esm.js +1 -1
  14. package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
  15. package/dist/nile-accordion/nile-accordian.test.esm.js +1 -1
  16. package/dist/nile-accordion/nile-accordion.cjs.js +1 -1
  17. package/dist/nile-accordion/nile-accordion.cjs.js.map +1 -1
  18. package/dist/nile-accordion/nile-accordion.css.cjs.js +1 -1
  19. package/dist/nile-accordion/nile-accordion.css.cjs.js.map +1 -1
  20. package/dist/nile-accordion/nile-accordion.css.esm.js +1 -1
  21. package/dist/nile-accordion/nile-accordion.esm.js +4 -4
  22. package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
  23. package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
  24. package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
  25. package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
  26. package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
  27. package/dist/nile-badge/nile-badge.test.esm.js +1 -1
  28. package/dist/nile-button/nile-button.test.cjs.js +1 -1
  29. package/dist/nile-button/nile-button.test.esm.js +1 -1
  30. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
  31. package/dist/nile-button-toggle-group/nile-button-toggle-group.test.esm.js +1 -1
  32. package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
  33. package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
  34. package/dist/nile-card/nile-card.test.cjs.js +1 -1
  35. package/dist/nile-card/nile-card.test.esm.js +1 -1
  36. package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
  37. package/dist/nile-checkbox/nile-checkbox.test.esm.js +1 -1
  38. package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
  39. package/dist/nile-chip/nile-chip.test.esm.js +1 -1
  40. package/dist/nile-circular-progressbar/nile-circular-progressbar.css.cjs.js +1 -1
  41. package/dist/nile-circular-progressbar/nile-circular-progressbar.css.cjs.js.map +1 -1
  42. package/dist/nile-circular-progressbar/nile-circular-progressbar.css.esm.js +49 -49
  43. package/dist/nile-code-editor/extensionSetup.cjs.js +7 -7
  44. package/dist/nile-code-editor/extensionSetup.cjs.js.map +1 -1
  45. package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
  46. package/dist/nile-code-editor/nile-code-editor.cjs.js +2 -2
  47. package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
  48. package/dist/nile-code-editor/nile-code-editor.esm.js +2 -2
  49. package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
  50. package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
  51. package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
  52. package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
  53. package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
  54. package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
  55. package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
  56. package/dist/nile-empty-state/nile-empty-state.test.esm.js +1 -1
  57. package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
  58. package/dist/nile-error-message/nile-error-message.test.esm.js +1 -1
  59. package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
  60. package/dist/nile-form-group/nile-form-group.test.esm.js +1 -1
  61. package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
  62. package/dist/nile-form-help-text/nile-form-help-text.test.esm.js +1 -1
  63. package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
  64. package/dist/nile-hero/nile-hero.test.esm.js +1 -1
  65. package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
  66. package/dist/nile-icon/nile-icon.test.esm.js +1 -1
  67. package/dist/nile-input/nile-input.test.cjs.js +1 -1
  68. package/dist/nile-input/nile-input.test.esm.js +1 -1
  69. package/dist/nile-link/nile-link.test.cjs.js +1 -1
  70. package/dist/nile-link/nile-link.test.esm.js +1 -1
  71. package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
  72. package/dist/nile-loader/nile-loader.test.esm.js +1 -1
  73. package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
  74. package/dist/nile-popover/nile-popover.test.esm.js +1 -1
  75. package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
  76. package/dist/nile-popup/nile-popup.test.esm.js +1 -1
  77. package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
  78. package/dist/nile-progress-bar/nile-progress-bar.test.esm.js +1 -1
  79. package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
  80. package/dist/nile-radio/nile-radio.test.esm.js +1 -1
  81. package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
  82. package/dist/nile-radio-group/nile-radio-group.test.esm.js +1 -1
  83. package/dist/nile-select/nile-select.test.cjs.js +1 -1
  84. package/dist/nile-select/nile-select.test.esm.js +1 -1
  85. package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
  86. package/dist/nile-slide-toggle/nile-slide-toggle.test.esm.js +1 -1
  87. package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
  88. package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
  89. package/dist/nile-table/index.cjs.js +2 -0
  90. package/dist/nile-table/index.cjs.js.map +1 -0
  91. package/dist/nile-table/index.esm.js +1 -0
  92. package/dist/nile-table/nile-table.cjs.js +2 -0
  93. package/dist/nile-table/nile-table.cjs.js.map +1 -0
  94. package/dist/nile-table/nile-table.css.cjs.js +2 -0
  95. package/dist/nile-table/nile-table.css.cjs.js.map +1 -0
  96. package/dist/nile-table/nile-table.css.esm.js +6 -0
  97. package/dist/nile-table/nile-table.esm.js +3 -0
  98. package/dist/nile-table-body/nile-table-body.cjs.js +1 -1
  99. package/dist/nile-table-body/nile-table-body.cjs.js.map +1 -1
  100. package/dist/nile-table-body/nile-table-body.esm.js +2 -2
  101. package/dist/nile-table-cell-item/nile-table-cell-item.css.cjs.js +1 -1
  102. package/dist/nile-table-cell-item/nile-table-cell-item.css.cjs.js.map +1 -1
  103. package/dist/nile-table-cell-item/nile-table-cell-item.css.esm.js +4 -2
  104. package/dist/nile-table-header-item/nile-table-header-item.css.cjs.js +1 -1
  105. package/dist/nile-table-header-item/nile-table-header-item.css.cjs.js.map +1 -1
  106. package/dist/nile-table-header-item/nile-table-header-item.css.esm.js +2 -0
  107. package/dist/nile-table-row/nile-table-row.cjs.js.map +1 -1
  108. package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
  109. package/dist/nile-textarea/nile-textarea.test.esm.js +1 -1
  110. package/dist/nile-tooltip/index.cjs.js +1 -1
  111. package/dist/nile-tooltip/index.esm.js +1 -1
  112. package/dist/nile-tooltip/nile-tooltip.cjs.js +1 -1
  113. package/dist/nile-tooltip/nile-tooltip.cjs.js.map +1 -1
  114. package/dist/nile-tooltip/nile-tooltip.css.cjs.js +1 -1
  115. package/dist/nile-tooltip/nile-tooltip.css.cjs.js.map +1 -1
  116. package/dist/nile-tooltip/nile-tooltip.css.esm.js +115 -56
  117. package/dist/nile-tooltip/nile-tooltip.esm.js +13 -30
  118. package/dist/src/index.d.ts +1 -0
  119. package/dist/src/index.js +1 -0
  120. package/dist/src/index.js.map +1 -1
  121. package/dist/src/nile-accordion/nile-accordion.css.js +1 -1
  122. package/dist/src/nile-accordion/nile-accordion.css.js.map +1 -1
  123. package/dist/src/nile-accordion/nile-accordion.d.ts +6 -5
  124. package/dist/src/nile-accordion/nile-accordion.js +21 -8
  125. package/dist/src/nile-accordion/nile-accordion.js.map +1 -1
  126. package/dist/src/nile-circular-progressbar/nile-circular-progressbar.css.js +49 -49
  127. package/dist/src/nile-circular-progressbar/nile-circular-progressbar.css.js.map +1 -1
  128. package/dist/src/nile-table/index.d.ts +1 -0
  129. package/dist/src/nile-table/index.js +2 -0
  130. package/dist/src/nile-table/index.js.map +1 -0
  131. package/dist/src/nile-table/nile-table.css.d.ts +12 -0
  132. package/dist/src/nile-table/nile-table.css.js +18 -0
  133. package/dist/src/nile-table/nile-table.css.js.map +1 -0
  134. package/dist/src/nile-table/nile-table.d.ts +47 -0
  135. package/dist/src/nile-table/nile-table.js +137 -0
  136. package/dist/src/nile-table/nile-table.js.map +1 -0
  137. package/dist/src/nile-table-body/nile-table-body.d.ts +3 -1
  138. package/dist/src/nile-table-body/nile-table-body.js +9 -1
  139. package/dist/src/nile-table-body/nile-table-body.js.map +1 -1
  140. package/dist/src/nile-table-cell-item/nile-table-cell-item.css.js +4 -2
  141. package/dist/src/nile-table-cell-item/nile-table-cell-item.css.js.map +1 -1
  142. package/dist/src/nile-table-header-item/nile-table-header-item.css.js +2 -0
  143. package/dist/src/nile-table-header-item/nile-table-header-item.css.js.map +1 -1
  144. package/dist/src/nile-table-row/nile-table-row.js.map +1 -1
  145. package/dist/src/nile-tooltip/nile-tooltip.css.js +113 -54
  146. package/dist/src/nile-tooltip/nile-tooltip.css.js.map +1 -1
  147. package/dist/src/nile-tooltip/nile-tooltip.d.ts +22 -62
  148. package/dist/src/nile-tooltip/nile-tooltip.js +180 -244
  149. package/dist/src/nile-tooltip/nile-tooltip.js.map +1 -1
  150. package/dist/tsconfig.tsbuildinfo +1 -1
  151. package/package.json +3 -3
  152. package/src/index.ts +2 -1
  153. package/src/nile-accordion/nile-accordion.css.ts +1 -1
  154. package/src/nile-accordion/nile-accordion.ts +15 -4
  155. package/src/nile-circular-progressbar/nile-circular-progressbar.css.ts +55 -56
  156. package/src/nile-table/index.ts +1 -0
  157. package/src/nile-table/nile-table.css.ts +20 -0
  158. package/src/nile-table/nile-table.ts +154 -0
  159. package/src/nile-table-body/nile-table-body.ts +8 -2
  160. package/src/nile-table-cell-item/nile-table-cell-item.css.ts +4 -2
  161. package/src/nile-table-header-item/nile-table-header-item.css.ts +2 -0
  162. package/src/nile-table-row/nile-table-row.ts +1 -2
  163. package/src/nile-tooltip/nile-tooltip.css.ts +113 -54
  164. package/src/nile-tooltip/nile-tooltip.ts +207 -269
  165. package/vscode-html-custom-data.json +36 -18
  166. package/dist/axe.min-2b379f29.cjs.js +0 -12
  167. package/dist/axe.min-2b379f29.cjs.js.map +0 -1
  168. package/dist/axe.min-c2cd8733.esm.js +0 -12
@@ -1,324 +1,262 @@
1
- /**
2
- * Copyright Aquera Inc 2023
3
- *
4
- * This source code is licensed under the BSD-3-Clause license found in the
5
- * LICENSE file in the root directory of this source tree.
6
- */
7
-
8
- import { LitElement, CSSResultArray, TemplateResult } from 'lit';
9
- import { styles } from './nile-tooltip.css';
10
- import '../nile-popup/nile-popup';
11
- import { animateTo, parseDuration, stopAnimations } from '../internal/animate';
12
- import { classMap } from 'lit/directives/class-map.js';
1
+ import { LitElement, html, css, CSSResultArray } from 'lit';
13
2
  import { customElement, property, query } from 'lit/decorators.js';
14
- import {
15
- getAnimation,
16
- setDefaultAnimation,
17
- } from '../utilities/animation-registry';
18
- import { html } from 'lit';
19
- // import { LocalizeController } from '../utilities/localize';
20
- import { waitForEvent } from '../internal/event';
21
- import { watch } from '../internal/watch';
3
+ import { classMap } from 'lit/directives/class-map.js';
4
+ import { styles } from './nile-tooltip.css';
22
5
  import NileElement from '../internal/nile-element';
23
- import type { CSSResultGroup } from 'lit';
24
- import type NilePopup from '../nile-popup/nile-popup';
25
- /**
26
- * Nile icon component.
27
- *
28
- * @tag nile-tooltip
29
- *
30
- */
31
- @customElement('nile-tooltip')
32
- export class NileTooltip extends NileElement {
33
- /**
34
- * The styles for Tooltip
35
- * @remarks If you are extending this class you can extend the base styles with super. Eg `return [super(), myCustomStyles]`
36
- */
37
- public static get styles(): CSSResultArray {
38
- return [styles];
39
- }
40
-
41
- private hoverTimeout: number;
42
- // private readonly localize = new LocalizeController(this);
43
-
44
- @query('slot:not([name])') defaultSlot: HTMLSlotElement;
45
- @query('.tooltip__body') body: HTMLElement;
46
- @query('nile-popup') popup: NilePopup;
47
6
 
48
- /** The tooltip's content. If you need to display HTML, use the `content` slot instead. */
49
- @property({ type: String, reflect: true }) content = '';
7
+ type TooltipPlacement =
8
+ | 'top' | 'top-start' | 'top-end'
9
+ | 'right' | 'right-start' | 'right-end'
10
+ | 'bottom' | 'bottom-start' | 'bottom-end'
11
+ | 'left' | 'left-start' | 'left-end';
50
12
 
51
- /** Size Property to decide the tool tip size */
13
+ // CSS Anchor positiong
14
+ @customElement('nile-tooltip')
15
+ export class NileTooltip extends NileElement {
16
+ @property({ type: String }) content = '';
52
17
  @property({ reflect: true }) size: 'small' | 'large' = 'small';
53
-
54
- /**
55
- * The preferred placement of the tooltip. Note that the actual placement may vary as needed to keep the tooltip
56
- * inside of the viewport.
57
- */
58
- @property() placement:
59
- | 'top'
60
- | 'top-start'
61
- | 'top-end'
62
- | 'right'
63
- | 'right-start'
64
- | 'right-end'
65
- | 'bottom'
66
- | 'bottom-start'
67
- | 'bottom-end'
68
- | 'left'
69
- | 'left-start'
70
- | 'left-end' = 'top';
71
-
72
- /** Disables the tooltip so it won't show when triggered. */
18
+ @property({ type: String }) placement: TooltipPlacement = 'top';
73
19
  @property({ type: Boolean, reflect: true }) disabled = false;
74
-
75
- /** The distance in pixels from which to offset the tooltip away from its target. */
76
- @property({ type: Number }) distance = 8;
77
-
78
- /** Indicates whether or not the tooltip is open. You can use this in lieu of the show/hide methods. */
79
20
  @property({ type: Boolean, reflect: true }) open = false;
80
-
81
- /** The distance in pixels from which to offset the tooltip along its target. */
82
- @property({ type: Number }) skidding = 0;
83
-
84
- /**
85
- * Controls how the tooltip is activated. Possible options include `click`, `hover`, `focus`, and `manual`. Multiple
86
- * options can be passed by separating them with a space. When manual is used, the tooltip must be activated
87
- * programmatically.
88
- */
89
21
  @property() trigger = 'hover focus';
90
-
91
- /**
92
- * Enable this option to prevent the tooltip from being clipped when the component is placed inside a container with
93
- * `overflow: auto|hidden|scroll`. Hoisting uses a fixed positioning strategy that works in many, but not all,
94
- * scenarios.
95
- */
22
+ @property({ type: Number }) distance = 8;
23
+ @property({ type: Number }) skidding = 0;
96
24
  @property({ type: Boolean }) hoist = false;
97
25
 
98
- connectedCallback() {
99
- super.connectedCallback();
100
- this.handleBlur = this.handleBlur.bind(this);
101
- this.handleClick = this.handleClick.bind(this);
102
- this.handleFocus = this.handleFocus.bind(this);
103
- this.handleKeyDown = this.handleKeyDown.bind(this);
104
- this.handleMouseOver = this.handleMouseOver.bind(this);
105
- this.handleMouseOut = this.handleMouseOut.bind(this);
106
-
107
- this.updateComplete.then(() => {
108
- this.addEventListener('blur', this.handleBlur, true);
109
- this.addEventListener('focus', this.handleFocus, true);
110
- this.addEventListener('click', this.handleClick);
111
- this.addEventListener('keydown', this.handleKeyDown);
112
- this.addEventListener('mouseover', this.handleMouseOver);
113
- this.addEventListener('mouseout', this.handleMouseOut);
114
- });
115
- }
26
+ @query('.tooltip') tooltip!: HTMLElement;
27
+ @query('slot') slotElement!: HTMLSlotElement;
116
28
 
117
- firstUpdated() {
118
- this.body.hidden = !this.open;
29
+ private hoverTimeout: number;
119
30
 
120
- // If the tooltip is visible on init, update its position
121
- if (this.open) {
122
- this.popup.active = true;
123
- this.popup.reposition();
31
+ public static get styles(): CSSResultArray {
32
+ return [styles];
124
33
  }
34
+
35
+
36
+
37
+
38
+ connectedCallback() {
39
+ super.connectedCallback();
40
+ window.addEventListener('resize', this.updateTooltipPosition);
41
+ window.addEventListener('scroll', this.updateTooltipPosition, true);
125
42
  }
126
43
 
127
44
  disconnectedCallback() {
128
45
  super.disconnectedCallback();
129
- this.removeEventListener('blur', this.handleBlur, true);
130
- this.removeEventListener('focus', this.handleFocus, true);
131
- this.removeEventListener('click', this.handleClick);
132
- this.removeEventListener('keydown', this.handleKeyDown);
133
- this.removeEventListener('mouseover', this.handleMouseOver);
134
- this.removeEventListener('mouseout', this.handleMouseOut);
46
+ window.removeEventListener('resize', this.updateTooltipPosition);
47
+ window.removeEventListener('scroll', this.updateTooltipPosition, true);
135
48
  }
136
49
 
137
- private handleBlur() {
138
- if (this.hasTrigger('focus')) {
139
- this.hide();
140
- }
50
+ private getBasePlacement(placement: TooltipPlacement): 'top' | 'right' | 'bottom' | 'left' {
51
+ return placement.split('-')[0] as 'top' | 'right' | 'bottom' | 'left';
141
52
  }
142
53
 
143
- private handleClick() {
144
- if (this.hasTrigger('click')) {
145
- if (this.open) {
146
- this.hide();
147
- } else {
148
- this.show();
149
- }
150
- }
54
+ private getAlignmentModifier(placement: TooltipPlacement): 'start' | 'end' | null {
55
+ const parts = placement.split('-');
56
+ return parts.length > 1 ? parts[1] as 'start' | 'end' : null;
151
57
  }
152
58
 
153
- private handleFocus() {
154
- if (this.hasTrigger('focus')) {
155
- this.show();
59
+ private updateTooltipPosition = () => {
60
+ if (!this.tooltip || !this.open) return;
61
+
62
+ const triggerEl = this.slotElement.assignedElements()[0] as HTMLElement;
63
+ if (!triggerEl) return;
64
+
65
+
66
+
67
+ const triggerRect = triggerEl.getBoundingClientRect();
68
+ const tooltipRect = this.tooltip.getBoundingClientRect();
69
+ const viewportWidth = window.innerWidth;
70
+ const viewportHeight = window.innerHeight;
71
+
72
+ let top = 0, left = 0;
73
+ let finalPlacement = this.placement;
74
+ const basePlacement = this.getBasePlacement(this.placement);
75
+ const alignment = this.getAlignmentModifier(this.placement);
76
+
77
+
78
+ const fitsLeft = triggerRect.left - tooltipRect.width - this.distance > 0;
79
+ const fitsRight = triggerRect.right + tooltipRect.width + this.distance < viewportWidth;
80
+ const fitsBottom = triggerRect.bottom + tooltipRect.height + this.distance < viewportHeight;
81
+ const fitsTop = triggerRect.top - tooltipRect.height - this.distance > 0;
82
+
83
+
84
+ let finalBasePlacement = basePlacement;
85
+
86
+
87
+ if ((basePlacement === 'left' && !fitsLeft) || (basePlacement === 'right' && !fitsRight)) {
88
+ finalBasePlacement = fitsBottom ? 'bottom' : (fitsTop ? 'top' : 'bottom');
89
+ }
90
+
91
+ else if (basePlacement === 'top' && !fitsTop) {
92
+ finalBasePlacement = fitsBottom ? 'bottom' : (fitsLeft ? 'left' : 'right');
93
+ } else if (basePlacement === 'bottom' && !fitsBottom) {
94
+ finalBasePlacement = fitsTop ? 'top' : (fitsLeft ? 'left' : 'right');
156
95
  }
157
- }
158
96
 
159
- private handleKeyDown(event: KeyboardEvent) {
160
- // Pressing escape when the target element has focus should dismiss the tooltip
161
- if (this.open && event.key === 'Escape') {
162
- event.stopPropagation();
163
- this.hide();
97
+
98
+ let finalAlignment = alignment;
99
+
100
+
101
+ if ((basePlacement === 'left' || basePlacement === 'right') &&
102
+ (finalBasePlacement === 'top' || finalBasePlacement === 'bottom')) {
103
+
104
+ if (alignment === 'start') {
105
+ finalAlignment = 'start';
106
+ } else if (alignment === 'end') {
107
+ finalAlignment = 'end';
108
+ }
164
109
  }
165
- }
166
110
 
167
- private handleMouseOver() {
168
- if (this.hasTrigger('hover')) {
169
- const delay = parseDuration(
170
- getComputedStyle(this).getPropertyValue('--show-delay')
171
- );
172
- clearTimeout(this.hoverTimeout);
173
- this.hoverTimeout = window.setTimeout(() => this.show(), delay);
111
+
112
+ switch (finalBasePlacement) {
113
+ case 'left':
114
+ top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2 + this.skidding;
115
+ left = triggerRect.left - tooltipRect.width - this.distance;
116
+ break;
117
+ case 'right':
118
+ top = triggerRect.top + (triggerRect.height - tooltipRect.height) / 2 + this.skidding;
119
+ left = triggerRect.right + this.distance;
120
+ break;
121
+ case 'top':
122
+ top = triggerRect.top - tooltipRect.height - this.distance;
123
+ left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2 + this.skidding;
124
+ break;
125
+ case 'bottom':
126
+ top = triggerRect.bottom + this.distance;
127
+ left = triggerRect.left + (triggerRect.width - tooltipRect.width) / 2 + this.skidding;
128
+ break;
174
129
  }
175
- }
176
130
 
177
- private handleMouseOut() {
178
- if (this.hasTrigger('hover')) {
179
- const delay = parseDuration(
180
- getComputedStyle(this).getPropertyValue('--hide-delay')
181
- );
182
- clearTimeout(this.hoverTimeout);
183
- this.hoverTimeout = window.setTimeout(() => this.hide(), delay);
131
+
132
+ if ((finalBasePlacement === 'top' || finalBasePlacement === 'bottom') && finalAlignment) {
133
+ if (finalAlignment === 'start') {
134
+ left = triggerRect.left + this.skidding;
135
+ } else if (finalAlignment === 'end') {
136
+ left = triggerRect.right - tooltipRect.width + this.skidding;
137
+ }
184
138
  }
185
- }
186
-
187
- private hasTrigger(triggerType: string) {
188
- const triggers = this.trigger.split(' ');
189
- return triggers.includes(triggerType);
190
- }
191
-
192
- @watch('open', { waitUntilFirstUpdate: true })
193
- async handleOpenChange() {
194
- if (this.open) {
195
- if (this.disabled) {
196
- return;
139
+
140
+
141
+ if ((finalBasePlacement === 'left' || finalBasePlacement === 'right') && finalAlignment) {
142
+ if (finalAlignment === 'start') {
143
+ top = triggerRect.top + this.skidding;
144
+ } else if (finalAlignment === 'end') {
145
+ top = triggerRect.bottom - tooltipRect.height + this.skidding;
197
146
  }
147
+ }
198
148
 
199
- // Show
149
+
150
+ finalPlacement = finalAlignment ? `${finalBasePlacement}-${finalAlignment}` : finalBasePlacement;
151
+
152
+
153
+ if (left < 0) left = 5;
154
+ if (left + tooltipRect.width > viewportWidth) left = viewportWidth - tooltipRect.width - 5;
155
+ if (top < 0) top = 5;
156
+ if (top + tooltipRect.height > viewportHeight) top = viewportHeight - tooltipRect.height - 5;
157
+
158
+
159
+ this.tooltip.style.top = `${top}px`;
160
+ this.tooltip.style.left = `${left}px`;
161
+ this.tooltip.setAttribute('data-placement', finalPlacement as string);
162
+ };
163
+
164
+ private showTooltip = () => {
165
+ if (!this.disabled &&
166
+ this.content.trim() !== '') {
167
+ this.open = true;
200
168
  this.emit('nile-show');
201
-
202
- await stopAnimations(this.body);
203
- this.body.hidden = false;
204
- this.popup.active = true;
205
- const { keyframes, options } = getAnimation(this, 'tooltip.show', {
206
- dir: '',
169
+ this.updateComplete.then(() => {
170
+ this.updateTooltipPosition();
171
+
172
+
173
+ this.tooltip.addEventListener('transitionend', this.handleAfterShow, { once: true });
207
174
  });
208
- await animateTo(this.popup.popup, keyframes, options);
209
-
210
- this.emit('nile-after-show');
211
- } else {
212
- // Hide
213
- this.emit('nile-hide');
214
-
215
- await stopAnimations(this.body);
216
- const { keyframes, options } = getAnimation(this, 'tooltip.hide', {
217
- dir: '',
218
- });
219
- await animateTo(this.popup.popup, keyframes, options);
220
- this.popup.active = false;
221
- this.body.hidden = true;
222
-
223
- this.emit('nile-after-hide');
224
175
  }
225
- }
226
-
227
- @watch(['content', 'distance', 'hoist', 'placement', 'skidding'])
228
- async handleOptionsChange() {
229
- if (this.hasUpdated) {
230
- await this.updateComplete;
231
- this.popup.reposition();
176
+ };
177
+
178
+ private handleAfterShow = () => {
179
+ this.emit('nile-after-show');
180
+ };
181
+
182
+
183
+ private hideTooltip = () => {
184
+ if (!this.open) return;
185
+
186
+ this.emit('nile-hide');
187
+ this.open = false;
188
+
189
+ this.tooltip.addEventListener('transitionend', this.handleAfterHide, { once: true });
190
+ };
191
+
192
+ private handleAfterHide = () => {
193
+ this.emit('nile-after-hide');
194
+ };
195
+
196
+ private handleMouseOver = () => {
197
+ if (this.trigger.includes('hover')) {
198
+ clearTimeout(this.hoverTimeout);
199
+ this.hoverTimeout = window.setTimeout(() => this.showTooltip(), 150);
232
200
  }
233
- }
201
+ };
234
202
 
235
- @watch('disabled')
236
- handleDisabledChange() {
237
- if (this.disabled && this.open) {
238
- this.hide();
203
+ private handleMouseOut = () => {
204
+ if (this.trigger.includes('hover')) {
205
+ clearTimeout(this.hoverTimeout);
206
+ this.hoverTimeout = window.setTimeout(() => this.hideTooltip(), 0);
239
207
  }
240
- }
208
+ };
241
209
 
242
- /** Shows the tooltip. */
243
- async show() {
244
- if (this.open || !this.content?.trim().length) {
245
- return undefined;
210
+ private handleClick = () => {
211
+ if (this.trigger.includes('click')) {
212
+ this.open = !this.open;
213
+ this.emit('nile-show');
214
+ this.updateComplete.then(() => this.updateTooltipPosition());
215
+ }
216
+ };
217
+
218
+ updated(changedProperties: Map<string, any>) {
219
+ super.updated(changedProperties);
220
+
221
+
222
+ if (changedProperties.has('open') || changedProperties.has('hoist')) {
223
+ if (this.open && this.hoist) {
224
+
225
+ }
246
226
  }
247
-
248
- this.open = true;
249
- return waitForEvent(this, 'nile-after-show');
250
227
  }
251
228
 
252
- /** Hides the tooltip */
253
- async hide() {
254
- if (!this.open) {
255
- return undefined;
229
+ private handleFocus = () => {
230
+ if (this.trigger.includes('focus')) {
231
+ this.showTooltip();
256
232
  }
233
+ };
257
234
 
258
- this.open = false;
259
- return waitForEvent(this, 'nile-after-hide');
260
- }
235
+ private handleBlur = () => {
236
+ if (this.trigger.includes('focus')) {
237
+ this.hideTooltip();
238
+ }
239
+ };
261
240
 
262
241
  render() {
263
242
  return html`
264
- <nile-popup
265
- part="base"
266
- exportparts="
267
- popup:base__popup,
268
- arrow:base__arrow
269
- "
270
- class=${classMap({
271
- tooltip: true,
272
- 'tooltip--open': this.open,
273
- })}
274
- placement=${this.placement}
275
- distance=${this.distance}
276
- skidding=${this.skidding}
277
- strategy=${this.hoist ? 'fixed' : 'absolute'}
278
- flip
279
- shift
280
- arrow
281
- >
282
- <slot slot="anchor" aria-describedby="tooltip"></slot>
283
-
284
- <slot
285
- name="content"
286
- part="body"
287
- id="tooltip"
288
- class=${classMap({
289
- tooltip__body: true,
290
- 'tooltip__body--large': this.size === 'large',
291
- })}
292
- role="tooltip"
293
- aria-live=${this.open ? 'polite' : 'off'}
294
- >
295
- ${this.content}
296
- </slot>
297
- </nile-popup>
243
+ <div class=${classMap({ tooltip: true, 'tooltip__body--large': this.size === 'large' })}>
244
+ ${this.content}
245
+ </div>
246
+ <slot
247
+ @mouseover=${this.handleMouseOver}
248
+ @mouseout=${this.handleMouseOut}
249
+ @click=${this.handleClick}
250
+ @focus=${this.handleFocus}
251
+ @blur=${this.handleBlur}
252
+ aria-describedby="tooltip"
253
+ ></slot>
298
254
  `;
299
255
  }
300
256
  }
301
257
 
302
- setDefaultAnimation('tooltip.show', {
303
- keyframes: [
304
- { opacity: 0, scale: 0.8 },
305
- { opacity: 1, scale: 1 },
306
- ],
307
- options: { duration: 150, easing: 'ease' },
308
- });
309
-
310
- setDefaultAnimation('tooltip.hide', {
311
- keyframes: [
312
- { opacity: 1, scale: 1 },
313
- { opacity: 0, scale: 0.8 },
314
- ],
315
- options: { duration: 150, easing: 'ease' },
316
- });
317
-
318
- export default NileTooltip;
319
-
320
258
  declare global {
321
259
  interface HTMLElementTagNameMap {
322
260
  'nile-tooltip': NileTooltip;
323
261
  }
324
- }
262
+ }