@vaadin/tooltip 25.0.0-alpha2 → 25.0.0-alpha20

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vaadin/tooltip",
3
- "version": "25.0.0-alpha2",
3
+ "version": "25.0.0-alpha20",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -21,7 +21,6 @@
21
21
  "type": "module",
22
22
  "files": [
23
23
  "src",
24
- "theme",
25
24
  "vaadin-*.d.ts",
26
25
  "vaadin-*.js",
27
26
  "web-types.json",
@@ -35,23 +34,23 @@
35
34
  ],
36
35
  "dependencies": {
37
36
  "@open-wc/dedupe-mixin": "^1.3.0",
38
- "@vaadin/a11y-base": "25.0.0-alpha2",
39
- "@vaadin/component-base": "25.0.0-alpha2",
40
- "@vaadin/overlay": "25.0.0-alpha2",
41
- "@vaadin/popover": "25.0.0-alpha2",
42
- "@vaadin/vaadin-lumo-styles": "25.0.0-alpha2",
43
- "@vaadin/vaadin-themable-mixin": "25.0.0-alpha2",
37
+ "@vaadin/a11y-base": "25.0.0-alpha20",
38
+ "@vaadin/component-base": "25.0.0-alpha20",
39
+ "@vaadin/overlay": "25.0.0-alpha20",
40
+ "@vaadin/popover": "25.0.0-alpha20",
41
+ "@vaadin/vaadin-themable-mixin": "25.0.0-alpha20",
44
42
  "lit": "^3.0.0"
45
43
  },
46
44
  "devDependencies": {
47
- "@vaadin/chai-plugins": "25.0.0-alpha2",
48
- "@vaadin/test-runner-commands": "25.0.0-alpha2",
45
+ "@vaadin/chai-plugins": "25.0.0-alpha20",
46
+ "@vaadin/test-runner-commands": "25.0.0-alpha20",
49
47
  "@vaadin/testing-helpers": "^2.0.0",
50
- "sinon": "^18.0.0"
48
+ "@vaadin/vaadin-lumo-styles": "25.0.0-alpha20",
49
+ "sinon": "^21.0.0"
51
50
  },
52
51
  "web-types": [
53
52
  "web-types.json",
54
53
  "web-types.lit.json"
55
54
  ],
56
- "gitHead": "67ffcd5355cf21ce1b5039c598525109fc4c164b"
55
+ "gitHead": "c948aae591a30b432f3784000d4677674cae56e0"
57
56
  }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2022 - 2025 Vaadin Ltd.
4
+ * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
+ */
6
+ import '@vaadin/component-base/src/styles/style-props.js';
7
+ import { css } from 'lit';
8
+
9
+ export const tooltipOverlayStyles = css`
10
+ :host {
11
+ --_vaadin-tooltip-default-offset: 4px;
12
+ line-height: normal;
13
+ }
14
+
15
+ [part='overlay'] {
16
+ max-width: var(--vaadin-tooltip-max-width, 40ch);
17
+ padding: var(--vaadin-tooltip-padding, var(--vaadin-padding-container));
18
+ border-radius: var(--vaadin-tooltip-border-radius, var(--vaadin-radius-m));
19
+ background: var(--vaadin-tooltip-background, var(--vaadin-background-color));
20
+ color: var(--vaadin-tooltip-color, inherit);
21
+ font-size: var(--vaadin-tooltip-font-size, 0.9em);
22
+ font-weight: var(--vaadin-tooltip-font-weight, inherit);
23
+ line-height: var(--vaadin-tooltip-line-height, inherit);
24
+ border: 0;
25
+ box-shadow:
26
+ 0 0 0 var(--vaadin-tooltip-border-width, 1px)
27
+ var(--vaadin-tooltip-border-color, var(--vaadin-border-color-secondary)),
28
+ var(--vaadin-tooltip-box-shadow, 0 3px 8px -1px rgba(0, 0, 0, 0.2));
29
+ }
30
+
31
+ [part='content'] {
32
+ white-space: pre-wrap;
33
+ }
34
+
35
+ :host([position^='top'][top-aligned]) [part='overlay'],
36
+ :host([position^='bottom'][top-aligned]) [part='overlay'] {
37
+ margin-top: var(--vaadin-tooltip-offset-top, var(--_vaadin-tooltip-default-offset));
38
+ }
39
+
40
+ :host([position^='top'][bottom-aligned]) [part='overlay'],
41
+ :host([position^='bottom'][bottom-aligned]) [part='overlay'] {
42
+ margin-bottom: var(--vaadin-tooltip-offset-bottom, var(--_vaadin-tooltip-default-offset));
43
+ }
44
+
45
+ :host([position^='start'][start-aligned]) [part='overlay'],
46
+ :host([position^='end'][start-aligned]) [part='overlay'] {
47
+ margin-inline-start: var(--vaadin-tooltip-offset-start, var(--_vaadin-tooltip-default-offset));
48
+ }
49
+
50
+ :host([position^='start'][end-aligned]) [part='overlay'],
51
+ :host([position^='end'][end-aligned]) [part='overlay'] {
52
+ margin-inline-end: var(--vaadin-tooltip-offset-end, var(--_vaadin-tooltip-default-offset));
53
+ }
54
+
55
+ @media (forced-colors: active) {
56
+ [part='overlay'] {
57
+ border: 1px dashed !important;
58
+ }
59
+ }
60
+ `;
@@ -4,7 +4,6 @@
4
4
  * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
