From 675d333a9dd9663eb1adbaf97c98174cb9449722 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 24 Aug 2026 16:11:45 +0000 Subject: [PATCH] docs(guide): correct layout guide's PageHeaderProps key list and registration inputs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The layout guide's "Write `subtitle`" blockquote made two claims the sources contradict. Claim 1 listed `PageHeaderProps` as declaring `title / subtitle / icon / breadcrumb / actions / aria`. Measured against the installed @objectstack/spec 17.2.0 by walking the zod shape's declared keys (not one parse result): the shape declares 11 entries, of which `icon` is an ADR-0087 D2 tombstone typed `ZodOptional` and the other 10 are live — `title, subtitle, breadcrumb, actions, recordChrome, showStar, showCopyId, maxVisible, mobileMaxVisible, aria`. The list now names those 10. Deriving from declared keys rather than from a `safeParse` output-key list matters: the output list for `{title, subtitle}` is only `["title","subtitle","breadcrumb","recordChrome","showStar","showCopyId"]`, because an optional key with no default never appears in a parse result. Writing the guide from that reading would have dropped `actions` and `aria` and never surfaced `maxVisible` / `mobileMaxVisible`. Claim 2 said the `page-header` registration declares "only" `title` and `subtitle`. `packages/layout/src/index.ts:126-136` declares four: `title`, `subtitle`, `icon`, `actions`. `icon` being retired on the spec shape while remaining a declared registration input is the genuine state of the tree, not an inconsistency to paper over: they are different renderers. The blockquote now states that split and quotes the tombstone's own message so a reader holding `icon` in an existing schema sees why the canonical node rejects it. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01CSoz9uGhaaSgiq3hshtN7L --- content/docs/guide/layout.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/content/docs/guide/layout.md b/content/docs/guide/layout.md index 8b9fb21f0c..573d411c19 100644 --- a/content/docs/guide/layout.md +++ b/content/docs/guide/layout.md @@ -287,15 +287,23 @@ renders nothing here. > **Write `subtitle`. `description` is retired.** `@objectstack/spec/ui`'s > `PageHeaderProps` — the contract for the canonical `page:header` node — declares -> `title / subtitle / icon / breadcrumb / actions / aria` and has **no** `description`, -> and `page-header`'s registration declares only `title` and `subtitle` as authorable -> inputs. The renderer used to read `description` as well, as a legacy alias; objectui#3789 +> `title / subtitle / breadcrumb / actions / recordChrome / showStar / showCopyId / +> maxVisible / mobileMaxVisible / aria` and has **no** `description`, and +> `page-header`'s registration declares four authorable inputs — `title`, `subtitle`, +> `icon` and `actions`. `icon` sits on exactly one of those two lists on purpose: it is +> an ADR-0087 D2 tombstone on the spec shape, which rejects it by name — "`page:header` +> property `icon` was removed in @objectstack/spec 17.0.0 (#6946, ADR-0087 D2) — no +> renderer ever read it … Delete the key." — while remaining a live input of *this* +> component, whose `` does draw an icon beside the title (objectui#3829). On +> a canonical `page:header` node the key is gone; as a prop of this component it is +> live. The renderer used to read `description` as well, as a legacy alias; objectui#3789 > removed that read, so `subtitle` is now the only spelling this component draws. Stored > metadata written the old way is not stranded: protocol 17's ADR-0087 D2 conversion > `page-header-subtitle-alias` rewrites `description` to `subtitle` on header nodes as the > stack loads — at every position a header can occupy, regions and slots and containers > nested to any depth (objectstack#6775 / #6776) — and `os migrate meta` rewrites it at -> rest. See the [PageHeader reference](/docs/layout/page-header). +> rest. See the [PageHeader reference](/docs/layout/page-header) for the per-key +> reference face. > **There is no `breadcrumbs` array.** The component reads no breadcrumb property of any > kind, in either spelling. The spec's `breadcrumb` is singular and a **boolean** — a