Fix indent guide hovering

This commit is contained in:
Gregory Schier
2025-10-20 09:13:00 -07:00
parent 7c5dec821d
commit 1c48b309b5
3 changed files with 15 additions and 6 deletions

View File

@@ -1,16 +1,19 @@
import classNames from 'classnames';
import { useAtomValue } from 'jotai';
import { memo } from 'react';
import { hoveredParentDepthFamily } from './atoms';
import { hoveredParentDepthFamily, isParentHoveredFamily } from './atoms';
export const TreeIndentGuide = memo(function TreeIndentGuide({
treeId,
depth,
parentId,
}: {
treeId: string;
depth: number;
parentId: string | null;
}) {
const parentDepth = useAtomValue(hoveredParentDepthFamily(treeId));
const isHovered = useAtomValue(isParentHoveredFamily({ treeId, parentId }));
return (
<div className="flex">
@@ -19,7 +22,7 @@ export const TreeIndentGuide = memo(function TreeIndentGuide({
key={i}
className={classNames(
'w-[1rem] border-r border-r-text-subtlest',
parentDepth !== i + 1 && 'opacity-30',
!(parentDepth === i + 1 && isHovered) && 'opacity-30',
)}
/>
))}

View File

@@ -239,7 +239,7 @@ function TreeItem_<T extends { id: string }>({
isSelected && 'selected',
)}
>
<TreeIndentGuide treeId={treeId} depth={depth} />
<TreeIndentGuide treeId={treeId} depth={depth} parentId={node.parent?.item.id ?? null} />
<div
className={classNames(
'text-text-subtle',

View File

@@ -45,8 +45,14 @@ export const hoveredParentFamily = atomFamily((_treeId: string) => {
});
});
export const isParentHoveredFamily = atomFamily(
({ treeId, parentId }: { treeId: string; parentId: string | null }) =>
selectAtom(hoveredParentFamily(treeId), (v) => v.parentId === parentId, Object.is),
(a, b) => a.treeId === b.treeId && a.parentId === b.parentId,
);
export const isIndexHoveredFamily = atomFamily(
({ treeId, index }: { treeId: string; index: number}) =>
({ treeId, index }: { treeId: string; index: number }) =>
selectAtom(hoveredParentFamily(treeId), (v) => v.index === index, Object.is),
(a, b) => a.treeId === b.treeId && a.index === b.index,
);
@@ -55,8 +61,8 @@ export const hoveredParentDepthFamily = atomFamily((treeId: string) =>
selectAtom(
hoveredParentFamily(treeId),
(s) => s.parentDepth,
(a, b) => Object.is(a, b) // prevents re-render unless the value changes
)
(a, b) => Object.is(a, b), // prevents re-render unless the value changes
),
);
export const collapsedFamily = atomFamily((workspaceId: string) => {