Skip to content

Commit 0b1a09d

Browse files
committed
feat: replace transform with top,left,width,height
1 parent c2791c6 commit 0b1a09d

File tree

2 files changed

+90
-41
lines changed

2 files changed

+90
-41
lines changed

packages/dockview-core/src/__tests__/dnd/droptarget.spec.ts

+59-29
Original file line numberDiff line numberDiff line change
@@ -171,18 +171,37 @@ describe('droptarget', () => {
171171
createOffsetDragOverEvent({ clientX: 19, clientY: 0 })
172172
);
173173

174+
function check(
175+
element: HTMLElement,
176+
box: {
177+
left: string;
178+
top: string;
179+
width: string;
180+
height: string;
181+
}
182+
) {
183+
expect(element.style.top).toBe(box.top);
184+
expect(element.style.left).toBe(box.left);
185+
expect(element.style.width).toBe(box.width);
186+
expect(element.style.height).toBe(box.height);
187+
}
188+
174189
viewQuery = element.querySelectorAll(
175190
'.drop-target > .drop-target-dropzone > .drop-target-selection'
176191
);
177192
expect(viewQuery.length).toBe(1);
178193
expect(droptarget.state).toBe('left');
179-
expect(
180-
(
181-
element
182-
.getElementsByClassName('drop-target-selection')
183-
.item(0) as HTMLDivElement
184-
).style.transform
185-
).toBe('translateX(-25%) scaleX(0.5)');
194+
check(
195+
element
196+
.getElementsByClassName('drop-target-selection')
197+
.item(0) as HTMLDivElement,
198+
{
199+
top: '0px',
200+
left: '0px',
201+
width: '50%',
202+
height: '100%',
203+
}
204+
);
186205

187206
fireEvent(
188207
target,
@@ -194,13 +213,17 @@ describe('droptarget', () => {
194213
);
195214
expect(viewQuery.length).toBe(1);
196215
expect(droptarget.state).toBe('top');
197-
expect(
198-
(
199-
element
200-
.getElementsByClassName('drop-target-selection')
201-
.item(0) as HTMLDivElement
202-
).style.transform
203-
).toBe('translateY(-25%) scaleY(0.5)');
216+
check(
217+
element
218+
.getElementsByClassName('drop-target-selection')
219+
.item(0) as HTMLDivElement,
220+
{
221+
top: '0px',
222+
left: '0px',
223+
width: '100%',
224+
height: '50%',
225+
}
226+
);
204227

205228
fireEvent(
206229
target,
@@ -212,13 +235,17 @@ describe('droptarget', () => {
212235
);
213236
expect(viewQuery.length).toBe(1);
214237
expect(droptarget.state).toBe('bottom');
215-
expect(
216-
(
217-
element
218-
.getElementsByClassName('drop-target-selection')
219-
.item(0) as HTMLDivElement
220-
).style.transform
221-
).toBe('translateY(25%) scaleY(0.5)');
238+
check(
239+
element
240+
.getElementsByClassName('drop-target-selection')
241+
.item(0) as HTMLDivElement,
242+
{
243+
top: '50%',
244+
left: '0px',
245+
width: '100%',
246+
height: '50%',
247+
}
248+
);
222249

223250
fireEvent(
224251
target,
@@ -230,14 +257,17 @@ describe('droptarget', () => {
230257
);
231258
expect(viewQuery.length).toBe(1);
232259
expect(droptarget.state).toBe('right');
233-
expect(
234-
(
235-
element
236-
.getElementsByClassName('drop-target-selection')
237-
.item(0) as HTMLDivElement
238-
).style.transform
239-
).toBe('translateX(25%) scaleX(0.5)');
240-
260+
check(
261+
element
262+
.getElementsByClassName('drop-target-selection')
263+
.item(0) as HTMLDivElement,
264+
{
265+
top: '0px',
266+
left: '50%',
267+
width: '50%',
268+
height: '100%',
269+
}
270+
);
241271
fireEvent(
242272
target,
243273
createOffsetDragOverEvent({ clientX: 100, clientY: 50 })

packages/dockview-core/src/dnd/droptarget.ts

+31-12
Original file line numberDiff line numberDiff line change
@@ -304,24 +304,43 @@ export class Droptarget extends CompositeDisposable {
304304
}
305305
}
306306

307-
const translate = (1 - size) / 2;
308-
const scale = size;
309-
310-
let transform: string;
311-
307+
const box = { top: '0px', left: '0px', width: '100%', height: '100%' };
308+
309+
/**
310+
* You can also achieve the overlay placement using the transform CSS property
311+
* to translate and scale the element however this has the undesired effect of
312+
* 'skewing' the element. Comment left here for anybody that ever revisits this.
313+
*
314+
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/transform
315+
*
316+
* right
317+
* translateX(${100 * (1 - size) / 2}%) scaleX(${scale})
318+
*
319+
* left
320+
* translateX(-${100 * (1 - size) / 2}%) scaleX(${scale})
321+
*
322+
* top
323+
* translateY(-${100 * (1 - size) / 2}%) scaleY(${scale})
324+
*
325+
* bottom
326+
* translateY(${100 * (1 - size) / 2}%) scaleY(${scale})
327+
*/
312328
if (rightClass) {
313-
transform = `translateX(${100 * translate}%) scaleX(${scale})`;
329+
box.left = `${100 * (1 - size)}%`;
330+
box.width = `${100 * size}%`;
314331
} else if (leftClass) {
315-
transform = `translateX(-${100 * translate}%) scaleX(${scale})`;
332+
box.width = `${100 * size}%`;
316333
} else if (topClass) {
317-
transform = `translateY(-${100 * translate}%) scaleY(${scale})`;
334+
box.height = `${100 * size}%`;
318335
} else if (bottomClass) {
319-
transform = `translateY(${100 * translate}%) scaleY(${scale})`;
320-
} else {
321-
transform = '';
336+
box.top = `${100 * size}%`;
337+
box.height = `${100 * size}%`;
322338
}
323339

324-
this.overlayElement.style.transform = transform;
340+
this.overlayElement.style.top = box.top;
341+
this.overlayElement.style.left = box.left;
342+
this.overlayElement.style.width = box.width;
343+
this.overlayElement.style.height = box.height;
325344

326345
toggleClass(
327346
this.overlayElement,

0 commit comments

Comments
 (0)