{"id":54,"date":"2026-03-25T06:00:19","date_gmt":"2026-03-25T06:00:19","guid":{"rendered":"https:\/\/bramptonsmokecannabis.com\/?page_id=54"},"modified":"2026-03-25T06:00:19","modified_gmt":"2026-03-25T06:00:19","slug":"edibles","status":"publish","type":"page","link":"https:\/\/bramptonsmokecannabis.com\/?page_id=54","title":{"rendered":"EDIBLES+"},"content":{"rendered":"\n<div id=\"EEC-ITEMS-menu\"\n     data-endpoint=\"https:\/\/script.google.com\/macros\/s\/AKfycbwbxgGlDAYxmxbSOlZQtuOnwnw_pOuea-A3BEKuRnzu3ya_fTK2lzZC-nHjzbqulaor4A\/exec\"\n     data-store=\"BSC01\"\n     data-version=\"2\"><\/div>\n\n<style>\n#EEC-ITEMS-menu{\n  font-family:ui-sans-serif,system-ui,-apple-system,\"Segoe UI\",Roboto,Arial;\n  padding:20px;max-width:1400px;margin:auto;box-sizing:border-box;\n}\n#EEC-ITEMS-menu *{box-sizing:border-box}\n\n.eec-title{font-size:24px;font-weight:950;letter-spacing:.06em;text-transform:uppercase;margin-bottom:18px}\n\n.eec-filters{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 18px 0}\n.eec-filter{\n  border:1px solid #e5e7eb;background:#fff;color:#111827;border-radius:999px;\n  padding:9px 14px;font-size:12px;font-weight:900;letter-spacing:.08em;text-transform:uppercase;\n  cursor:pointer;box-shadow:0 1px 2px rgba(2,6,23,.06);transition:all .15s ease;\n}\n.eec-filter:hover{border-color:#111827}\n.eec-filter.active{background:#111827;color:#fff;border-color:#111827}\n\n.eec-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}\n@media(min-width:640px){.eec-grid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:18px}}\n\n.eec-count{font-size:12px;color:#64748b;margin-bottom:8px}\n\n@keyframes eecFadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n.eec-card{\n  background:#111827;border-radius:16px;overflow:hidden;\n  box-shadow:0 16px 36px rgba(0,0,0,.30);color:#fff;\n  display:flex;flex-direction:column;\n  transition:transform .2s ease,box-shadow .2s ease;\n  animation:eecFadeIn .3s ease both;\n}\n.eec-card:hover{transform:translateY(-3px);box-shadow:0 20px 40px rgba(0,0,0,.40)}\n.eec-card:active{transform:scale(.98)}\n\n.eec-img{aspect-ratio:4\/3;background:#1f2937;overflow:hidden}\n.eec-img img{width:100%;height:100%;object-fit:cover;display:block}\n\n.eec-body{padding:14px;display:flex;flex-direction:column;gap:8px;flex:1}\n.eec-name{font-weight:800;font-size:15px;letter-spacing:.04em;text-transform:uppercase;line-height:1.25}\n.eec-price{font-size:20px;font-weight:950;color:#34d399;letter-spacing:-.02em}\n\n.eec-pill{\n  display:inline-block;align-self:flex-start;padding:5px 10px;border-radius:999px;\n  font-size:10px;font-weight:900;letter-spacing:.12em;text-transform:uppercase;margin-bottom:2px;\n}\n.pill-vapes{background:#3b82f6}\n.pill-prerolls{background:#f59e0b;color:#78350f}\n.pill-edibles{background:#ec4899}\n.pill-concentrates{background:#8b5cf6}\n.pill-accessories{background:#10b981}\n.pill-other{background:#6b7280}\n\n.eec-btn{\n  margin-top:auto;width:100%;height:42px;border-radius:12px;border:0;\n  font-weight:900;letter-spacing:.14em;text-transform:uppercase;font-size:11px;\n  background:#16a34a;color:#fff;cursor:pointer;transition:background .15s ease;\n}\n.eec-btn:hover{background:#15803d}\n.eec-btn:active{transform:scale(.98)}\n\n.eec-empty{\n  padding:28px;text-align:center;border:2px dashed #d1d5db;border-radius:18px;\n  background:#fff;color:#6b7280;font-weight:700;font-size:14px;\n}\n\n.eec-spinner{\n  width:48px;height:48px;border-radius:999px;\n  border:5px solid #dbeafe;border-top-color:#16a34a;border-right-color:#2563eb;\n  animation:eecspin .9s linear infinite;\n}\n.eec-loadingtitle{font-size:16px;font-weight:950;letter-spacing:.10em;text-transform:uppercase;color:#0f172a}\n.eec-loadingsub{font-size:12px;color:#64748b;text-align:center}\n@keyframes eecspin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n<\/style>\n\n<script>\n(() => {\n  function _and(a,b){ return a ? b : false; }\n\n  const root = document.getElementById('EEC-ITEMS-menu');\n  if (!root) return;\n\n  const ENDPOINT = (root.dataset.endpoint || '').trim();\n  const STORE    = (root.dataset.store    || 'MJ01').trim().toUpperCase();\n  const VER      = root.dataset.version   || 1;\n\n  const CACHE_KEY = 'ei_cache_' + STORE + '_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  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('ei_cache_')){\n            if (k !== CACHE_KEY) localStorage.removeItem(k);\n          }\n        }\n      }\n      localStorage.setItem(CACHE_KEY, JSON.stringify({ ts:Date.now(), d:data }));\n    } catch(e){}\n  }\n\n  const state = { items: [], activeCategory: 'vapes' };\n\n  function esc(s){\n    return String(s ?? '').replace(\/[<>\"]\/g,m=>({'<':'&#60;','>':'&#62;','\"':'&#34;'}[m]));\n  }\n\n  function num(v){\n    const n = parseFloat(String(v ?? '').replace(\/[^\\d.]\/g,''));\n    return isNaN(n) ? 0 : n;\n  }\n\n  function showLoading(){\n    root.innerHTML = `\n      <div style=\"display:flex;flex-direction:column;align-items:center;gap:10px;padding:40px 0\">\n        <div class=\"eec-spinner\"><\/div>\n        <div class=\"eec-loadingtitle\">LIVE MENU Loading<\/div>\n        <div class=\"eec-loadingsub\">Fetching the latest products and prices...<\/div>\n      <\/div>\n    `;\n  }\n\n  function normalizeCategory(value){\n    const slug = String(value || '').toLowerCase().trim();\n\n    if (slug.includes('vape disposable')) return 'vapes';\n    if (slug.includes('vape pens')) return 'vapes';\n    if (slug.includes('vape')) return 'vapes';\n    if (slug.includes('cart')) return 'vapes';\n\n    if (\n      slug === 'add ons' ||\n      slug === 'add on' ||\n      slug === 'add-ons' ||\n      slug === 'add-on' ||\n      slug.includes('add ons') ||\n      slug.includes('add on') ||\n      slug.includes('add-ons') ||\n      slug.includes('add-on') ||\n      slug.includes('addon') ||\n      slug.includes('preroll') ||\n      slug.includes('pre-roll') ||\n      slug.includes('pre roll') ||\n      slug.includes('magic') ||\n      slug.includes('other')\n    ) return 'prerolls_magic';\n\n    if (slug.includes('edible') || slug.includes('gummy') || slug.includes('drink')) return 'edibles';\n\n    if (\n      slug.includes('concentrate') ||\n      slug.includes('hash') ||\n      slug.includes('shatter') ||\n      slug.includes('wax') ||\n      slug.includes('resin') ||\n      slug.includes('rosin')\n    ) return 'concentrates';\n\n    if (slug.includes('access') || slug.includes('battery') || slug.includes('grinder') || slug.includes('paper')) return 'accessories';\n\n    return 'prerolls_magic';\n  }\n\n  function categoryLabel(key){\n    if (key === 'vapes') return 'VAPES';\n    if (key === 'prerolls_magic') return 'PREROLLS';\n    if (key === 'edibles') return 'EDIBLES';\n    if (key === 'concentrates') return 'CONCENTRATES';\n    if (key === 'accessories') return 'ACCESSORIES';\n    return 'PREROLLS';\n  }\n\n  function getPillClass(key){\n    if (key === 'vapes') return 'pill-vapes';\n    if (key === 'prerolls_magic') return 'pill-prerolls';\n    if (key === 'edibles') return 'pill-edibles';\n    if (key === 'concentrates') return 'pill-concentrates';\n    if (key === 'accessories') return 'pill-accessories';\n    return 'pill-prerolls';\n  }\n\n  function getPrice(p){\n    if (p.price){\n      if (typeof p.price === 'object'){\n        if (p.price.label) return p.price.label;\n        if (p.price.price) return '$' + num(p.price.price).toFixed(0);\n      } else {\n        const raw = String(p.price);\n        return raw.startsWith('$') ? raw : '$' + raw;\n      }\n    }\n    if (_and(p.lowestPrice, p.lowestPrice ? p.lowestPrice.price : null)){\n      return '$' + num(p.lowestPrice.price).toFixed(0);\n    }\n    return '';\n  }\n\n  function getSortPrice(p){\n    if (p.price){\n      if (typeof p.price === 'object'){\n        if (p.price.price) return num(p.price.price);\n        if (p.price.label) return num(p.price.label);\n      } else {\n        return num(p.price);\n      }\n    }\n    if (_and(p.lowestPrice, p.lowestPrice ? p.lowestPrice.price : null)){\n      return num(p.lowestPrice.price);\n    }\n    return 999999;\n  }\n\n  function getFilteredItems(){\n    let items = state.items.filter(p => p._menuCategory === state.activeCategory);\n    return items.slice().sort((a,b) => {\n      const pa = getSortPrice(a);\n      const pb = getSortPrice(b);\n      if (pa !== pb) return pa - pb;\n      return String(a.name || a.strain || a.sku || '').localeCompare(String(b.name || b.strain || b.sku || ''));\n    });\n  }\n\n  function getAvailableCategories(items){\n    const order = ['vapes','prerolls_magic','edibles','concentrates','accessories'];\n    const found = new Set();\n    items.forEach(p => found.add(p._menuCategory));\n    return order.filter(x => found.has(x));\n  }\n\n  function render(){\n    const categories = getAvailableCategories(state.items);\n\n    if (!categories.includes(state.activeCategory)){\n      state.activeCategory = categories[0] || 'prerolls_magic';\n    }\n\n    const items = getFilteredItems();\n\n    root.innerHTML = `\n      <div class=\"eec-title\">PRODUCTS MENU<\/div>\n\n      <nav class=\"eec-filters\" aria-label=\"Category filters\">\n        ${categories.map(cat => `\n          <button class=\"eec-filter ${state.activeCategory === cat ? 'active' : ''}\" data-cat=\"${esc(cat)}\" aria-pressed=\"${state.activeCategory === cat}\">\n            ${esc(categoryLabel(cat))}\n          <\/button>\n        `).join('')}\n      <\/nav>\n\n      <div class=\"eec-count\">${items.length} product${items.length!==1?'s':''} found<\/div>\n\n      ${\n        items.length\n          ? `<div class=\"eec-grid\" role=\"list\">\n              ${items.map((p, idx) => {\n                const price = getPrice(p);\n                const pillKey = p._menuCategory;\n                const pillClass = getPillClass(pillKey);\n                const pillText = categoryLabel(pillKey);\n                const isEdible = pillKey === 'edibles';\n                const delay = Math.min(idx * 40, 400);\n                const name = p.name || p.strain || p.sku || '';\n\n                return `\n                  <article class=\"eec-card\" role=\"listitem\" style=\"animation-delay:${delay}ms\"\n                    itemscope itemtype=\"https:\/\/schema.org\/Product\">\n                    <meta itemprop=\"name\" content=\"${esc(name)}\">\n                    <div class=\"eec-img\">\n                      ${p.imageUrl ? `<img decoding=\"async\" src=\"${esc(p.imageUrl)}\" alt=\"${esc(name)}\" loading=\"lazy\">` : ``}\n                    <\/div>\n                    <div class=\"eec-body\">\n                      <span class=\"eec-pill ${pillClass}\">${esc(pillText)}<\/span>\n                      <div class=\"eec-name\">${esc(name)}<\/div>\n                      <div class=\"eec-price\">${esc(price || '-')}<\/div>\n                      ${!isEdible ? `<button class=\"eec-btn\">VIEW OPTIONS<\/button>` : ``}\n                    <\/div>\n                  <\/article>\n                `;\n              }).join('')}\n            <\/div>`\n          : `<div class=\"eec-empty\">No items found in this category.<\/div>`\n      }\n    `;\n\n    wireUI();\n  }\n\n  function wireUI(){\n    root.querySelectorAll('.eec-filter').forEach(btn => {\n      btn.addEventListener('click', () => {\n        state.activeCategory = btn.dataset.cat || 'prerolls_magic';\n        render();\n      });\n    });\n  }\n\n  async function load(){\n    const cached = getCached();\n\n    if (cached){\n      const items = (cached.items || [])\n        .filter(p => String(p.kind || '').toLowerCase() !== 'flower')\n        .map(p => ({\n          ...p,\n          _menuCategory: normalizeCategory(p.categorySlug || p.category)\n        }));\n      state.items = items;\n      render();\n    } else {\n      showLoading();\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\n      const items = (data.items || [])\n        .filter(p => String(p.kind || '').toLowerCase() !== 'flower')\n        .map(p => ({\n          ...p,\n          _menuCategory: normalizeCategory(p.categorySlug || p.category)\n        }));\n\n      state.items = items;\n      render();\n    } catch(e){\n      if (!cached){\n        root.innerHTML = `<div class=\"eec-empty\">Unable to load menu. Please refresh the page.<\/div>`;\n      }\n    }\n  }\n\n  load();\n})();\n<\/script>\n\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-54","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=\/wp\/v2\/pages\/54","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=54"}],"version-history":[{"count":1,"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=\/wp\/v2\/pages\/54\/revisions"}],"predecessor-version":[{"id":61,"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=\/wp\/v2\/pages\/54\/revisions\/61"}],"wp:attachment":[{"href":"https:\/\/bramptonsmokecannabis.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=54"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}