Skip to content

Commit 8a6f053

Browse files
committed
Set the transform origin correctly when scaling the drag clone
1 parent e2a4466 commit 8a6f053

5 files changed

Lines changed: 43 additions & 17 deletions

File tree

.yarn/versions/07f13bad.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
releases:
2+
"@pitter-patter/shuffle": patch

packages/docs/src/components/demos/shuffle.css

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,13 @@ img {
1010
border-radius: 1rem;
1111
}
1212

13+
[data-node-type] {
14+
border-radius: 0.25rem;
15+
}
16+
1317
[data-node-type][data-shuffle-clone] {
14-
border-radius: 1rem;
15-
background-color: white;
18+
background-color: #f3efea;
19+
color: #351900;
1620
}
1721

1822
.shuffle-block {

packages/shuffle/src/plugin.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -315,14 +315,7 @@ export function startDragOnPointerDown(
315315
const startX = clientX;
316316
const startY = clientY;
317317

318-
const translateCalc = new TranslateCalculator(
319-
originX,
320-
originY,
321-
startX,
322-
startY,
323-
domRect,
324-
LIFT_AMOUNT,
325-
);
318+
const translateCalc = new TranslateCalculator(originX, originY, startX, startY, domRect);
326319

327320
let clone: HTMLElement | null = null;
328321
let initialStyles: InitialStyles | null = null;
@@ -356,7 +349,10 @@ export function startDragOnPointerDown(
356349
}
357350
if (!(dom instanceof HTMLElement)) return;
358351

359-
clone.style.transform = translateCalc.slide(e.clientX, e.clientY);
352+
const { transform, transformOrigin } = translateCalc.slide(e.clientX, e.clientY);
353+
354+
clone.style.transform = transform;
355+
clone.style.transformOrigin = transformOrigin;
360356

361357
const before = shufflePluginKey.getState(view.state)?.activeNodePos;
362358

@@ -424,7 +420,10 @@ export function startDragOnPointerDown(
424420

425421
const domRect = dom.getBoundingClientRect();
426422

427-
clone.style.transform = translateCalc.place(domRect.left, domRect.top);
423+
const { transform, transformOrigin } = translateCalc.place(domRect.left, domRect.top);
424+
425+
clone.style.transform = transform;
426+
clone.style.transformOrigin = transformOrigin;
428427

429428
setTimeout(() => {
430429
clone!.style.transition = "none";
@@ -448,7 +447,6 @@ export function startDragOnPointerDown(
448447
}
449448

450449
export type ViewDesc = NodeViewDesc & WidgetViewDesc;
451-
const LIFT_AMOUNT = 24;
452450

453451
interface InitialStyles {
454452
boxShadow: string;
@@ -471,7 +469,13 @@ function startDrag(dom: HTMLElement, translateCalc: TranslateCalculator) {
471469
const initialBoxShadow = dom.style.boxShadow;
472470

473471
clone.style.transition = "transform 0.1s ease";
474-
clone.style.transform = translateCalc.slide(translateCalc.startX, translateCalc.startY);
472+
const { transform, transformOrigin } = translateCalc.slide(
473+
translateCalc.startX,
474+
translateCalc.startY,
475+
);
476+
477+
clone.style.transform = transform;
478+
clone.style.transformOrigin = transformOrigin;
475479
clone.style.boxShadow = "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)";
476480
clone.style.zIndex = "100";
477481

packages/shuffle/src/translation.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ export class TranslateCalculator {
55
public startX: number,
66
public startY: number,
77
private rect: DOMRect,
8-
private liftAmount: number,
98
) {}
109

1110
slide(x: number, y: number) {
1211
const dx = x - this.startX;
1312
const dy = y - this.startY;
14-
return `rotateX(0) scale(1.05) translate(${this.originX + dx}px, ${this.originY + dy - this.liftAmount}px)`;
13+
return {
14+
transform: `rotateX(0) scale(1.05) translate(${this.originX + dx}px, ${this.originY + dy}px)`,
15+
transformOrigin: `${this.startX - this.rect.x}px ${this.startY - this.rect.y}px`,
16+
};
1517
}
1618

1719
place(x: number, y: number) {
@@ -21,6 +23,9 @@ export class TranslateCalculator {
2123
const dx = x - this.startX - offsetX;
2224
const dy = y - this.startY - offsetY;
2325

24-
return `rotateX(0) scale(1) translate(${this.originX + dx}px, ${this.originY + dy}px)`;
26+
return {
27+
transform: `rotateX(0) scale(1) translate(${this.originX + dx}px, ${this.originY + dy}px)`,
28+
transformOrigin: "initial",
29+
};
2530
}
2631
}

packages/shuffle/style/shuffle.css

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,17 @@
3232
grid-row-start: 1 !important;
3333
}
3434

35+
/* The drag clone gets a little messed up since
36+
its grid-template-columns is set to subgrid, but
37+
it's absolutely positioned. So we manually duplicate
38+
the grid template columns. This isn't perfect, but
39+
it looks much less broken. */
40+
[data-shuffle-clone].row {
41+
grid-template-columns:
42+
minmax(0, 1fr) repeat(12, minmax(0, var(--shuffle-column-width, 3rem)))
43+
minmax(0, 1fr);
44+
}
45+
3546
.shuffle-block {
3647
width: 100%;
3748
}

0 commit comments

Comments
 (0)