@spectrum-web-components/tooltip 0.11.16-overlay.8 → 0.11.16

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.
@@ -0,0 +1,374 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "readme": "",
4
+ "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "sp-tooltip.js",
8
+ "declarations": [],
9
+ "exports": [
10
+ {
11
+ "kind": "custom-element-definition",
12
+ "name": "sp-tooltip",
13
+ "declaration": {
14
+ "name": "Tooltip",
15
+ "module": "/src/Tooltip.js"
16
+ }
17
+ }
18
+ ]
19
+ },
20
+ {
21
+ "kind": "javascript-module",
22
+ "path": "src/Tooltip.js",
23
+ "declarations": [
24
+ {
25
+ "kind": "class",
26
+ "description": "",
27
+ "name": "TooltipProxy",
28
+ "events": [
29
+ {
30
+ "name": "disconnected",
31
+ "type": {
32
+ "text": "Event"
33
+ }
34
+ }
35
+ ],
36
+ "superclass": {
37
+ "name": "HTMLElement"
38
+ },
39
+ "tagName": "tooltip-proxy",
40
+ "customElement": true
41
+ },
42
+ {
43
+ "kind": "class",
44
+ "description": "",
45
+ "name": "Tooltip",
46
+ "slots": [
47
+ {
48
+ "description": "the icon element appearing at the start of the label",
49
+ "name": "icon"
50
+ },
51
+ {
52
+ "description": "the text label of the Tooltip",
53
+ "name": ""
54
+ }
55
+ ],
56
+ "members": [
57
+ {
58
+ "kind": "field",
59
+ "name": "instanceCount",
60
+ "type": {
61
+ "text": "number"
62
+ },
63
+ "static": true,
64
+ "default": "0",
65
+ "privacy": "private"
66
+ },
67
+ {
68
+ "kind": "field",
69
+ "name": "_tooltipId",
70
+ "privacy": "private",
71
+ "default": "`sp-tooltip-describedby-helper-${Tooltip.instanceCount++}`"
72
+ },
73
+ {
74
+ "kind": "field",
75
+ "name": "selfManaged",
76
+ "type": {
77
+ "text": "boolean"
78
+ },
79
+ "privacy": "public",
80
+ "default": "false",
81
+ "attribute": "self-managed"
82
+ },
83
+ {
84
+ "kind": "field",
85
+ "name": "offset",
86
+ "type": {
87
+ "text": "number"
88
+ },
89
+ "privacy": "public",
90
+ "default": "6",
91
+ "attribute": "offset",
92
+ "reflects": true
93
+ },
94
+ {
95
+ "kind": "field",
96
+ "name": "hadTooltipId",
97
+ "type": {
98
+ "text": "boolean"
99
+ },
100
+ "privacy": "private",
101
+ "default": "false"
102
+ },
103
+ {
104
+ "kind": "field",
105
+ "name": "open",
106
+ "type": {
107
+ "text": "boolean"
108
+ },
109
+ "privacy": "public",
110
+ "default": "false",
111
+ "attribute": "open",
112
+ "reflects": true
113
+ },
114
+ {
115
+ "kind": "field",
116
+ "name": "placement",
117
+ "type": {
118
+ "text": "\"auto\" | \"auto-start\" | \"auto-end\" | \"top\" | \"bottom\" | \"right\" | \"left\" | \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"right-end\" | \"left-start\" | \"left-end\" | \"none\""
119
+ },
120
+ "privacy": "public",
121
+ "default": "'top'",
122
+ "attribute": "placement",
123
+ "reflects": true
124
+ },
125
+ {
126
+ "kind": "field",
127
+ "name": "tipElement",
128
+ "type": {
129
+ "text": "HTMLSpanElement"
130
+ },
131
+ "privacy": "private"
132
+ },
133
+ {
134
+ "kind": "field",
135
+ "name": "_variant",
136
+ "type": {
137
+ "text": "string"
138
+ },
139
+ "privacy": "private",
140
+ "default": "''"
141
+ },
142
+ {
143
+ "kind": "field",
144
+ "name": "variant",
145
+ "type": {
146
+ "text": "string"
147
+ },
148
+ "privacy": "public",
149
+ "attribute": "variant"
150
+ },
151
+ {
152
+ "kind": "method",
153
+ "name": "onOverlayQuery",
154
+ "privacy": "public",
155
+ "return": {
156
+ "type": {
157
+ "text": "void"
158
+ }
159
+ },
160
+ "parameters": [
161
+ {
162
+ "name": "event",
163
+ "type": {
164
+ "text": "CustomEvent<OverlayDisplayQueryDetail>"
165
+ }
166
+ }
167
+ ]
168
+ },
169
+ {
170
+ "kind": "field",
171
+ "name": "_proxy",
172
+ "type": {
173
+ "text": "HTMLElement"
174
+ },
175
+ "privacy": "private"
176
+ },
177
+ {
178
+ "kind": "method",
179
+ "name": "generateProxy",
180
+ "privacy": "private",
181
+ "return": {
182
+ "type": {
183
+ "text": "void"
184
+ }
185
+ }
186
+ },
187
+ {
188
+ "kind": "method",
189
+ "name": "overlayWillOpenCallback",
190
+ "privacy": "public",
191
+ "return": {
192
+ "type": {
193
+ "text": "void"
194
+ }
195
+ },
196
+ "parameters": [
197
+ {
198
+ "name": "{\n trigger,\n }",
199
+ "type": {
200
+ "text": "{\n trigger: HTMLElement;\n }"
201
+ }
202
+ }
203
+ ]
204
+ },
205
+ {
206
+ "kind": "method",
207
+ "name": "overlayOpenCancelledCallback",
208
+ "privacy": "public",
209
+ "return": {
210
+ "type": {
211
+ "text": "void"
212
+ }
213
+ },
214
+ "parameters": [
215
+ {
216
+ "name": "{\n trigger,\n }",
217
+ "type": {
218
+ "text": "{\n trigger: HTMLElement;\n }"
219
+ }
220
+ }
221
+ ]
222
+ },
223
+ {
224
+ "kind": "method",
225
+ "name": "overlayCloseCallback",
226
+ "privacy": "public",
227
+ "return": {
228
+ "type": {
229
+ "text": "void"
230
+ }
231
+ },
232
+ "parameters": [
233
+ {
234
+ "name": "{ trigger }",
235
+ "type": {
236
+ "text": "{ trigger: HTMLElement }"
237
+ }
238
+ }
239
+ ]
240
+ },
241
+ {
242
+ "kind": "method",
243
+ "name": "removeProxy",
244
+ "privacy": "private",
245
+ "return": {
246
+ "type": {
247
+ "text": "void"
248
+ }
249
+ }
250
+ },
251
+ {
252
+ "kind": "field",
253
+ "name": "closeOverlayCallback",
254
+ "type": {
255
+ "text": "Promise<() => void> | undefined"
256
+ },
257
+ "privacy": "private"
258
+ },
259
+ {
260
+ "kind": "field",
261
+ "name": "abortOverlay",
262
+ "type": {
263
+ "text": "(cancelled: boolean) => void"
264
+ },
265
+ "privacy": "private"
266
+ },
267
+ {
268
+ "kind": "field",
269
+ "name": "openOverlay",
270
+ "privacy": "private"
271
+ },
272
+ {
273
+ "kind": "field",
274
+ "name": "closeOverlay",
275
+ "privacy": "private"
276
+ },
277
+ {
278
+ "kind": "field",
279
+ "name": "previousSlot",
280
+ "type": {
281
+ "text": "string | undefined"
282
+ },
283
+ "privacy": "private"
284
+ },
285
+ {
286
+ "kind": "method",
287
+ "name": "manageTooltip",
288
+ "privacy": "private",
289
+ "return": {
290
+ "type": {
291
+ "text": "void"
292
+ }
293
+ }
294
+ }
295
+ ],
296
+ "attributes": [
297
+ {
298
+ "name": "placement",
299
+ "type": {
300
+ "text": "\"auto\" | \"auto-start\" | \"auto-end\" | \"top\" | \"bottom\" | \"right\" | \"left\" | \"top-start\" | \"top-end\" | \"bottom-start\" | \"bottom-end\" | \"right-start\" | \"right-end\" | \"left-start\" | \"left-end\" | \"none\""
301
+ },
302
+ "default": "'top'",
303
+ "fieldName": "placement",
304
+ "attribute": "placement"
305
+ },
306
+ {
307
+ "name": "self-managed",
308
+ "type": {
309
+ "text": "boolean"
310
+ },
311
+ "default": "false",
312
+ "fieldName": "selfManaged"
313
+ },
314
+ {
315
+ "name": "offset",
316
+ "type": {
317
+ "text": "number"
318
+ },
319
+ "default": "6",
320
+ "fieldName": "offset"
321
+ },
322
+ {
323
+ "name": "open",
324
+ "type": {
325
+ "text": "boolean"
326
+ },
327
+ "default": "false",
328
+ "fieldName": "open"
329
+ },
330
+ {
331
+ "name": "variant",
332
+ "type": {
333
+ "text": "string"
334
+ },
335
+ "fieldName": "variant"
336
+ }
337
+ ],
338
+ "superclass": {
339
+ "name": "SpectrumElement",
340
+ "package": "@spectrum-web-components/base"
341
+ },
342
+ "tagName": "sp-tooltip",
343
+ "customElement": true
344
+ }
345
+ ],
346
+ "exports": [
347
+ {
348
+ "kind": "js",
349
+ "name": "TooltipProxy",
350
+ "declaration": {
351
+ "name": "TooltipProxy",
352
+ "module": "src/Tooltip.js"
353
+ }
354
+ },
355
+ {
356
+ "kind": "custom-element-definition",
357
+ "name": "tooltip-proxy",
358
+ "declaration": {
359
+ "name": "TooltipProxy",
360
+ "module": "src/Tooltip.js"
361
+ }
362
+ },
363
+ {
364
+ "kind": "js",
365
+ "name": "Tooltip",
366
+ "declaration": {
367
+ "name": "Tooltip",
368
+ "module": "src/Tooltip.js"
369
+ }
370
+ }
371
+ ]
372
+ }
373
+ ]
374
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/tooltip",
3
- "version": "0.11.16-overlay.8+eef228d8d",
3
+ "version": "0.11.16",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -57,8 +57,8 @@
57
57
  "lit-html"
