Skip to content

Commit f386bef

Browse files
committed
refactor: Removed manager drag overlay container
Attaching the drag ghost inside the overlay messes up the any Light DOM styles and there is no easy way to fix that.
1 parent 3377715 commit f386bef

File tree

6 files changed

+57
-68
lines changed

6 files changed

+57
-68
lines changed

src/components/common/context.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
import { createContext } from '@lit/context';
22
import type { Ref } from 'lit/directives/ref.js';
33
import type IgcCarouselComponent from '../carousel/carousel.js';
4-
import type { addFullscreenController } from '../tile-manager/controllers/fullscreen.js';
54
import type IgcTileManagerComponent from '../tile-manager/tile-manager.js';
6-
import type IgcTileComponent from '../tile-manager/tile.js';
75

86
export type TileManagerContext = {
97
/** The igc-tile-manager instance. */
108
instance: IgcTileManagerComponent;
119
/** The internal CSS grid container of the igc-tile-manager. */
1210
grid: Ref<HTMLElement>;
13-
/** The internal igc-tile-manager overlay container. */
14-
overlay: Ref<HTMLElement>;
1511
};
1612

1713
const carouselContext = createContext<IgcCarouselComponent>(

src/components/tile-manager/themes/tile-manager.base.scss

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,6 @@
88
--ig-min-row-height: 200px;
99
}
1010

