or just rely on the H1 fallback if the H1 is the strain name.
Providers:
jane -> {path}?searchText=Blue%20Dream
blaze -> {path}search/?q=Blue+Dream
All coordinates verified. Riverside excluded (location sold).
============================================================ -->
#tat-strain-stores {
--tat-ss-accent: #1a1a1a; /* button + highlight color */
--tat-ss-accent-text: #ffffff;
--tat-ss-border: #e2e2e2;
--tat-ss-radius: 8px;
--tat-ss-highlight-bg: #f7f5f2; /* nearest-store card bg */
max-width: 720px;
}
#tat-strain-stores .tat-ss-header {
display: flex; align-items: center; justify-content: space-between;
gap: 12px; flex-wrap: wrap; margin-bottom: 4px;
}
#tat-strain-stores .tat-ss-title { margin: 0; }
#tat-strain-stores .tat-ss-geo-btn {
background: var(--tat-ss-accent); color: var(--tat-ss-accent-text);
border: none; border-radius: var(--tat-ss-radius);
padding: 10px 18px; cursor: pointer; font-size: 0.95rem;
}
#tat-strain-stores .tat-ss-geo-btn:focus-visible { outline: 2px solid var(--tat-ss-accent); outline-offset: 2px; }
#tat-strain-stores .tat-ss-geo-btn[disabled] { opacity: 0.6; cursor: default; }
#tat-strain-stores .tat-ss-status { min-height: 1.2em; font-size: 0.9rem; opacity: 0.75; margin: 0 0 12px; }
#tat-strain-stores .tat-ss-list { list-style: none; margin: 0; padding: 0; }
#tat-strain-stores .tat-ss-item { margin: 0 0 10px; }
#tat-strain-stores .tat-ss-link {
display: flex; align-items: center; justify-content: space-between; gap: 12px;
border: 1px solid var(--tat-ss-border); border-radius: var(--tat-ss-radius);
padding: 14px 16px; text-decoration: none; color: inherit;
transition: border-color 0.15s ease, background 0.15s ease;
}
#tat-strain-stores .tat-ss-link:hover { border-color: var(--tat-ss-accent); }
#tat-strain-stores .tat-ss-item.tat-ss-nearest .tat-ss-link {
background: var(--tat-ss-highlight-bg); border-color: var(--tat-ss-accent);
}
#tat-strain-stores .tat-ss-city { font-weight: 600; }
#tat-strain-stores .tat-ss-meta { font-size: 0.85rem; opacity: 0.7; white-space: nowrap; }
#tat-strain-stores .tat-ss-badge {
display: inline-block; font-size: 0.72rem; font-weight: 600;
letter-spacing: 0.04em; text-transform: uppercase;
background: var(--tat-ss-accent); color: var(--tat-ss-accent-text);
border-radius: 999px; padding: 2px 10px; margin-left: 8px;
}
@media (prefers-reduced-motion: reduce) {
#tat-strain-stores .tat-ss-link { transition: none; }
}
(function () {
'use strict';
/* ---------- Store table ----------
path: full path from site root, trailing slash included.
provider: 'jane' | 'blaze'
Coordinates from the map pins Efrain supplied, except
those marked VERIFY (geocoded from street address). */
var STORES = [
{ city: 'West Hollywood', path: '/order-online/', provider: 'jane', lat: 34.0878567, lng: -118.3799552 },
{ city: 'Beverly Hills', path: '/order-online-beverly-hills/', provider: 'jane', lat: 34.0763226, lng: -118.3704640 },
{ city: 'LA Koreatown', path: '/order-online-koreatown/', provider: 'jane', lat: 34.0647058, lng: -118.3089100 },
{ city: 'Hawthorne', path: '/order-online-hawthorne/', provider: 'jane', lat: 33.9306797, lng: -118.3610329 },
{ city: 'Laguna Woods', path: '/order-online-laguna-woods/', provider: 'jane', lat: 33.6004571, lng: -117.7163986 },
{ city: 'Oxnard', path: '/order-online-oxnard/', provider: 'jane', lat: 34.2081913, lng: -119.1782889 },
{ city: 'Fresno (Palm Ave)', path: '/order-online-fresno/', provider: 'jane', lat: 36.8513662, lng: -119.8071504 },
{ city: 'Fresno (Shaw Ave)', path: '/order-online-fresno-shaw/',provider: 'jane', lat: 36.8069599, lng: -119.8510645 },
{ city: 'El Sobrante', path: '/order-online-el-sobrante/', provider: 'jane', lat: 37.9661609, lng: -122.3092546 },
{ city: 'Davis', path: '/menu/davis/', provider: 'blaze', lat: 38.5443000, lng: -121.7398000 },
{ city: 'Dixon', path: '/menu/dixon/', provider: 'blaze', lat: 38.4404000, lng: -121.8175000 }
];
var root = document.getElementById('tat-strain-stores');
var listEl = document.getElementById('tat-ss-list');
var statusEl= document.getElementById('tat-ss-status');
var geoBtn = document.getElementById('tat-ss-geo');
if (!root || !listEl) return;
/* ---------- Strain name resolution ---------- */
function getStrain() {
var attr = (root.getAttribute('data-strain') || '').trim();
if (attr && attr.indexOf('[') === -1) return attr; /* ignore unresolved shortcode-style placeholders */
var h1 = document.querySelector('h1');
return h1 ? h1.textContent.trim() : '';
}
var strain = getStrain();
var strainLabel = root.querySelector('.tat-ss-strain');
if (strainLabel) strainLabel.textContent = strain || 'this strain';
/* ---------- URL builders ---------- */
function buildUrl(store, strainName) {
if (!strainName) return store.path; /* no strain resolved: link to plain menu */
if (store.provider === 'blaze') {
/* Blaze: /menu/{city}/search/?q=blue+dream — plus-encoded spaces */
var q = encodeURIComponent(strainName).replace(/%20/g, '+');
return store.path + 'search/?q=' + q;
}
/* Jane: /order-online-{city}/?searchText=blue%20dream */
return store.path + '?searchText=' + encodeURIComponent(strainName);
}
/* ---------- Distance ---------- */
function haversineMiles(lat1, lng1, lat2, lng2) {
var R = 3958.8, toRad = Math.PI / 180;
var dLat = (lat2 - lat1) * toRad, dLng = (lng2 - lng1) * toRad;
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(lat1 * toRad) * Math.cos(lat2 * toRad) *
Math.sin(dLng / 2) * Math.sin(dLng / 2);
return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
}
/* ---------- Render ---------- */
function render(stores, withDistance) {
listEl.innerHTML = '';
stores.forEach(function (s, i) {
var li = document.createElement('li');
li.className = 'tat-ss-item' + (withDistance && i === 0 ? ' tat-ss-nearest' : '');
var a = document.createElement('a');
a.className = 'tat-ss-link';
a.href = buildUrl(s, strain);
var citySpan = document.createElement('span');
citySpan.className = 'tat-ss-city';
citySpan.textContent = s.city;
if (withDistance && i === 0) {
var badge = document.createElement('span');
badge.className = 'tat-ss-badge';
badge.textContent = 'Nearest';
citySpan.appendChild(badge);
}
var meta = document.createElement('span');
meta.className = 'tat-ss-meta';
meta.textContent = withDistance && typeof s.distance === 'number'
? s.distance.toFixed(1) + ' mi'
: 'Shop menu \u2192';
a.appendChild(citySpan);
a.appendChild(meta);
li.appendChild(a);
listEl.appendChild(li);
});
}
/* Initial render: alphabetical, no distances, no prompts. */
var initial = STORES.slice().sort(function (a, b) { return a.city.localeCompare(b.city); });
render(initial, false);
/* ---------- Geolocate on demand ---------- */
function sortByLocation(lat, lng) {
var sorted = STORES.map(function (s) {
var copy = Object.assign({}, s);
copy.distance = haversineMiles(lat, lng, s.lat, s.lng);
return copy;
}).sort(function (a, b) { return a.distance - b.distance; });
render(sorted, true);
statusEl.textContent = 'Sorted by distance from your location.';
}
if (geoBtn) {
if (!('geolocation' in navigator)) {
geoBtn.style.display = 'none';
} else {
geoBtn.addEventListener('click', function () {
geoBtn.disabled = true;
statusEl.textContent = 'Finding your nearest store\u2026';
navigator.geolocation.getCurrentPosition(
function (pos) {
sortByLocation(pos.coords.latitude, pos.coords.longitude);
geoBtn.disabled = false;
},
function () {
statusEl.textContent = 'Location unavailable \u2014 pick your store below.';
geoBtn.disabled = false;
},
{ timeout: 8000, maximumAge: 300000 }
);
});
}
}
})();