Skip to content

feat(cli): add the marketing page-template set (landing, pricing, features, footer) - #5341

Draft
AKnassa wants to merge 3 commits into
facebook:mainfrom
AKnassa:rocky/issue-5300-marketing-templates
Draft

feat(cli): add the marketing page-template set (landing, pricing, features, footer)#5341
AKnassa wants to merge 3 commits into
facebook:mainfrom
AKnassa:rocky/issue-5300-marketing-templates

Conversation

@AKnassa

@AKnassa AKnassa commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

Stacked on #5340. That PR is the first commit here and is not part of this review. Review the second commit, feat(cli): add the marketing page-template set, or merge #5340 first and this diff shrinks to it.

What this does

Adds the four marketing page templates from item 1 of #5300: a landing page, a pricing page, a feature-sections page, and a footer collection.

Why

The roster answers app-shell prompts well and marketing prompts not at all. Before this, astryx search "pricing page" --type template returned no pricing page, because none existed. "landing page", "feature grid" and "footer" were the same. An agent asked for any of them hand-rolled the layout instead of retrieving a graded template.

What changed

Template Category Composition
marketing-landing Marketing - Landing Hero, value pillars, testimonial, pricing teaser, closing CTA
marketing-pricing Marketing - Pricing Billing-period toggle, three tiers, per-plan feature lists, billing FAQ
marketing-feature-sections Marketing - Feature Sections Split media row, four-up icon grid, metric band, bento grid
marketing-footer Marketing - Footer Sitemap footer, newsletter footer, minimal status footer

marketing-feature-sections deliberately shows four different shapes rather than repeating one, because the Card guidance calls an identical icon-heading-text card grid an anti-pattern. marketing-footer uses Section rather than Card for the same reason: a footer is a page region, not a discrete item.

TemplateCategory gains a Marketing group: Landing, Pricing, Feature Sections, Footer, Testimonials, FAQ. The last two are reserved with no template behind them, which the taxonomy's doc comment states reserved values are for. This is a typed public surface in @astryxdesign/cli/authoring, so the group name is worth a maintainer's opinion.

Retrieval fix included

search() indexed a template's directory but never its authored name. A page authored Searchable Table could not be found by that phrase. On "landing page" two templates tied on the keyword Landing, so the alphabetical tiebreak answered with ai-chat-landing. The authored name now runs the same name ladder as the directory and the stronger of the two wins.

How to see it

astryx search "pricing page" --type template
astryx template marketing-pricing
Query Result
landing page 100 marketing-landing (exact name)
pricing page 100 marketing-pricing (exact name)
feature sections 117 marketing-feature-sections
footer 90 marketing-footer

Each page is registered in the docsite lazy-import map, so all four render in the templates gallery.

Checks

Ten new tests cover retrieval for each prompt-class, the category taxonomy, doc metadata, component purity, hardcoded colors, and both directions of the docsite registry sync. The registry test asserts the real invariant: a page that is isReady and not hidden must have an entry. 32 of the 45 pages qualify and all 32 pass, with no entry pointing at a missing page.

Against the audit rubric, <img> is the only raw HTML element across the four pages, and there are no hardcoded colors.

A 16-query ranking battery is unchanged in score and order, so the name signal costs nothing elsewhere.

pnpm -F @astryxdesign/cli test passes 2787, with the same 9 failures present on the base commit (ENOENT scandir 'packages/core/src'). pnpm lint:strict reports 0 errors, pnpm check:repo is clean, and all four cli typechecks pass.

Scope

Part of #5300, covering item 1 of its proposed roster. Items 2 through 6 (scheduling, form wizard, command palette, notification center, mobile shell) are not included. Item 2 in particular is on hold per the discussion on #4784.

A page template's search keywords are read back out of its own source,
and each rendered component name scored as an exact keyword match — the
same 90 an author's `category` earns. So every page rendering a <List>
anywhere claimed "list" as loudly as the page that IS a list. On
"customer list" 14 pages tied at 98, the tie fell through to the
alphabetical tiebreak, and table-page came back 35th of 36. Breadth was
unbounded too: theme-showcase renders 51 components — 4x the median
page — so it matched more terms of almost any query than the page
written for it, and took first place on "list of users".