58
58
  ],
59
59
  "dependencies": {
60
- "@spectrum-web-components/base": "^0.7.5-overlay.236+eef228d8d",
61
- "@spectrum-web-components/overlay": "^0.19.4-overlay.8+eef228d8d"
60
+ "@spectrum-web-components/base": "^0.7.5",
61
+ "@spectrum-web-components/overlay": "^0.19.4"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@spectrum-css/tooltip": "^4.0.10"
@@ -69,5 +69,5 @@
69
69
  "./sp-*.js",
70
70
  "./**/*.dev.js"
71
71
  ],
72
- "gitHead": "eef228d8defcf04fe32713c7232fd0873828752b"
72
+ "gitHead": "fe316a3ee9fc753f0de98aece11e04227df73ab7"
73
73
  }
package/src/Tooltip.d.ts CHANGED
@@ -1,6 +1,8 @@
1
- import { CSSResultArray, SpectrumElement, TemplateResult } from '@spectrum-web-components/base';
2
- import type { Placement } from '@spectrum-web-components/overlay';
3
- import '@spectrum-web-components/overlay/sp-overlay.js';
1
+ import { CSSResultArray, PropertyValues, SpectrumElement, TemplateResult } from '@spectrum-web-components/base';
2
+ import type { OverlayDisplayQueryDetail, Placement } from '@spectrum-web-components/overlay';
3
+ export declare class TooltipProxy extends HTMLElement {
4
+ disconnectedCallback(): void;
5
+ }
4
6
  /**
5
7
  * @element sp-tooltip
6
8
  *
@@ -13,20 +15,41 @@ export declare class Tooltip extends SpectrumElement {
13
15
  * @private
14
16
  */
