Select a page to edit its component hierarchy
diff --git a/frontends/nextjs/src/components/managers/component/ComponentHierarchyEditor/Tree.tsx b/frontends/nextjs/src/components/managers/component/ComponentHierarchyEditor/Tree.tsx
new file mode 100644
index 000000000..5960b5f7c
--- /dev/null
+++ b/frontends/nextjs/src/components/managers/component/ComponentHierarchyEditor/Tree.tsx
@@ -0,0 +1,65 @@
+import { Cursor } from '@phosphor-icons/react'
+import type React from 'react'
+import type { ComponentNode } from '@/lib/database'
+import { TreeNode } from '../modules/TreeNode'
+
+interface HierarchyTreeProps {
+ rootNodes: ComponentNode[]
+ hierarchy: Record
+ selectedNodeId: string | null
+ expandedNodes: Record
+ draggingNodeId: string | null
+ onSelect: (nodeId: string) => void
+ onToggle: (nodeId: string) => void
+ onDelete: (nodeId: string) => Promise
+ onConfig: (nodeId: string) => void
+ onDragStart: (event: React.DragEvent, nodeId: string) => void
+ onDragOver: (event: React.DragEvent, nodeId: string) => void
+ onDrop: (event: React.DragEvent, nodeId: string) => void
+}
+
+export function HierarchyTree({
+ rootNodes,
+ hierarchy,
+ selectedNodeId,
+ expandedNodes,
+ draggingNodeId,
+ onSelect,
+ onToggle,
+ onDelete,
+ onConfig,
+ onDragStart,
+ onDragOver,
+ onDrop,
+}: HierarchyTreeProps) {
+ if (rootNodes.length === 0) {
+ return (
+
+
+
No components yet. Add one from the catalog!
+
+ )
+ }
+
+ return (
+
+ {rootNodes.map((node) => (
+
+ ))}
+
+ )
+}
diff --git a/frontends/nextjs/src/components/managers/component/ComponentHierarchyEditor/selectors.ts b/frontends/nextjs/src/components/managers/component/ComponentHierarchyEditor/selectors.ts
new file mode 100644
index 000000000..383c12303
--- /dev/null
+++ b/frontends/nextjs/src/components/managers/component/ComponentHierarchyEditor/selectors.ts
@@ -0,0 +1,10 @@
+import type { ComponentNode } from '@/lib/database'
+
+export function selectRootNodes(
+ hierarchy: Record,
+ selectedPageId: string | null
+): ComponentNode[] {
+ return Object.values(hierarchy)
+ .filter(node => node.pageId === selectedPageId && !node.parentId)
+ .sort((a, b) => a.order - b.order)
+}