+
+
+ {tree.map((node) => (
+
+ ))}
+
+ {total > LARGE_TREE_THRESHOLD && (
+
+ {t("Showing {{count}} subpages", { count: total })}
+
+ )}
+
+
+ );
+}
diff --git a/apps/client/src/features/editor/components/subpages/subpages-view.utils.test.ts b/apps/client/src/features/editor/components/subpages/subpages-view.utils.test.ts
new file mode 100644
index 00000000..17760f47
--- /dev/null
+++ b/apps/client/src/features/editor/components/subpages/subpages-view.utils.test.ts
@@ -0,0 +1,114 @@
+import { describe, it, expect } from "vitest";
+import {
+ buildSubtree,
+ countNodes,
+ mapSharedNodes,
+ SubpageNode,
+} from "./subpages-view.utils";
+import { IPage } from "@/features/page/types/page.types";
+
+// Minimal IPage fixture — buildSubtree only reads id/slugId/title/icon/position/
+// parentPageId. `position` keys are fractional-indexing strings (lexicographic).
+const page = (p: Partial