15
17
  static instanceCount: number;
18
+ private _tooltipId;
16
19
  selfManaged: boolean;
17
20
  offset: number;
21
+ private hadTooltipId;
18
22
  open: boolean;
19
23
  /**
20
24
  * @type {"auto" | "auto-start" | "auto-end" | "top" | "bottom" | "right" | "left" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end" | "none"}
21
25
  * @attr
22
26
  */
23
27
  placement: Placement;
24
- tipElement: HTMLSpanElement;
28
+ private tipElement;
25
29
  private _variant;
26
30
  get variant(): string;
27
31
  set variant(variant: string);
28
- private handleOpenOverlay;
29
- protected handleCloseOverlay: () => void;
30
- protected handleTransitionend(): void;
32
+ constructor();
33
+ onOverlayQuery(event: CustomEvent<OverlayDisplayQueryDetail>): void;
34
+ private _proxy;
35
+ private generateProxy;
36
+ overlayWillOpenCallback({ trigger, }: {
37
+ trigger: HTMLElement;
38
+ }): void;
39
+ overlayOpenCancelledCallback({ trigger, }: {
40
+ trigger: HTMLElement;
41
+ }): void;
42
+ overlayCloseCallback({ trigger }: {
43
+ trigger: HTMLElement;
44
+ }): void;
45
+ private removeProxy;
46
+ private closeOverlayCallback?;
47
+ private abortOverlay;
48
+ private openOverlay;
49
+ private closeOverlay;
50
+ private previousSlot?;
51
+ private manageTooltip;
31
52
  render(): TemplateResult;
