174d1d92026-05-13remove stray contact modal markup that was rendering inline on the page
966aa4b2026-05-13header: remove duplicate <header> with dwmOpen-contact (was overlapping ns-header) + add display:none default to .ns-modal so How-can-we-help only opens on click. Restores canonical logo-UL + hamburger-UR layout per MEMORY rule.
Commits with substantial prose (≥120 chars) — the rationale behind each move.
ace7c3b · 2026-05-30 · fix: remove leaked backup file from public/ and add *.bak-* to .gitignore
public/index.html.bak-20260526152130 was untracked but physically present in
the static-serve directory. Removed the file. Added *.bak-* pattern to
.gitignore so timestamped backup variants are covered alongside *.bak and *.bak.*.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Default: theme1, toggle hidden. Opt-in via ?theme=2 or localStorage
('wallco-page-theme' key shared across the fleet). Same gate pattern
as dw-domain-fleet productPage.
Fleet rails sweep A3 — adds the canonical DW rail-sections pattern from
retrowalls (per LEDGER 2026-05-26 correction note). Renders rails from
/api/sliders ABOVE the flat grid on the unfiltered '/' home view; hides
itself when state.q or state.facet !== 'all'. Clicking 'View all -> on a
rail title calls state.facet=aes + resetGrid + scrollIntoView('#shop')
which is the canonical jumpToFacet behavior. Patch is 3 pieces:
(1) <div id='rails' style='display:none'></div> before <div id='grid'>
(2) .rail-section/.rail-head/.rail-all/.grid.rail-grid CSS
(3) async renderRailSections() fn + startup call right after loadGridPage().
Coexists cleanly with the existing 2-rail Ideas block above (which renders
'New this week' + 'Curated picks' from /api/products and survives in any
filter state).
fd2ae5f · 2026-05-26 · site.config rails: align with actual catalog buckets
Fleet rails sweep — config rails referenced blush/mint/sage/butter/sky/lavender (the
ASPIRATIONAL pastel palette) but products.json has no such buckets. Pre-existing
catalog buckets into beige(374) contemporary(141) traditional(31) cream(17) white(14)
textured(14). Replaced rails with these so /api/sliders returns non-empty data.
d896cb4 · 2026-05-25 · /api/facets: total counts the filtered list, not the entire niche slice
Endpoint now accepts the same ?q / ?aesthetic / ?vendor params as
/api/products and computes the aesthetics map, vendors map, and total
off the filtered list. Previously total always reported the full
PRODUCTS_NICHE length, which made the result-count badge wrong as soon
as the user typed in the search box or picked an aesthetic chip.
Mounts ../_shared/api-vendor-redact as the first app.use, above route
registration, so /api/* responses can never leak vendor fields or the
vendors facet map. Also replaces the inline (p.vendor || '') render in
the Ideas rail card with the canonical 'Designer Wallcoverings' string
so the customer-facing HTML matches the API contract.