{"id":53,"date":"2026-03-25T05:59:45","date_gmt":"2026-03-25T05:59:45","guid":{"rendered":"https:\/\/bramptonsmokecannabis.com\/?page_id=53"},"modified":"2026-03-28T15:25:52","modified_gmt":"2026-03-28T15:25:52","slug":"budget","status":"publish","type":"page","link":"https:\/\/bramptonsmokecannabis.com\/?page_id=53","title":{"rendered":"BUDGET"},"content":{"rendered":"\n<div id=\"EEC-menu-root\"\n     data-endpoint=\"https:\/\/script.google.com\/macros\/s\/AKfycbzGEeNDc2M1TJ1-cCuvb3tV00DLoF-syh5fKcuXiYNSqGxMOir7OHEExLZ24FV36gdeHg\/exec\"\n     data-store=\"BSC01\"\n     data-tier=\"BUDGET\"\n     data-version=\"1\"><\/div>\n\n<style>\n  #EEC-menu-root{font-family:ui-sans-serif,system-ui,-apple-system,\"Segoe UI\",Roboto,Arial,sans-serif;color:#0f172a;width:100%;max-width:100%;overflow:visible;box-sizing:border-box}\n  #EEC-menu-root *{box-sizing:border-box}\n  .pm-wrap{width:100%;max-width:1600px;margin:0 auto;padding:16px}\n  .pm-tier-banner{width:100%;height:auto;border-radius:18px;margin-bottom:14px;display:block;box-shadow:0 10px 30px rgba(2,6,23,.06)}\n  .pm-deals{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 14px;margin-bottom:10px;border-radius:14px;background:linear-gradient(90deg,rgba(22,163,74,.08),rgba(59,130,246,.06));border:1px solid rgba(22,163,74,.15)}\n  .pm-deal-tag{font-size:13px;font-weight:900;letter-spacing:.04em;text-transform:uppercase;color:#016533}\n  .pm-deal-sep{color:#cbd5e1;font-size:12px}\n  .pm-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:10px}\n  .pm-chips{display:flex;gap:6px;flex-wrap:wrap}\n  .pm-chip{border:1px solid #e5e7eb;background:#fff;color:#0f172a;border-radius:999px;padding:6px 10px;font-size:11px;font-weight:900;letter-spacing:.06em;text-transform:uppercase;cursor:pointer;user-select:none;display:inline-flex;align-items:center;gap:5px;box-shadow:0 1px 2px rgba(2,6,23,.05);transition:all .15s ease}\n  .pm-chip:hover{border-color:#016533}\n  .pm-chip.active{border-color:#016533;background:#016533;color:#fff}\n  .pm-controls{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:8px}\n  .pm-search{flex:1;min-width:180px;display:flex;align-items:center;gap:8px;padding:9px 12px;border-radius:12px;background:#f8fafc;border:1px solid #e5e7eb;box-shadow:0 1px 2px rgba(2,6,23,.04)}\n  .pm-search input{width:100%;border:0;outline:0;background:transparent;font-size:13px}\n  .pm-sort select{padding:9px 12px;border-radius:12px;border:1px solid #e5e7eb;background:#f8fafc;font-size:13px;box-shadow:0 1px 2px rgba(2,6,23,.04)}\n  .pm-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}\n  @media(min-width:768px){.pm-grid{grid-template-columns:repeat(3,1fr);gap:16px}}\n  @media(min-width:1024px){.pm-grid{grid-template-columns:repeat(4,1fr);gap:18px}}\n  @keyframes cardFadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n  .sc-card{border:1px solid #e5e7eb;border-radius:14px;overflow:hidden;background:#fff;box-shadow:0 8px 22px rgba(2,6,23,.08);display:flex;flex-direction:column;min-height:100%;animation:cardFadeIn .3s ease both;transition:box-shadow .2s ease,transform .2s ease}\n  .sc-card:hover{box-shadow:0 12px 32px rgba(2,6,23,.12);transform:translateY(-2px)}\n  .sc-card:active{transform:scale(.98)}\n  .sc-thcbar{height:30px;display:flex;align-items:center;justify-content:center;font-weight:950;font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#fff;background:#16a34a}\n  .sc-sale{height:30px;display:flex;align-items:center;justify-content:center;font-weight:950;font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:#fff;background:linear-gradient(90deg,#ff2d2d 0%,#ff7a00 100%)}\n  .sc-sale.hidden{display:none}\n  .sc-media{position:relative;aspect-ratio:4\/3;background:#eef2f7;border-bottom:1px solid #e5e7eb}\n  .sc-media img{width:100%;height:100%;object-fit:cover;display:block}\n  .sc-media .sc-noimg{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#94a3b8;font-weight:900;letter-spacing:.08em;text-transform:uppercase;font-size:11px}\n  .sc-tierbar{background:#0b0f19;color:#fff;font-weight:950;letter-spacing:.14em;text-transform:uppercase;font-size:10px;padding:8px 12px;display:flex;align-items:center;gap:10px}\n  .sc-tierpill{background:#facc15;color:#0b0f19;border-radius:999px;padding:3px 9px;font-size:10px;font-weight:1000;letter-spacing:.14em;border:1px solid rgba(15,23,42,.18)}\n  .sc-body{padding:12px;display:flex;flex-direction:column;gap:8px;flex:1}\n  .sc-name{font-weight:800;font-size:15px;letter-spacing:.01em;text-transform:uppercase;line-height:1.25}\n  .sc-prices{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap}\n  .sc-price-sale{font-weight:950;font-size:22px;color:#dc2626;letter-spacing:-.02em}\n  .sc-price-reg{font-weight:900;font-size:14px;color:#64748b;text-decoration:line-through}\n  .sc-price-main{font-weight:950;font-size:22px;color:#0b0f19;letter-spacing:-.02em}\n  .sc-perg{font-size:12px;color:#64748b;margin-top:-2px}\n  .sc-weights{display:flex;gap:6px;flex-wrap:wrap}\n  .sc-w{border:1px solid #e5e7eb;background:#f8fafc;padding:5px 9px;border-radius:10px;font-size:12px;font-weight:800;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:all .12s ease}\n  .sc-w:hover{border-color:#016533}\n  .sc-w.active{background:#016533;border-color:#016533;color:#fff}\n  .sc-w .sc-wp{opacity:.80;font-weight:800}\n  .sc-btn{margin-top:auto;width:100%;border:0;border-radius:12px;height:44px;background:#0a6b2e;color:#fff;font-weight:900;letter-spacing:.12em;text-transform:uppercase;font-size:12px;cursor:pointer;transition:background .15s ease}\n  .sc-btn:hover{background:#085d27}\n  .sc-btn:active{transform:scale(.99)}\n  .pm-empty{padding:22px;text-align:center;border:2px dashed #e5e7eb;border-radius:18px;color:#64748b;background:#fff;font-size:14px}\n  @keyframes skeletonPulse{0%{opacity:.6}50%{opacity:1}100%{opacity:.6}}\n  .skel-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;padding:16px}\n  @media(min-width:768px){.skel-grid{grid-template-columns:repeat(3,1fr)}}\n  @media(min-width:1024px){.skel-grid{grid-template-columns:repeat(4,1fr)}}\n  .skel-card{border-radius:14px;overflow:hidden;background:#fff;border:1px solid #e5e7eb;box-shadow:0 8px 22px rgba(2,6,23,.08)}\n  .skel-bar{background:#e5e7eb;border-radius:8px;animation:skeletonPulse 1.2s ease-in-out infinite}\n  .skel-img{aspect-ratio:4\/3;background:#eef2f7;animation:skeletonPulse 1.2s ease-in-out infinite}\n  .skel-body{padding:12px;display:flex;flex-direction:column;gap:10px}\n  .pm-spinner{width:48px;height:48px;border-radius:999px;border:5px solid #dbeafe;border-top-color:#16a34a;border-right-color:#2563eb;animation:pmspin .9s linear infinite}\n  .pm-loadingtitle{font-size:16px;font-weight:950;letter-spacing:.10em;text-transform:uppercase;color:#0f172a}\n  .pm-loadingsub{font-size:12px;color:#64748b;text-align:center}\n  @keyframes pmspin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n  .pm-backdrop{position:fixed;inset:0;background:rgba(15,23,42,.55);display:none;z-index:9999}\n  .pm-backdrop.open{display:block}\n  .pm-modal{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);width:min(520px,calc(100vw - 24px));max-height:82vh;overflow:auto;background:#fff;border-radius:20px;border:1px solid #e5e7eb;box-shadow:0 30px 60px rgba(2,6,23,.30);padding:16px}\n  .pm-mhead{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}\n  .pm-mtitle{font-weight:800;font-size:20px;line-height:1.25}\n  .pm-mclose{border:0;background:#f1f5f9;width:38px;height:38px;border-radius:999px;cursor:pointer;font-size:20px;line-height:38px;text-align:center;transition:background .15s ease}\n  .pm-mclose:hover{background:#e2e8f0}\n  .pm-mimg{margin-top:10px;border-radius:16px;overflow:hidden;background:#f1f5f9;border:1px solid #e5e7eb;aspect-ratio:1\/1}\n  .pm-mimg img{width:100%;height:100%;object-fit:cover;display:block}\n  .pm-mtags{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}\n  .pm-tag{font-size:11px;font-weight:800;padding:6px 10px;border-radius:999px;background:#f8fafc;border:1px solid #e5e7eb}\n  .pm-mtable{margin-top:12px;border:1px solid #e5e7eb;border-radius:16px;overflow:hidden}\n  .pm-mtable table{width:100%;border-collapse:collapse}\n  .pm-mtable th,.pm-mtable td{padding:10px 14px;font-size:14px;border-bottom:1px solid #e5e7eb}\n  .pm-mtable th{background:#f8fafc;text-transform:uppercase;letter-spacing:.10em;font-size:11px;text-align:left;color:#475569}\n  .pm-mtable td:last-child{text-align:right;font-weight:900}\n  .pm-note{margin-top:10px;font-size:12px;color:#64748b}\n<\/style>\n\n<script>\n(() => {\n  function _and(a,b){ return a ? b : false; }\n\n  const root = document.getElementById('EEC-menu-root');\n  if (!root) return;\n\n  const ENDPOINT = (root.dataset.endpoint || '').trim();\n  const STORE    = (root.dataset.store    || 'MJ01').trim().toUpperCase();\n  const TIER     = (root.dataset.tier     || 'PREMIUM').trim().toUpperCase();\n  const VER      = root.dataset.version   || 1;\n\n  const CACHE_KEY = 'pm_cache_' + STORE + '_' + TIER + '_v' + VER;\n  const CACHE_TTL = 3 * 60 * 1000;\n\n  function getCached(){\n    try{\n      const raw = localStorage.getItem(CACHE_KEY);\n      if (!raw) return null;\n      const obj = JSON.parse(raw);\n      if (!obj.ts || !obj.d) return null;\n      if (Date.now() - obj.ts > CACHE_TTL) return null;\n      return obj.d;\n    } catch(e){ return null; }\n  }\n\n  function setCache(data){\n    try{\n      for (let i = 0; i < localStorage.length; i++){\n        const k = localStorage.key(i);\n        if (k){\n          if (k.startsWith('pm_cache_')){\n            if (k !== CACHE_KEY) localStorage.removeItem(k);\n          }\n          if (k.startsWith('prime_menu_cache_')) localStorage.removeItem(k);\n        }\n      }\n      localStorage.setItem(CACHE_KEY, JSON.stringify({ ts:Date.now(), d:data }));\n    } catch(e){}\n  }\n\n  const S = {\n    q:'', sort:'featured',\n    onlyTop:false, onlyMust:false, onlyHighThc:false,\n    products:[], topPick:new Set(), mustTry:new Set(),\n    banners:{}\n  };\n\n  function showSkeleton(){\n    const cards = Array.from({length:6}, () => `<div class=\"skel-card\">\n      <div class=\"skel-img\"><\/div>\n      <div class=\"skel-body\">\n        <div class=\"skel-bar\" style=\"width:70%;height:16px\"><\/div>\n        <div class=\"skel-bar\" style=\"width:50%;height:22px\"><\/div>\n        <div class=\"skel-bar\" style=\"width:40%;height:12px\"><\/div>\n        <div style=\"display:flex;gap:6px\">\n          <div class=\"skel-bar\" style=\"width:50px;height:28px;border-radius:10px\"><\/div>\n          <div class=\"skel-bar\" style=\"width:55px;height:28px;border-radius:10px\"><\/div>\n        <\/div>\n        <div class=\"skel-bar\" style=\"width:100%;height:40px;border-radius:12px;margin-top:8px\"><\/div>\n      <\/div>\n    <\/div>`).join('');\n    root.innerHTML = `<div class=\"pm-wrap\">\n      <div style=\"display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px 0 8px\">\n        <div class=\"pm-spinner\"><\/div>\n        <div class=\"pm-loadingtitle\">LIVE MENU Loading<\/div>\n        <div class=\"pm-loadingsub\">Fetching the latest products and prices...<\/div>\n      <\/div>\n      <div class=\"skel-grid\">${cards}<\/div>\n    <\/div>`;\n  }\n\n  function esc(s){ return String(s ?? '').replace(\/[<>\"]\/g,m=>({'<':'&#60;','>':'&#62;','\"':'&#34;'}[m])); }\n  function num(v){ const n=parseFloat(String(v??'').replace(\/[^\\d.]\/g,'')); return isNaN(n)?0:n; }\n  function thcFmt(v){ const s=String(v??'').trim(); if(!s) return ''; return s.includes('%')?s:(s+'%'); }\n\n  function parsePrice(pr){\n    const reg2=num(pr ? pr.regPrice : 0), sale2=num(pr ? pr.salePrice : 0);\n    if (_and(_and(reg2, sale2), reg2>sale2)) return {reg:reg2,sale:sale2,effective:sale2,isSale:true};\n    const raw=String((pr ? pr.price : '') ?? '').trim();\n    if(!raw) return {reg:0,sale:0,effective:0,isSale:false};\n    if(raw.includes('|')){\n      const p=raw.split('|').map(x=>x.trim()), r=num(p[0]), s=num(p[1]);\n      if(_and(_and(r,s), r>s)) return {reg:r,sale:s,effective:s,isSale:true};\n    }\n    const d=raw.replace(\/[^\\d]\/g,'');\n    if(d.length===4){ const r=num(d.slice(0,2)),s=num(d.slice(2,4)); if(_and(_and(r,s),r>s)) return {reg:r,sale:s,effective:s,isSale:true}; }\n    if(d.length===5){ const r=num(d.slice(0,3)),s=num(d.slice(3,5)); if(_and(_and(r,s),r>s)) return {reg:r,sale:s,effective:s,isSale:true}; }\n    if(d.length===6){ const r=num(d.slice(0,3)),s=num(d.slice(3,6)); if(_and(_and(r,s),r>s)) return {reg:r,sale:s,effective:s,isSale:true}; }\n    const p=num(raw); if(p) return {reg:0,sale:0,effective:p,isSale:false};\n    return {reg:0,sale:0,effective:0,isSale:false};\n  }\n\n  function pickBestPrice(p){\n    if(!p || !Array.isArray(p.prices) || !p.prices.length) return null;\n    let best=p.prices[0], bestV=parsePrice(best).effective||999999;\n    for(const pr of p.prices){ const v=parsePrice(pr).effective||999999; if(v<bestV){best=pr;bestV=v;} }\n    return best;\n  }\n\n  function perGram(eff,sizeLabel){\n    const g=num(sizeLabel), pr=num(eff);\n    if(!g||!pr) return '';\n    return (pr\/g).toFixed(2);\n  }\n\n  function sortList(list){\n    const out=list.slice();\n    out.sort((a,b)=>{\n      const aS=parsePrice(pickBestPrice(a)).isSale?1:0, bS=parsePrice(pickBestPrice(b)).isSale?1:0;\n      return bS-aS;\n    });\n    if(S.sort==='thc-desc') out.sort((a,b)=>{ const aS=parsePrice(pickBestPrice(a)).isSale?1:0,bS=parsePrice(pickBestPrice(b)).isSale?1:0; if(aS!==bS) return bS-aS; return num(b.thc)-num(a.thc); });\n    else if(S.sort==='price-asc') out.sort((a,b)=>{ const aS=parsePrice(pickBestPrice(a)).isSale?1:0,bS=parsePrice(pickBestPrice(b)).isSale?1:0; if(aS!==bS) return bS-aS; return num(parsePrice(pickBestPrice(a)).effective)-num(parsePrice(pickBestPrice(b)).effective); });\n    else if(S.sort==='price-desc') out.sort((a,b)=>{ const aS=parsePrice(pickBestPrice(a)).isSale?1:0,bS=parsePrice(pickBestPrice(b)).isSale?1:0; if(aS!==bS) return bS-aS; return num(parsePrice(pickBestPrice(b)).effective)-num(parsePrice(pickBestPrice(a)).effective); });\n    else if(S.sort==='name-asc') out.sort((a,b)=>{ const aS=parsePrice(pickBestPrice(a)).isSale?1:0,bS=parsePrice(pickBestPrice(b)).isSale?1:0; if(aS!==bS) return bS-aS; return String(a.name||'').localeCompare(String(b.name||'')); });\n    return out;\n  }\n\n  function applyFilters(){\n    const term=S.q.trim().toLowerCase();\n    let out=S.products\n      .filter(p=>String(p.kind||'')==='flower')\n      .filter(p=>String(p.tier||p.tierGroup||'').trim().toUpperCase()===TIER);\n    if(S.onlyTop) out=out.filter(p=>S.topPick.has(String(p.sku||'').trim()));\n    if(S.onlyMust) out=out.filter(p=>S.mustTry.has(String(p.sku||'').trim()));\n    if(S.onlyHighThc) out=out.filter(p=>num(p.thc)>=30);\n    if(term) out=out.filter(p=>[p.name,p.strain,p.sku,p.type,p.thc].join(' ').toLowerCase().includes(term));\n    return sortList(out);\n  }\n\n  function injectStructuredData(list){\n    const existing = document.getElementById('pm-jsonld');\n    if(existing) existing.remove();\n    if(!list.length) return;\n    const items = list.slice(0,50).map(p => {\n      const best = pickBestPrice(p);\n      const bp = best ? parsePrice(best) : {effective:0};\n      return {\n        \"@type\": \"Product\",\n        \"name\": p.name || p.strain || p.sku || '',\n        \"sku\": p.sku || '',\n        \"image\": p.imageUrl || '',\n        \"category\": TIER + ' Cannabis Flower',\n        \"offers\": {\n          \"@type\": \"Offer\",\n          \"price\": bp.effective || 0,\n          \"priceCurrency\": \"CAD\",\n          \"availability\": \"https:\/\/schema.org\/InStock\",\n          \"itemCondition\": \"https:\/\/schema.org\/NewCondition\"\n        }\n      };\n    });\n    const script = document.createElement('script');\n    script.type = 'application\/ld+json';\n    script.id = 'pm-jsonld';\n    script.textContent = JSON.stringify({\n      \"@context\": \"https:\/\/schema.org\",\n      \"@type\": \"OfferCatalog\",\n      \"name\": TIER + \" Cannabis Flowers\",\n      \"itemListElement\": items\n    });\n    document.head.appendChild(script);\n  }\n\n  function render(){\n    const list = applyFilters();\n    const bannerUrl = S.banners[TIER] || null;\n    const bannerHtml = bannerUrl ? `<img decoding=\"async\" src=\"${esc(bannerUrl)}\" class=\"pm-tier-banner\" alt=\"${esc(TIER)} Flower Collection Banner\" loading=\"lazy\">` : '';\n    injectStructuredData(list);\n\n    const dealMap = {\n      'AA':     ['$20\/5g Special'],\n      'BUDGET': ['$10\/3g Special','$40\/oz Shreds']\n    };\n    const deals = dealMap[TIER] || [];\n    const dealsHtml = deals.length ? `<div class=\"pm-deals\">${deals.map((d,i)=> (i?'<span class=\"pm-deal-sep\">&#8226;<\/span>':'')+`<span class=\"pm-deal-tag\">${esc(d)}<\/span>`).join('')}<\/div>` : '';\n\n    root.innerHTML = `<div class=\"pm-wrap\">\n      ${bannerHtml}\n      ${dealsHtml}\n      <div class=\"pm-toolbar\">\n        <nav class=\"pm-chips\" aria-label=\"Quick filters\">\n          <button class=\"pm-chip ${S.onlyTop?'active':''}\" data-chip=\"top\" aria-pressed=\"${S.onlyTop}\">TOP PICKS &#x2705;<\/button>\n          <button class=\"pm-chip ${S.onlyMust?'active':''}\" data-chip=\"must\" aria-pressed=\"${S.onlyMust}\">MUST TRY &#x2b50;<\/button>\n          <button class=\"pm-chip ${S.onlyHighThc?'active':''}\" data-chip=\"thc\" aria-pressed=\"${S.onlyHighThc}\">30%+ THC &#x1f525;<\/button>\n        <\/nav>\n      <\/div>\n      <div class=\"pm-controls\">\n        <div class=\"pm-search\"><span>&#x1f50d;<\/span><input id=\"pm-q\" type=\"search\" placeholder=\"Search strain \/ SKU \/ type...\" value=\"${esc(S.q)}\" aria-label=\"Search products\"><\/div>\n        <select id=\"pm-sort-sel\">\n          <option value=\"featured\" ${S.sort==='featured'?'selected':''}>Featured<\/option>\n          <option value=\"thc-desc\" ${S.sort==='thc-desc'?'selected':''}>THC High to Low<\/option>\n          <option value=\"price-asc\" ${S.sort==='price-asc'?'selected':''}>Price Low to High<\/option>\n          <option value=\"price-desc\" ${S.sort==='price-desc'?'selected':''}>Price High to Low<\/option>\n          <option value=\"name-asc\" ${S.sort==='name-asc'?'selected':''}>Name A to Z<\/option>\n        <\/select>\n      <\/div>\n      <div class=\"pm-count\" style=\"font-size:11px;color:#64748b;margin-bottom:6px\">${list.length} product${list.length!==1?'s':''} found<\/div>\n      ${list.length?`<div class=\"pm-grid\" role=\"list\">${list.map((p,i)=>cardHTML(p,i)).join('')}<\/div>`:`<div class=\"pm-empty\">No items found. Try clearing your filters.<\/div>`}\n    <\/div>\n    <div class=\"pm-backdrop\" id=\"pm-backdrop\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Product details\">\n      <div class=\"pm-modal\">\n        <div class=\"pm-mhead\">\n          <div><div class=\"pm-mtitle\" id=\"pm-mtitle\"><\/div><div class=\"pm-mtags\" id=\"pm-mtags\"><\/div><\/div>\n          <button class=\"pm-mclose\" id=\"pm-mclose\" aria-label=\"Close\">&#215;<\/button>\n        <\/div>\n        <div class=\"pm-mimg\" id=\"pm-mimg\" style=\"display:none\"><img id=\"pm-mimg-el\" alt=\"Product image\" loading=\"lazy\"><\/div>\n        <div class=\"pm-mtable\" id=\"pm-mtable\" style=\"display:none\"><\/div>\n        <p class=\"pm-note\">Prices shown for reference. Final pricing may vary in-store.<\/p>\n      <\/div>\n    <\/div>`;\n    wireUI();\n  }\n\n  function cardHTML(p, idx){\n    const sku=String(p.sku||'').trim();\n    const best=pickBestPrice(p);\n    const bp=best?parsePrice(best):{effective:0,isSale:false,reg:0,sale:0};\n    const isSale=!!bp.isSale;\n    const thc=thcFmt(p.thc);\n    const img=p.imageUrl?`<img decoding=\"async\" src=\"${esc(p.imageUrl)}\" alt=\"${esc(p.name||sku)} cannabis flower\" loading=\"lazy\">`:`<div class=\"sc-noimg\">NO IMAGE<\/div>`;\n    const name=(p.name||p.strain||sku||'').toString();\n    const saleHtml=isSale\n      ?`<div class=\"sc-prices\"><span class=\"sc-price-reg\">$${bp.reg.toFixed(0)}<\/span><span class=\"sc-price-sale\">$${bp.sale.toFixed(0)}<\/span><\/div>`\n      :`<div class=\"sc-prices\"><span class=\"sc-price-main\">$${num(bp.effective)?num(bp.effective).toFixed(0):'-'}<\/span><\/div>`;\n    const pg = _and(best, best ? best.sizeLabel : '') ? perGram(bp.effective, best.sizeLabel) : '';\n    const perGHtml=pg?`From $${esc(pg)} per gram`:'';\n    const weights=Array.isArray(p.prices)?p.prices.slice(0,4):[];\n    const wHTML=weights.map((pr,i)=>{\n      const s=String(pr.sizeLabel||'').trim(), pp=parsePrice(pr);\n      const show='$'+(pp.isSale?pp.sale.toFixed(0):num(pp.effective).toFixed(0));\n      return `<button class=\"sc-w ${i===0?'active':''}\" data-sku=\"${esc(sku)}\" data-size=\"${esc(s)}\" data-reg=\"${esc(pp.reg)}\" data-sale=\"${esc(pp.sale)}\" data-eff=\"${esc(pp.effective)}\" data-issale=\"${pp.isSale?'1':'0'}\" aria-label=\"${esc(s)} for ${esc(show)}\"><span>${esc(s)}<\/span><span class=\"sc-wp\">${esc(show)}<\/span><\/button>`;\n    }).join('');\n\n    const delay = Math.min(idx * 40, 400);\n\n    return `<article class=\"sc-card\" data-sku=\"${esc(sku)}\" role=\"listitem\" style=\"animation-delay:${delay}ms\"\n      itemscope itemtype=\"https:\/\/schema.org\/Product\">\n      <meta itemprop=\"name\" content=\"${esc(name)}\">\n      <meta itemprop=\"sku\" content=\"${esc(sku)}\">\n      <div class=\"sc-thcbar\">${esc(thc||'THC')}<\/div>\n      <div class=\"sc-sale ${isSale?'':'hidden'}\">SALE<\/div>\n      <div class=\"sc-media\">${img}<\/div>\n      <div class=\"sc-tierbar\"><span class=\"sc-tierpill\">${esc(TIER)}<\/span><\/div>\n      <div class=\"sc-body\">\n        <div class=\"sc-name\" itemprop=\"name\">${esc(name)}<\/div>\n        ${saleHtml}\n        <div class=\"sc-perg\" id=\"sc-perg-${esc(sku)}\">${esc(perGHtml)}<\/div>\n        ${weights.length?`<div class=\"sc-weights\" role=\"group\" aria-label=\"Size options\">${wHTML}<\/div>`:''}\n        <button class=\"sc-btn\" data-action=\"options\" data-sku=\"${esc(sku)}\" aria-label=\"View options for ${esc(name)}\">VIEW OPTIONS<\/button>\n      <\/div>\n    <\/article>`;\n  }\n\n  function wireUI(){\n    root.querySelectorAll('.pm-chip[data-chip]').forEach(ch=>{\n      ch.addEventListener('click',()=>{\n        const k=ch.dataset.chip;\n        if(k==='top') S.onlyTop=!S.onlyTop;\n        if(k==='must') S.onlyMust=!S.onlyMust;\n        if(k==='thc') S.onlyHighThc=!S.onlyHighThc;\n        render();\n      });\n    });\n    const q=root.querySelector('#pm-q'), s=root.querySelector('#pm-sort-sel');\n    if(q) q.addEventListener('input',()=>{ S.q=q.value||''; render(); });\n    if(s) s.addEventListener('change',()=>{ S.sort=s.value||'featured'; render(); });\n\n    root.querySelectorAll('.sc-w').forEach(btn=>{\n      btn.addEventListener('click',e=>{\n        e.stopPropagation();\n        const wrap=btn.parentElement;\n        if(wrap) wrap.querySelectorAll('.sc-w').forEach(b=>b.classList.remove('active'));\n        btn.classList.add('active');\n        const card=btn.closest('.sc-card'); if(!card) return;\n        const sku=card.dataset.sku||'', size=btn.dataset.size||'';\n        const eff=num(btn.dataset.eff), isSale=btn.dataset.issale==='1';\n        const reg=num(btn.dataset.reg), sale=num(btn.dataset.sale);\n        const pergEl=root.querySelector('#sc-perg-'+CSS.escape(sku));\n        const pg = _and(eff, size) ? (eff\/num(size)).toFixed(2) : '';\n        if(pergEl) pergEl.textContent=pg?('From $'+pg+' per gram'):'';\n        const prices=card.querySelector('.sc-prices'); if(!prices) return;\n        const saleBar=card.querySelector('.sc-sale');\n        if(_and(_and(isSale,reg),sale)){\n          prices.innerHTML=`<span class=\"sc-price-reg\">$${reg.toFixed(0)}<\/span><span class=\"sc-price-sale\">$${sale.toFixed(0)}<\/span>`;\n          if(saleBar) saleBar.classList.remove('hidden');\n        } else {\n          prices.innerHTML=`<span class=\"sc-price-main\">$${eff?eff.toFixed(0):'-'}<\/span>`;\n          if(saleBar) saleBar.classList.add('hidden');\n        }\n      });\n    });\n\n    root.querySelectorAll('[data-action=\"options\"]').forEach(btn=>{\n      btn.addEventListener('click',e=>{ e.stopPropagation(); const p=S.products.find(x=>String(x.sku||'').trim()===btn.dataset.sku); if(p) openModal(p); });\n    });\n    root.querySelectorAll('.sc-card').forEach(card=>{\n      card.addEventListener('click',()=>{ const p=S.products.find(x=>String(x.sku||'').trim()===card.dataset.sku); if(p) openModal(p); });\n    });\n    const bd=root.querySelector('#pm-backdrop'), close=root.querySelector('#pm-mclose');\n    if(close) close.addEventListener('click',closeModal);\n    if(bd) bd.addEventListener('click',e=>{ if(e.target===bd) closeModal(); });\n  }\n\n  document.addEventListener('keydown',e=>{ if(e.key==='Escape') closeModal(); });\n\n  function openModal(p){\n    const bd=root.querySelector('#pm-backdrop'), t=root.querySelector('#pm-mtitle');\n    const tags=root.querySelector('#pm-mtags'), imgWrap=root.querySelector('#pm-mimg');\n    const imgEl=root.querySelector('#pm-mimg-el'), table=root.querySelector('#pm-mtable');\n    if(t) t.textContent=(p.name||p.strain||p.sku||'');\n    if(tags){\n      const chips=[TIER]; if(p.type) chips.push(p.type);\n      if(p.thc) chips.push('THC '+thcFmt(p.thc));\n      tags.innerHTML=chips.map(x=>`<span class=\"pm-tag\">${esc(x)}<\/span>`).join('');\n    }\n    if(p.imageUrl){ imgWrap.style.display=''; imgEl.src=p.imageUrl; imgEl.alt=(p.name||p.sku)+' cannabis flower'; }\n    else { imgWrap.style.display='none'; imgEl.removeAttribute('src'); }\n    if(_and(Array.isArray(p.prices), p.prices.length)){\n      const rows=p.prices.map(pr=>{\n        const pp=parsePrice(pr);\n        const txt=pp.isSale?`$${pp.sale.toFixed(0)} (was $${pp.reg.toFixed(0)})`:`$${num(pp.effective)?num(pp.effective).toFixed(0):'-'}`;\n        return `<tr><td>${esc(pr.sizeLabel||'')}<\/td><td>${esc(txt)}<\/td><\/tr>`;\n      }).join('');\n      table.style.display=''; table.innerHTML=`<table><thead><tr><th>Size<\/th><th>Price<\/th><\/tr><\/thead><tbody>${rows}<\/tbody><\/table>`;\n    } else { table.style.display='none'; table.innerHTML=''; }\n    if(bd) bd.classList.add('open');\n    document.body.style.overflow='hidden';\n  }\n\n  function closeModal(){\n    const bd=root.querySelector('#pm-backdrop');\n    if(bd) bd.classList.remove('open');\n    document.body.style.overflow='';\n  }\n\n  async function load(){\n    const cached = getCached();\n\n    if(cached){\n      S.topPick = new Set((cached.topPickSkus||[]).map(String));\n      S.mustTry = new Set((cached.mustTrySkus||[]).map(String));\n      S.products = cached.flowers || [];\n      S.banners = cached.banners || {};\n      render();\n    } else {\n      showSkeleton();\n    }\n\n    try{\n      const url = ENDPOINT + '?view=webjson' + String.fromCharCode(38) + 'store=' + encodeURIComponent(STORE);\n      const res = await fetch(url, {method:'GET'});\n      if (!res.ok) throw new Error('HTTP ' + res.status);\n      const data = await res.json();\n      setCache(data);\n      S.topPick = new Set((data.topPickSkus||[]).map(String));\n      S.mustTry = new Set((data.mustTrySkus||[]).map(String));\n      S.products = data.flowers || [];\n      S.banners = data.banners || {};\n      render();\n    } catch(err){\n      if (!cached){\n        root.innerHTML = `<div class=\"pm-wrap\"><div class=\"pm-empty\">Unable to load menu. Please refresh the page.<\/div><\/div>`;\n      }\n    }\n  }\n\n  load();\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-53","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=\/wp\/v2\/pages\/53","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=53"}],"version-history":[{"count":2,"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=\/wp\/v2\/pages\/53\/revisions"}],"predecessor-version":[{"id":106,"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=\/wp\/v2\/pages\/53\/revisions\/106"}],"wp:attachment":[{"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=53"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}