Site / Creating a site

Nested rendering without an Outlet

Site.view(site, route, model, h) draws the route: the deepest node's view, wrapped by every ancestor's layout root-first. Ancestors contribute layouts only — never their views:

ts
const Section = Site.route(sectionRouter, AppRoute.Section, {
  layout: {
    render: (child, model, h) => h.div([], [sidebar(model, h), child]),
  },
  view: {
    render: (model, h) => h.ul([], [...]),
  },
})

A layout receives its composed child explicitly: no Outlet, no context provider, no hidden route state, no child router. Unknown tags and viewless leaves fail loudly instead of guessing. What is deliberately deferred: per-node child models, route-local subscriptions/effects, and layout-spanning Surfaces — flat routes plus section tags scaled further than assumed, so the tree grows those when a real nested layout demands them, not before.