eafbabc2026-05-13remove stray contact modal markup that was rendering inline on the page
9cc82652026-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.
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).
84375b9 · 2026-05-26 · site.config rails: align with actual catalog buckets (texture/botanical/palm)
Fleet rails sweep — config rails referenced raffia/grasscloth/sisal/natural/woven/handloom
but products.json only buckets into texture(28) botanical(15) palm(2). /api/sliders was
returning rails:[]. Now matches reality.
before: all=52
after: all=7, botanical=15, palm=2, texture=28
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>
690771d · 2026-05-19 · nav: remove dead /about and /vocabulary links
Neither about.html nor vocabulary.html exists, so those nav links 404.
Stripped them from the care/history/sourcing/trade footer nav. The
index.html nav/footer /about links were replaced with real clean-URL
targets (/history, /care, /trade) in the prior commit.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dd75db7 · 2026-05-19 · index: wire sort select to API, hydrate saved sort before first load
The sort <select> persisted to localStorage but state.sort was never
sent in the /api/products query, and the wire-up that read the saved
value ran AFTER the initial loadGridPage(). Now state.sort is hydrated
from localStorage at state-init time (before the first fetch), the
select reflects it, and loadGridPage() passes sort= to the server.
Also add rel="noopener noreferrer" to the Facebook external link.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- /api/facets total now counts PRODUCTS_NICHE (the filtered list actually
served), not the raw PRODUCTS array.
- Middleware 404-guards any .bak/.pre-/.orig path so snapshot files never
serve from the static root.
- express.static gets extensions:['html'] so extension-less nav links
(/care, /history, /trade, /sourcing) resolve instead of 404ing.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Removes 19 committed backup/snapshot files from version control and
extends .gitignore to cover *.bak.*, *.pre-*, *.orig patterns.
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.