`translate3d(${x}px, ${y}px, 0)`;
// The picked up card shrinks a little, and grows back as it lands. It grows back
// even when it lands where it was picked up, which dnd-kit's own drop would skip.
+// Its shadow fades out and the spot it lands on stays outlined until it gets there.
const dropCard: DropAnimationFunction = (params) => {
const { active, dragOverlay, transform } = params;
const card = dragOverlay.node.firstElementChild;
+ const shadow = dragOverlay.node.querySelector("[data-card-shadow]");
const x = transform.x - (dragOverlay.rect.left - active.rect.left);
const y = transform.y - (dragOverlay.rect.top - active.rect.top);
const { duration, easing } = defaultDropAnimation;
- const cleanup = defaultDropAnimation.sideEffects?.(params);
+ active.node.dataset.dragSource = "";
const animations = [
dragOverlay.node.animate(
{ transform: [translate(transform.x, transform.y), translate(x, y)] },
@@ -96,11 +98,20 @@ const dropCard: DropAnimationFunction = (params) => {
{ transform: [getComputedStyle(card).transform, "none"] },
{ duration, easing, fill: "forwards" },
),
+ shadow?.animate(
+ { boxShadow: [getComputedStyle(shadow).boxShadow, "none"] },
+ { duration, easing, fill: "forwards" },
+ ),
];
- return Promise.allSettled(animations.map((a) => a?.finished)).then(() => cleanup?.());
+ return Promise.allSettled(animations.map((a) => a?.finished)).then(() => {
+ delete active.node.dataset.dragSource;
+ });
};
-export const cardOverlayProps = { className: "*:animate-card-grab", dropAnimation: dropCard };
+export const cardOverlayProps = {
+ className: "*:animate-card-grab **:data-card-shadow:animate-card-shadow-in",
+ dropAnimation: dropCard,
+};
// dnd-kit measures the overlay's card, so it has to see past the shrink to place the drop
export const cardMeasuring: MeasuringConfiguration = {
diff --git a/apps/web/src/components/team/project-card.tsx b/apps/web/src/components/team/project-card.tsx
index 1700c769..743d9801 100644
--- a/apps/web/src/components/team/project-card.tsx
+++ b/apps/web/src/components/team/project-card.tsx
@@ -162,7 +162,7 @@ function ConditionalButton({
if (linkProps === undefined) {
return (
-
+
{children}
);
@@ -182,7 +182,7 @@ function ConditionalButton({
}}
error={error}
>
-
+
{children}
@@ -192,6 +192,7 @@ function ConditionalButton({
return (