feat(platform): checkpoint current implementation state

This commit is contained in:
2026-04-01 07:42:03 +02:00
parent 3e53471f05
commit 8c5be51251
125 changed files with 10269 additions and 17808 deletions
@@ -0,0 +1,89 @@
"use client";
export type TimelineVisualEntry = {
id: string;
startDate: Date | string;
endDate: Date | string;
};
export type TimelineVisualOverride = {
startDate: Date;
endDate: Date;
};
export type TimelineVisualOverrides = ReadonlyMap<string, TimelineVisualOverride>;
export function getDragPointerOffset(
pointerDeltaX: number,
daysDelta: number,
cellWidth: number,
): number {
return pointerDeltaX - daysDelta * cellWidth;
}
export function applyPointerOffsetPreviewRect({
left,
width,
mode,
pointerOffsetX,
minWidth,
}: {
left: number;
width: number;
mode: "move" | "resize-start" | "resize-end";
pointerOffsetX: number;
minWidth: number;
}): { left: number; width: number; transform?: string } {
if (pointerOffsetX === 0) {
return { left, width };
}
if (mode === "move") {
return { left, width, transform: `translateX(${pointerOffsetX}px)` };
}
if (mode === "resize-start") {
const nextWidth = width - pointerOffsetX;
if (nextWidth < minWidth) {
return {
left: left + (width - minWidth),
width: minWidth,
};
}
return {
left: left + pointerOffsetX,
width: nextWidth,
};
}
return {
left,
width: Math.max(minWidth, width + pointerOffsetX),
};
}
export function applyVisualOverrides<T extends TimelineVisualEntry>(
entries: readonly T[],
overrides: TimelineVisualOverrides,
): T[] {
if (overrides.size === 0) {
return entries as T[];
}
let changed = false;
const nextEntries = entries.map((entry) => {
const override = overrides.get(entry.id);
if (!override) {
return entry;
}
changed = true;
return {
...entry,
startDate: new Date(override.startDate),
endDate: new Date(override.endDate),
};
});
return changed ? nextEntries : (entries as T[]);
}