feat!: block-composable site chrome (chrome.*) - #7
Merged
Conversation
Approved brainstorming output: site-setting gains header/footer dynamic zones, a new engine-owned chrome.* palette (navbar, footer), serializer + generator extensions for nested components, seed on bootstrap, and the breaking removal of headerNav. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ted into all engine DZs
…ent refs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…unions Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rNav Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e public exports Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…avbar/footer styles
odenirdev
added a commit
that referenced
this pull request
Jul 4, 2026
* docs: add design spec for composite section blocks (section.*)
Approved brainstorming design for an engine-owned section palette under a
new Strapi category `section.*`, mirroring the existing press.* injection +
type-sync mechanism. v1 ships two flat sections (section.hero, section.cta);
sections with nested repeatable components (FeatureGrid, Testimonials) are
deferred to a second spec.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(cms): inject section.hero and section.cta components
* feat(cms): admit section.* into page DZ and serialize them
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test(web): pin zero-change section generation in the type generator
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(web): add SectionHero/SectionCta types and the Hero renderer
* feat(web): add the Cta section renderer
* feat(web): merge sectionBlocks into BlockRenderer and export the palette
Widen packages/web/vitest.config.ts test.include to src/**/*.test.{ts,tsx}
so the new block-renderer.test.tsx (authored with JSX) is discovered by
vitest; prior config only matched *.test.ts.
* feat(web): theme section.hero and section.cta from press-* tokens
* docs: document section.* palette and add changeset
* docs(web): cite Spec §5.2 in the section.cta theme comment
Final-review Minor #7: match the section.hero sibling's citation and the
"comments cite Spec §…" convention. Comment-only; no behavior change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
odenirdev
added a commit
that referenced
this pull request
Jul 4, 2026
* docs: add design spec for composite section blocks (section.*)
Approved brainstorming design for an engine-owned section palette under a
new Strapi category `section.*`, mirroring the existing press.* injection +
type-sync mechanism. v1 ships two flat sections (section.hero, section.cta);
sections with nested repeatable components (FeatureGrid, Testimonials) are
deferred to a second spec.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(cms): inject section.hero and section.cta components
* feat(cms): admit section.* into page DZ and serialize them
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test(web): pin zero-change section generation in the type generator
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(web): add SectionHero/SectionCta types and the Hero renderer
* feat(web): add the Cta section renderer
* feat(web): merge sectionBlocks into BlockRenderer and export the palette
Widen packages/web/vitest.config.ts test.include to src/**/*.test.{ts,tsx}
so the new block-renderer.test.tsx (authored with JSX) is discovered by
vitest; prior config only matched *.test.ts.
* feat(web): theme section.hero and section.cta from press-* tokens
* docs: document section.* palette and add changeset
* docs(web): cite Spec §5.2 in the section.cta theme comment
Final-review Minor #7: match the section.hero sibling's citation and the
"comments cite Spec §…" convention. Comment-only; no behavior change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs: add chrome blocks design spec (block-composable header/footer)
Approved brainstorming output: site-setting gains header/footer dynamic
zones, a new engine-owned chrome.* palette (navbar, footer), serializer +
generator extensions for nested components, seed on bootstrap, and the
breaking removal of headerNav.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(cms): add chrome.navbar and chrome.footer engine components
* feat(cms)!: site-setting chrome DZs replace headerNav; custom.* admitted into all engine DZs
* feat(cms): serialize site-setting chrome DZs and follow nested component refs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): generator types nested component refs and emits chrome DZ unions
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(cms)!: site-setting controller populates chrome DZs, drops headerNav
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(cms): seed default chrome composition once via plugin-store flag
* feat(web)!: ResolvedPressConfig.chrome with hydrated chrome DZs replaces nav
* feat(web)!: Navbar chrome renderer; SiteNav becomes internal NavLinks
* feat(web): Footer chrome renderer with brand-year fallback
* feat(web): chromeBlocks registry joins the BlockRenderer merge; chrome public exports
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web)!: host template renders block-composed chrome; token-only navbar/footer styles
* docs: changeset and architecture notes for chrome blocks
* docs: type-sync loop section reflects the three-DZ serializer
* chore(playground): regenerate types with chrome blocks
* test(web): pin non-http nav url resolving with external:false
* feat: introduce canonical URN identity for pages and site settings
- Add a new document outlining design decisions for the canonical URN identity.
- Implement `mapPage` function to attach canonical stored identity `urn:page:{documentId}`.
- Create `quietSchemaHttpLog` to suppress schema polling logs in development.
- Add tests for `mapPage`, `buildUrn`, and `quietSchemaHttpLog` to ensure functionality.
- Define identity primitives in `urn.ts` for structured URN generation.
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Makes the site header and footer block-composable in the CMS admin — stacked on #6 (section blocks); merge that first.
chrome.*(chrome.navbar,chrome.footer), injected at pluginregister()and admitted only into two newsite-settingDynamic Zones (header/footer) — never the pagebody.chrome.navbar→press.nav-item,press.button); generator types component refs, skips relations, emits nested-only components without__component, addsHeaderBlocks/FooterBlocksunions (version-skew tolerant).chrome.navbar(items.page→ slug +cta);bootstrap()seeds a default composition exactly once (plugin-store flag — an editor-emptied zone is respected forever).mapSiteSettingshydrates the zones (brand injection + nav resolution); newNavbar/Footerrenderers;chromeBlocksregistry joins the merge{ ...referenceBlocks, ...sectionBlocks, ...chromeBlocks, ...components }(adopter overridable); token-onlytheme.csschrome styles; host layout renders both zones throughBlockRenderer.BREAKING changes
site-setting.headerNavremoved; Strapi drops its data on schema sync — no automated migration. Re-enter nav links once inside the seeded Navbar block (Site Settings → Header).SiteNavno longer exported (navbar renders links internally);ResolvedPressConfig.nav→ResolvedPressConfig.chrome. Override chrome like any block:components={{ 'chrome.navbar': MyNavbar }}.Attrgains typedcomponent/repeatablekeys (additive).Verification
pnpm build6/6 (cmsstrapi-plugin build+ playground Next build).site-setting+ both DZs (incl. dynamiccustom.calloutadmission);press.nav-itementers the components map via nested-ref walking without being a DZ member; seed upgrade path filledheader=[chrome.navbar]/footer=[chrome.footer]on an existing DB;:3000renders both chrome blocks with thebrand · yearfooter fallback; regenerated playground types committed.Remaining manual smoke test (before release): in the admin, add a nav item pointing at a page inside the seeded Navbar block, publish, and confirm the link renders and resolves to the page slug on
:3000; a fresh-DB seed (pnpm play:create) has only unit-level coverage.🤖 Generated with Claude Code