Sessions · demo.sessions.ca

67 working versions · newest first · v227 is live at the root. Click any version to open it.

v227LATESTJun 11, 2026 · 4:10 AM
  • On-sale toggle styling: orange track when on.
  • Filter footer split: “Clear Filters” on the left, result count on the right.
v226Jun 11, 2026 · 3:59 AM
  • “On sale only” filter now actually filters (it was checking a field the live data never set).
  • Cards show the struck-out original price + % off.
v225Jun 11, 2026 · 3:43 AM
  • Saving a product flies a heart up to the header (like add-to-cart) + the heart pops.
v224Jun 11, 2026 · 3:36 AM
  • Wishlist fills in image / brand / price for older saves from the live catalogue.
v223Jun 11, 2026 · 3:21 AM
  • Wishlist de-duplicates the same product (fixes a cross-version double listing).
v222Jun 11, 2026 · 3:18 AM
  • Favourites now work end-to-end: a real /wishlist page + a live count badge on the header heart.
  • Saved on your device across visits.
v221Jun 11, 2026 · 1:29 AM
  • Size toggle only appears when a product genuinely has multiple sizes (removed fake buckets).
  • Plain (un-coloured) selected chip.
v220Jun 11, 2026 · 1:20 AM
  • Switching store now shows a loading skeleton instead of briefly flashing the old store's products.
v219Jun 11, 2026 · 1:10 AM
  • Store-aware left filter: options a store doesn't stock are greyed with a tooltip + “switch store”.
  • Filter counts recompute as you filter (conditional faceting).
  • Shop loads a fuller catalogue (~117 vs 20 products).
v218Jun 11, 2026 · 12:33 AM
  • Size selector now uses the REAL Dutchie variants — the price updates per size (was fake static sizes).
v217Jun 11, 2026 · 12:20 AM
  • Added a “Save” heart to every card + a segmented size selector.
v216Jun 10, 2026 · 11:33 PM
  • Fixed your selected store (e.g. London) missing from a product's “available at” list.
v215Jun 10, 2026 · 11:19 PM
  • Product cards: store availability now sorted nearest → farthest by your location.
v214Jun 10, 2026 · 10:50 PM
  • Footer licence banner: cream background + readable, per-store CRSA licence number.
v213Jun 10, 2026 · 9:47 PM
  • Empty-shop self-heal: auto-retry if a store lands empty + a “Retry now” button.
v212Jun 10, 2026 · 12:38 PM
  • Fixed broken “shop locations” deep links (a real page folder per store).
v211Jun 10, 2026 · 12:06 PM
  • Resilience: products hook retries and keeps last-good results on a transient miss.
v210Jun 10, 2026 · 11:46 AM
  • Removed the shop header's bottom border.
v209Jun 10, 2026 · 11:41 AM
  • Resilience: retry the live menu on a worker 502 so the grid doesn't blank.
v208Jun 10, 2026 · 11:31 AM
  • Shop card polish: outline “+ Add” button + refined variant pill.
v207Jun 10, 2026 · 11:31 AM
  • Hid the “Our Vibe” page.
v206Jun 10, 2026 · 11:31 AM
  • Fixed the shop background not blending (full-width band, no seam).
v205Jun 10, 2026 · 11:31 AM
  • Shop redesign: clean white product cards (no cream).
  • Removed per-card store info; rounded the left filter to match.
v204Jun 10, 2026 · 11:31 AM
  • Removed the orange “Check out our Everyday Deals” banner from every page.
v203Jun 10, 2026 · 11:31 AM
  • Renamed “Sessions Featured” → “Recently Sold”.
  • Removed the gradient from the “Visit {store}” heading.
v202Jun 10, 2026 · 11:31 AM
  • Homepage reorder: Everyday Deals moved up, Sessions Featured moved down.
v201Jun 10, 2026 · 11:31 AM
  • Surfaced all real on-sale London products (10, vs 2 before) via a per-category scan.
  • Cards show the new price + the struck-out old price.
v200Jun 10, 2026 · 11:31 AM
  • Everyday Deals wired to Dutchie's real “Everyday Deals” special (genuine on-sale products).