53
+ protected update(changed: PropertyValues<this>): Promise<void>;
54
+ protected updated(changed: PropertyValues<this>): void;
32
55
  }
@@ -18,23 +18,69 @@ import {
18
18
  property,
19
19
  query
20
20
  } from "@spectrum-web-components/base/src/decorators.js";
21
- import "@spectrum-web-components/overlay/sp-overlay.js";
21
+ import { openOverlay } from "@spectrum-web-components/overlay/src/loader.js";
22
22
  import tooltipStyles from "./tooltip.css.js";
23
- export class Tooltip extends SpectrumElement {
23
+ export class TooltipProxy extends HTMLElement {
24
+ disconnectedCallback() {
25
+ this.dispatchEvent(new Event("disconnected"));
26
+ }
27
+ }
28
+ customElements.define("tooltip-proxy", TooltipProxy);
29
+ const _Tooltip = class extends SpectrumElement {
24
30
  constructor() {
25
- super(...arguments);
31
+ super();
32
+ this._tooltipId = `sp-tooltip-describedby-helper-${_Tooltip.instanceCount++}`;
26
33
  this.selfManaged = false;
27
34
  this.offset = 6;
35
+ this.hadTooltipId = false;
28
36
  this.open = false;
29
37
  this.placement = "top";
30
38
  /* Ensure that a '' value for `variant` removes the attribute instead of a blank value */
31
39
  this._variant = "";
32
- this.handleOpenOverlay = () => {
33
- this.open = true;
40
+ this.abortOverlay = () => {
41
+ return;
42
+ };
43
+ this.openOverlay = () => {
44
+ const parentElement = this.parentElement;
45
+ const abortPromise = new Promise((res) => {
46
+ this.abortOverlay = res;
47
+ });
48
+ if (true) {
49
+ window.__swc.ignoreWarningLevels.deprecation = true;
50
+ }
51
+ this.closeOverlayCallback = openOverlay(parentElement, "hover", this, {
52
+ abortPromise,
53
+ offset: this.offset,
54
+ placement: this.placement
55
+ });
56
+ if (true) {
57
+ window.__swc.ignoreWarningLevels.deprecation = false;
58
+ }
34
59
  };
35
- this.handleCloseOverlay = () => {
36
- this.open = false;
60
+ this.closeOverlay = async (event) => {
61
+ const pointerIsEnteringTooltip = event && event.type === "pointerleave" && event.relatedTarget === this;
62
+ if (pointerIsEnteringTooltip) {
63
+ this.addEventListener(
64
+ "pointerleave",
65
+ (event2) => {
66
+ const pointerIsEnteringParnet = event2.relatedTarget === this.parentElement;
67
+ if (pointerIsEnteringParnet) {
68
+ return;
69
+ }
70
+ this.closeOverlay(event2);
71
+ },
72
+ { once: true }
73
+ );
74
+ return;
75
+ }
76
+ if (this.abortOverlay)
77
+ this.abortOverlay(true);
78
+ if (!this.closeOverlayCallback)
79
+ return;
80
+ (await this.closeOverlayCallback)();
81
+ delete this.closeOverlayCallback;
37
82
  };
83
+ this.addEventListener("sp-overlay-query", this.onOverlayQuery);
38
84
  }
39
85
  static get styles() {
40
86
  return [tooltipStyles];
@@ -54,42 +100,121 @@ export class Tooltip extends SpectrumElement {
54
100
  this.removeAttribute("variant");
55
101
  this._variant = "";
56
102
  }
57
- handleTransitionend() {
58
- this.dispatchEvent(
59
- new Event("transitionend", {
60
- bubbles: true,
61
- composed: true
62
- })
63
- );
103
+ onOverlayQuery(event) {
104
+ if (!event.target)
105
+ return;
106
+ const target = event.target;
107
+ if (target !== this)
108
+ return;
109
+ event.detail.overlayContentTipElement = this.tipElement;
64
110
  }
65
- render() {
66
- const tooltip = html`
67
- <span id="tooltip" @transitionend=${this.handleTransitionend}>
68
- <slot name="icon"></slot>
69
- <span id="label"><slot></slot></span>
70
- <span id="tip"></span>
71
- </span>
72
- `;
111
+ generateProxy() {
112
+ if (this._proxy) {
113
+ return;
114
+ }
115
+ this._proxy = document.createElement("tooltip-proxy");
116
+ this._proxy.id = this._tooltipId;
117
+ this._proxy.hidden = true;
118
+ this._proxy.slot = "hidden-tooltip-content";
119
+ this._proxy.setAttribute("role", "tooltip");
120
+ this._proxy.addEventListener("disconnected", this.closeOverlay);
121
+ }
122
+ overlayWillOpenCallback({
123
+ trigger
124
+ }) {
125
+ this.setAttribute("aria-hidden", "true");
126
+ this.generateProxy();
127
+ this._proxy.textContent = this.textContent;
128
+ const ariaDescribedby = trigger.getAttribute("aria-describedby") || "";
129
+ this.hadTooltipId = ariaDescribedby.search(this._tooltipId) > -1;
130
+ this.insertAdjacentElement("beforebegin", this._proxy);
131
+ if (this.hadTooltipId)
132
+ return;
133
+ if (ariaDescribedby) {
134
+ trigger.setAttribute(
135
+ "aria-describedby",
136
+ `${ariaDescribedby} ${this._tooltipId}`
137
+ );
138
+ } else {
139
+ trigger.setAttribute("aria-describedby", `${this._tooltipId}`);
140
+ }
141
+ }
142
+ overlayOpenCancelledCallback({
143
+ trigger
144
+ }) {
145
+ this.overlayCloseCallback({ trigger });
146
+ }
147
+ overlayCloseCallback({ trigger }) {
148
+ const ariaDescribedby = trigger.getAttribute("aria-describedby") || "";
149
+ let descriptors = ariaDescribedby.split(/\s+/);
150
+ if (!this.hadTooltipId) {
151
+ descriptors = descriptors.filter(
152
+ (descriptor) => descriptor !== this._tooltipId
153
+ );
154
+ }
155
+ if (descriptors.length) {
156
+ trigger.setAttribute("aria-describedby", descriptors.join(" "));
157
+ } else {
158
+ trigger.removeAttribute("aria-describedby");
159
+ }
160
+ this.removeAttribute("aria-hidden");
161
+ this.removeProxy();
162
+ }
163
+ removeProxy() {
164
+ this._proxy.remove();
165
+ }
166
+ manageTooltip() {
167
+ const parentElement = this.parentElement;
73
168
  if (this.selfManaged) {
74
- return html`
75
- <sp-overlay
76
- ?open=${this.open}
77
- offset=${this.offset}
78
- type="hint"
79
- .placement=${this.placement}
80
- .triggerElement=${this.parentElement}
81
- .triggerInteraction=${"hover"}
82
- @sp-opened=${this.handleOpenOverlay}
83
- @sp-closed=${this.handleCloseOverlay}
84
- >
85
- ${tooltip}
86
- </sp-overlay>
87
- `;
169
+ if (this.slot) {
170
+ this.previousSlot = this.slot;
171
+ }
172
+ this.slot = "self-managed-tooltip";
173
+ parentElement.addEventListener("pointerenter", this.openOverlay);
174
+ parentElement.addEventListener("focusin", this.openOverlay);
175
+ parentElement.addEventListener("pointerleave", this.closeOverlay);
176
+ parentElement.addEventListener("focusout", this.closeOverlay);
88
177
  } else {
89
- return tooltip;
178
+ if (this.previousSlot) {
179
+ this.slot = this.previousSlot;
180
+ } else if (this.slot === "self-managed-tooltip") {
181
+ this.removeAttribute("slot");
182
+ }
183
+ parentElement.removeEventListener("pointerenter", this.openOverlay);
184
+ parentElement.removeEventListener("focusin", this.openOverlay);
185
+ parentElement.removeEventListener(
186
+ "pointerleave",
187
+ this.closeOverlay
188
+ );
189
+ parentElement.removeEventListener("focusout", this.closeOverlay);
90
190
  }
91
191
  }
92
- }
192
+ render() {
193
+ return html`
194
+ <slot name="icon"></slot>
195
+ <span id="label"><slot></slot></span>
196
+ <span id="tip"></span>
197
+ `;
198
+ }
199
+ async update(changed) {
200
+ if (changed.has("open") && this.selfManaged) {
201
+ if (this.open) {
202
+ this.openOverlay();
203
+ } else {
204
+ this.closeOverlay();
205
+ }
206
+ }
207
+ this.generateProxy();
208
+ super.update(changed);
209
+ }
210
+ updated(changed) {
211
+ super.updated(changed);
212
+ if (changed.has("selfManaged")) {
213
+ this.manageTooltip();
214
+ }
215
+ }
216
+ };
217
+ export let Tooltip = _Tooltip;
93
218
  /**
94
219
  * @private
95
220
  */