From d651cca79a840b13da7cb7aa2d2bb8e76511270b Mon Sep 17 00:00:00 2001 From: wass08 Date: Mon, 26 Jan 2026 09:02:10 +0900 Subject: [PATCH] hover seletion --- .../components/ui/sidebar/panels/site-panel/index.tsx | 9 ++++++++- .../ui/sidebar/panels/site-panel/item-tree-node.tsx | 11 +++++++++++ .../ui/sidebar/panels/site-panel/tree-node.tsx | 6 ++++++ .../ui/sidebar/panels/site-panel/wall-tree-node.tsx | 11 +++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/apps/editor/components/ui/sidebar/panels/site-panel/index.tsx b/apps/editor/components/ui/sidebar/panels/site-panel/index.tsx index 66a017c6..673fedf8 100644 --- a/apps/editor/components/ui/sidebar/panels/site-panel/index.tsx +++ b/apps/editor/components/ui/sidebar/panels/site-panel/index.tsx @@ -254,11 +254,14 @@ function ZoneItem({ zone }: { zone: ZoneNode }) { const deleteNode = useScene((state) => state.deleteNode); const updateNode = useScene((state) => state.updateNode); const selectedZoneId = useViewer((state) => state.selection.zoneId); + const hoveredId = useViewer((state) => state.hoveredId); const setSelection = useViewer((state) => state.setSelection); + const setHoveredId = useViewer((state) => state.setHoveredId); const setPhase = useEditor((state) => state.setPhase); const setMode = useEditor((state) => state.setMode); const isSelected = selectedZoneId === zone.id; + const isHovered = hoveredId === zone.id; const handleClick = () => { setSelection({ zoneId: zone.id }); @@ -284,9 +287,13 @@ function ZoneItem({ zone }: { zone: ZoneNode }) { "flex items-center h-7 cursor-pointer group/row text-sm px-3", isSelected ? "text-primary-foreground bg-primary/80 hover:bg-primary/90" - : "text-muted-foreground hover:bg-accent/50" + : isHovered + ? "bg-accent/70 text-foreground" + : "text-muted-foreground hover:bg-accent/50" )} onClick={handleClick} + onMouseEnter={() => setHoveredId(zone.id)} + onMouseLeave={() => setHoveredId(null)} > diff --git a/apps/editor/components/ui/sidebar/panels/site-panel/item-tree-node.tsx b/apps/editor/components/ui/sidebar/panels/site-panel/item-tree-node.tsx index 610363f9..8a1757ff 100644 --- a/apps/editor/components/ui/sidebar/panels/site-panel/item-tree-node.tsx +++ b/apps/editor/components/ui/sidebar/panels/site-panel/item-tree-node.tsx @@ -13,11 +13,20 @@ export function ItemTreeNode({ node, depth }: ItemTreeNodeProps) { const isSelected = useViewer((state) => state.selection.selectedIds.includes(node.id)); const isHovered = useViewer((state) => state.hoveredId === node.id); const setSelection = useViewer((state) => state.setSelection); + const setHoveredId = useViewer((state) => state.setHoveredId); const handleClick = () => { setSelection({ selectedIds: [node.id] }); }; + const handleMouseEnter = () => { + setHoveredId(node.id); + }; + + const handleMouseLeave = () => { + setHoveredId(null); + }; + return ( } @@ -27,6 +36,8 @@ export function ItemTreeNode({ node, depth }: ItemTreeNodeProps) { expanded={false} onToggle={() => {}} onClick={handleClick} + onMouseEnter={handleMouseEnter} + onMouseLeave={handleMouseLeave} isSelected={isSelected} isHovered={isHovered} actions={} diff --git a/apps/editor/components/ui/sidebar/panels/site-panel/tree-node.tsx b/apps/editor/components/ui/sidebar/panels/site-panel/tree-node.tsx index cf8acd80..14e152b4 100644 --- a/apps/editor/components/ui/sidebar/panels/site-panel/tree-node.tsx +++ b/apps/editor/components/ui/sidebar/panels/site-panel/tree-node.tsx @@ -38,6 +38,8 @@ interface TreeNodeWrapperProps { expanded: boolean; onToggle: () => void; onClick: () => void; + onMouseEnter?: () => void; + onMouseLeave?: () => void; actions?: React.ReactNode; children?: React.ReactNode; isSelected?: boolean; @@ -52,6 +54,8 @@ export function TreeNodeWrapper({ expanded, onToggle, onClick, + onMouseEnter, + onMouseLeave, actions, children, isSelected, @@ -69,6 +73,8 @@ export function TreeNodeWrapper({ : "text-muted-foreground hover:bg-accent/50" )} style={{ paddingLeft: depth * 12 + 4 }} + onMouseEnter={onMouseEnter} + onMouseLeave={onMouseLeave} >