v199Jun 10, 2026 · 11:31 AM
  • Fix for v198: DealsFold passed the v2 record id to useDeals instead of the Dutchie store UUID, so the live on-sale fetch returned 0 (section hid). Now passes store.store_id (UUID). Everyday-Deals cards show real on-sale products + price (new + struck old).
v198Jun 10, 2026 · 11:31 AM
  • Darryl: Everyday-Deals cards now show the actual on-sale PRODUCT + PRICE (new price + struck-through old price), not promo-concept copy. Rewired useDeals() to pull genuinely on-sale items from the LIVE Dutchie menu (variant.on_sale / price_special1) per selected store; DealCard3D bottom band shows brand + name + $new (accent) + $old (line-through) + size. Dropped the promo claims (e.g. \u201c15% OFF FIRST BASKET / First-Time Customer / over the counter no fuss\u201d). Section hides if a store has zero live on-sale items.
v197Jun 10, 2026 · 11:31 AM
  • Confirmed + cleaned: the entire price/availability path is LIVE Dutchie only. Shop+homepage listing = live menu (v181, no D1 fallback). PDP price/stock = live cross-store fan-out. Removed the orphaned D1 reader (fetchFromWorkerProducts/d1_cache) so there is zero stale-cache code in the listing module. The only D1 touch left is the PDP product IMAGE/description (cosmetic, not price/availability).
v196Jun 10, 2026 · 11:31 AM
  • Applied Darryl\u2019s availability rule everywhere on LIVE Dutchie quantity: hide any product/store-listing with qty≤1 (show only ≥2). Already on shop + homepage (v189); now also on the PDP cross-store \u201cAvailable at N stores\u201d list (was qty>0). Net effect: only genuinely-buyable items/stores are listed \u2014 removes the dependency on the Dutchie whitelist IP for not-listing-unavailable-products. Checkout still re-validates live (the qty>1 buffer makes the sell-out race rare, not impossible). The whitelist remains useful only for the separate cross-store availability index.
v195Jun 10, 2026 · 11:31 AM
  • Removed the homepage-embedded full product catalog (the sticky search + category-pills bar and the product grid + Load more). Product browsing now lives on the dedicated /shop page (ShopPage), which is unchanged. Homepage is now a clean landing page (hero, categories, deals carousel, locations, blog, store map).
v194Jun 10, 2026 · 11:31 AM
  • Removed the homepage Rewards + Freshness Guarantee + Delivery promo bento (RewardsPromoStrip). All prior v187-v193 changes retained.
v193Jun 10, 2026 · 11:31 AM
  • (1) Removed the stats divider line at its real source: a stylesheet rule .sc-stats-grid { border-top } in global.css (the inline one was already gone). (2) Deleted the old "This Week at [store]" bento section (StorewideDeals) so the homepage has a single deals section — the Everyday Deals 3D card carousel (DealsFold). Stat cards remain centered (v192).
v192Jun 10, 2026 · 11:31 AM
  • Centered the hero stat cards (align-items + text-align center; was left-aligned) and confirmed no top divider line on the stats band. Numbers from v191 retained: 50+ Ontario Locations / 374 Avg SKUs per store / 4.7 rating / 6 yrs.
v191Jun 10, 2026 · 11:31 AM
  • RESTORED the hero stats band (it was wanted, not removed) and removed the thin divider LINE crossing above it (border-top on .sc-stats-band). Applied Darryl\u2019s number fixes: "Ontario locations" now uses the real store-master count (50) instead of the inflated/duplicated 76; "Live SKUs daily / 132K" replaced with "Avg SKUs / store" computed from live per-store counts (Darryl: avg per store, not a misleading total). 4.7 rating + 6 yrs kept. All v187-v190 cleanups retained.
v190Jun 10, 2026 · 11:31 AM
  • Removed the homepage hero stats band (76+ Ontario Locations / 132K+ Live SKUs Daily / 4.7 / 6yrs). Darryl flagged "76+" as incorrect and "132K Live SKUs daily" as misleading. Rather than ship invented numbers on a live cannabis site, the band is removed until Darryl provides the correct figures (e.g. real location count + avg SKUs per store split cannabis/accessory). Everything else from v187-v189 retained.
