Every section in the library, with a real rendered thumbnail and the metadata that decides when it appears — plus a coverage matrix that shows which client scenarios are fully dressed and which still need sections built.
--base — metadata + coverage matrix only. Re-run with --base=<running-clone-url> to inline real section thumbnails.| Fires when | base — always eligible |
| Pages | about, home |
| Use | About intro as plain prose. Pick when there is editor copy or you want a simple, text-led lead with no image. |
| Claim-safe | Always renders; claim-safe generated intro from name/city/areas when no copy. |
option:suds_service_areas</code> <code>signal:service_area_content| Fires when | service_area_content |
| Needs | option:suds_service_areas |
| Pages | home, about, contact |
| Use | Compact chip row of service-area towns. Pick for a light area touch on home/about/contact. |
| Claim-safe | Hides if suds_service_areas is empty. |
| Fires when | base — always eligible |
| Pages | pricing |
| Use | Pricing fallback callout ("call for pricing"). Pick on Pricing when no service has public pricing rows. |
| Claim-safe | Renders only when pricing is visible globally and no service has public pricing rows. |
primary_loc:location_amenities| Fires when | base — always eligible |
| Needs | primary_loc:location_amenities |
| Pages | about, home, location |
| Use | Amenities grid from the primary location. Pick to showcase confirmed amenities plainly. |
| Claim-safe | Hides if location_amenities is empty. |
| Fires when | base — always eligible |
| Pages | contact, about, location |
| Use | Per-day hours card for a SINGLE-LOCATION shop. Pick on contact/about/location when per-day hours exist. |
| Claim-safe | Renders the primary location per-day hours; falls back to the global hours summary, else hides. Self-gates OFF on MULTI-LOCATION builds (>1 published location) — there, hours are per-branch (locations_grid/locations_map <details> + Location pages), so a lone generic hours block would misrepresent branches with different hours. hours_summary_strip (a global operator one-liner) is unaffected. |
primary_loc:location_map_embed| Fires when | base — always eligible |
| Needs | primary_loc:location_map_embed |
| Pages | contact, about, location |
| Use | Full-width Google map embed. Pick on contact/location when an embed is set. |
| Claim-safe | Hides if no primary-location map embed. |
cpt:faq| Fires when | base — always eligible |
| Needs | cpt:faq |
| Pages | faq, contact, about, home |
| Use | FAQ accordion from the faq CPT. Pick for collapsible Q&A. |
| Claim-safe | Hides if no faq posts. |
signal:commercial_accounts| Fires when | commercial_accounts |
| Pages | home, services, commercial |
| Use | B2B card. Pick to surface commercial accounts when a commercial service exists. |
| Claim-safe | Signal-gated: only renders if a commercial service exists. |
| Fires when | base — always eligible |
| Pages | services, pricing, about, contact, location |
| Use | Full-width final CTA band. The default page closer; always safe. |
| Claim-safe | Always renders; label/sub are signal-aware (no pickup claim on self-service). |
cpt:service| Fires when | base — always eligible |
| Needs | cpt:service |
| Pages | pricing |
| Use | Per-service rate table. Pick on Pricing when services carry public pricing rows. |
| Claim-safe | Hides unless a service has client-confirmed pricing or market-default rows marked for review. |
| Fires when | base — always eligible |
| Pages | about, services, pricing, contact, faq |
| Use | The sub-page opener: per-PAGE eyebrow / title override / lead + a background style (none · surface · ink · gradient · image-with-scrim). Fields live on each page/post edit screen. |
| Claim-safe | Always renders; blank fields fall back to the template default, the page title, and the sentence-bounded auto subtitle. Image bg falls back to the featured image, then degrades to ink (never an empty frame). Agent CLI: `wp suds field-set page_header <field> <v> --page=<type>`. |
| Fires when | base — always eligible |
| Pages | home, services |
| Use | Services card grid. The default services presentation; image-friendly. |
| Claim-safe | Generic claim-safe fallback cards; always renders. |
| Fires when | base — always eligible |
| Pages | services, home |
| Use | Alternating-row services; a service's featured image renders beside its copy when set. Pick for dense/structured services (value / commercial). |
| Claim-safe | Generic claim-safe fallback; always renders. Rows without an image stay text-only (no empty frames). |
| Fires when | base — always eligible |
| Pages | home, services |
| Use | Flagship-led services: the FIRST service (menu_order) renders as a large feature (photo or icon panel + excerpt + CTA), the rest as compact rows. Pick when one service (wash & fold, pickup) leads the business. |
| Claim-safe | The operator's service ORDER is the emphasis — reorder Services to change the flagship. Same claim-safe generic fallback as the other services variants. |
| Fires when | base — always eligible |
| Pages | home, services |
| Use | Services card grid where each card LEADS WITH THE SERVICE FEATURED IMAGE instead of an icon. Pick for image-led services on photo-forward skins (warm / premium / eco). |
| Claim-safe | Generic claim-safe fallback cards; always renders. A service with no featured image (and every fallback card) shows the claim-safe striped "add a photo" placeholder — NEVER a fabricated photo — so it looks complete during a build and swaps to real photos as service featured images are set. |
cpt:service| Fires when | base — always eligible |
| Needs | cpt:service |
| Pages | pricing, services |
| Use | Marketing plan cards per priced service (lowest public price + up to 3 benefits). Pick for a sales-oriented pricing presentation. |
| Claim-safe | Hides when no service has client-confirmed pricing or market-default rows marked for review. |
home:suds_reviews_embed| Fires when | base — always eligible |
| Needs | home:suds_reviews_embed |
| Pages | home, about, contact |
| Use | Admin-entered third-party reviews widget. Pick only when a reviews embed is provided. |
| Claim-safe | Requires suds_reviews_embed; never shows sample quotes. Hides if none. |
home:suds_reviews| Fires when | base — always eligible |
| Needs | home:suds_reviews |
| Pages | home, about |
| Use | Real reviews as cards. Pick when the suds_reviews repeater has entries. |
| Claim-safe | REAL reviews only; hides if none; stars only when a rating is set. |
| Fires when | base — always eligible |
| Pages | home, services, pricing, about, contact |
| Use | Two-column CTA: copy + an action card (CTA link + call/text). Pick when you want a contact-action card alongside the CTA. |
| Claim-safe | Real link, no fake form; signal-aware copy. tone targets the OUTER band; the panel itself takes the cta_bg knob (ink|primary|tint|surface) — on tone=dark the default ink panel lifts to the shared card mix so it never sinks ink-on-ink. |
| Fires when | base — always eligible |
| Pages | home, services, about |
| Use | Numbered "how it works". The default how-it-works; balanced. |
| Claim-safe | Signal-aware claim-safe default flow (self-service vs pickup); always renders. |
| Fires when | base — always eligible |
| Pages | home, services, about |
| Use | Compact horizontal numbered steps. Pick for a light, scannable flow (express / value). |
| Claim-safe | Signal-aware default flow; always renders. |
| Fires when | base — always eligible |
| Pages | about, home |
| Use | About intro copy beside a photo. Pick for an image-led, warmer lead when a storefront/interior photo exists. |
| Claim-safe | Shows a claim-safe striped photo placeholder when no image; always renders. |
primary_loc:location_amenities| Fires when | base — always eligible |
| Needs | primary_loc:location_amenities |
| Pages | about, home, location |
| Use | Compact chip row of amenities. Pick for a light amenities touch (express / value). |
| Claim-safe | Hides if none. |
option:suds_service_areas</code> <code>signal:service_area_content| Fires when | service_area_content |
| Needs | option:suds_service_areas |
| Pages | home, about, contact |
| Use | Multi-column town list. Pick when the area list is long and you want a denser, scannable block. |
| Claim-safe | Hides if no areas. |
primary_loc:location_map_embed| Fires when | base — always eligible |
| Needs | primary_loc:location_map_embed |
| Pages | contact, about, location |
| Use | Map beside the location name/address/phone + hours. Pick when you want the map plus confirmed contact details. |
| Claim-safe | Hides if no map embed; all data confirmed. |
signal:pickup_delivery| Fires when | pickup_delivery |
| Pages | home, services |
| Use | ZIP lead-in + real scheduling link. Pick as an app-style lead capture when pickup is offered (express). |
| Claim-safe | Signal-gated: pickup_delivery. Never on self-service-only. |
signal:pickup_delivery| Fires when | pickup_delivery |
| Pages | home, services |
| Use | Pickup flow steps + scheduling CTA. Pick to explain the pickup process. |
| Claim-safe | Signal-gated: pickup_delivery. |
| Fires when | base — always eligible |
| Pages | home, services, about |
| Use | Compact icon + label strip of services. Pick for a light services overview (express). |
| Claim-safe | Generic fallback; always renders. `display=cards` upgrades the bare icons to tappable cards (gradient icon tile + hover lift) when the band feels too plain. |
home:suds_reviews| Fires when | base — always eligible |
| Needs | home:suds_reviews |
| Pages | home, about |
| Use | Dense masonry wall of real reviews. Pick when there are many reviews and you want social-proof density. |
| Claim-safe | REAL reviews only; hides if none. |
| Fires when | base — always eligible |
| Pages | home, services, pricing, about, contact, faq |
| Use | Centered boxed CTA card. Pick for a softer, contained closer (warm / premium / eco). |
| Claim-safe | Always renders; signal-aware copy. |
| Fires when | base — always eligible |
| Pages | home, about, services, pricing, faq, contact |
| Use | Email-capture band ahead of the footer. Pick when the client has a real list destination (WPForms form or an external signup URL). |
| Claim-safe | Self-gates: renders NOTHING without a WPForms id (plugin active) or external link — never a dead form. Claim-safe default copy promises no cadence or offers. |
| Fires when | base — always eligible |
| Pages | contact, about, location |
| Use | Contact block: an inquiry FORM beside a phone/email/address/directions card. Leads the contact page; also fits about/location. The bundled "Contact Us" WPForms form auto-imports so a fresh build works out of the box. |
| Claim-safe | Form column self-gates (WPForms id → external form link → nothing — never a dead form); the NAP card keeps the section useful, so it always renders. Scheduling stays a separate link CTA (suds_cta_url); this captures general inquiries, invents no contact facts. |
| Fires when | base — always eligible |
| Pages | home, about |
| Use | Owner/attendant spotlight — a person-led trust surface ('meet our guides' shape). Pick on Home/About when the client supplies real people. |
| Claim-safe | Self-gates on the suds_team_people repeater (empty → renders nothing). Auto-layout by count: 1 person = feature split, 2–3 = card grid. No photo → initials monogram, NEVER a stock face; role is free text (no invented credentials). |
cpt:faq| Fires when | base — always eligible |
| Needs | cpt:faq |
| Pages | faq, contact, about, home |
| Use | Open two-column Q&A. Pick when you want all answers visible (dense / value / commercial). |
| Claim-safe | Hides if no faq posts. |
option:suds_service_areas</code> <code>signal:service_area_content| Fires when | service_area_content |
| Needs | option:suds_service_areas |
| Pages | home, about, contact |
| Use | Town list beside the map embed. Pick on location-focused pages where a map embed exists. |
| Claim-safe | List-only without a map; hides if no areas. |
cpt:location</code> <code>signal:multi_location| Fires when | multi_location |
| Needs | cpt:location |
| Pages | contact, about, location |
| Use | One card per published Location (name, address, phone, directions, page link; primary badged). Pick on Contact/About/Location pages for MULTI-location clients. |
| Claim-safe | Signal-gated (multi_location) AND self-gates below 2 published locations — a single-location site never renders it. Real Location posts only; per-branch hours render behind a native <details> disclosure when confirmed rows exist. |
cpt:location</code> <code>signal:multi_location| Fires when | multi_location |
| Needs | cpt:location |
| Pages | contact, about, location |
| Use | Same as locations_grid but each branch card LEADS WITH THE LOCATION FEATURED IMAGE. Pick for image-led multi-location on photo-forward skins. |
| Claim-safe | Same gating as locations_grid (multi_location + 2+ published locations). A location with no featured image shows the claim-safe striped "add a photo" placeholder — NEVER a fabricated photo — swapping to the real photo when set. |
cpt:location</code> <code>signal:multi_location| Fires when | multi_location |
| Needs | cpt:location |
| Pages | contact, about, location |
| Use | Compact branch list beside the primary map embed — the map-led locations variant. Pick on Contact/About/Location for MULTI-location clients on map-forward skins. |
| Claim-safe | Same gating as locations_grid (multi_location + 2+ published locations). Renders the list WITHOUT the map column when no embed exists (never hides a composed locations slot). Per-branch hours render behind a native <details> disclosure when confirmed rows exist. |
home:suds_why_gallery| Fires when | base — always eligible |
| Needs | home:suds_why_gallery |
| Pages | about, location |
| Use | Standalone photo grid from the shared interior gallery (first photo leads larger). Pick on About/Location for PHOTO-RICH clients. |
| Claim-safe | Self-gates below 3 real images (the why panel covers 1–2). Renders existing client media only — never stock/placeholder padding. Photos take the archetype photo grade. |
home:suds_why_gallery| Fires when | base — always eligible |
| Needs | home:suds_why_gallery |
| Pages | about, location |
| Use | The photo gallery as a slim scroll-snap filmstrip — the compact variant for dense/technical skins. Pick on About/Location where the full grid is too heavy. |
| Claim-safe | Same data + 3+-image self-gate as gallery_grid; keyboard-scrollable (focusable strip). Existing client media only. |
primary_loc:location_amenities| Fires when | base — always eligible |
| Needs | primary_loc:location_amenities |
| Pages | about, home, location |
| Use | A few large amenity feature cards. Pick to spotlight 2–4 standout amenities (warm / premium / eco). |
| Claim-safe | Hides if none. |
| Fires when | base — always eligible |
| Pages | home, services, about |
| Use | Vertical numbered timeline. Pick for a structured, sequential flow (commercial / premium). |
| Claim-safe | Signal-aware default flow; always renders. |
| Fires when | base — always eligible |
| Pages | about, home |
| Use | Generic, claim-safe value cards (clean / easy / helpful). Pick when there is no copy or photo and you want a structured, confident block (commercial / premium). |
| Claim-safe | Generic-safe; invents no facts. Always renders. |
option:suds_hours_summary| Fires when | base — always eligible |
| Needs | option:suds_hours_summary |
| Pages | contact, about, home, location |
| Use | One-line hours strip. Pick for a compact hours mention when only a summary line is set. |
| Claim-safe | Hides if suds_hours_summary is empty. |
signal:pickup_delivery| Fires when | pickup_delivery |
| Pages | home, services, pricing |
| Use | Punchy pickup promo card + CTA. Pick as a compact pickup highlight. |
| Claim-safe | Signal-gated: pickup_delivery. |
signal:commercial_accounts| Fires when | commercial_accounts |
| Pages | home, services, commercial |
| Use | Commercial benefits + photo from the commercial service. Pick for a richer B2B showcase. |
| Claim-safe | Commercial-service gated. |
signal:wash_fold| Fires when | wash_fold |
| Pages | home, services |
| Use | Wash & fold explainer + photo. Pick to feature a wash & fold offering. |
| Claim-safe | Signal-gated: wash_fold. |
signal:wash_fold| Fires when | wash_fold |
| Pages | home, services |
| Use | Wash & fold drop-off flow. Pick to explain the wash & fold process. |
| Claim-safe | Signal-gated: wash_fold; generic flow fallback. |
| Fires when | base — always eligible |
| Pages | home, about, services, contact |
| Use | Reassurance strip from confirmed amenities, else generic-safe badges. Pick for a light trust row; always safe. |
| Claim-safe | Always renders; generic-safe when no amenities. |
home:suds_hero_stats| Fires when | base — always eligible |
| Needs | home:suds_hero_stats |
| Pages | home, about, commercial |
| Use | Headline numbers from confirmed hero stats. Pick only when real stats are entered. |
| Claim-safe | CONFIRMED only — hides if no suds_hero_stats. |
| Fires when | base — always eligible |
| Pages | home, about, services, contact |
| Use | Soft, claim-safe promise + call CTA. Pick for a reassurance block. |
| Claim-safe | Soft promise only; never a fabricated warranty. Always renders. |
| Fires when | base — always eligible |
| Pages | home |
| Use | Home "why choose us" rich panel (copy + benefits + interior gallery + amenities). The home `why` slot. |
| Claim-safe | Home-only; always renders. Interior gallery shows a slider for 2+ photos, a single photo for one, else a placeholder. |
| Fires when | base — always eligible |
| Pages | home |
| Use | The why-us home panel as centered intro + icon tiles + amenities, with NO media frame — pick for photo-poor clients or compact skins so the home never shows a placeholder photo box. |
| Claim-safe | Shares why_panel content (single owner); the interior gallery fields stay live for the About-page gallery sections. Keeps the .s-why class so band/texture rhythm applies. `align` knob (default center) left-aligns the head + CTA to match pages whose other section heads are left-aligned. |
| Fires when | base — always eligible |
| Pages | home |
| Use | Home service-area rich panel. The home `areas` slot. |
| Claim-safe | Home-only; always renders. |
signal:has_reviews| Fires when | has_reviews |
| Pages | home |
| Use | Home reviews rich panel. The home `quotes` slot. |
| Claim-safe | Home-only; admin embed → real suds_reviews, with an optional verified Google badge. Self-gates when no real review source exists. |
cpt:service| Fires when | base — always eligible |
| Needs | cpt:service |
| Pages | services |
| Use | The /services/ CPT-archive grid (every published service as a card), riding the MAIN archive query. The default grid slot on the services archive — compose a services_* variant to swap it. |
| Claim-safe | Archive-context section: it renders the main query, so outside /services/ it shows the empty state. Promoted from the hardcoded archive part (byte-identical). |
cpt:location| Fires when | base — always eligible |
| Needs | cpt:location |
| Pages | locations |
| Use | The /locations/ CPT-archive branch grid, riding the MAIN archive query. The default grid slot on the locations archive — compose locations_grid/photo/map to swap it (multi-location clients). |
| Claim-safe | Archive-context section, NOT signal-gated: the archive always shows its branches (single-location clients keep it via the template fallback). Promoted from the hardcoded archive part (byte-identical). |
cpt:service| Fires when | base — always eligible |
| Needs | cpt:service |
| Pages | service |
| Use | The single-service main content (description, benefits, process steps, pricing) read from the CURRENT service post. Part of every service single by default. |
| Claim-safe | Single-context section: reads the queried service post; composable per-type (suds_section_stack_service option) or per-post (suds_section_stack meta). |
cpt:service| Fires when | base — always eligible |
| Needs | cpt:service |
| Pages | service |
| Use | Cross-links the OTHER services from a service single. Part of every service single by default; remove per-type or per-post via composition. |
| Claim-safe | Single-context section: excludes the queried service from its grid. |
cpt:location| Fires when | base — always eligible |
| Needs | cpt:location |
| Pages | location |
| Use | The single-location NAP block (address, phone, hours, map embed, amenities) read from the CURRENT location post. Part of every location single by default. |
| Claim-safe | Single-context section: reads the queried location post; composable per-type (suds_section_stack_location option) or per-post (suds_section_stack meta). |
cpt:location| Fires when | base — always eligible |
| Needs | cpt:location |
| Pages | location |
| Use | The single-location photo gallery (location_gallery field, Fancybox lightbox) read from the CURRENT location post. Self-gates when the location has no gallery. |
| Claim-safe | Single-context section: reads the queried location post. |
home:suds_cardbalance_url| Fires when | base — always eligible |
| Needs | home:suds_cardbalance_url |
| Pages | home |
| Use | Stored-value laundry-card balance check (Laundroworks/FasCard portal link) as a compact home utility band. Pick when the client uses a card system with a customer portal. |
| Claim-safe | URL-gated on home:suds_cardbalance_url — hidden until the portal link is entered (never a dead CTA). Also surfaces a matching button in the footer hours column when the URL is set. Ported from the t2-laundry fork. |
Each cell counts sections in that category that fire for the scenario. Columns cover two layers: per-section triggers (e.g. pickup_delivery, commercial_accounts) that select individual sections, and site-level signals (e.g. commercial, multi_location, has_reviews) that gate whole categories at render time — so the latter often show no per-section count. Sparse columns are scenarios with thin coverage; flagged categories have only one variant.
| category | variants | base | commercial | commercial_accounts | has_reviews | multi_location | pickup_delivery | service_area | service_area_content | spanish | wash_fold |
|---|---|---|---|---|---|---|---|---|---|---|---|
| amenities | 3 | 3 | · | · | · | · | · | · | · | · | · |
| areas ▲ | 1 | 1 | · | · | · | · | · | · | · | · | · |
| commercial | 2 | · | · | 2 | · | · | · | · | · | · | · |
| contact ▲ | 1 | 1 | · | · | · | · | · | · | · | · | · |
| cta | 3 | 3 | · | · | · | · | · | · | · | · | · |
| faq | 2 | 2 | · | · | · | · | · | · | · | · | · |
| gallery | 2 | 2 | · | · | · | · | · | · | · | · | · |
| hero ▲ | 1 | 1 | · | · | · | · | · | · | · | · | · |
| hours | 2 | 2 | · | · | · | · | · | · | · | · | · |
| location-single | 2 | 2 | · | · | · | · | · | · | · | · | · |
| locations | 4 | 1 | · | · | · | 3 | · | · | · | · | · |
| map | 2 | 2 | · | · | · | · | · | · | · | · | · |
| newsletter ▲ | 1 | 1 | · | · | · | · | · | · | · | · | · |
| payment ▲ | 1 | 1 | · | · | · | · | · | · | · | · | · |
| pickup-delivery | 3 | · | · | · | · | · | 3 | · | · | · | · |
| pricing | 3 | 3 | · | · | · | · | · | · | · | · | · |
| reviews | 4 | 3 | · | · | 1 | · | · | · | · | · | · |
| service-area | 3 | · | · | · | · | · | · | · | 3 | · | · |
| service-single | 2 | 2 | · | · | · | · | · | · | · | · | · |
| services | 6 | 6 | · | · | · | · | · | · | · | · | · |
| steps | 3 | 3 | · | · | · | · | · | · | · | · | · |
| story | 3 | 3 | · | · | · | · | · | · | · | · | · |
| team ▲ | 1 | 1 | · | · | · | · | · | · | · | · | · |
| trust | 3 | 3 | · | · | · | · | · | · | · | · | · |
| wash-fold | 2 | · | · | · | · | · | · | · | · | · | 2 |
| why | 2 | 2 | · | · | · | · | · | · | · | · | · |
Generated from docs/manifest.json by tools/build-catalog.php. Do not hand-edit — re-run after section or manifest changes. Prefix: {prefix}.