{"slug":"ffepurchasing","total":54,"limit":100,"offset":0,"since":null,"commits":[{"hash":"098c6b7","date":"2026-07-06 17:57:07 -0700","author":"Steve Abrams","subject":"Square product-card images (aspect-ratio 1/1)","body":""},{"hash":"ff7f64b","date":"2026-07-03 09:57:41 -0700","author":"Steve Abrams","subject":"corner-nav: move login to its own hamburger in upper-left (panel slides from left)","body":""},{"hash":"a2c5b59","date":"2026-06-19 16:33:18 -0700","author":"Steve","subject":"Mount new-arrivals promo strip (Tier B): require ../_shared/_universal-promo-banner before express.static — text-only rotating 'New · <product> →' banner from /api/products?sort=newest. Local only; deploy gated.","body":"Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>"},{"hash":"4c05158","date":"2026-06-18 09:04:25 -0700","author":"Steve Abrams","subject":"fix: safeImg allow same-origin /img/ proxy urls (vendor-neutral image proxy 2026-06-03) — product cards were falling back to hero-bg (images all wrong)","body":""},{"hash":"2e367c7","date":"2026-06-11 09:23:37 -0700","author":"Steve Abrams","subject":"ffepurchasing: rails fire again — wire sliders + grid filter to aesthetic-OR-tags matcher (prod-safe try-require + inline fallback)","body":""},{"hash":"1ec14db","date":"2026-06-09 13:47:50 -0700","author":"Steve","subject":"step2 vendor-leak fix: dual-key /sample resolver + handle_display hrefs","body":""},{"hash":"004be02","date":"2026-06-09 13:47:50 -0700","author":"Steve","subject":"snapshot before step2 codemod","body":""},{"hash":"7bd9109","date":"2026-06-03 20:45:06 -0700","author":"Steve","subject":"Scrub residual vendor names from products.json (title/vendor/tags); preserve sku/handle","body":""},{"hash":"4ffcd75","date":"2026-06-01 16:38:38 -0700","author":"Steve Abrams","subject":"admin: add dw-theme-nav 20-theme navigator (upper-right, admin-only)","body":""},{"hash":"81397e6","date":"2026-06-01 15:21:12 -0700","author":"Steve","subject":"hero: rotate curated room-setting pool (hero-pool.json), guard >=1400px, no swatch blur","body":""},{"hash":"1fb9ff7","date":"2026-06-01 13:59:20 -0700","author":"Steve","subject":"homepage: collapse duplicated 'Ideas' rail-eyebrows into one section eyebrow","body":""},{"hash":"1934fb3","date":"2026-06-01 13:56:18 -0700","author":"Steve Abrams","subject":"Unique hero image (backsync from prod, fleet hero dedup 2026-06-01)","body":""},{"hash":"fc990f8","date":"2026-06-01 07:28:18 -0700","author":"Steve Abrams","subject":"clean-URL: 301 redirect legacy /*.html -> extension-less routes (/index.html -> /, /trade-account.html -> /trade-account)","body":""},{"hash":"1dadf89","date":"2026-06-01 07:28:04 -0700","author":"Steve Abrams","subject":"noopener,noreferrer on sister-site constellation window.open popup","body":""},{"hash":"4c34b57","date":"2026-06-01 07:27:55 -0700","author":"Steve Abrams","subject":"/api/facets: drill-down counts over the active filtered set (q/aesthetic/vendor) via shared filterProducts() — was counting whole niche catalog","body":""},{"hash":"02ead9b","date":"2026-05-30 23:54:36 -0700","author":"Steve Abrams","subject":"remove served backup file public/index.html.bak-20260526152130 and add *.bak-* to .gitignore","body":"Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>"},{"hash":"8a7bd96","date":"2026-05-28 07:25:56 -0700","author":"Steve","subject":"scrub vendor name leaks from products.json source (224 products: title/vendor/tags cleaned per sku-redact denylist)","body":""},{"hash":"14c3805","date":"2026-05-26 15:25:18 -0700","author":"Steve","subject":"frontend: cleanSku() strips vendor names from displayed sku (.ven/list/detail) + defer renderRailSections call (fix ReferenceError) — click-through verified","body":""},{"hash":"9ea9991","date":"2026-05-26 15:16:00 -0700","author":"Steve Abrams","subject":"sku-redact: wire shared vendor-id display scrubber","body":""},{"hash":"1ac0432","date":"2026-05-26 09:50:34 -0700","author":"Steve Abrams","subject":"ffepurchasing: editorial rail/facet labels — polished neutrals over real aesthetic buckets; behavior unchanged","body":""},{"hash":"6ff2de0","date":"2026-05-26 09:43:23 -0700","author":"Steve Abrams","subject":"ffepurchasing: commit config-rails fix — aspirational hotel/restaurant (0 hydrate) → real buckets (5 rails fire)","body":""},{"hash":"407df7e","date":"2026-05-26 07:19:43 -0700","author":"Steve","subject":"wire api-vendor-redact middleware (close vendors-facet leak)","body":""},{"hash":"8b06c9d","date":"2026-05-25 21:03:03 -0700","author":"Steve Abrams","subject":"remove vendor names from customer-facing cards/rows/rails (DW rule: never expose vendor identity)","body":""},{"hash":"52ff72f","date":"2026-05-25 20:37:36 -0700","author":"Steve Abrams","subject":"retag aesthetic from PG: 598 rows updated","body":"before: all=600\nafter:  all=2, beige=43, contemporary=60, gray=3, textured=448, traditional=26, white=18\n\nBackfills correct multi-bucket aesthetic tagging from dw_unified.microsite_products\n(DTD verdict B, 2026-05-25 fleet retag run).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"f1221c9","date":"2026-05-19 23:19:42 -0700","author":"Steve Abrams","subject":"make server.js self-contained — gate _shared/admin-catalog behind MICROSITE_ADMIN_ENABLED env flag (kamatera deploy unblock)","body":""},{"hash":"118b48e","date":"2026-05-19 17:19:49 -0700","author":"Steve Abrams","subject":"fix: add noreferrer to target=_blank external links","body":"Both index.html (Facebook) and dw-fleet-nav.js (sister-brand\nrail) had target=\"_blank\" with rel=\"noopener\" only — adds\nnoreferrer per the standing fleet hygiene rule.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"084f9b5","date":"2026-05-19 17:17:24 -0700","author":"Steve Abrams","subject":"WIP: partial sort hydration from killed agent — finish in next pass","body":""},{"hash":"2bdb4aa","date":"2026-05-19 15:22:48 -0700","author":"Steve Abrams","subject":"fix: add .bak/.pre-* 404 guard and correct /api/facets total","body":"- Express middleware before express.static returns 404 for any path\n  matching .bak / .bak.* / .pre-* so leftover local snapshots never\n  serve from public/.\n- /api/facets total now reflects PRODUCTS_NICHE (the filtered list\n  served by /api/products) instead of the raw PRODUCTS array, so the\n  footer/header counts match what users can actually see.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"8a7784b","date":"2026-05-19 15:22:19 -0700","author":"Steve Abrams","subject":"chore: untrack .bak/.pre-* snapshots and broaden .gitignore","body":"Removes 16 committed snapshot files (15 index.html backups + 1 server.js\nbackup) from version control; adds *.bak.*, *.pre-*, *.pre-*.bak patterns\nto .gitignore so future snapshots stay local-only.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>"},{"hash":"c489d2e","date":"2026-05-19 12:14:36 -0700","author":"Steve Abrams","subject":"Phase 2b: harden .card .pat against long-token title clipping (overflow-wrap)","body":""},{"hash":"232394b","date":"2026-05-19 11:32:14 -0700","author":"Steve Abrams","subject":"Phase 2: mobile-ready + tap-to-reveal","body":""},{"hash":"e92af14","date":"2026-05-19 10:55:37 -0700","author":"Steve Abrams","subject":"fix site.config.json — correct slug/identity (was copy-pasted from hospitalitywallpaper)","body":""},{"hash":"0de1c6c","date":"2026-05-19 10:17:26 -0700","author":"Steve Abrams","subject":"stage2: wire microsite catalog + admin CRUD","body":""},{"hash":"72acf4a","date":"2026-05-14 08:54:34 -0700","author":"Steve","subject":"hero-4grid: relocate json from data/ to public/ for Express static","body":""},{"hash":"e92a629","date":"2026-05-14 08:48:42 -0700","author":"Steve","subject":"4-grid hero: drop-in script + crop CSS + initial 4 newest products","body":""},{"hash":"768f0bf","date":"2026-05-14 08:35:03 -0700","author":"Steve","subject":"favicon: Mag-7-inspired SVG glyph","body":""},{"hash":"eec46e0","date":"2026-05-13 17:42:54 -0700","author":"Steve Abrams","subject":"corner-nav: title-case the brand name even when .ns-name source is lowercase","body":""},{"hash":"84446f4","date":"2026-05-13 17:41:29 -0700","author":"Steve Abrams","subject":"corner-nav: title-case brand display (e.g. corkwallcovering → Cork Wallcovering)","body":""},{"hash":"33c6ad8","date":"2026-05-13 17:40:51 -0700","author":"Steve Abrams","subject":"corner-nav: fix injection — script tag was landing inside HTML comment, now anchored to real </body>","body":""},{"hash":"8dec271","date":"2026-05-13 14:46:29 -0700","author":"Steve Abrams","subject":"fix: contact modal CSS+HTML (was rendering inline as raw emoji/links)","body":""},{"hash":"29b5c4c","date":"2026-05-13 12:32:42 -0700","author":"Steve Abrams","subject":"add universal corner-nav.js (UR 4-icon: bag/account/search/menu)","body":""},{"hash":"0102b55","date":"2026-05-13 12:13:21 -0700","author":"Steve Abrams","subject":"remove stray contact modal markup that was rendering inline on the page","body":""},{"hash":"24cf536","date":"2026-05-13 08:57:53 -0700","author":"Steve","subject":"snapshot: 5 file(s) changed, +3 new, ~2 modified","body":""},{"hash":"137bcca","date":"2026-05-10 00:14:32 -0700","author":"Steve Abrams","subject":"add gated figma capture loader (only fires on ?figmacapture= URL param)","body":"The script never loads for normal visitors — only when the URL contains\n'figmacapture=' query string or hash, which is required for the figma MCP\ngenerate_figma_design tool to convert the page to a Figma file."},{"hash":"af3374d","date":"2026-05-10 00:04:21 -0700","author":"Steve Abrams","subject":"brand customization for ffepurchasing","body":"- swap Heritage Atelier → site-specific brand\n- swap GA G-XM0936TL4N → site-specific measurement_id\n- swap palette + typography to match per-site fashion template\n- swap port + sitemap/robots domain"},{"hash":"690b5d6","date":"2026-05-08 00:12:42 -0700","author":"Steve","subject":"fleet UX: novasuede-style hamburger drawer (DW-Websites/_shared/dw-fleet-nav.js)","body":"This site has 2 </body> (one in a comment block) — script tag goes\nbefore the LAST </body> per the corrected injector logic."},{"hash":"c969938","date":"2026-05-07 17:55:29 -0700","author":"Steve","subject":"graphic-loop pass 13: real footer brand + Facebook link + OG/Twitter meta tags","body":""},{"hash":"f8c4ed7","date":"2026-05-07 13:19:42 -0700","author":"Steve","subject":"graphic-loop pass 12: niche keyword filter (no off-niche products like 'solid' on patterned sites)","body":""},{"hash":"3e4a6bb","date":"2026-05-07 12:43:12 -0700","author":"Steve","subject":"graphic-loop pass 11: add Ideas rails (New this week + Curated picks) above main grid","body":""},{"hash":"de6aabe","date":"2026-05-07 09:26:16 -0700","author":"Steve","subject":"graphic-loop pass 10: center-mark to top + readable text-shadow + tighter letter-spacing (no mix-blend-mode)","body":""},{"hash":"fb4455f","date":"2026-05-07 09:13:10 -0700","author":"Steve","subject":"graphic-loop pass 9: real site name + 20-image hero rotation + 2400px hero res","body":""},{"hash":"9880dd8","date":"2026-05-07 08:41:34 -0700","author":"Steve","subject":"graphic-loop pass 8: theme-aware font Cormorant Garamond (panel-approved comprehensive 16-bucket assignment)","body":""},{"hash":"2cbfe46","date":"2026-05-06 19:59:56 -0700","author":"Steve","subject":"graphic-loop pass 2: fix .corner-mark contrast + soften hero overlay (qwen3:14b consensus across fleet)","body":""},{"hash":"404c252","date":"2026-05-06 10:25:40 -0700","author":"Steve Abrams","subject":"initial scaffold (gitify-all 2026-05-06)","body":""}]}