v189Jun 10, 2026 · 11:31 AM
  • More of Darryl\u2019s review actioned (visible homepage changes): (1) HIDE products with qty\u22641 across shop + product surfaces (Darryl\u2019s race-condition rule \u2014 never list a near-OOS item). (2) FEATURED section no longer surfaces apparel/accessories/merch/topicals (kills the \u201c6-year-old t-shirt\u201d that doesn\u2019t sell). (3) HIDE the placeholder Reviews section (fake reviews; awaiting a real review system). (4) REMOVE the floating \u201cFollow \u00b7 25% off\u201d pill (unverifiable offer, dead link, wrong handle). (5) HIDE the Instagram tile feed (account is private \u2014 cannot show a live feed). Plus: added physical SPA route folders so deep-links/refresh on /v189/shop, /cart, /product, /location, /rewards, /blog resolve to the app (not the picker). HELD (need Darryl figures / Sophie content / data-wiring): exact stats numbers, the Everyday-Deals real-product feed (needs Dutchie specials API), per-store distance sort (needs geolocation), programs/rewards copy.
v188Jun 10, 2026 · 11:31 AM
  • REGULATORY FIX. The footer/PDP CRSA licence number was hard-coded to a single value (CRSA1382440) whenever the store-record fuzzy match missed — so different stores showed the SAME wrong licence (Cannabis Act/AGCO compliance exposure). FIX: built an address-VALIDATED UUID→CRSA map (48/50 stores; only map when the store master address and the licensed address are the same physical building). This caught a real data hazard — stoney-creek and red-hill had their ids/addresses swapped between datasets, which an id-only match would have mislabelled — and resolved them by true address instead. Footer now binds the licence to the active store by UUID; when a store has no verified licence on file (2 stores: Laurelwood, St. Catharines — data gap flagged for Sophie/Amber) it shows the generic “Ontario Authorized Cannabis Retailer” with NO number, never a false one. Verified per-store on production: London South→CRSA1480667, Oshawa→CRSA1172585 (previously both showed CRSA1382440).
v187Jun 10, 2026 · 11:31 AM
  • First implementation pass from the Darryl × Ravi review (SADD-005/006). Three selector-grounded removals, each mapped to source then verified against the live DOM: (B1) removed the auto-scrolling category marquee (TrustStrip / LogoLoop “Sessions categories” — the Indica/Sativa/Hybrid pills Darryl said “remove that”). (B2) removed the 4 non-clickable store-address cards from the orange footer; kept the footer nav-link columns. (B3) removed the PDP “Available at N Stores” + “Search city…” sidestep bar; kept the per-store availability list, “+ Show more stores”, and location pills below — only the redundant header/filter chrome removed. No content invented: stats numbers + everyday-deals label cleanup held for Darryl’s actual figures; Instagram / reviews / first-fold / footer-image held for Sophie’s sign-off. Promos untouched.
