feat(viz): two pointers narrative
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
"use client";
|
||||
|
||||
import { cn } from "@/lib/utils";
|
||||
import type { ArrayState, PointerState } from "@/lib/visualizations/types";
|
||||
import { ArrayElement } from "../primitives/array-element";
|
||||
import { Pointer } from "../primitives/pointer";
|
||||
|
||||
interface ArrayViewProps {
|
||||
array: ArrayState;
|
||||
pointers: PointerState[];
|
||||
showIndices?: boolean;
|
||||
elementSize?: "sm" | "md" | "lg";
|
||||
className?: string;
|
||||
}
|
||||
|
||||
// Must match SIZE_CLASSES in array-element.tsx (Tailwind units × 4)
|
||||
const ELEMENT_WIDTHS = {
|
||||
sm: 40, // w-10 = 40px
|
||||
md: 56, // w-14 = 56px
|
||||
lg: 72, // w-18 = 72px
|
||||
} as const;
|
||||
|
||||
const ELEMENT_GAPS = {
|
||||
sm: 4,
|
||||
md: 8,
|
||||
lg: 12,
|
||||
} as const;
|
||||
|
||||
export function ArrayView({
|
||||
array,
|
||||
pointers,
|
||||
showIndices = true,
|
||||
elementSize = "md",
|
||||
className,
|
||||
}: ArrayViewProps) {
|
||||
const elementWidth = ELEMENT_WIDTHS[elementSize];
|
||||
const gap = ELEMENT_GAPS[elementSize];
|
||||
|
||||
// Calculate total array width for proper pointer alignment
|
||||
const totalWidth = array.elements.length * elementWidth + (array.elements.length - 1) * gap;
|
||||
|
||||
return (
|
||||
<div className={cn("flex flex-col items-center", className)}>
|
||||
{array.label && (
|
||||
<span className="mb-2 text-sm font-medium text-[var(--muted-foreground)]">
|
||||
{array.label}
|
||||
</span>
|
||||
)}
|
||||
|
||||
{/* Container that sizes to array width - ensures pointer/array alignment */}
|
||||
<div className="relative" style={{ width: totalWidth }}>
|
||||
{/* Pointers row */}
|
||||
<div className="relative mb-1 h-10">
|
||||
{pointers.map((pointer) => (
|
||||
<Pointer
|
||||
key={pointer.id}
|
||||
pointer={pointer}
|
||||
elementWidth={elementWidth}
|
||||
gap={gap}
|
||||
value={array.elements[pointer.index]?.value}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
|
||||
{/* Array elements */}
|
||||
<div
|
||||
className="flex"
|
||||
style={{ gap: `${gap}px` }}
|
||||
>
|
||||
{array.elements.map((element) => (
|
||||
<ArrayElement
|
||||
key={`${array.id}-${element.index}`}
|
||||
element={element}
|
||||
size={elementSize}
|
||||
showIndex={showIndices}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user