@aquera/nile-elements 0.1.31 → 0.1.32-beta-1.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.
- package/README.md +17 -5
- package/demo/index.html +5 -9
- package/dist/axe.min-5bf06036.esm.js +12 -0
- package/dist/axe.min-ff35bfba.cjs.js +12 -0
- package/dist/axe.min-ff35bfba.cjs.js.map +1 -0
- package/dist/{fixture-161dee0b.cjs.js → fixture-3acb409b.cjs.js} +2 -2
- package/dist/{fixture-161dee0b.cjs.js.map → fixture-3acb409b.cjs.js.map} +1 -1
- package/dist/{fixture-372df3b0.esm.js → fixture-db35a8ae.esm.js} +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/internal/animate.cjs.js +1 -1
- package/dist/internal/animate.cjs.js.map +1 -1
- package/dist/internal/animate.esm.js +1 -1
- package/dist/nile-accordion/nile-accordian.test.cjs.js +1 -1
- package/dist/nile-accordion/nile-accordian.test.esm.js +1 -1
- package/dist/nile-accordion/nile-accordion.cjs.js +1 -1
- package/dist/nile-accordion/nile-accordion.cjs.js.map +1 -1
- package/dist/nile-accordion/nile-accordion.css.cjs.js +1 -1
- package/dist/nile-accordion/nile-accordion.css.cjs.js.map +1 -1
- package/dist/nile-accordion/nile-accordion.css.esm.js +1 -1
- package/dist/nile-accordion/nile-accordion.esm.js +4 -4
- package/dist/nile-auto-complete/nile-auto-complete.test.cjs.js +1 -1
- package/dist/nile-auto-complete/nile-auto-complete.test.esm.js +1 -1
- package/dist/nile-avatar/nile-avatar.test.cjs.js +1 -1
- package/dist/nile-avatar/nile-avatar.test.esm.js +1 -1
- package/dist/nile-badge/nile-badge.test.cjs.js +1 -1
- package/dist/nile-badge/nile-badge.test.esm.js +1 -1
- package/dist/nile-button/nile-button.test.cjs.js +1 -1
- package/dist/nile-button/nile-button.test.esm.js +1 -1
- package/dist/nile-button-toggle-group/nile-button-toggle-group.test.cjs.js +1 -1
- package/dist/nile-button-toggle-group/nile-button-toggle-group.test.esm.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.cjs.js +1 -1
- package/dist/nile-calendar/nile-calendar.test.esm.js +1 -1
- package/dist/nile-card/nile-card.test.cjs.js +1 -1
- package/dist/nile-card/nile-card.test.esm.js +1 -1
- package/dist/nile-checkbox/nile-checkbox.test.cjs.js +1 -1
- package/dist/nile-checkbox/nile-checkbox.test.esm.js +1 -1
- package/dist/nile-chip/nile-chip.test.cjs.js +1 -1
- package/dist/nile-chip/nile-chip.test.esm.js +1 -1
- package/dist/nile-circular-progressbar/nile-circular-progressbar.css.cjs.js +1 -1
- package/dist/nile-circular-progressbar/nile-circular-progressbar.css.cjs.js.map +1 -1
- package/dist/nile-circular-progressbar/nile-circular-progressbar.css.esm.js +49 -49
- package/dist/nile-code-editor/extensionSetup.cjs.js +7 -7
- package/dist/nile-code-editor/extensionSetup.cjs.js.map +1 -1
- package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
- package/dist/nile-code-editor/nile-code-editor.cjs.js +2 -2
- package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
- package/dist/nile-code-editor/nile-code-editor.esm.js +2 -2
- package/dist/nile-dialog/nile-dialog.test.cjs.js +1 -1
- package/dist/nile-dialog/nile-dialog.test.esm.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.cjs.js +1 -1
- package/dist/nile-drawer/nile-drawer.test.esm.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.test.cjs.js +1 -1
- package/dist/nile-dropdown/nile-dropdown.test.esm.js +1 -1
- package/dist/nile-empty-state/nile-empty-state.test.cjs.js +1 -1
- package/dist/nile-empty-state/nile-empty-state.test.esm.js +1 -1
- package/dist/nile-error-message/nile-error-message.test.cjs.js +1 -1
- package/dist/nile-error-message/nile-error-message.test.esm.js +1 -1
- package/dist/nile-form-group/nile-form-group.test.cjs.js +1 -1
- package/dist/nile-form-group/nile-form-group.test.esm.js +1 -1
- package/dist/nile-form-help-text/nile-form-help-text.test.cjs.js +1 -1
- package/dist/nile-form-help-text/nile-form-help-text.test.esm.js +1 -1
- package/dist/nile-hero/nile-hero.test.cjs.js +1 -1
- package/dist/nile-hero/nile-hero.test.esm.js +1 -1
- package/dist/nile-icon/nile-icon.test.cjs.js +1 -1
- package/dist/nile-icon/nile-icon.test.esm.js +1 -1
- package/dist/nile-input/nile-input.test.cjs.js +1 -1
- package/dist/nile-input/nile-input.test.esm.js +1 -1
- package/dist/nile-link/nile-link.test.cjs.js +1 -1
- package/dist/nile-link/nile-link.test.esm.js +1 -1
- package/dist/nile-loader/nile-loader.test.cjs.js +1 -1
- package/dist/nile-loader/nile-loader.test.esm.js +1 -1
- package/dist/nile-popover/nile-popover.test.cjs.js +1 -1
- package/dist/nile-popover/nile-popover.test.esm.js +1 -1
- package/dist/nile-popup/nile-popup.test.cjs.js +1 -1
- package/dist/nile-popup/nile-popup.test.esm.js +1 -1
- package/dist/nile-progress-bar/nile-progress-bar.test.cjs.js +1 -1
- package/dist/nile-progress-bar/nile-progress-bar.test.esm.js +1 -1
- package/dist/nile-radio/nile-radio.test.cjs.js +1 -1
- package/dist/nile-radio/nile-radio.test.esm.js +1 -1
- package/dist/nile-radio-group/nile-radio-group.test.cjs.js +1 -1
- package/dist/nile-radio-group/nile-radio-group.test.esm.js +1 -1
- package/dist/nile-select/nile-select.test.cjs.js +1 -1
- package/dist/nile-select/nile-select.test.esm.js +1 -1
- package/dist/nile-slide-toggle/nile-slide-toggle.test.cjs.js +1 -1
- package/dist/nile-slide-toggle/nile-slide-toggle.test.esm.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.cjs.js +1 -1
- package/dist/nile-tab-group/nile-tab-group.test.esm.js +1 -1
- package/dist/nile-table/index.cjs.js +2 -0
- package/dist/nile-table/index.cjs.js.map +1 -0
- package/dist/nile-table/index.esm.js +1 -0
- package/dist/nile-table/nile-table.cjs.js +2 -0
- package/dist/nile-table/nile-table.cjs.js.map +1 -0
- package/dist/nile-table/nile-table.css.cjs.js +2 -0
- package/dist/nile-table/nile-table.css.cjs.js.map +1 -0
- package/dist/nile-table/nile-table.css.esm.js +5 -0
- package/dist/nile-table/nile-table.esm.js +3 -0
- package/dist/nile-table-body/nile-table-body.cjs.js +1 -1
- package/dist/nile-table-body/nile-table-body.cjs.js.map +1 -1
- package/dist/nile-table-body/nile-table-body.esm.js +2 -2
- package/dist/nile-table-cell-item/nile-table-cell-item.css.cjs.js +1 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.css.cjs.js.map +1 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.css.esm.js +4 -2
- package/dist/nile-table-header-item/nile-table-header-item.css.cjs.js +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.css.cjs.js.map +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.css.esm.js +2 -0
- package/dist/nile-table-row/nile-table-row.cjs.js.map +1 -1
- package/dist/nile-textarea/nile-textarea.test.cjs.js +1 -1
- package/dist/nile-textarea/nile-textarea.test.esm.js +1 -1
- package/dist/nile-tooltip/index.cjs.js +1 -1
- package/dist/nile-tooltip/index.esm.js +1 -1
- package/dist/nile-tooltip/nile-tooltip.cjs.js +1 -1
- package/dist/nile-tooltip/nile-tooltip.cjs.js.map +1 -1
- package/dist/nile-tooltip/nile-tooltip.css.cjs.js +1 -1
- package/dist/nile-tooltip/nile-tooltip.css.cjs.js.map +1 -1
- package/dist/nile-tooltip/nile-tooltip.css.esm.js +115 -56
- package/dist/nile-tooltip/nile-tooltip.esm.js +13 -30
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/nile-accordion/nile-accordion.css.js +1 -1
- package/dist/src/nile-accordion/nile-accordion.css.js.map +1 -1
- package/dist/src/nile-accordion/nile-accordion.d.ts +6 -5
- package/dist/src/nile-accordion/nile-accordion.js +21 -8
- package/dist/src/nile-accordion/nile-accordion.js.map +1 -1
- package/dist/src/nile-circular-progressbar/nile-circular-progressbar.css.js +49 -49
- package/dist/src/nile-circular-progressbar/nile-circular-progressbar.css.js.map +1 -1
- package/dist/src/nile-table/index.d.ts +1 -0
- package/dist/src/nile-table/index.js +2 -0
- package/dist/src/nile-table/index.js.map +1 -0
- package/dist/src/nile-table/nile-table.css.d.ts +12 -0
- package/dist/src/nile-table/nile-table.css.js +17 -0
- package/dist/src/nile-table/nile-table.css.js.map +1 -0
- package/dist/src/nile-table/nile-table.d.ts +44 -0
- package/dist/src/nile-table/nile-table.js +122 -0
- package/dist/src/nile-table/nile-table.js.map +1 -0
- package/dist/src/nile-table-body/nile-table-body.d.ts +3 -1
- package/dist/src/nile-table-body/nile-table-body.js +9 -1
- package/dist/src/nile-table-body/nile-table-body.js.map +1 -1
- package/dist/src/nile-table-cell-item/nile-table-cell-item.css.js +4 -2
- package/dist/src/nile-table-cell-item/nile-table-cell-item.css.js.map +1 -1
- package/dist/src/nile-table-header-item/nile-table-header-item.css.js +2 -0
- package/dist/src/nile-table-header-item/nile-table-header-item.css.js.map +1 -1
- package/dist/src/nile-table-row/nile-table-row.js.map +1 -1
- package/dist/src/nile-tooltip/nile-tooltip.css.js +113 -54
- package/dist/src/nile-tooltip/nile-tooltip.css.js.map +1 -1
- package/dist/src/nile-tooltip/nile-tooltip.d.ts +22 -62
- package/dist/src/nile-tooltip/nile-tooltip.js +180 -244
- package/dist/src/nile-tooltip/nile-tooltip.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/index.ts +2 -1
- package/src/nile-accordion/nile-accordion.css.ts +1 -1
- package/src/nile-accordion/nile-accordion.ts +15 -4
- package/src/nile-circular-progressbar/nile-circular-progressbar.css.ts +55 -56
- package/src/nile-table/index.ts +1 -0
- package/src/nile-table/nile-table.css.ts +19 -0
- package/src/nile-table/nile-table.ts +137 -0
- package/src/nile-table-body/nile-table-body.ts +8 -2
- package/src/nile-table-cell-item/nile-table-cell-item.css.ts +4 -2
- package/src/nile-table-header-item/nile-table-header-item.css.ts +2 -0
- package/src/nile-table-row/nile-table-row.ts +1 -2
- package/src/nile-tooltip/nile-tooltip.css.ts +113 -54
- package/src/nile-tooltip/nile-tooltip.ts +207 -269
- package/vscode-html-custom-data.json +36 -18
- package/dist/axe.min-2b379f29.cjs.js +0 -12
- package/dist/axe.min-2b379f29.cjs.js.map +0 -1
- 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
|
-
|
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
|
-
|
49
|
-
|
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
|
-
|
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
|
-
|
99
|
-
|
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
|
-
|
118
|
-
this.body.hidden = !this.open;
|
29
|
+
private hoverTimeout: number;
|
119
30
|
|
120
|
-
|
121
|
-
|
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
|
-
|
130
|
-
|
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
|
138
|
-
|
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
|
144
|
-
|
145
|
-
|
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
|
154
|
-
if (this.
|
155
|
-
|
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
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
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
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
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
|
-
|
178
|
-
if (
|
179
|
-
|
180
|
-
|
181
|
-
)
|
182
|
-
|
183
|
-
|
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
|
-
|
188
|
-
|
189
|
-
|
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
|
-
|
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
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
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
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
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
|
-
|
236
|
-
|
237
|
-
|
238
|
-
this.
|
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
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
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
|
-
|
253
|
-
|
254
|
-
|
255
|
-
return undefined;
|
229
|
+
private handleFocus = () => {
|
230
|
+
if (this.trigger.includes('focus')) {
|
231
|
+
this.showTooltip();
|
256
232
|
}
|
233
|
+
};
|
257
234
|
|
258
|
-
|
259
|
-
|
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
|
-
<
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
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
|
+
}
|