Skip to content

Commit 77a697a

Browse files
committed
refactor: Use slot controller and part attribute for styling
1 parent 530a7a8 commit 77a697a

File tree

3 files changed

+18
-43
lines changed

3 files changed

+18
-43
lines changed

src/components/tooltip/themes/tooltip.base.scss

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
text-align: center;
99
}
1010

11-
[part="base"] {
11+
[part~="base"] {
1212
@include type-style('body-2');
1313

1414
padding: pad-block(rem(4px)) pad-inline(rem(8px));
@@ -20,10 +20,10 @@
2020
align-items: flex-start;
2121
gap: rem(8px);
2222
position: relative;
23+
}
2324

24-
&.simple-text {
25-
max-width: 200px;
26-
}
25+
[part~="simple-text"] {
26+
max-width: 200px;
2727
}
2828

2929
#arrow {

src/components/tooltip/tooltip.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,9 @@ describe('Tooltip', () => {
287287
tooltip = container.querySelector(IgcTooltipComponent.tagName)!;
288288
await elementUpdated(tooltip);
289289

290-
const baseElement = tooltip.renderRoot.querySelector('[part="base"]');
290+
const baseElement = tooltip.renderRoot.querySelector('[part~="base"]');
291291
expect(baseElement).not.to.be.null;
292-
expect(baseElement?.classList.contains('simple-text')).to.be.true;
292+
expect(baseElement?.part.contains('simple-text')).to.be.true;
293293
});
294294

295295
it('should not apply simple-text class when using custom content', async () => {
@@ -305,9 +305,9 @@ describe('Tooltip', () => {
305305
tooltip = container.querySelector(IgcTooltipComponent.tagName)!;
306306
await elementUpdated(tooltip);
307307

308-
const baseElement = tooltip.renderRoot.querySelector('[part="base"]');
308+
const baseElement = tooltip.renderRoot.querySelector('[part~="base"]');
309309
expect(baseElement).not.to.be.null;
310-
expect(baseElement?.classList.contains('simple-text')).to.be.false;
310+
expect(baseElement?.part.contains('simple-text')).to.be.false;
311311
});
312312

313313
it('should render a default close button when in `sticky` mode', async () => {

src/components/tooltip/tooltip.ts

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
import { html, LitElement, nothing, type PropertyValues } from 'lit';
2-
import { property, query, state } from 'lit/decorators.js';
3-
import { classMap } from 'lit/directives/class-map.js';
2+
import { property, query } from 'lit/decorators.js';
43
import { createRef, ref } from 'lit/directives/ref.js';
54
import { EaseOut } from '../../animations/easings.js';
65
import { addAnimationController } from '../../animations/player.js';
76
import { fadeOut } from '../../animations/presets/fade/index.js';
87
import { scaleInCenter } from '../../animations/presets/scale/index.js';
98
import { addThemingController } from '../../theming/theming-controller.js';
109
import { addInternalsController } from '../common/controllers/internals.js';
10+
import { addSlotController, setSlots } from '../common/controllers/slot.js';
1111
import { registerComponent } from '../common/definitions/register.js';
1212
import type { Constructor } from '../common/mixins/constructor.js';
1313
import { EventEmitterMixin } from '../common/mixins/event-emitter.js';
14+
import { partMap } from '../common/part-map.js';
1415
import { asNumber, isLTR } from '../common/util.js';
1516
import IgcIconComponent from '../icon/icon.js';
1617
import IgcPopoverComponent, {
@@ -44,6 +45,7 @@ type TooltipStateOptions = {
4445
* @slot close-button - Slot for custom sticky-mode close action (e.g., an icon/button).
4546
*
4647
* @csspart base - The wrapping container of the tooltip content.
48+
* @csspart simple-text - The container where the message property of the tooltip is rendered.
4749
*
4850
* @fires igcOpening - Emitted before the tooltip begins to open. Can be canceled to prevent opening.
4951
* @fires igcOpened - Emitted after the tooltip has successfully opened and is visible.
@@ -83,6 +85,7 @@ export default class IgcTooltipComponent extends EventEmitterMixin<
8385

8486
private readonly _containerRef = createRef<HTMLElement>();
8587
private readonly _player = addAnimationController(this, this._containerRef);
88+
private readonly _slots = addSlotController(this, { slots: setSlots() });
8689

8790
private readonly _showAnimation = scaleInCenter({
8891
duration: 150,
@@ -102,14 +105,6 @@ export default class IgcTooltipComponent extends EventEmitterMixin<
102105
@query('#arrow')
103106
private _arrowElement!: HTMLElement;
104107

105-
@query('slot:not([name])')
106-
private _defaultSlot!: HTMLSlotElement;
107-
108-
@state()
109-
private _hasCustomContent = false;
110-
111-
private _initialCheckDone = false;
112-
113108
private get _arrowOffset() {
114109
if (this.placement.includes('-')) {
115110
// Horizontal start | end placement
@@ -302,15 +297,6 @@ export default class IgcTooltipComponent extends EventEmitterMixin<
302297
}
303298
}
304299

305-
protected override updated(changedProperties: PropertyValues<this>): void {
306-
super.updated(changedProperties);
307-
// Check on first update when slot becomes available, or when message changes
308-
if (!this._initialCheckDone || changedProperties.has('message')) {
309-
this._initialCheckDone = true;
310-
this.updateComplete.then(() => this._checkForCustomContent());
311-
}
312-
}
313-
314300
protected override willUpdate(changedProperties: PropertyValues<this>): void {
315301
if (changedProperties.has('anchor')) {
316302
this._controller.resolveAnchor(this.anchor);
@@ -447,19 +433,10 @@ export default class IgcTooltipComponent extends EventEmitterMixin<
447433
this._emitEvent('igcClosed');
448434
}
449435

450-
private _checkForCustomContent(): void {
451-
if (!this._defaultSlot) {
452-
this._hasCustomContent = false;
453-
return;
454-
}
455-
const assignedNodes = this._defaultSlot.assignedNodes({ flatten: true });
456-
// If there are assigned nodes, we have custom content
457-
this._hasCustomContent = assignedNodes.length > 0;
458-
}
459-
460436
protected override render() {
461-
const classes = {
462-
'simple-text': !this._hasCustomContent,
437+
const parts = {
438+
base: true,
439+
'simple-text': !this._slots.hasAssignedNodes('[default]', true),
463440
};
464441

465442
return html`
@@ -475,10 +452,8 @@ export default class IgcTooltipComponent extends EventEmitterMixin<
475452
flip
476453
shift
477454
>
478-
<div ${ref(this._containerRef)} part="base" class=${classMap(classes)}>
479-
<slot @slotchange=${this._checkForCustomContent}
480-
>${this.message}</slot
481-
>
455+
<div ${ref(this._containerRef)} part=${partMap(parts)}>
456+
<slot>${this.message}</slot>
482457
${this.sticky
483458
? html`
484459
<slot name="close-button" @click=${this._setAutoHide}>

0 commit comments

Comments
 (0)