2fc9fb22026-05-13remove stray contact modal markup that was rendering inline on the page
98cdf992026-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.
4b657cf · 2026-05-30 · fix: remove public .bak- snapshot leak, harden bak-guard regex and gitignore
- Deleted public/index.html.bak-20260526152130 (was served 200 via express.static)
- Fixed middleware regex /.bak[\.\-]|\.bak$/ to also block .bak-* filenames (was only blocking .bak. or .bak$)
- Added *.bak-* pattern to .gitignore (*.bak.* pattern did not match hyphen-separated timestamps)
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).
a2dc3c5 · 2026-05-25 · scrub vendor leak from Ideas rail + add noreferrer to Facebook link
Ideas rail's rc-meta div was rendering p.vendor on the customer page —
defeats the vendor-redact rule that the rest of the index already honors.
Hardcode to 'Designer Wallcoverings' instead.
Also tightens target=_blank rel from 'noopener' to 'noopener noreferrer'
on the Facebook footer link.
Author: steve@designerwallcoverings.com
e1f6a3c · 2026-05-25 · /api/facets: total + aesthetics counts now reflect filtered list
Was always returning PRODUCTS_NICHE.length regardless of ?q= or
?aesthetic=, so the header count drifted whenever the user narrowed the
grid. Now applies the same filters /api/products does before counting.
Author: steve@designerwallcoverings.com
cee03af · 2026-05-25 · wire api-vendor-redact middleware as first app.use()
Mounts ../_shared/api-vendor-redact so /api/facets stops emitting the
vendors{} map and /api/products strips ?vendor= filter. Defense-in-depth
behind the HTML scrub already in place on the customer-facing pages.
Author: steve@designerwallcoverings.com
before: all=108
after: all=15, metallic=57, silver=36
Backfills correct multi-bucket aesthetic tagging from dw_unified.microsite_products
(DTD verdict B, 2026-05-25 fleet retag run).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
795e7a3 · 2026-05-07 · Scrub Designer Wallcoverings from products.json (vendor/imageAlt/tags)
Replaced literal 'Designer Wallcoverings' (vendor field, imageAlt suffix,
and tag arrays) with site brand_name. The static HTML was already clean,
but Browserbase rendered-page check found these JS-injected strings.
Now: 0 DW leaks rendered.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
File tree
20 files tracked. Click any to browse the source at HEAD.