11-
[part="overlay"] {
12-
position: absolute;
13-
top: 0;
14-
left: 0;
15-
z-index: 1;
16-
width: 100%;
17-
height: 100%;
18-
pointer-events: none;
19-
}
20-
2111
[part~='base'] {
2212
display: grid;
2313
position: relative;

src/components/tile-manager/tile-manager.spec.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,11 @@ describe('Tile Manager component', () => {
166166
);
167167

168168
expect(tileManager).shadowDom.to.equal(
169-
`<div part="overlay">
170-
</div>
171-
<div
172-
part="base"
173-
style=""
174-
>
169+
`</div>
170+
<div
171+
part="base"
172+
style=""
173+
>
175174
<slot></slot>
176175
</div>`
177176
);

src/components/tile-manager/tile-manager.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { createSerializer } from './serializer.js';
2626
import { all } from './themes/container.js';
2727
import { styles as shared } from './themes/shared/tile-manager.common.css.js';
2828
import { styles } from './themes/tile-manager.base.css.js';
29+
import { DraggedTileAttribute } from './tile-util.js';
2930
import IgcTileComponent from './tile.js';
3031

3132
// REVIEW: WIP
@@ -74,7 +75,6 @@ export default class IgcTileManagerComponent extends EventEmitterMixin<
7475
private _tilesState = createTilesState(this);
7576

7677
private _grid = createRef<HTMLElement>();
77-
private _overlay = createRef<HTMLElement>();
7878

7979
// #endregion
8080

@@ -89,7 +89,6 @@ export default class IgcTileManagerComponent extends EventEmitterMixin<
8989
return {
9090
instance: this,
9191
grid: this._grid,
92-
overlay: this._overlay,
9392
};
9493
}
9594

@@ -225,7 +224,7 @@ export default class IgcTileManagerComponent extends EventEmitterMixin<
225224

226225
createMutationController(this, {
227226
callback: this._observerCallback,
228-
filter: [IgcTileComponent.tagName],
227+
filter: [`${IgcTileComponent.tagName}:not([${DraggedTileAttribute}])`],
229228
config: {
230229
childList: true,
231230
},
@@ -284,18 +283,13 @@ export default class IgcTileManagerComponent extends EventEmitterMixin<
284283

285284
// #region Rendering
286285

287-
protected _renderOverlay() {
288-
return html`<div ${ref(this._overlay)} part="overlay"></div>`;
289-
}
290-
291286
protected override render() {
292287
const parts = partNameMap({
293288
base: true,
294289
'maximized-tile': this.tiles.some((tile) => tile.maximized),
295290
});
296291

297292
return html`
298-
${this._renderOverlay()}
299293
<div
300294
${ref(this._grid)}
301295
style=${styleMap(this._internalStyles)}

src/components/tile-manager/tile-util.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ type TileGridPosition = {
1212
row: TilePosition;
1313
};
1414

15+
export const DraggedTileAttribute = 'data-drag-ghost-tile';
16+
1517
type TileGridDimension = { count: number; entries: number[]; minSize: number };
1618

1719
const CssValues = new RegExp(/(?<start>\d+)?\s*\/?\s*span\s*(?<span>\d+)?/gi);
@@ -332,6 +334,32 @@ export function createTileResizeState(): TileResizeState {
332334
return new TileResizeState();
333335
}
334336

337+
export function createTileDragGhost(tile: IgcTileComponent): IgcTileComponent {
338+
const clone = tile.cloneNode(true) as IgcTileComponent;
339+
const { width, height } = tile.getBoundingClientRect();
340+
341+
clone.removeAttribute('id');
342+
clone.setAttribute(DraggedTileAttribute, '');
343+
clone.inert = true;
344+
clone.position = -1;
345+
346+
Object.assign(clone.style, {
347+
position: 'absolute',
348+
contain: 'strict',
349+
top: 0,
350+
left: 0,
351+
width: `${width}px`,
352+
height: `${height}px`,
353+
background: 'var(--placeholder-background)',
354+
border: '1px solid var(--ghost-border)',
355+
borderRadius: 'var(--border-radius)',
356+
zIndex: 1000,
357+
viewTransitionName: 'dragged-tile-ghost',
358+
});
359+
360+
return clone;
361+
}
362+
335363
export function createTileGhost(): HTMLElement {
336364
const element = document.createElement('div');
337365

src/components/tile-manager/tile.ts

Lines changed: 22 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ import { swapTiles } from './position.js';
2828
import { styles as shared } from './themes/shared/tile/tile.common.css.js';
2929
import { styles } from './themes/tile.base.css.js';
3030
import { all } from './themes/tile.js';
31-
import { createTileGhost, createTileResizeState } from './tile-util.js';
31+
import {
32+
createTileDragGhost,
33+
createTileGhost,
34+
createTileResizeState,
35+
} from './tile-util.js';
3236

3337
type IgcTileChangeState = {
3438
tile: IgcTileComponent;
@@ -94,7 +98,7 @@ export default class IgcTileComponent extends EventEmitterMixin<
9498
private _dragController = addDragController(this, {
9599
skip: this._skipDrag,
96100
matchTarget: this._match,
97-
layer: () => this._tileOverlay,
101+
layer: () => this._tileManager!,
98102
ghost: this._createDragGhost,
99103
dragStart: this._handleDragStart,
100104
dragMove: this._handleDragMove,
@@ -133,36 +137,35 @@ export default class IgcTileComponent extends EventEmitterMixin<
133137
});
134138
};
135139

136-
private _managerContext = createAsyncContext(
140+
private _context = createAsyncContext(
137141
this,
138142
tileManagerContext,
139143
this._setDragConfiguration
140144
);
141145

142-
/** Returns the parent tile manager. */
143-
private get _tileManager(): TileManagerContext | undefined {
144-
return this._managerContext.value;
146+
/** Returns the parent tile manager context. */
147+
private get _tileManagerCtx(): TileManagerContext | undefined {
148+
return this._context.value;
145149
}
146150

147-
/** Returns the overlay container of the tile manager. */
148-
private get _tileOverlay(): HTMLElement {
149-
return this._tileManager?.overlay.value!;
151+
private get _tileManager() {
152+
return this._tileManagerCtx?.instance;
150153
}
151154

152155
/** Returns the tile manager internal CSS grid container. */
153156
private get _cssContainer(): HTMLElement {
154-
return this._tileManager?.grid.value!;
157+
return this._tileManagerCtx?.grid.value!;
155158
}
156159

157160
/** Returns the tile manager current resize mode. */
158161
private get _resizeMode() {
159-
return this._tileManager?.instance.resizeMode ?? 'none';
162+
return this._tileManager?.resizeMode ?? 'none';
160163
}
161164

162165
/** Whether the parent tile manager drag action is in **slide** mode. */
163166
private get _isSlideMode(): boolean {
164-
return this._tileManager
165-
? this._tileManager.instance.dragAction === 'slide'
167+
return this._tileManagerCtx
168+
? this._tileManagerCtx.instance.dragAction === 'slide'
166169
: true;
167170
}
168171

@@ -293,8 +296,8 @@ export default class IgcTileComponent extends EventEmitterMixin<
293296
public set maximized(value: boolean) {
294297
this._maximized = value;
295298

296-
if (this._tileManager) {
297-
this._tileManager.instance.requestUpdate();
299+
if (this._tileManagerCtx) {
300+
this._tileManagerCtx.instance.requestUpdate();
298301
}
299302
}
300303

@@ -346,7 +349,8 @@ export default class IgcTileComponent extends EventEmitterMixin<
346349
super.connectedCallback();
347350
this.tileId = this.tileId || `tile-${IgcTileComponent.increment()}`;
348351

349-
this.style.viewTransitionName = `tile-transition-${this.tileId}`;
352+
this.style.viewTransitionName =
353+
this.style.viewTransitionName || `tile-transition-${this.tileId}`;
350354
}
351355

352356
private _setDragState(state = true) {
@@ -397,30 +401,8 @@ export default class IgcTileComponent extends EventEmitterMixin<
397401
return element !== this && IgcTileComponent.tagName === element.localName;
398402
}
399403

400-
private _createDragGhost(): HTMLElement {
401-
const ghost = this.cloneNode(true) as HTMLElement;
402-
const { width, height } = this.getBoundingClientRect();
403-
404-
Object.assign(ghost, {
405-
inert: true,
406-
id: '',
407-
});
408-
409-
Object.assign(ghost.style, {
410-
position: 'absolute',
411-
contain: 'strict',
412-
top: 0,
413-
left: 0,
414-
width: `${width}px`,
415-
height: `${height}px`,
416-
background: 'var(--placeholder-background)',
417-
border: '1px solid var(--ghost-border)',
418-
borderRadius: 'var(--border-radius)',
419-
zIndex: 1000,
420-
viewTransitionName: '',
421-
});
422-
423-
return ghost;
404+
private _createDragGhost(): IgcTileComponent {
405+
return createTileDragGhost(this);
424406
}
425407

426408
private _setResizeState(state = true) {

0 commit comments

Comments
 (0)