5
  */
6
6
  import type { Constructor } from '@open-wc/dedupe-mixin';
7
- import type { OverlayClassMixinClass } from '@vaadin/component-base/src/overlay-class-mixin.js';
8
7
  import type { PopoverPositionMixinClass } from '@vaadin/popover/src/vaadin-popover-position-mixin.js';
9
8
  import type { PopoverTargetMixinClass } from '@vaadin/popover/src/vaadin-popover-target-mixin.js';
10
9
 
@@ -15,11 +14,7 @@ export type { PopoverPosition as TooltipPosition } from '@vaadin/popover/src/vaa
15
14
  */
16
15
  export declare function TooltipMixin<T extends Constructor<HTMLElement>>(
17
16
  base: T,
18
- ): Constructor<OverlayClassMixinClass> &
19
- Constructor<PopoverPositionMixinClass> &
20
- Constructor<PopoverTargetMixinClass> &
21
- Constructor<TooltipMixinClass> &
22
- T;
17
+ ): Constructor<PopoverPositionMixinClass> & Constructor<PopoverTargetMixinClass> & Constructor<TooltipMixinClass> & T;
23
18
 
24
19
  export declare class TooltipMixinClass {
25
20
  /**
@@ -27,7 +22,7 @@ export declare class TooltipMixinClass {
27
22
  * attribute. Supports array of multiple elements.
28
23
  * When not set, defaults to `target`.
29
24
  */
30
- ariaTarget: HTMLElement | HTMLElement[] | undefined;
25
+ ariaTarget: HTMLElement | HTMLElement[] | null | undefined;
31
26
 
32
27
  /**
33
28
  * Object with properties passed to `generator` and
@@ -73,8 +68,9 @@ export declare class TooltipMixinClass {
73
68
  manual: boolean;
74
69
 
75
70
  /**
76
- * When true, the tooltip is opened programmatically.
77
- * Only works if `manual` is set to `true`.
71
+ * When true, the tooltip is opened.
72
+ * In manual mode, this can be set programmatically.
73
+ * In automatic mode, this is set automatically by internal logic.
78
74
  */
79
75
  opened: boolean;
80
76
 
@@ -5,7 +5,6 @@
5
5
  */
6
6
  import { isKeyboardActive } from '@vaadin/a11y-base/src/focus-utils.js';
7
7
  import { addValueToAttribute, removeValueFromAttribute } from '@vaadin/component-base/src/dom-utils.js';
8
- import { OverlayClassMixin } from '@vaadin/component-base/src/overlay-class-mixin.js';
9
8
  import { SlotController } from '@vaadin/component-base/src/slot-controller.js';
10
9
  import { generateUniqueId } from '@vaadin/component-base/src/unique-id-utils.js';
11
10
  import { PopoverPositionMixin } from '@vaadin/popover/src/vaadin-popover-position-mixin.js';
@@ -45,11 +44,6 @@ class TooltipStateController {
45
44
  this.host = host;
46
45
  }
47
46
 
48
- /** @private */
49
- get openedProp() {
50
- return this.host.manual ? 'opened' : '_autoOpened';
51
- }
52
-
53
47
  /** @private */
54
48
  get focusDelay() {
55
49
  const tooltip = this.host;
@@ -115,12 +109,12 @@ class TooltipStateController {
115
109
 
116
110
  /** @private */
117
111
  _isOpened() {
118
- return this.host[this.openedProp];
112
+ return this.host.opened;
119
113
  }
120
114
 
121
115
  /** @private */
122
116
  _setOpened(opened) {
123
- this.host[this.openedProp] = opened;
117
+ this.host.opened = opened;
124
118
  }
125
119
 
126
120
  /** @private */
@@ -224,12 +218,11 @@ class TooltipStateController {
224
218
  * A mixin providing common tooltip functionality.
225
219
  *
226
220
  * @polymerMixin
227
- * @mixes OverlayClassMixin
228
221
  * @mixes PopoverPositionMixin
229
222
  * @mixes PopoverTargetMixin
230
223
  */
231
224
  export const TooltipMixin = (superClass) =>
232
- class TooltipMixinClass extends PopoverPositionMixin(PopoverTargetMixin(OverlayClassMixin(superClass))) {
225
+ class TooltipMixinClass extends PopoverPositionMixin(PopoverTargetMixin(superClass)) {
233
226
  static get properties() {
234
227
  return {
235
228
  /**
@@ -302,12 +295,15 @@ export const TooltipMixin = (superClass) =>
302
295
  },
303
296
 
304
297
  /**
305
- * When true, the tooltip is opened programmatically.
306
- * Only works if `manual` is set to `true`.
298
+ * When true, the tooltip is opened.
299
+ * In manual mode, this can be set programmatically.
300
+ * In automatic mode, this is set automatically by internal logic.
307
301
  */
308
302
  opened: {
309
303
  type: Boolean,
310
304
  value: false,
305
+ reflectToAttribute: true,
306
+ observer: '__openedChanged',
311
307
  sync: true,
312
308
  },
313
309
 
@@ -330,18 +326,6 @@ export const TooltipMixin = (superClass) =>
330
326
  */
331
327
  text: {
332
328
  type: String,
333
- observer: '__textChanged',
334
- },
335
-
336
- /**
337
- * Set to true when the overlay is opened using auto-added
338
- * event listeners: mouseenter and focusin (keyboard only).
339
- * @protected
340
- */
341
- _autoOpened: {
342
- type: Boolean,
343
- observer: '__autoOpenedChanged',
344
- sync: true,
345
329
  },
346
330
 
347
331
  /**
@@ -366,26 +350,9 @@ export const TooltipMixin = (superClass) =>
366
350
  type: Boolean,
367
351
  sync: true,
368
352
  },
369
-
370
- /** @private */
371
- _srLabel: {
372
- type: Object,
373
- },
374
-
375
- /** @private */
376
- _overlayContent: {
377
- type: String,
378
- },
379
353
  };
380
354
  }
381
355
 
382
- static get observers() {
383
- return [
384
- '__generatorChanged(_overlayElement, generator, context)',
385
- '__updateSrLabelText(_srLabel, _overlayContent)',
386
- ];
387
- }
388
-
389
356
  /**
390
357
  * Sets the default focus delay to be used by all tooltip instances,
391
358
  * except for those that have focus delay configured using property.
@@ -420,7 +387,6 @@ export const TooltipMixin = (superClass) =>
420
387
  super();
421
388
 
422
389
  this._uniqueId = `vaadin-tooltip-${generateUniqueId()}`;
423
- this._renderer = this.__tooltipRenderer.bind(this);
424
390
 
425
391
  this.__onFocusin = this.__onFocusin.bind(this);
426
392
  this.__onFocusout = this.__onFocusout.bind(this);
@@ -453,7 +419,7 @@ export const TooltipMixin = (superClass) =>
453
419
  disconnectedCallback() {
454
420
  super.disconnectedCallback();
455
421
 
456
- if (this._autoOpened) {
422
+ if (this.opened && !this.manual) {
457
423
  this._stateController.close(true);
458
424
  }
459
425
  this._isConnected = false;
@@ -467,23 +433,28 @@ export const TooltipMixin = (superClass) =>
467
433
 
468
434
  this._overlayElement = this.$.overlay;
469
435
 
470
- this._srLabelController = new SlotController(this, 'sr-label', 'div', {
436
+ this.__contentController = new SlotController(this, 'overlay', 'div', {
471
437
  initializer: (element) => {
472
438
  element.id = this._uniqueId;
473
439
  element.setAttribute('role', 'tooltip');
474
- this._srLabel = element;
440
+ this.__contentNode = element;
475
441
  },
476
442
  });
477
- this.addController(this._srLabelController);
443
+ this.addController(this.__contentController);
478
444
  }
479
445
 
480
- /** @private */
481
- __computeOpened(manual, opened, autoOpened, connected) {
482
- return connected && (manual ? opened : autoOpened);
446
+ /** @protected */
447
+ updated(props) {
448
+ super.updated(props);
449
+
450
+ if (props.has('text') || props.has('generator') || props.has('context')) {
451
+ this.__updateContent();
452
+ this.$.overlay.toggleAttribute('hidden', this.__contentNode.textContent.trim() === '');
453
+ }
483
454
  }
484
455
 
485
456
  /** @private */
486
- __autoOpenedChanged(opened, oldOpened) {
457
+ __openedChanged(opened, oldOpened) {
487
458
  if (opened) {
488
459
  document.addEventListener('keydown', this.__onKeyDown, true);
489
460
  } else if (oldOpened) {
@@ -546,7 +517,7 @@ export const TooltipMixin = (superClass) =>
546
517
 
547
518
  this.__focusInside = true;
548
519
 
549
- if (!this.__isTargetHidden && (!this.__hoverInside || !this._autoOpened)) {
520
+ if (!this.__isTargetHidden && (!this.__hoverInside || !this.opened)) {
550
521
  this._stateController.open({ focus: true });
551
522
  }
552
523
  }
@@ -571,6 +542,10 @@ export const TooltipMixin = (superClass) =>
571
542
 
572
543
  /** @private */
573
544
  __onKeyDown(event) {
545
+ if (this.manual) {
546
+ return;
547
+ }
548
+
574
549
  if (event.key === 'Escape') {
575
550
  event.stopPropagation();
576
551
  this._stateController.close(true);
@@ -603,7 +578,7 @@ export const TooltipMixin = (superClass) =>
603
578
 
604
579
  this.__hoverInside = true;
605
580
 
606
- if (!this.__isTargetHidden && (!this.__focusInside || !this._autoOpened)) {
581
+ if (!this.__isTargetHidden && (!this.__focusInside || !this.opened)) {
607
582
  this._stateController.open({ hover: true });
608
583
  }
609
584
  }
@@ -617,6 +592,9 @@ export const TooltipMixin = (superClass) =>
617
592
 
618
593
  /** @protected */
619
594
  __onOverlayMouseEnter() {
595
+ if (this.manual) {
596
+ return;
597
+ }
620
598
  // Retain opened state when moving pointer over the overlay.
621
599
  // Closing can start due to an offset between the target and
622
600
  // the overlay itself. If that's the case, re-open overlay.
@@ -660,6 +638,10 @@ export const TooltipMixin = (superClass) =>
660
638
 
661
639
  /** @private */
662
640
  __onTargetVisibilityChange(isVisible) {
641
+ if (this.manual) {
642
+ return;
643
+ }
644
+
663
645
  const oldHidden = this.__isTargetHidden;
664
646
  this.__isTargetHidden = !isVisible;
665
647
 
@@ -670,7 +652,7 @@ export const TooltipMixin = (superClass) =>
670
652
  }
671
653
 
672
654
  // Close the overlay when the target is no longer fully visible.
673
- if (!isVisible && this._autoOpened) {
655
+ if (!isVisible && this.opened) {
674
656
  this._stateController.close(true);
675
657
  }
676
658
  }
@@ -685,25 +667,16 @@ export const TooltipMixin = (superClass) =>
685
667
  }
686
668
 
687
669
  /** @private */
688
- __textChanged(text, oldText) {
689
- if (this._overlayElement && (text || oldText)) {
690
- this._overlayElement.requestContentUpdate();
691
- }
692
- }
693
-
694
- /** @private */
695
- __tooltipRenderer(root) {
696
- root.textContent = typeof this.generator === 'function' ? this.generator(this.context) : this.text;
697
-
698
- // Update the sr-only label text content
699
- this._overlayContent = root.textContent;
670
+ __updateContent() {
671
+ this.__contentNode.textContent = typeof this.generator === 'function' ? this.generator(this.context) : this.text;
672
+ this.dispatchEvent(new CustomEvent('content-changed', { detail: { content: this.__contentNode.textContent } }));
700
673
  }
701
674
 
702
675
  /** @private */
703
676
  __computeAriaTarget(ariaTarget, target) {
704
677
  const isElementNode = (el) => el && el.nodeType === Node.ELEMENT_NODE;
705
678
  const isAriaTargetSet = Array.isArray(ariaTarget) ? ariaTarget.some(isElementNode) : ariaTarget;
706
- return isAriaTargetSet ? ariaTarget : target;
679
+ return ariaTarget === null || isAriaTargetSet ? ariaTarget : target;
707
680
  }
708
681
 
709
682
  /** @private */
@@ -721,22 +694,9 @@ export const TooltipMixin = (superClass) =>
721
694
  }
722
695
  }
723
696
 
724
- /** @private */
725
- __generatorChanged(overlayElement, generator, context) {
726
- if (overlayElement) {
727
- if (generator !== this.__oldTextGenerator || context !== this.__oldContext) {
728
- overlayElement.requestContentUpdate();
729
- }
730
-
731
- this.__oldTextGenerator = generator;
732
- this.__oldContext = context;
733
- }
734
- }
735
-
736
- /** @private */
737
- __updateSrLabelText(srLabel, textContent) {
738
- if (srLabel) {
739
- srLabel.textContent = textContent;
740
- }
741
- }
697
+ /**
698
+ * Fired when the tooltip text content is changed.
699
+ *
700
+ * @event content-changed
701
+ */
742
702
  };
@@ -7,10 +7,11 @@ import { html, LitElement } from 'lit';
7
7
  import { defineCustomElement } from '@vaadin/component-base/src/define.js';
8
8
  import { DirMixin } from '@vaadin/component-base/src/dir-mixin.js';
9
9
  import { PolylitMixin } from '@vaadin/component-base/src/polylit-mixin.js';
10
- import { overlayStyles } from '@vaadin/overlay/src/vaadin-overlay-styles.js';
10
+ import { overlayStyles } from '@vaadin/overlay/src/styles/vaadin-overlay-base-styles.js';
11
11
  import { PopoverOverlayMixin } from '@vaadin/popover/src/vaadin-popover-overlay-mixin.js';
12
+ import { LumoInjectionMixin } from '@vaadin/vaadin-themable-mixin/lumo-injection-mixin.js';
12
13
  import { ThemableMixin } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
13
- import { tooltipOverlayStyles } from './vaadin-tooltip-overlay-styles.js';
14
+ import { tooltipOverlayStyles } from './styles/vaadin-tooltip-overlay-base-styles.js';
14
15
 
15
16
  /**
16
17
  * An element used internally by `<vaadin-tooltip>`. Not intended to be used separately.
@@ -22,7 +23,9 @@ import { tooltipOverlayStyles } from './vaadin-tooltip-overlay-styles.js';
22
23
  * @mixes PopoverOverlayMixin
23
24
  * @private
24
25
  */
25
- class TooltipOverlay extends PopoverOverlayMixin(DirMixin(ThemableMixin(PolylitMixin(LitElement)))) {
26
+ class TooltipOverlay extends PopoverOverlayMixin(
27
+ DirMixin(ThemableMixin(PolylitMixin(LumoInjectionMixin(LitElement)))),
28
+ ) {
26
29
  static get is() {
27
30
  return 'vaadin-tooltip-overlay';
28
31
  }
@@ -31,30 +34,14 @@ class TooltipOverlay extends PopoverOverlayMixin(DirMixin(ThemableMixin(PolylitM
31
34
  return [overlayStyles, tooltipOverlayStyles];
32
35
  }
33
36
 
34
- /**
35
- * Tag name prefix used by custom properties.
36
- * @protected
37
- * @return {string}
38
- */
39
- get _tagNamePrefix() {
40
- return 'vaadin-tooltip';
41
- }
42
-
43
37
  /** @protected */
44
38
  render() {
45
39
  return html`
46
- <div id="backdrop" part="backdrop" hidden></div>
47
40
  <div part="overlay" id="overlay">
48
41
  <div part="content" id="content"><slot></slot></div>
49
42
  </div>
50
43
  `;
51
44
  }
52
-
53
- requestContentUpdate() {
54
- super.requestContentUpdate();
55
-
56
- this.toggleAttribute('hidden', this.textContent.trim() === '');
57
- }
58
45
  }
59
46
 
60
47
  defineCustomElement(TooltipOverlay);
@@ -9,6 +9,17 @@ import { TooltipMixin } from './vaadin-tooltip-mixin.js';
9
9
 
10
10
  export { TooltipPosition } from './vaadin-tooltip-mixin.js';
11
11
 
12
+ /**
13
+ * Fired when the tooltip text content is changed.
14
+ */
15
+ export type TooltipContentChangedEvent = CustomEvent<{ content: string }>;
16
+
17
+ export interface TooltipCustomEventMap {
18
+ 'content-changed': TooltipContentChangedEvent;
19
+ }
20
+
21
+ export interface TooltipEventMap extends HTMLElementEventMap, TooltipCustomEventMap {}
22
+
12
23
  /**
13
24
  * `<vaadin-tooltip>` is a Web Component for creating tooltips.
14
25
  *
@@ -19,11 +30,12 @@ export { TooltipPosition } from './vaadin-tooltip-mixin.js';
19
30
  *
20
31
  * ### Styling
21
32
  *
22
- * `<vaadin-tooltip>` uses `<vaadin-tooltip-overlay>` internal
23
- * themable component as the actual visible overlay.
33
+ * The following shadow DOM parts are available for styling:
24
34
  *
25
- * See [`<vaadin-overlay>`](#/elements/vaadin-overlay) documentation
26
- * for `<vaadin-tooltip-overlay>` parts.
35
+ * Part name | Description
36
+ * ----------- | ---------------
37
+ * `overlay` | The overlay element
38
+ * `content` | The overlay content element
27
39
  *
28
40
  * The following state attributes are available for styling:
29
41
  *
@@ -31,9 +43,6 @@ export { TooltipPosition } from './vaadin-tooltip-mixin.js';
31
43
  * -----------------|----------------------------------------
32
44
  * `position` | Reflects the `position` property value.
33
45
  *
34
- * Note: the `theme` attribute value set on `<vaadin-tooltip>` is
35
- * propagated to the internal `<vaadin-tooltip-overlay>` component.
36
- *
37
46
  * ### Custom CSS Properties
38
47
  *
39
48
  * The following custom CSS properties are available on the `<vaadin-tooltip>` element:
@@ -46,6 +55,8 @@ export { TooltipPosition } from './vaadin-tooltip-mixin.js';
46
55
  * `--vaadin-tooltip-offset-end` | Used as an offset when the tooltip is aligned horizontally before the target
47
56
  *
48
57
  * See [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.
58
+ *
59
+ * @fires {CustomEvent} content-changed - Fired when the tooltip text content is changed.
49
60
  */
50
61
  declare class Tooltip extends TooltipMixin(ThemePropertyMixin(ElementMixin(HTMLElement))) {
51
62
  /**
@@ -65,6 +76,18 @@ declare class Tooltip extends TooltipMixin(ThemePropertyMixin(ElementMixin(HTMLE
65
76
  * except for those that have hover delay configured using property.
66
77
  */
67
78
  static setDefaultHoverDelay(hoverDelay: number): void;
79
+
80
+ addEventListener<K extends keyof TooltipEventMap>(
81
+ type: K,
82
+ listener: (this: Tooltip, ev: TooltipEventMap[K]) => void,
83
+ options?: AddEventListenerOptions | boolean,
84
+ ): void;
85
+
86
+ removeEventListener<K extends keyof TooltipEventMap>(
87
+ type: K,
88
+ listener: (this: Tooltip, ev: TooltipEventMap[K]) => void,
89
+ options?: EventListenerOptions | boolean,
90
+ ): void;
68
91
  }
69
92
 
70
93
  declare global {
@@ -22,11 +22,12 @@ import { TooltipMixin } from './vaadin-tooltip-mixin.js';
22
22
  *
23
23
  * ### Styling
24
24
  *
25
- * `<vaadin-tooltip>` uses `<vaadin-tooltip-overlay>` internal
26
- * themable component as the actual visible overlay.
25
+ * The following shadow DOM parts are available for styling:
27
26
  *
28
- * See [`<vaadin-overlay>`](#/elements/vaadin-overlay) documentation
29
- * for `<vaadin-tooltip-overlay>` parts.
27
+ * Part name | Description
28
+ * ----------- | ---------------
29
+ * `overlay` | The overlay element
30
+ * `content` | The overlay content element
30
31
  *
31
32
  * The following state attributes are available for styling:
32
33
  *
@@ -34,9 +35,6 @@ import { TooltipMixin } from './vaadin-tooltip-mixin.js';
34
35
  * -----------------|----------------------------------------
35
36
  * `position` | Reflects the `position` property value.
36
37
  *
37
- * Note: the `theme` attribute value set on `<vaadin-tooltip>` is
38
- * propagated to the internal `<vaadin-tooltip-overlay>` component.
39
- *
40
38
  * ### Custom CSS Properties
41
39
  *
42
40
  * The following custom CSS properties are available on the `<vaadin-tooltip>` element:
@@ -50,6 +48,8 @@ import { TooltipMixin } from './vaadin-tooltip-mixin.js';
50
48
  *
51
49
  * See [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.
52
50
  *
51
+ * @fires {CustomEvent} content-changed - Fired when the tooltip text content is changed.
52
+ *
53
53
  * @customElement
54
54
  * @extends HTMLElement
55
55
  * @mixes ElementMixin
@@ -64,7 +64,7 @@ class Tooltip extends TooltipMixin(ThemePropertyMixin(ElementMixin(PolylitMixin(
64
64
  static get styles() {
65
65
  return css`
66
66
  :host {
67
- display: none;
67
+ display: contents;
68
68
  }
69
69
  `;
70
70
  }
@@ -76,10 +76,9 @@ class Tooltip extends TooltipMixin(ThemePropertyMixin(ElementMixin(PolylitMixin(
76
76
  return html`
77
77
  <vaadin-tooltip-overlay
78
78
  id="overlay"
79
- .renderer="${this._renderer}"
80
79
  .owner="${this}"
81
80
  theme="${ifDefined(this._theme)}"
82
- .opened="${this._isConnected && (this.manual ? this.opened : this._autoOpened)}"
81
+ .opened="${this._isConnected && this.opened}"
83
82
  .positionTarget="${this.target}"
84
83
  .position="${effectivePosition}"
85
84
  ?no-horizontal-overlap="${this.__computeNoHorizontalOverlap(effectivePosition)}"
@@ -89,9 +88,9 @@ class Tooltip extends TooltipMixin(ThemePropertyMixin(ElementMixin(PolylitMixin(
89
88
  @mouseenter="${this.__onOverlayMouseEnter}"
90
89
  @mouseleave="${this.__onOverlayMouseLeave}"
91
90
  modeless
91
+ exportparts="overlay, content"
92
+ ><slot name="overlay"></slot
92
93
  ></vaadin-tooltip-overlay>
93
-
94
- <slot name="sr-label"></slot>
95
94
  `;
96
95
  }
97
96
  }
package/vaadin-tooltip.js CHANGED
@@ -1,3 +1,3 @@
1
- import './theme/lumo/vaadin-tooltip.js';
1
+ import './src/vaadin-tooltip.js';
2
2
 
3
3
  export * from './src/vaadin-tooltip.js';
package/web-types.json CHANGED
@@ -1,26 +1,15 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/tooltip",
4
- "version": "25.0.0-alpha2",
4
+ "version": "25.0.0-alpha20",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
8
8
  "elements": [
9
9
  {
10
10
  "name": "vaadin-tooltip",
11
- "description": "`<vaadin-tooltip>` is a Web Component for creating tooltips.\n\n```html\n<button id=\"confirm\">Confirm</button>\n<vaadin-tooltip text=\"Click to save changes\" for=\"confirm\"></vaadin-tooltip>\n```\n\n### Styling\n\n`<vaadin-tooltip>` uses `<vaadin-tooltip-overlay>` internal\nthemable component as the actual visible overlay.\n\nSee [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/25.0.0-alpha2/#/elements/vaadin-overlay) documentation\nfor `<vaadin-tooltip-overlay>` parts.\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|----------------------------------------\n`position` | Reflects the `position` property value.\n\nNote: the `theme` attribute value set on `<vaadin-tooltip>` is\npropagated to the internal `<vaadin-tooltip-overlay>` component.\n\n### Custom CSS Properties\n\nThe following custom CSS properties are available on the `<vaadin-tooltip>` element:\n\nCustom CSS property | Description\n---------------------------------|-------------\n`--vaadin-tooltip-offset-top` | Used as an offset when the tooltip is aligned vertically below the target\n`--vaadin-tooltip-offset-bottom` | Used as an offset when the tooltip is aligned vertically above the target\n`--vaadin-tooltip-offset-start` | Used as an offset when the tooltip is aligned horizontally after the target\n`--vaadin-tooltip-offset-end` | Used as an offset when the tooltip is aligned horizontally before the target\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
11
+ "description": "`<vaadin-tooltip>` is a Web Component for creating tooltips.\n\n```html\n<button id=\"confirm\">Confirm</button>\n<vaadin-tooltip text=\"Click to save changes\" for=\"confirm\"></vaadin-tooltip>\n```\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n----------- | ---------------\n`overlay` | The overlay element\n`content` | The overlay content element\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|----------------------------------------\n`position` | Reflects the `position` property value.\n\n### Custom CSS Properties\n\nThe following custom CSS properties are available on the `<vaadin-tooltip>` element:\n\nCustom CSS property | Description\n---------------------------------|-------------\n`--vaadin-tooltip-offset-top` | Used as an offset when the tooltip is aligned vertically below the target\n`--vaadin-tooltip-offset-bottom` | Used as an offset when the tooltip is aligned vertically above the target\n`--vaadin-tooltip-offset-start` | Used as an offset when the tooltip is aligned horizontally after the target\n`--vaadin-tooltip-offset-end` | Used as an offset when the tooltip is aligned horizontally before the target\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
12
12
  "attributes": [
13
- {
14
- "name": "overlay-class",
15
- "description": "A space-delimited list of CSS class names to set on the overlay element.\nThis property does not affect other CSS class names set manually via JS.\n\nNote, if the CSS class name was set with this property, clearing it will\nremove it from the overlay, even if the same class name was also added\nmanually, e.g. by using `classList.add()` in the `renderer` function.",
16
- "value": {
17
- "type": [
18
- "string",
19
- "null",
20
- "undefined"
21
- ]
22
- }
23
- },
24
13
  {
25
14
  "name": "position",
26
15
  "description": "Position of the overlay with respect to the target.\nSupported values: `top-start`, `top`, `top-end`,\n`bottom-start`, `bottom`, `bottom-end`, `start-top`,\n`start`, `start-bottom`, `end-top`, `end`, `end-bottom`.",
@@ -89,7 +78,7 @@
89
78
  },
90
79
  {
91
80
  "name": "opened",
92
- "description": "When true, the tooltip is opened programmatically.\nOnly works if `manual` is set to `true`.",
81
+ "description": "When true, the tooltip is opened.\nIn manual mode, this can be set programmatically.\nIn automatic mode, this is set automatically by internal logic.",
93
82
  "value": {
94
83
  "type": [
95
84
  "boolean",
@@ -123,17 +112,6 @@
123
112
  ],
124
113
  "js": {
125
114
  "properties": [
126
- {
127
- "name": "overlayClass",
128
- "description": "A space-delimited list of CSS class names to set on the overlay element.\nThis property does not affect other CSS class names set manually via JS.\n\nNote, if the CSS class name was set with this property, clearing it will\nremove it from the overlay, even if the same class name was also added\nmanually, e.g. by using `classList.add()` in the `renderer` function.",
129
- "value": {
130
- "type": [
131
- "string",
132
- "null",
133
- "undefined"
134
- ]
135
- }
136
- },
137
115
  {
138
116
  "name": "position",
139
117
  "description": "Position of the overlay with respect to the target.\nSupported values: `top-start`, `top`, `top-end`,\n`bottom-start`, `bottom`, `bottom-end`, `start-top`,\n`start`, `start-bottom`, `end-top`, `end`, `end-bottom`.",
@@ -246,7 +224,7 @@
246
224
  },
247
225
  {
248
226
  "name": "opened",
249
- "description": "When true, the tooltip is opened programmatically.\nOnly works if `manual` is set to `true`.",
227
+ "description": "When true, the tooltip is opened.\nIn manual mode, this can be set programmatically.\nIn automatic mode, this is set automatically by internal logic.",
250
228
  "value": {
251
229
  "type": [
252
230
  "boolean",
@@ -278,7 +256,12 @@
278
256
  }
279
257
  }
280
258
  ],
281
- "events": []
259
+ "events": [
260
+ {
261
+ "name": "content-changed",
262
+ "description": "Fired when the tooltip text content is changed."
263
+ }
264
+ ]
282
265
  }
283
266
  }
284
267
  ]
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/web-types",
3
3
  "name": "@vaadin/tooltip",
4
- "version": "25.0.0-alpha2",
4
+ "version": "25.0.0-alpha20",
5
5
  "description-markup": "markdown",
6
6
  "framework": "lit",
7
7
  "framework-config": {
@@ -16,7 +16,7 @@
16
16
  "elements": [
17
17
  {
18
18
  "name": "vaadin-tooltip",
19
- "description": "`<vaadin-tooltip>` is a Web Component for creating tooltips.\n\n```html\n<button id=\"confirm\">Confirm</button>\n<vaadin-tooltip text=\"Click to save changes\" for=\"confirm\"></vaadin-tooltip>\n```\n\n### Styling\n\n`<vaadin-tooltip>` uses `<vaadin-tooltip-overlay>` internal\nthemable component as the actual visible overlay.\n\nSee [`<vaadin-overlay>`](https://cdn.vaadin.com/vaadin-web-components/25.0.0-alpha2/#/elements/vaadin-overlay) documentation\nfor `<vaadin-tooltip-overlay>` parts.\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|----------------------------------------\n`position` | Reflects the `position` property value.\n\nNote: the `theme` attribute value set on `<vaadin-tooltip>` is\npropagated to the internal `<vaadin-tooltip-overlay>` component.\n\n### Custom CSS Properties\n\nThe following custom CSS properties are available on the `<vaadin-tooltip>` element:\n\nCustom CSS property | Description\n---------------------------------|-------------\n`--vaadin-tooltip-offset-top` | Used as an offset when the tooltip is aligned vertically below the target\n`--vaadin-tooltip-offset-bottom` | Used as an offset when the tooltip is aligned vertically above the target\n`--vaadin-tooltip-offset-start` | Used as an offset when the tooltip is aligned horizontally after the target\n`--vaadin-tooltip-offset-end` | Used as an offset when the tooltip is aligned horizontally before the target\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
19
+ "description": "`<vaadin-tooltip>` is a Web Component for creating tooltips.\n\n```html\n<button id=\"confirm\">Confirm</button>\n<vaadin-tooltip text=\"Click to save changes\" for=\"confirm\"></vaadin-tooltip>\n```\n\n### Styling\n\nThe following shadow DOM parts are available for styling:\n\nPart name | Description\n----------- | ---------------\n`overlay` | The overlay element\n`content` | The overlay content element\n\nThe following state attributes are available for styling:\n\nAttribute | Description\n-----------------|----------------------------------------\n`position` | Reflects the `position` property value.\n\n### Custom CSS Properties\n\nThe following custom CSS properties are available on the `<vaadin-tooltip>` element:\n\nCustom CSS property | Description\n---------------------------------|-------------\n`--vaadin-tooltip-offset-top` | Used as an offset when the tooltip is aligned vertically below the target\n`--vaadin-tooltip-offset-bottom` | Used as an offset when the tooltip is aligned vertically above the target\n`--vaadin-tooltip-offset-start` | Used as an offset when the tooltip is aligned horizontally after the target\n`--vaadin-tooltip-offset-end` | Used as an offset when the tooltip is aligned horizontally before the target\n\nSee [Styling Components](https://vaadin.com/docs/latest/styling/styling-components) documentation.",
20
20
  "extension": true,
21
21
  "attributes": [
22
22
  {
@@ -28,14 +28,7 @@
28
28
  },
29
29
  {
30
30
  "name": "?opened",
31
- "description": "When true, the tooltip is opened programmatically.\nOnly works if `manual` is set to `true`.",
32
- "value": {
33
- "kind": "expression"
34
- }
35
- },
36
- {
37
- "name": ".overlayClass",
38
- "description": "A space-delimited list of CSS class names to set on the overlay element.\nThis property does not affect other CSS class names set manually via JS.\n\nNote, if the CSS class name was set with this property, clearing it will\nremove it from the overlay, even if the same class name was also added\nmanually, e.g. by using `classList.add()` in the `renderer` function.",
31
+ "description": "When true, the tooltip is opened.\nIn manual mode, this can be set programmatically.\nIn automatic mode, this is set automatically by internal logic.",
39
32
  "value": {
40
33
  "kind": "expression"
41
34
  }
@@ -116,6 +109,13 @@
116
109
  "value": {
117
110
  "kind": "expression"
118
111
  }
112
+ },
113
+ {
114
+ "name": "@content-changed",
115
+ "description": "Fired when the tooltip text content is changed.",
116
+ "value": {
117
+ "kind": "expression"
118
+ }
119
119
  }
120
120
  ]
121
121
  }
@@ -1,42 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright (c) 2022 - 2025 Vaadin Ltd.
4
- * This program is available under Apache License Version 2.0, available at https://vaadin.com/license/
5
- */
6
- import { css } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
7
-
8
- export const tooltipOverlayStyles = css`
9
- [part='overlay'] {
10
- max-width: 40ch;
11
- }
12
-
13
- [part='content'] {
14
- white-space: pre-wrap;
15
- }
16
-
17
- :host([position^='top'][top-aligned]) [part='overlay'],
18
- :host([position^='bottom'][top-aligned]) [part='overlay'] {
19
- margin-top: var(--vaadin-tooltip-offset-top, 0);
20
- }
21
-
22
- :host([position^='top'][bottom-aligned]) [part='overlay'],
23
- :host([position^='bottom'][bottom-aligned]) [part='overlay'] {
24
- margin-bottom: var(--vaadin-tooltip-offset-bottom, 0);
25
- }
26
-
27
- :host([position^='start'][start-aligned]) [part='overlay'],
28
- :host([position^='end'][start-aligned]) [part='overlay'] {
29
- margin-inline-start: var(--vaadin-tooltip-offset-start, 0);
30
- }
31
-
32
- :host([position^='start'][end-aligned]) [part='overlay'],
33
- :host([position^='end'][end-aligned]) [part='overlay'] {
34
- margin-inline-end: var(--vaadin-tooltip-offset-end, 0);
35
- }
36
-
37
- @media (forced-colors: active) {
38
- [part='overlay'] {
39
- outline: 1px dashed;
40
- }
41
- }
42
- `;
@@ -1,3 +0,0 @@
1
- import '@vaadin/vaadin-lumo-styles/color.js';
2
- import '@vaadin/vaadin-lumo-styles/style.js';
3
- import '@vaadin/vaadin-lumo-styles/typography.js';
@@ -1,27 +0,0 @@
1
- import '@vaadin/vaadin-lumo-styles/color.js';
2
- import '@vaadin/vaadin-lumo-styles/style.js';
3
- import '@vaadin/vaadin-lumo-styles/typography.js';
4
- import { overlay } from '@vaadin/vaadin-lumo-styles/mixins/overlay.js';
5
- import { css, registerStyles } from '@vaadin/vaadin-themable-mixin/vaadin-themable-mixin.js';
6
-
7
- const tooltipOverlay = css`
8
- :host {
9
- --vaadin-tooltip-offset-top: var(--lumo-space-xs);
10
- --vaadin-tooltip-offset-bottom: var(--lumo-space-xs);
11
- --vaadin-tooltip-offset-start: var(--lumo-space-xs);
12
- --vaadin-tooltip-offset-end: var(--lumo-space-xs);
13
- }
14
-
15
- [part='overlay'] {
16
- background: var(--lumo-base-color) linear-gradient(var(--lumo-contrast-5pct), var(--lumo-contrast-5pct));
17
- color: var(--lumo-body-text-color);
18
- font-size: var(--lumo-font-size-xs);
19
- line-height: var(--lumo-line-height-s);
20
- }
21
-
22
- [part='content'] {
23
- padding: var(--lumo-space-xs) var(--lumo-space-s);
24
- }
25
- `;
26
-
27
- registerStyles('vaadin-tooltip-overlay', [overlay, tooltipOverlay], { moduleId: 'lumo-tooltip-overlay' });
@@ -1,2 +0,0 @@
1
- import './vaadin-tooltip-styles.js';
2
- import '../../src/vaadin-tooltip.js';
@@ -1,2 +0,0 @@
1
- import './vaadin-tooltip-styles.js';
2
- import '../../src/vaadin-tooltip.js';