···33import { after } from "next/server";
44import { TID } from "@atproto/common";
55import { getCurrentDid, getSessionAgent } from "@/auth";
66-import { renderNode, renderOptions } from "@/app/sandbox/render/render";
66+import { renderNode, renderOptions } from "@/app/(render)/render";
77import { render as resolveInlay, type RenderOptions } from "@inlay/render";
88import {
99 resolveView,
···33import { useState, type ReactNode } from "react";
44import Link from "@/app/link";
55import { useSearchParams, usePathname } from "next/navigation";
66-import { useNav, useRecordParams } from "../../nav";
66+import { useNav, useRecordParams } from "@/app/nav";
77import { parseAtUri } from "@/data/uri";
88import type { FamilyInfo } from "@/data/queries";
99import type { BrowseComponentCard } from "./browse";
1010-import { BrowseProvider } from "../render/client";
1010+import { BrowseProvider } from "@/app/(render)/client";
1111import s from "./browse-shell.module.css";
1212import {
1313 PreviewCard,
1414 PreviewToolbar,
1515 ExternalLinkIcon,
1616 NavArrow,
1717-} from "../ui/preview";
1818-import { PrimaryButton } from "../ui/primary-button";
1919-import { BrowsePill } from "../ui/browse-pill";
2020-import { BrowseCard } from "../ui/browse-card";
2121-import { EmbedButton } from "../ui/embed-button";
2222-import { DotGrid } from "../ui/dot-grid";
1717+} from "@/app/preview";
1818+import { PrimaryButton } from "@/app/primary-button";
1919+import { BrowsePill } from "./browse-pill";
2020+import { BrowseCard } from "./browse-card";
2121+import { EmbedButton } from "./embed-button";
2222+import { DotGrid } from "@/app/dot-grid";
23232424export function BrowseShell({
2525 families,
+1-1
app/sandbox/browse/browse.tsx
app/list/browse.tsx
···11import type { ReactNode } from "react";
22-import { renderNode, createContext } from "../render/render";
22+import { renderNode, createContext } from "@/app/(render)/render";
33import { $ } from "@inlay/core";
44import { resolveView } from "@/data/queries";
55import type { ComponentRecord } from "@/data/types";
···11-import type { ToolboxPack } from "../sandbox-types";
22-import type { AcceptsEntry } from "../accepts";
11+import type { ToolboxPack } from "./sandbox-types";
22+import type { AcceptsEntry } from "@/data/accepts";
33import { HOST_DID } from "./sandbox-transform";
4455/**
···11-import { renderNodeAction } from "../actions";
11+import { renderNodeAction } from "./actions";
22import * as Babel from "@babel/standalone";
33import * as jsxRuntime from "@inlay/core/jsx-runtime";
44import { $, serializeTree, deserializeTree } from "@inlay/core";
55-import { nodeToJsx } from "../render/node-to-jsx";
55+import { nodeToJsx } from "@/app/(render)/node-to-jsx";
66import type { ComponentRecord } from "@/data/types";
77-import type { FlatEntry } from "../lexicons";
77+import type { FlatEntry } from "./lexicons";
88import { parseAtUri } from "@/data/uri";
99import { ensureValidNsid, type DidString } from "@atproto/syntax";
1010
···11-import type { LexiconDoc } from "../lexicons";
22-import { resolveComponentInfo } from "../lexicons";
33-import type { AcceptsEntry, InferredType } from "../accepts";
11+import type { LexiconDoc } from "./lexicons";
22+import { resolveComponentInfo } from "./lexicons";
33+import type { AcceptsEntry, InferredType } from "@/data/accepts";
44import {
55 matchesAccepts,
66 bestMatchSpecificity,
77 inferDataType,
88 deriveUriAccepts,
99-} from "../accepts";
1010-import type { ExportMeta } from "../sandbox-types";
99+} from "@/data/accepts";
1010+import type { ExportMeta } from "./sandbox-types";
11111212// Sentinel character for cursor position in snippets
1313const CURSOR = "\x00";
···99 type DragEvent,
1010} from "react";
1111import NextLink from "@/app/link";
1212-import { isMissing } from "../errors";
1313-import { ErrorBox } from "../ui/preview";
1212+import { isMissing } from "./errors";
1313+import { ErrorBox } from "@/app/preview";
14141515// Navigation context — each mode (canvas, browse, view) provides its own handler.
1616// Handler receives an AT URI and returns true if it handled the navigation.
···11-import type { AcceptsEntry } from "./accepts";
11+import type { AcceptsEntry } from "@/data/accepts";
2233export type ExportMeta = {
44 componentUri: string;
···11"use client";
2233import { useState, useRef } from "react";
44-import { Dropdown } from "@/app/ui/dropdown";
44+import { Dropdown } from "@/app/dropdown";
55import { parseAtUri } from "@/data/uri";
66-import s from "./preview.module.css";
66+import s from "@/app/preview.module.css";
7788export function EmbedButton({
99 componentUri,
···11"use client";
2233import type { ReactNode } from "react";
44-import type { ToolboxPack } from "../sandbox-types";
55-import type { InferredType } from "../accepts";
66-import { matchesAccepts, bestMatchSpecificity } from "../accepts";
44+import type { ToolboxPack } from "./sandbox-types";
55+import type { InferredType } from "@/data/accepts";
66+import { matchesAccepts, bestMatchSpecificity } from "@/data/accepts";
77import { IconButton } from "./icon-button";
88-import type { useReorder } from "../editor/use-reorder";
99-import { HOST_DID } from "../editor/sandbox-transform";
88+import type { useReorder } from "@/app/canvas/at/[did]/[collection]/[rkey]/use-reorder";
99+import { HOST_DID } from "./sandbox-transform";
1010import s from "./palette.module.css";
11111212// =============================================================================
···1010 type ReactNode,
1111} from "react";
1212import Link from "@/app/link";
1313-import { isMissing, missingPath } from "../errors";
1414-import type { RenderResult } from "../actions";
1313+import { isMissing, missingPath } from "@/app/(render)/errors";
1414+import type { RenderResult } from "@/app/edit/actions";
1515import { GhostButton } from "./ghost-button";
1616import { DotGrid } from "./dot-grid";
1717import s from "./preview.module.css";
···11"use client";
2233import type { ReactNode } from "react";
44-import type { FlatEntry } from "../lexicons";
44+import type { FlatEntry } from "./lexicons";
55import type { ComponentRecord } from "@/data/types";
66-import { nodeToJsx } from "../render/node-to-jsx";
66+import { nodeToJsx } from "@/app/(render)/node-to-jsx";
77import { serializeTree } from "@inlay/core";
88-import { GhostButton } from "./ghost-button";
88+import { GhostButton } from "@/app/ghost-button";
99import { IconButton } from "./icon-button";
1010-import { TextInput } from "./text-input";
1010+import { TextInput } from "@/app/text-input";
1111import { Select } from "./select";
1212import s from "./sidebar-sections.module.css";
1313
···130130}
131131132132// Batch-fetch via + view-derived accepts for a set of component URIs (single query)
133133-import type { AcceptsEntry } from "@/app/sandbox/accepts";
133133+import type { AcceptsEntry } from "@/data/accepts";
134134135135export async function fetchComponentMeta(componentUris: string[]): Promise<{
136136 via: Map<string, ComponentRecord["via"]>;
+1-1
proto/src/cache.ts
···4646};
47474848// Convert inlay cache tags to the string format used by the reverse index.
4949-// Must match the format in app/sandbox/render.tsx (callComponentCached)
4949+// Must match the format in app/(render)/render.tsx (callComponentCached)
5050// and invalidator/src/cache-invalidation.ts (getRecordPatterns, getLinkPatterns).
5151function tagToIndexKeys(tag: CacheTag): string[] {
5252 if (tag.$type === "at.inlay.defs#tagRecord") {