@aquera/nile-elements 0.1.33-beta-1.0 → 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.
- package/README.md +6 -10
- package/demo/index.html +27 -262
- package/dist/{fixture-d5b55278.cjs.js → fixture-161dee0b.cjs.js} +3 -3
- package/dist/fixture-161dee0b.cjs.js.map +1 -0
- package/dist/{fixture-df8b52d7.esm.js → fixture-372df3b0.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-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-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.css.cjs.js +1 -1
- package/dist/nile-input/nile-input.css.cjs.js.map +1 -1
- package/dist/nile-input/nile-input.css.esm.js +0 -8
- 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-menu/nile-menu.cjs.js +1 -1
- package/dist/nile-menu/nile-menu.cjs.js.map +1 -1
- package/dist/nile-menu/nile-menu.esm.js +2 -2
- 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/nile-table.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 +56 -59
- package/dist/nile-tooltip/nile-tooltip.esm.js +28 -23
- package/dist/src/nile-input/nile-input.css.js +0 -8
- package/dist/src/nile-input/nile-input.css.js.map +1 -1
- package/dist/src/nile-menu/nile-menu.d.ts +1 -0
- package/dist/src/nile-menu/nile-menu.js +5 -6
- package/dist/src/nile-menu/nile-menu.js.map +1 -1
- package/dist/src/nile-table/nile-table.js.map +1 -1
- package/dist/src/nile-tooltip/nile-tooltip.css.js +45 -48
- package/dist/src/nile-tooltip/nile-tooltip.css.js.map +1 -1
- package/dist/src/nile-tooltip/nile-tooltip.d.ts +44 -23
- package/dist/src/nile-tooltip/nile-tooltip.js +227 -157
- package/dist/src/nile-tooltip/nile-tooltip.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/nile-input/nile-input.css.ts +0 -8
- package/src/nile-menu/nile-menu.ts +4 -8
- package/src/nile-table/nile-table.ts +2 -2
- package/src/nile-tooltip/nile-tooltip.css.ts +46 -49
- package/src/nile-tooltip/nile-tooltip.ts +237 -155
- package/vscode-html-custom-data.json +87 -82
- package/dist/fixture-d5b55278.cjs.js.map +0 -1
- package/dist/nile-tooltip/nile-tooltip-utils.cjs.js +0 -2
- package/dist/nile-tooltip/nile-tooltip-utils.cjs.js.map +0 -1
- package/dist/nile-tooltip/nile-tooltip-utils.esm.js +0 -1
- package/dist/nile-tooltip/nile-tooltip.test.cjs.js +0 -2
- package/dist/nile-tooltip/nile-tooltip.test.cjs.js.map +0 -1
- package/dist/nile-tooltip/nile-tooltip.test.esm.js +0 -51
- package/dist/src/nile-tooltip/nile-tooltip-utils.d.ts +0 -18
- package/dist/src/nile-tooltip/nile-tooltip-utils.js +0 -151
- package/dist/src/nile-tooltip/nile-tooltip-utils.js.map +0 -1
- package/dist/src/nile-tooltip/nile-tooltip.test.d.ts +0 -1
- package/dist/src/nile-tooltip/nile-tooltip.test.js +0 -158
- package/dist/src/nile-tooltip/nile-tooltip.test.js.map +0 -1
- package/src/nile-tooltip/nile-tooltip-utils.ts +0 -190
- package/src/nile-tooltip/nile-tooltip.test.ts +0 -178
package/package.json
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
"description": "Webcomponent nile-elements following open-wc recommendations",
|
4
4
|
"license": "MIT",
|
5
5
|
"author": "nile-elements",
|
6
|
-
"version": "0.1.33
|
6
|
+
"version": "0.1.33",
|
7
7
|
"main": "dist/src/index.js",
|
8
8
|
"type": "module",
|
9
9
|
"module": "dist/src/index.js",
|
@@ -15,14 +15,6 @@ export const styles = css`
|
|
15
15
|
display: block;
|
16
16
|
}
|
17
17
|
|
18
|
-
/* To Hide Safari's AutoFill icon */
|
19
|
-
input::-webkit-contacts-auto-fill-button {
|
20
|
-
visibility: hidden;
|
21
|
-
width: 0;
|
22
|
-
margin: 0;
|
23
|
-
padding: 0;
|
24
|
-
}
|
25
|
-
|
26
18
|
.form-control .form-control__label {
|
27
19
|
display: none;
|
28
20
|
}
|
@@ -31,6 +31,8 @@ export class NileMenu extends NileElement {
|
|
31
31
|
|
32
32
|
@property({ type: Boolean }) showNoResults: boolean = false;
|
33
33
|
|
34
|
+
@property({ type: Boolean }) allowSpaceKey: boolean = false;
|
35
|
+
|
34
36
|
@property({ type: String }) noResultsMessage: string = 'No results found';
|
35
37
|
|
36
38
|
@query('slot:not([name])') defaultSlot!: HTMLSlotElement;
|
@@ -67,12 +69,6 @@ export class NileMenu extends NileElement {
|
|
67
69
|
}
|
68
70
|
|
69
71
|
private handleKeyDown(event: KeyboardEvent) {
|
70
|
-
const target = event.target as HTMLElement;
|
71
|
-
|
72
|
-
// Only handle keyboard shortcuts if NOT inside input, textarea, or contenteditable
|
73
|
-
if (target.closest('nile-input') || target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
|
74
|
-
return; // Ignore handling space, arrows, etc.
|
75
|
-
}
|
76
72
|
|
77
73
|
// Make a selection when pressing enter
|
78
74
|
if (event.key === 'Enter') {
|
@@ -82,7 +78,7 @@ export class NileMenu extends NileElement {
|
|
82
78
|
}
|
83
79
|
|
84
80
|
// Prevent scrolling when space is pressed (ONLY if not typing)
|
85
|
-
if (event.key === ' ') {
|
81
|
+
if (!this.allowSpaceKey && event.key === ' ') {
|
86
82
|
event.preventDefault();
|
87
83
|
}
|
88
84
|
|
@@ -107,7 +103,7 @@ export class NileMenu extends NileElement {
|
|
107
103
|
items[index].focus();
|
108
104
|
}
|
109
105
|
}
|
110
|
-
}
|
106
|
+
}
|
111
107
|
|
112
108
|
|
113
109
|
private handleMouseDown(event: MouseEvent) {
|
@@ -74,7 +74,7 @@ export class NileTable extends NileElement {
|
|
74
74
|
handleBodyCssUpdate(){
|
75
75
|
if (this.rows.length<2) return;
|
76
76
|
const tableBodies = this.rows;
|
77
|
-
const firstEl=tableBodies[0].shadowRoot?.querySelector<HTMLDivElement>('div.base')
|
77
|
+
const firstEl=tableBodies[0].shadowRoot?.querySelector<HTMLDivElement>('div.base')
|
78
78
|
if(firstEl) {
|
79
79
|
firstEl.style.borderTopRightRadius="var(--nile-radius-radius-xl)";
|
80
80
|
firstEl.style.borderTopLeftRadius = 'var(--nile-radius-radius-xl)';
|
@@ -84,7 +84,7 @@ export class NileTable extends NileElement {
|
|
84
84
|
}
|
85
85
|
tableBodies.forEach((tb,i)=>{
|
86
86
|
if(i>0 && i<tableBodies.length-1){
|
87
|
-
const el=tb.shadowRoot?.querySelector<HTMLDivElement>('div.base')
|
87
|
+
const el=tb.shadowRoot?.querySelector<HTMLDivElement>('div.base')
|
88
88
|
if(el) {
|
89
89
|
el.style.borderTopRightRadius="0px";
|
90
90
|
el.style.borderTopLeftRadius = "0px";
|
@@ -11,63 +11,60 @@ import { css } from 'lit';
|
|
11
11
|
* Tooltip CSS
|
12
12
|
*/
|
13
13
|
export const styles = css`
|
14
|
+
:host {
|
15
|
+
--max-width: 20rem;
|
16
|
+
--hide-delay: 0ms;
|
17
|
+
--show-delay: 150ms;
|
14
18
|
|
19
|
+
display: contents;
|
20
|
+
}
|
15
21
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
.tooltip {
|
21
|
-
position: fixed;
|
22
|
-
z-index: 1000;
|
23
|
-
background-color: var(--nile-tooltip-color-background, #333);
|
24
|
-
color: var(--nile-colors-white-base, #fff);
|
25
|
-
padding: 6px 10px;
|
26
|
-
border-radius: 4px;
|
27
|
-
font-size: var(--nile-tooltip-font-size-sm, 14px);
|
28
|
-
line-height: var(--nile-tooltip-line-height-sm, 1.5);
|
29
|
-
opacity: 0;
|
30
|
-
transition: opacity 0.2s, transform 0.2s;
|
31
|
-
pointer-events: none;
|
32
|
-
white-space: normal;
|
33
|
-
visibility: hidden;
|
34
|
-
overflow: visible;
|
35
|
-
|
36
|
-
}
|
37
|
-
:host([open]) .tooltip {
|
38
|
-
opacity: 1;
|
39
|
-
visibility: visible;
|
40
|
-
pointer-events: auto;
|
41
|
-
}
|
42
|
-
.tooltip__body--large {
|
43
|
-
font-size: var(--nile-tooltip-font-size-lg, 16px);
|
44
|
-
line-height: var(--nile-tooltip-line-height-lg, 1.75);
|
45
|
-
}
|
46
|
-
.tooltip-content {
|
47
|
-
overflow: auto;
|
48
|
-
max-width: 252px;
|
49
|
-
max-height: 116px;
|
50
|
-
}
|
51
|
-
.tooltip-caret {
|
52
|
-
position: absolute;
|
53
|
-
width: calc(2 * var(--caret-size, 6px));
|
54
|
-
height: calc(2 * var(--caret-size, 6px));
|
55
|
-
background-color: inherit;
|
56
|
-
transform: rotate(45deg);
|
57
|
-
z-index: -1;
|
58
|
-
}
|
59
|
-
.trigger-container {
|
60
|
-
display: inline-block;
|
61
|
-
}
|
62
|
-
|
22
|
+
.tooltip {
|
23
|
+
--arrow-size: 6px;
|
24
|
+
--arrow-color: var(--nile-tooltip-color-background);
|
25
|
+
}
|
63
26
|
|
27
|
+
.tooltip::part(popup) {
|
28
|
+
pointer-events: none;
|
29
|
+
z-index: 1000;
|
30
|
+
}
|
64
31
|
|
32
|
+
.tooltip[placement^='top']::part(popup) {
|
33
|
+
transform-origin: bottom;
|
34
|
+
}
|
65
35
|
|
36
|
+
.tooltip[placement^='bottom']::part(popup) {
|
37
|
+
transform-origin: top;
|
38
|
+
}
|
66
39
|
|
40
|
+
.tooltip[placement^='left']::part(popup) {
|
41
|
+
transform-origin: right;
|
42
|
+
}
|
67
43
|
|
44
|
+
.tooltip[placement^='right']::part(popup) {
|
45
|
+
transform-origin: left;
|
46
|
+
}
|
68
47
|
|
48
|
+
.tooltip__body {
|
49
|
+
display: block;
|
50
|
+
width: max-content;
|
51
|
+
max-width: var(--max-width);
|
52
|
+
border-radius: 4px;
|
53
|
+
background-color: var(--nile-tooltip-color-background);
|
54
|
+
font-size: var(--nile-tooltip-font-size-sm);
|
55
|
+
font-weight: var(--nile-tooltip-font-weight-sm);
|
56
|
+
line-height: var(--nile-tooltip-line-height-sm);
|
57
|
+
padding: var(--nile-tooltip-padding-y) var(--nile-tooltip-padding-x);
|
58
|
+
color: var(--nile-colors-white-base);
|
59
|
+
pointer-events: none;
|
60
|
+
word-break: break-word;
|
61
|
+
}
|
69
62
|
|
70
|
-
|
63
|
+
.tooltip__body--large {
|
64
|
+
font-size: var(--nile-tooltip-font-size-lg);
|
65
|
+
line-height: var(--nile-tooltip-line-height-lg);
|
66
|
+
font-weight: var(--nile-tooltip-font-weight-lg);
|
67
|
+
}
|
71
68
|
`;
|
72
69
|
|
73
|
-
export default [styles];
|
70
|
+
export default [styles];
|
@@ -4,25 +4,58 @@
|
|
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
|
-
|
8
|
-
import {
|
9
|
-
import { classMap } from 'lit/directives/class-map.js';
|
7
|
+
|
8
|
+
import { LitElement, CSSResultArray, TemplateResult } from 'lit';
|
10
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';
|
13
|
+
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';
|
11
22
|
import NileElement from '../internal/nile-element';
|
12
|
-
import {
|
23
|
+
import type { CSSResultGroup } from 'lit';
|
24
|
+
import type NilePopup from '../nile-popup/nile-popup';
|
13
25
|
/**
|
14
26
|
* Nile icon component.
|
15
27
|
*
|
16
28
|
* @tag nile-tooltip
|
17
29
|
*
|
18
30
|
*/
|
19
|
-
|
20
31
|
@customElement('nile-tooltip')
|
21
32
|
export class NileTooltip extends NileElement {
|
22
|
-
|
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
|
+
|
48
|
+
/** The tooltip's content. If you need to display HTML, use the `content` slot instead. */
|
49
|
+
@property({ type: String, reflect: true }) content = '';
|
50
|
+
|
51
|
+
/** Size Property to decide the tool tip size */
|
23
52
|
@property({ reflect: true }) size: 'small' | 'large' = 'small';
|
24
|
-
|
25
|
-
|
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:
|
26
59
|
| 'top'
|
27
60
|
| 'top-start'
|
28
61
|
| 'top-end'
|
@@ -34,209 +67,258 @@ export class NileTooltip extends NileElement {
|
|
34
67
|
| 'bottom-end'
|
35
68
|
| 'left'
|
36
69
|
| 'left-start'
|
37
|
-
| 'left-end' = '
|
70
|
+
| 'left-end' = 'top';
|
71
|
+
|
72
|
+
/** Disables the tooltip so it won't show when triggered. */
|
38
73
|
@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. */
|
39
79
|
@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
|
+
|
40
84
|
/**
|
41
85
|
* Controls how the tooltip is activated. Possible options include `click`, `hover`, `focus`, and `manual`. Multiple
|
42
86
|
* options can be passed by separating them with a space. When manual is used, the tooltip must be activated
|
43
87
|
* programmatically.
|
44
88
|
*/
|
45
|
-
@property() trigger = 'hover focus';
|
46
|
-
@property({ type: Number }) distance = 8;
|
47
|
-
private readonly SHIFT_OFFSET = 16;
|
48
|
-
/** The distance in pixels from which to offset the tooltip along its target. */
|
49
|
-
@property({ type: Number }) skidding = 0;
|
50
|
-
@property({ type: Boolean, reflect: true }) hoist = false;
|
89
|
+
@property() trigger = 'hover focus';
|
51
90
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
+
*/
|
96
|
+
@property({ type: Boolean }) hoist = false;
|
56
97
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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);
|
61
106
|
|
62
|
-
|
63
|
-
|
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
|
+
});
|
64
115
|
}
|
65
116
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
117
|
+
firstUpdated() {
|
118
|
+
this.body.hidden = !this.open;
|
119
|
+
|
120
|
+
// If the tooltip is visible on init, update its position
|
121
|
+
if (this.open) {
|
122
|
+
this.popup.active = true;
|
123
|
+
this.popup.reposition();
|
124
|
+
}
|
71
125
|
}
|
72
126
|
|
73
|
-
|
74
|
-
super.
|
127
|
+
disconnectedCallback() {
|
128
|
+
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);
|
135
|
+
}
|
75
136
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
];
|
137
|
+
private handleBlur() {
|
138
|
+
if (this.hasTrigger('focus')) {
|
139
|
+
this.hide();
|
140
|
+
}
|
141
|
+
}
|
82
142
|
|
83
|
-
|
84
|
-
|
85
|
-
this.
|
143
|
+
private handleClick() {
|
144
|
+
if (this.hasTrigger('click')) {
|
145
|
+
if (this.open) {
|
146
|
+
this.hide();
|
147
|
+
} else {
|
148
|
+
this.show();
|
149
|
+
}
|
86
150
|
}
|
151
|
+
}
|
87
152
|
|
88
|
-
|
89
|
-
|
153
|
+
private handleFocus() {
|
154
|
+
if (this.hasTrigger('focus')) {
|
155
|
+
this.show();
|
90
156
|
}
|
91
157
|
}
|
92
158
|
|
93
|
-
|
94
|
-
|
95
|
-
|
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();
|
164
|
+
}
|
97
165
|
}
|
98
166
|
|
99
|
-
private
|
100
|
-
|
101
|
-
|
102
|
-
|
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);
|
174
|
+
}
|
103
175
|
}
|
104
176
|
|
105
|
-
private
|
106
|
-
if (
|
107
|
-
|
108
|
-
|
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);
|
109
184
|
}
|
185
|
+
}
|
110
186
|
|
111
|
-
|
112
|
-
const
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
const { top, left, placement } = getValidTooltipPosition(
|
117
|
-
triggerRect,
|
118
|
-
tooltipRect,
|
119
|
-
this.originalPlacement,
|
120
|
-
this.distance,
|
121
|
-
this.skidding,
|
122
|
-
this.caretSize,
|
123
|
-
viewportWidth,
|
124
|
-
viewportHeight
|
125
|
-
);
|
126
|
-
|
127
|
-
this.setAttribute('placement', placement);
|
128
|
-
this.tooltip.style.top = `${top}px`;
|
129
|
-
this.tooltip.style.left = `${left}px`;
|
130
|
-
|
131
|
-
const { caretLeft, caretTop } = getCaretPosition({
|
132
|
-
placement,
|
133
|
-
tooltipRect,
|
134
|
-
triggerRect,
|
135
|
-
caretSize: this.caretSize,
|
136
|
-
left,
|
137
|
-
top
|
138
|
-
});
|
187
|
+
private hasTrigger(triggerType: string) {
|
188
|
+
const triggers = this.trigger.split(' ');
|
189
|
+
return triggers.includes(triggerType);
|
190
|
+
}
|
139
191
|
|
140
|
-
|
141
|
-
|
142
|
-
|
192
|
+
@watch('open', { waitUntilFirstUpdate: true })
|
193
|
+
async handleOpenChange() {
|
194
|
+
if (this.open) {
|
195
|
+
if (this.disabled) {
|
196
|
+
return;
|
197
|
+
}
|
143
198
|
|
144
|
-
|
145
|
-
const trimmedContent = this.content.trim();
|
146
|
-
if (!trimmedContent && !this.hasTooltipSlot) {
|
147
|
-
return;
|
148
|
-
}
|
149
|
-
if (!this.disabled && isInViewport(this.triggerContainer)) {
|
199
|
+
// Show
|
150
200
|
this.emit('nile-show');
|
151
|
-
|
152
|
-
this.
|
153
|
-
|
154
|
-
|
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: '',
|
155
207
|
});
|
208
|
+
await animateTo(this.popup.popup, keyframes, options);
|
209
|
+
|
210
|
+
this.emit('nile-after-show');
|
156
211
|
} else {
|
157
|
-
|
158
|
-
|
159
|
-
};
|
212
|
+
// Hide
|
213
|
+
this.emit('nile-hide');
|
160
214
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
this.
|
166
|
-
|
167
|
-
|
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;
|
168
222
|
|
169
|
-
|
170
|
-
if (this.trigger.includes('hover')) {
|
171
|
-
clearTimeout(this.hoverTimeout);
|
172
|
-
this.hoverTimeout = window.setTimeout(() => this.showTooltip(), 150);
|
223
|
+
this.emit('nile-after-hide');
|
173
224
|
}
|
174
|
-
}
|
225
|
+
}
|
175
226
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
227
|
+
@watch(['content', 'distance', 'hoist', 'placement', 'skidding'])
|
228
|
+
async handleOptionsChange() {
|
229
|
+
if (this.hasUpdated) {
|
230
|
+
await this.updateComplete;
|
231
|
+
this.popup.reposition();
|
180
232
|
}
|
181
|
-
}
|
233
|
+
}
|
182
234
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
} else {
|
188
|
-
this.hideTooltip();
|
189
|
-
}
|
235
|
+
@watch('disabled')
|
236
|
+
handleDisabledChange() {
|
237
|
+
if (this.disabled && this.open) {
|
238
|
+
this.hide();
|
190
239
|
}
|
191
|
-
}
|
240
|
+
}
|
192
241
|
|
193
|
-
|
194
|
-
|
195
|
-
|
242
|
+
/** Shows the tooltip. */
|
243
|
+
async show() {
|
244
|
+
if (this.open || !this.content?.trim().length) {
|
245
|
+
return undefined;
|
196
246
|
}
|
197
|
-
};
|
198
247
|
|
199
|
-
|
200
|
-
|
201
|
-
|
248
|
+
this.open = true;
|
249
|
+
return waitForEvent(this, 'nile-after-show');
|
250
|
+
}
|
251
|
+
|
252
|
+
/** Hides the tooltip */
|
253
|
+
async hide() {
|
254
|
+
if (!this.open) {
|
255
|
+
return undefined;
|
202
256
|
}
|
203
|
-
|
257
|
+
|
258
|
+
this.open = false;
|
259
|
+
return waitForEvent(this, 'nile-after-hide');
|
260
|
+
}
|
204
261
|
|
205
262
|
render() {
|
206
263
|
return html`
|
207
|
-
<
|
264
|
+
<nile-popup
|
265
|
+
part="base"
|
266
|
+
exportparts="
|
267
|
+
popup:base__popup,
|
268
|
+
arrow:base__arrow
|
269
|
+
"
|
208
270
|
class=${classMap({
|
209
271
|
tooltip: true,
|
210
|
-
'
|
272
|
+
'tooltip--open': this.open,
|
211
273
|
})}
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
</div>
|
220
|
-
|
221
|
-
<div
|
222
|
-
class="trigger-container"
|
223
|
-
tabindex="0"
|
224
|
-
@mouseover=${this.handleMouseOver}
|
225
|
-
@mouseout=${this.handleMouseOut}
|
226
|
-
@click=${this.handleClick}
|
227
|
-
@focusin=${this.handleFocus}
|
228
|
-
@focusout=${this.handleBlur}
|
229
|
-
aria-describedby="tooltip"
|
274
|
+
placement=${this.placement}
|
275
|
+
distance=${this.distance}
|
276
|
+
skidding=${this.skidding}
|
277
|
+
strategy=${this.hoist ? 'fixed' : 'absolute'}
|
278
|
+
flip
|
279
|
+
shift
|
280
|
+
arrow
|
230
281
|
>
|
231
|
-
<slot></slot>
|
232
|
-
|
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>
|
233
298
|
`;
|
234
299
|
}
|
235
300
|
}
|
236
301
|
|
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
|
+
|
237
320
|
declare global {
|
238
321
|
interface HTMLElementTagNameMap {
|
239
322
|
'nile-tooltip': NileTooltip;
|
240
323
|
}
|
241
324
|
}
|
242
|
-
|