feat: auto-scroll and highlight newly added items in all array editors
This commit is contained in:
@@ -28,9 +28,18 @@ export function ArrayEditor<T>({
|
|||||||
const [grabOffset, setGrabOffset] = useState({ x: 0, y: 0 });
|
const [grabOffset, setGrabOffset] = useState({ x: 0, y: 0 });
|
||||||
const itemRefs = useRef<(HTMLDivElement | null)[]>([]);
|
const itemRefs = useRef<(HTMLDivElement | null)[]>([]);
|
||||||
const [mounted, setMounted] = useState(false);
|
const [mounted, setMounted] = useState(false);
|
||||||
|
const [newItemIndex, setNewItemIndex] = useState<number | null>(null);
|
||||||
|
|
||||||
useEffect(() => { setMounted(true); }, []);
|
useEffect(() => { setMounted(true); }, []);
|
||||||
|
|
||||||
|
// Scroll to newly added item
|
||||||
|
useEffect(() => {
|
||||||
|
if (newItemIndex !== null && itemRefs.current[newItemIndex]) {
|
||||||
|
itemRefs.current[newItemIndex]?.scrollIntoView({ behavior: "smooth", block: "center" });
|
||||||
|
setNewItemIndex(null);
|
||||||
|
}
|
||||||
|
}, [newItemIndex, items]);
|
||||||
|
|
||||||
function updateItem(index: number, item: T) {
|
function updateItem(index: number, item: T) {
|
||||||
const updated = [...items];
|
const updated = [...items];
|
||||||
updated[index] = item;
|
updated[index] = item;
|
||||||
@@ -125,7 +134,9 @@ export function ArrayEditor<T>({
|
|||||||
<div
|
<div
|
||||||
key={i}
|
key={i}
|
||||||
ref={(el) => { itemRefs.current[i] = el; }}
|
ref={(el) => { itemRefs.current[i] = el; }}
|
||||||
className="rounded-lg border border-white/10 bg-neutral-900/50 p-4 mb-3 hover:border-white/25 hover:bg-neutral-800/50 transition-colors"
|
className={`rounded-lg border bg-neutral-900/50 p-4 mb-3 hover:border-white/25 hover:bg-neutral-800/50 transition-all ${
|
||||||
|
newItemIndex === i ? "border-gold/40 ring-1 ring-gold/20" : "border-white/10"
|
||||||
|
}`}
|
||||||
>
|
>
|
||||||
<div className="flex items-start justify-between gap-2 mb-3">
|
<div className="flex items-start justify-between gap-2 mb-3">
|
||||||
<div
|
<div
|
||||||
@@ -223,7 +234,7 @@ export function ArrayEditor<T>({
|
|||||||
|
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => onChange([...items, createItem()])}
|
onClick={() => { onChange([...items, createItem()]); setNewItemIndex(items.length); }}
|
||||||
className="mt-3 flex items-center gap-2 rounded-lg border border-dashed border-white/20 px-4 py-2.5 text-sm text-neutral-400 hover:text-white hover:border-white/40 transition-colors"
|
className="mt-3 flex items-center gap-2 rounded-lg border border-dashed border-white/20 px-4 py-2.5 text-sm text-neutral-400 hover:text-white hover:border-white/40 transition-colors"
|
||||||
>
|
>
|
||||||
<Plus size={16} />
|
<Plus size={16} />
|
||||||
|
|||||||
Reference in New Issue
Block a user