Keywords now come in two grades. Authored ones (a component's
`keywords`, a block's `componentsUsed`, a page's `category`) keep
scoring at face value. Ones derived by reading a page's source are
length-normalized by how many were derived alongside them, so a focused
page outranks a kitchen sink on the same component and a wide-surface
page stops claiming concepts it only brushes against. Results now read
`renders "List"` rather than `keyword "List"`, so a ranking can be
explained.

Addresses the retrieval-hygiene half of facebook#5300. The roster half — six
proposed new page templates — is a curation call left to maintainers.

Verified: `astryx search "customer list" --type template` returns the
table pages instead of dashboard-portfolio. Full cli suite 2777 passed,
with the same 9 pre-existing failures as the base commit; lint:strict,
check:repo and all four cli typechecks green.
The official roster answers app-shell prompts well and marketing prompts
not at all: "landing page", "pricing page", "feature grid" and "footer"
had no page template to retrieve, so an agent hand-rolled them.

Adds four pages. marketing-landing composes a hero, value pillars, a
testimonial, a pricing teaser and a closing CTA. marketing-pricing has a
billing-period toggle, three tiers, per-plan feature lists and a billing
FAQ. marketing-feature-sections deliberately shows four different shapes
(split media, icon grid, metric band, bento) rather than repeating one,
because an identical card grid is called out as an anti-pattern in the
Card guidance. marketing-footer collects a sitemap, newsletter and
minimal footer.

TemplateCategory gains a Marketing group: Landing, Pricing, Feature
Sections, Footer, Testimonials and FAQ. The last two are reserved with
no template behind them, which is what the taxonomy's own doc comment
says reserved values are for.

Also fixes a retrieval bug found while building these: search() indexed
a template's directory but never its authored name, so a page authored
"Searchable Table" could not be found by that phrase, and on "landing
page" two templates tied on the keyword "Landing" and the alphabetical
tiebreak answered with ai-chat-landing. The authored name now runs the
same name ladder as the directory and the stronger of the two wins.

Part of facebook#5300, covering item 1 of its proposed roster.

Verified: "landing page" and "pricing page" both resolve to their new
template on an exact-name match; "feature sections" and "footer" resolve
to theirs. A 16-query ranking battery is unchanged in score and order,
so the name signal costs nothing elsewhere. Ten new tests cover
retrieval, the category taxonomy, doc metadata, component purity,
hardcoded colors, and both directions of the docsite registry sync.
Full cli suite 2787 passed with the same 9 pre-existing failures as the
base; lint:strict, check:repo and all four cli typechecks green.
@vercel

vercel Bot commented Aug 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
astryx Error Error Aug 22, 2026 5:52pm

Request Review

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Meta Open Source bot. label Aug 22, 2026
@github-actions github-actions Bot added community Authored by a community contributor (not on the eng/design team) needs:code-review High-risk change (new package/component/API) — needs human code review before merge needs:design-review Affects visuals — Design should review labels Aug 22, 2026
@github-actions

github-actions Bot commented Aug 22, 2026

Copy link
Copy Markdown
Contributor

PR Analysis Report

📚 Storybook Preview

View Storybook for this PR
GitHub Pages may take up to a minute to hydrate after deploy.

🧪 Sandbox Preview

View Sandbox for this PR
GitHub Pages may take up to a minute to hydrate after deploy.

No new or modified components detected.

Bundle Size Summary

No component packages changed.

Accessibility Audit

Status: No accessibility violations detected.


Generated by PR Enrichment workflow | Storybook | Sandbox | View full report

Found by rendering the templates rather than reading them.

The Badge in a VStack stretched to the full column width instead of
hugging its label, because a vertical stack stretches its children by
default. Wrapped each in an HStack so it sizes to content.

The footer sitemap put the brand block and four link columns in one
five-track grid. At the shipped width that resolved to 169.2px per
track against a 200px minimum, so "Legal" wrapped onto a row of its
own. Tuning the minimum would have left it one padding change away
from breaking again, so the brand block now sits above a four-track
grid and the tracks have room to spare.

The newsletter field carried a flex shorthand that stretched it into a
tall box beside the Subscribe button. The field sizes itself now.

Part of facebook#5300.
github-actions Bot added a commit that referenced this pull request Aug 22, 2026
github-actions Bot added a commit that referenced this pull request Aug 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Meta Open Source bot. community Authored by a community contributor (not on the eng/design team) needs:code-review High-risk change (new package/component/API) — needs human code review before merge needs:design-review Affects visuals — Design should review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant