writeonce/docs/examples/ecommerce/shared/components/layout.htmlx
shoney.arickathil 9279175f26 scaffold sibling crates, multi-app ecommerce, REST + concurrency docs
- scaffold 14 placeholder crates (app, db, engine, gen, http, logic,
  policy, ql, service, sub, txn, ui, value, wal) — empty Cargo.toml +
  src/lib.rs to receive code phase-by-phase from `rt`
- restructure docs/examples/ecommerce into multi-app layout: apps/admin
  and apps/storefront, with shared/ types/logic/components, per-app
  app.wo + wo.toml, and reusable .htmlx components (layout, money,
  order-row)
- add reference/rest/{blog,ecommerce}.rest — VS Code/JetBrains HTTP
  request files driving the running prototype, including 501/404/405
  expectations for stubbed endpoints
- add docs/plan/09-concurrency-scaleout.md and docs/plan/ui/00-overview.md;
  refine docs/plan/assembly/02-writeonce-stance.md
- refresh templates (about, article, header/footer, home, layout, styles)
  and add static favicon/logo
- add infra/sync.sh and tighten .gitignore for reference/ symlinks
2026-05-04 13:39:58 +02:00

42 lines
1.4 KiB
Text

{{!--
Top-level page chrome shared across every app in the workspace.
Both storefront and admin inherit this layout and override the `{{> slot.content}}`
partial with their own screen's body.
The `wo:bind="session.user.name"` in the header is a field-level live binding:
when the customer updates their profile, every open tab's header repaints
without a page reload — the same delta-dispatch mechanism the live tables use,
just on a singleton subscription.
See docs/plan/ui/01-htmlx-format-spec.md (to land in a future sub-phase)
for the full grammar.
--}}
<!doctype html>
<html lang="{{app.i18n}}">
<head>
<meta charset="utf-8">
<title>{{page.title}} — {{app.name}}</title>
<link rel="stylesheet" href="/static/{{app.name}}.css">
{{> slot.head}}
</head>
<body class="theme-{{app.theme}}">
<header class="page-header">
<a href="/" class="brand">{{app.name}}</a>
<nav>{{> slot.nav}}</nav>
{{#if session.user}}
<span class="session" wo:bind="session.user.name">{{session.user.name}}</span>
{{/if}}
</header>
<main class="page-body">
{{> slot.content}}
</main>
<footer class="page-footer">
<small>Built with writeonce · {{app.version}}</small>
</footer>
{{!-- Client runtime + subscription manifest are injected automatically. --}}
<script data-wo-runtime src="/_wo/runtime.js"></script>
</body>
</html>