`apps/saas` keeps a `loading.tsx` per route group that reuses the feature skeleton, for cold hard navigations.
The standard prefers page-level Suspense boundaries over loading.tsx and keeps loading.tsx only as the fallback for cold hard navigations. nextjs-app-architecture asks for shaped loading states. CentraKit's page shells are synchronous and wrap async feature components in <Suspense>, but a cold navigation into a dynamic tenant route still waits for the layout without a fallback.
Each tenant route segment in apps/saas keeps a loading.tsx that renders the same skeleton as its page's Suspense fallback. It is never a generic spinner, and new routes add one with the page.
loading.tsx, which is why they share one component. Revisit when Partial Prefetching covers cold navigations to dynamic segments.Last updated on