v186
v185Jun 10, 2026 · 11:31 AM
  • Ravi diagnosed + tested live in browser: .shop-layout grid traps mobile swipes inside .fs-aside (max-height:573 + overflow-y:auto + scrollHeight:1448 = internal scroll container). User scrolls filter sections instead of page; products physically render 1738px down (unreachable); no search escape hatch. FIX (mobile bottom-sheet pattern): (1) .shop-layout display:block !important on mobile (breaks the trapping grid); (2) .fs-aside becomes position:fixed bottom drawer, transform:translateY(100%) hidden by default, max-height:80vh, overscroll-behavior:contain (scroll stays in sheet), border-radius 20px top, z:1000, padding-bottom:96 to clear sticky checkout; (3) body.fs-filters-open class triggers slide-up via transform:translateY(0); (4) Real React-rendered .fs-filter-scrim div (NOT body::after) at z:999 with onClick=close (pseudo-elements can't carry React handlers); (5) Floating #fs-filter-trigger pill (dark Sessions green #0f3d2e — orange reserved for cart-rail CTA) at bottom-LEFT 84px above FAM-toggle at 14px (70px gap, no collision). Composes with v184 cart-rail bottom-right z:9500 untouched. ShopPage.jsx adds filtersOpen state + useEffect body class sync + Escape-to-close. Mirrors 21st.dev bottom-sheet pattern referenced in handoff doc.
v184Jun 10, 2026 · 11:31 AM
  • Ravi: "checkout button went missing but make sure it stays always and for mobile view it should be horizontal instead of vertical." ROOT CAUSE (3 stacked): (1) .cart-rail-cta-shiny used color:transparent + -webkit-background-clip:text (gold-on-white shine gradient on text) which sometimes rendered invisible against the orange rail bg on certain mobile browsers/states; (2) cart-rail had no explicit z-index in v179 mobile rules — defaulted to source z:250, while FAM at z:9000 + sc-promo-flag at z:40 also bottom-right-positioned, causing potential overlap; (3) hover:width-grow rule applied even on touch devices. FIX: explicit z:9500 on cart-rail (above FAM), SOLID white CHECKOUT pill background with #C96A2C text (not transparent gradient — kills the invisible-text class entirely with -webkit-text-fill-color override), 4-element horizontal pill layout (icon32+count16 / / CHECKOUT pill — limit-track hidden), FAM toggle MOVED to bottom-LEFT on mobile (was right) to clear cart-rail zone, sc-promo-flag legacy FOLLOW pill HIDDEN on mobile (was bottom:16 right:16 colliding). Three breakpoint cascade: 768px (pill 52px), 480px (48px), 360px (44px) — CHECKOUT visible at all sizes. Pattern inspired by 21st.dev floating-action-menu reference doc Ravi uploaded (single trigger, consolidated bottom-right zone, orange reserved for primary CTA).
v183Jun 10, 2026 · 11:31 AM
  • CRITICAL routing fix. Ravi reported: "shop location page... no page at all. Any of the individual shop locations, 50 locations, what happened to them?" Empirical probe confirmed: /v182/location/dalhousie returned the PICKER (152KB, title "Demo versions") instead of the SPA. Root cause: 3 stacked failures. (1) _redirects file was written to /v182/_redirects but CF Pages only reads it at DEPLOY ROOT, not inside subfolders — the SPA fallback rule never fired. (2) No physical folders existed for /v182/location/{slug} — CF Pages fell through to root /index.html (the picker) for every unknown slug. (3) This bug existed since at least v149 — affecting EVERY versioned deploy that used dynamic routes. THE FIX (3 layers): (A) Root-level dist-v183-full/_redirects with /v183/location/* → /v183/location/index.html 200 + same for /product + /shop + /cart. (B) Pre-built physical folders for all 146 known store slugs (50 stores × 3 variants: id, slugified-name, short-name) under /v183/location/{slug}/index.html. (C) ALSO backfilled the same fix into v182 paths so demo.sessions.ca/v182/location/dalhousie now resolves correctly via the root _redirects + physical folders. Local-served the build, verified SPA title returns (not picker) for every test path before deploy. Both v183 AND v182 location routes should now serve the SPA, store-pick flow should land users on the right page.
v182Jun 10, 2026 · 11:31 AM
  • PDP architectural honesty fix (Ravi flagged: "cross store is decorative means the number isnot true?"). The "Available at N Stores" widget was reading D1 product_availability snapshots from the hourly scraper — prices and "10 left" qty were stale. (1) Auto-fetch of fetchProductStores DELETED — PDP no longer hits /api/product-stores → D1 on mount. (2) NEW lazy-expand UI: pre-expand state shows a CTA "Find at other Sessions stores ↓" inside a warm dashed pill. (3) Click → triggers findProductAcrossStores() in src/api/menu.js — fans out fetchMenu() across all ~50 stores in batches of 6 (browser-safe concurrency), filters each store's LIVE Dutchie menu for matches by product name + variant size, returns real-time price + qty. (4) Per-store cards still use the original storeCard JSX but with REAL Dutchie numbers — no more ".73 In stock" lies. (5) StockPill above the fold reworded: pre-expand shows neutral "Available across Sessions stores", post-expand shows accurate "In Stock at N of M stores". Stores that error (Dutchie 404 retailer not found, network fail) are silently skipped — graceful degradation. Architecture: completes v181's Dutchie-direct commitment by removing the last D1 read path from user-facing surfaces. /api/product-stores endpoint now orphaned.
v181Jun 10, 2026 · 11:31 AM
  • Architecture pivot. Ravi directive: "no cross store force ask them." (1) Mandatory store-gate added to useEntryFlow as new step between AgeGate and done — picker has no close X, no backdrop dismiss, no skip. After AgeGate confirms with no selectedStore, the picker is the only thing on screen until a store is chosen. (2) StorePicker.jsx gets new mandatory={true} prop that hides close affordances and swaps title to "Select a Store to Continue" with explanatory subtitle. (3) useProducts.fetchProducts D1 fallback (fetchFromWorkerProducts → /api/products) DELETED. Now Dutchie-direct only via tryLiveMenu → /api/menu. If no storeId → returns empty without fetching. If Dutchie unavailable → surfaces error instead of silently swapping to D1 cache. (4) useEntryFlow boot path also checks store: ageOk && !selectedStore → step=store_gate. App.jsx renders mandatory picker on store_gate step. Auto-advances to done when selectedStore becomes set. (5) HeaderV2 hidden during store_gate (per AgeGate convention). Architectural consequence: D1 cross-store availability layer becomes orphan infrastructure — every product fetch now goes through Dutchie live per-store. Decommission of scraper/data-worker/D1 deferred to v182+ once Canary confidence builds.
v180Jun 10, 2026 · 11:31 AM
  • BUG-201 section-header flex-row squeeze fix (Ravi verified live). v179 collapsed grids but not flex rows; section headers like 'Sessions Featured' got squeezed to 77px causing mid-word breaks ('Sessi/ons/Featu/red'). Fix: @media max-width:768 flex-wrap:wrap on row containers via :has(h2/h3), heading column flex:1 1 100% via :has(> h1/h2/h3), and word-break:keep-all + overflow-wrap:break-word + hyphens:none on all h1-h4. Plus shipped findings on BUG-202 + worker-account investigation (see github centilio-hub/v180-bug201-bug202-worker-investigation).
v164Jun 10, 2026 · 11:31 AM
  • 3D Deals Carousel (NEW). Replaces the GalleryDeals 4-blank-tile grid (fold 12) with a rotating 3D card carousel on a dark fold bg. Six brand-colored deal cards orbit in 3D space — focal card center with ElectricBorder lightning halo, neighbor cards at +/-25deg / +/-340px with subtle accent tint, auto-rotates every 4.5s, pauses 8s after any click. Click focal card opens full-screen DealExpandModal with discount, eligible products, validity dates, and store-aware CTA. Seed includes live Dutchie special "Everyday Deals - June" (special 6a19fdca1a59b80089fda097, Carlisle 605513b5e2d86a00cd247e75) plus 5 brand companions (Freshness Drop, SESH Reserve, First-Time, Birthday Bonus, Concentrate BOGO). Files: src/components/deals/{DealCard3D, DealsCarousel3D, DealExpandModal}.jsx + src/data/dealsSeed.js + src/hooks/useDeals.js + src/sections/DealsFold.jsx. App.jsx: GalleryDeals replaced with DealsFold. v164.5 ships /api/specials Worker proxy.
v163Jun 10, 2026 · 11:31 AM
  • Cart drawer per-store visibility + multi-store checkout picker. Patch C: PersistentCartRail computes itemsByStore, shows orange warning bar when cart spans 2+ stores, adds per-item store-name badge chip (visible only in multi-store). Patch D: useCart new actions requestMultiStoreCheckout / cancelMultiStoreCheckout / checkoutOneStore; new MultiStoreCheckoutModal globally mounted, listens for pendingMultiStoreCheckout. PersistentCartRail checkout button intercepts multi-store cart → opens modal instead of going to /cart → user picks store → checkoutOneStore(sid) calls Worker with that store only, removes those items on success so other store stays in cart for next checkout.
v162Jun 10, 2026 · 11:31 AM
  • Cross-store cart UX. Ravi: silent location switch + silent cross-store add no-op causing double Dutchie checkouts. Fixes: (1) Toast w/ Undo when /location/:slug auto-switches selectedStore — user sees "Now shopping at X · ← back to Y". (2) CrossStoreCartModal (NEW) pre-empts add when cart has items from another store — "Switch to Y (clears N items)" vs "Keep X cart". (3) useCart commit/cancelPendingSwitch handlers wire to the existing v147 R5 pendingStoreSwitch state (built but never consumed). (4) Toast component now supports action prop. Spec committed first per Ravi rule: github.com/ravigandhiarulagent1/centilio-hub/blob/main/v162-cross-store-cart-ux/DEEP-PLAN.md
v161Jun 10, 2026 · 11:31 AM
  • Per-store landing page hero upgrade. Ravi: "images compressed too much, look stretched, blank on header, not premium". Fixes: (1) hero minHeight 280→480px so photo gets proper proportions, (2) real with objectFit:cover + objectPosition:center 40% (bias toward storefront sign at photo top-half), (3) dark gradient overlay 0→55→75% so title/badges read clearly over any photo, (4) store.id-first lookup so SSM Hillside vs WestSide get their own different photos, (5) eager load on hero img (no lazy delay).
v160Jun 10, 2026 · 11:31 AM
  • Same-city collision fix. Sault Ste Marie has 2 stores (Hillside + WestSide), Hamilton has 5 (Red Hill, Rymal, Rosedale, Mohawk, Dundurn). v159 lookup keyed on short_name which collides. v160 patches: (1) getStoreAssets normalizer strips PERIODS too (St. Catharines→st-catharines), (2) mergeStoreData tries store.id FIRST then short_name (so each location-specific id resolves to its own photo), (3) explicit entries for sault-ste-marie→WestSide, hillside→Hillside, st-catharines→Welland fallback.
v159Jun 10, 2026 · 11:31 AM
  • Authoritative explicit slug→photo map (no auto-guessing). 50 of 50 stores now have a photo entry in storeAssets.js. SESH 4/4 + Sessions 46/46. Includes Etobicoke→Albion fallback, Oshawa→NorthYork fallback, Ottawa→Brockville fallback for stores Sophie hasn't shot. Fixed mini-push rebase from v158.
v158Jun 10, 2026 · 11:31 AM
  • THREE fixes: (1) storeAssets.js: filled 12 null photo entries + added 16 new slug entries (Humberlea, Wasaga Beach, Welland, Strathroy, Sudbury, Thunder Bay, Timmins, Tottenham, Sarnia, StoneyCreek, SSM, etc.). 60 of Sophie's 50 photos now have at least one slug mapping (multi-alias for typos). (2) LocationsPage StoreCard: "Shop location" CTA was buildStoreMenuUrl(uuid) → hard redirect to https://www.sessions.ca/{slug}/ (production WordPress, ORPHAN from demo). NOW goes to /v158/location/{storeSlug} — the per-store demo landing page. (3) PNGs Wasaga/Humberlea/Sarnia converted to JPG (q80, 1600px) — 392K/352K/296K each. Empirical Canary DOM verify pending.
v157Jun 10, 2026 · 11:31 AM
v156Jun 10, 2026 · 11:31 AM
  • Sophie's 50 storefront photos now display in Locations card heroes (was orange-gradient placeholder + Google Maps embed). Root cause of v154/v155 silent failures: phone-camera originals 5712×4284 at 4.3MB each — browser hung decoding 100MB of images. Fix: `sips --resampleHeightWidthMax 1600 --setProperty formatOptions 80` brought Aurora.jpg 4.4MB → 519KB. Plus `getStoreAssets()` patched to prepend `import.meta.env.BASE_URL` so /vN/-scoped paths resolve correctly. Empirical Canary DOM: 26/50 cards loaded photos, 0 failed, 0 hung. Remaining 24 are SESH stores whose storeAssets entries weren't auto-generated. Commit 0f8a8fce on hub+mini.
v155Jun 10, 2026 · 11:31 AM
  • First attempt at fixing photo URL resolution. Patched `getStoreAssets()` to prepend `import.meta.env.BASE_URL` so paths resolve to /v155/assets/store-photos/X.jpg instead of /assets/store-photos/X.jpg (which served picker HTML, not JPEG). Also converted SESH HEIC files to JPG via `sips -s format jpeg`. SESH-slug entries (dalhousie, komoka, main, king-st) injection silently failed — superseded by v156 which added compression.
v154Jun 10, 2026 · 11:31 AM
  • LocationsPage StoreCard renders when Sophie photo available, falls back to lazy Google Maps embed. `mergeStoreData()` now reads getStoreAssets(short).photo as photo source. Looked like 26/50 cards had photos in DOM (img tag present) but they failed to load in browser due to 4MB+ size + lazy attribute. Commit 02b60adb on hub+mini.
v153Jun 10, 2026 · 11:31 AM
  • TWO fixes: (1) LocationsPage.jsx now imports StoreMapCTA from SophieHome and renders Sophie's "40+ Stores Across Ontario" Ontario-map hero as top fold. (2) Fixed #611 SPA fallback — /v153/locations was returning the 123KB picker HTML instead of SPA shell. Created 19 flat-route folders + 176 /location/:slug folders × physical SPA shells. Now /v153/locations + /v153/location/:slug return 1166B SPA correctly. Empirical Canary DOM: 5/5 Sophie strings rendered. Commit e07a6200 on hub+mini.
v152Jun 10, 2026 · 11:31 AM
  • Extended LocationProfilePage.jsx (the /location/:slug per-store route) with 3 Sophie Figma folds from Sessions Cannabis (13) export: ShopByCategory 8-icon row, StorewideDeals per-store dual card, StoreMapCTA 40+ Ontario map. Renders between live Dutchie product grid and Footer. Bundle-string verified but /v152/location/:slug returned picker (SPA fallback not yet fixed — that came in v153). Built source patch only.
v151Jun 10, 2026 · 11:31 AM
  • Made HeaderV2 truly universal. Per Ravi: "why is there no universal header why is it broken for every page". (1) ProductDetailPage.jsx dropped its 'import Header' + Header mount (was rendering the old blue v140 3-layer banner on every PDP). (2) App.jsx mounts HeaderV2 ONCE at top level when not in age_gate — automatic for every route. (3) Removed 26→3 per-route HeaderV2 wraps that were duplicate / inconsistent. (4) HomePage's inline HeaderV2 mount also removed (was duplicate). Result: identical header on /, /shop, /locations, /product/<name>, every other route. No more per-page Header wiring. Pairs with v150 canonical nav (Shop · Locations · Our Vibe · Our Programs · Rewards · Gift Cards · Blog) + physical folder SPA fallback.
v150Jun 10, 2026 · 11:31 AM
  • Five surgical patches: (1) HeaderV2 PRIMARY_NAV canonicalized to Shop · Locations · Our Vibe · Our Programs · Rewards · Gift Cards · Blog (was Shop·Deals·Learn·Locations·Rewards). (2) ShopPage drops internal old Header.jsx import + mount — kills the blue #5B7C99 'Shopping at:' banner + 'Follow Us 25% off' strip. (3) App.jsx /shop and /shop/ routes now wrap with HeaderV2 like all other routes. (4) Root _redirects rewritten with explicit /v{143,144,147,148,149,150}/* → /vN/index.html 200 SPA fallback (fixes /v150/shop returning picker HTML bug #611/#634). (5) Dynamic logo via resolveLogo(storeRecord) already worked in HeaderV2 — no store: brand fallback; store selected: store-specific logo_svg. Stacks on v149 age-gate-only flow.
v149Jun 10, 2026 · 11:31 AM
  • Reversed v148 mandatory store-gate per Ravi directive. Boot flow: age_gate (19+ Ontario) → done. No forced "Choose your store" before content view. StorePicker becomes opt-in (header CTA + AddToCart inline prompt). Patches: useEntryFlow.js (drop afterAge geo-suggestion), App.jsx (drop GeoStoreSuggestion render block), LocationProfilePage.jsx repair (pre-existing M-105 duplicate import/var). Build verified locally: 2353 modules, no errors. Centilio-hub commit 6f8b3a80.
v147Jun 10, 2026 · 11:31 AM
v144Jun 10, 2026 · 11:31 AM
v143Jun 10, 2026 · 11:31 AM