{
  "version": 3,
  "sources": ["/cdn/shop/t/202/assets/tool-dog-walk-weather.js?x=1794182125348"],
  "sourcesContent": ["/*! \u00A9 2026 Sniff & Bark. All rights reserved. Proprietary code, not licensed for copying, reuse or AI training. Terms: https://www.sniffandbark.com.co/pages/tools-terms */\n// Walk-weather check (tools dog-cold-walk + dog-hot-walk). Our reading of the Tufts Animal Care and Condition\n// (TACC) Weather Safety Scale, Patronek 1997. Pure logic is exported for scripts/dogtools/tool-dog-walk-weather.test.js.\n\n// TACC score per 5\u00B0F step, 0\u201395\u00B0F (index = \u00B0F / 5). Toy dogs use the small row (+1 on the cold side).\nexport const TACC = {\n  small: [5, 5, 5, 5, 5, 4, 3, 3, 3, 2, 2, 1, 1, 1, 2, 3, 4, 5, 5, 5],\n  medium: [5, 5, 5, 4, 4, 4, 3, 3, 3, 2, 1, 1, 1, 1, 2, 3, 4, 5, 5, 5],\n  giant: [5, 5, 5, 4, 3, 3, 3, 3, 2, 1, 1, 1, 2, 3, 3, 3, 5, 5, 5, 5]\n};\nexport const SIZES = ['toy', 'small', 'medium', 'giant'];\nexport const COLD_BELOW_F = 60;\nexport const WIND_MPH = { calm: 0, breezy: 10, windy: 20 };\nexport const LEVELS = ['ok', 'care', 'limit', 'stay'];\n\nconst r1 = (n) => Math.round(n * 10) / 10;\nexport const toF = (c) => c * 9 / 5 + 32;\nexport const toC = (f) => (f - 32) * 5 / 9;\n\n// NWS wind chill (\u00B0F, mph); defined for T \u2264 50\u00B0F and wind \u2265 3 mph.\nexport function windChill(t, v) {\n  if (!(t <= 50 && v >= 3)) return t;\n  const p = Math.pow(v, 0.16);\n  return r1(35.74 + 0.6215 * t - 35.75 * p + 0.4275 * t * p);\n}\n\n// NWS heat index (Rothfusz regression with the NWS adjustments); \u00B0F, relative humidity %.\nexport function heatIndex(t, rh) {\n  if (!Number.isFinite(rh)) return t;\n  const simple = 0.5 * (t + 61 + (t - 68) * 1.2 + rh * 0.094);\n  if ((simple + t) / 2 < 80) return r1(Math.max(t, simple));\n  let hi = -42.379 + 2.04901523 * t + 10.14333127 * rh - 0.22475541 * t * rh - 0.00683783 * t * t -\n    0.05481717 * rh * rh + 0.00122874 * t * t * rh + 0.00085282 * t * rh * rh - 0.00000199 * t * t * rh * rh;\n  if (rh < 13 && t >= 80 && t <= 112) hi -= ((13 - rh) / 4) * Math.sqrt((17 - Math.abs(t - 95)) / 17);\n  else if (rh > 85 && t >= 80 && t <= 87) hi += ((rh - 85) / 10) * ((87 - t) / 5);\n  return r1(Math.max(t, hi));\n}\n\n// Chart lookup. Cold side rounds down to the colder 5\u00B0F step, hot side up to the hotter one (the cautious reading).\nexport function taccBase(size, f) {\n  const row = TACC[size === 'toy' ? 'small' : size] || TACC.medium;\n  if (!Number.isFinite(f) || f < 0 || f > 95) return 5;\n  const i = f < COLD_BELOW_F ? Math.floor(f / 5) : Math.ceil(f / 5);\n  return row[Math.min(19, Math.max(0, i))];\n}\n\nexport const level = (score) => (score <= 1 ? 'ok' : score === 2 ? 'care' : score === 3 ? 'limit' : 'stay');\n\n// A coat the dog is wearing (cold side only). Our reading, not a Tufts row: Tufts scores a thick coat one step better\n// (\u22121), so a fleece or sweater gets the same \u22121, and so does a waterproof coat on a dry day. On a wet day a waterproof\n// coat keeps rain and snow off their back, so it offsets the two steps Tufts adds for wet weather (\u22122).\n// worn: 'fleece' | 'rain' | anything else = no coat.\nexport function coatCredit(worn, wet) {\n  if (worn === 'fleece') return { n: -1, k: 'worn_fleece' };\n  if (worn === 'rain') return wet ? { n: -2, k: 'worn_rain_wet' } : { n: -1, k: 'worn_rain' };\n  return null;\n}\n\n// s: { mode, f, wind, mph, wet, size, coat, worn, age, rh, shade, water, brachy, heavy, pavement }\nexport function assess(s) {\n  const f = Number(s.f);\n  if (!Number.isFinite(f)) return null;\n  // Exact wind from the weather service when we have it (s.mph); a tapped pill uses its representative speed.\n  const mph = Number.isFinite(s.mph) ? Math.max(0, s.mph) : (WIND_MPH[s.wind] ?? 0);\n  const side = f < COLD_BELOW_F ? 'cold' : 'hot';\n  const feels = side === 'cold' ? windChill(f, mph) : heatIndex(f, s.rh === '' || s.rh == null ? NaN : Number(s.rh));\n  const base = taccBase(s.size, feels);\n  const why = [];\n  let score = base;\n  let credit = null;\n  const add = (n, k) => { score += n; why.push(k); };\n  if (side === 'cold') {\n    if (s.size === 'toy') add(1, 'toy');\n    if (s.wet) add(2, 'wet');\n    if (s.coat === 'thick') add(-1, 'thick');\n    credit = coatCredit(s.worn, !!s.wet);\n    if (credit) score += credit.n;\n  } else {\n    if (s.shade) add(-1, 'shade');\n    if (s.water) add(-1, 'water');\n    if (s.brachy) add(1, 'brachy');\n    if (s.heavy) add(1, 'heavy');\n    if (s.coat === 'thick') add(1, 'thick_hot');\n  }\n  if (s.age === 'puppy' || s.age === 'senior') add(1, s.age);\n  score = Math.max(0, Math.min(6, score));\n  let lv = level(score);\n  const hotGround = side === 'hot' && s.pavement === 'hot';\n  if (hotGround && LEVELS.indexOf(lv) < 2) lv = 'limit';\n  return { side, feels, base, score, level: lv, why, credit, hotGround, gear: side === 'cold' ? gear(s, lv) : null, bandana: side === 'hot' && bandanaTip(s, lv) };\n}\n\n// Our gear rule, cold side only: already wearing a coat \u2192 no vest pitch ('coat-on'); wet or snowy \u2192 waterproof shell;\n// dry and not \"OK\" \u2192 fleece unless a thick double coat.\nexport function gear(s, lv) {\n  if (s.worn === 'fleece' || s.worn === 'rain') return 'coat-on';\n  if (s.wet) return 'rain';\n  if (lv !== 'ok' && s.coat !== 'thick') return 'fleece';\n  return 'no-coat';\n}\n\n// Hot side only: the wet cotton bandana tip. A damp cloth cools a little by evaporation, which slows as the air gets humid,\n// so we show it only on 'care' or 'limit' days with humidity at or below BANDANA_MAX_RH (or not entered), and never at 'stay'.\n// 50% is a cautious cut-off: above it evaporation slows and the heat index climbs past the air temperature.\n// Flat-faced, heavier and senior dogs get no gear tip: their margin is thin, so the plan changes instead (ASPCA, VCA).\nexport const BANDANA_MAX_RH = 50;\nexport function bandanaTip(s, lv) {\n  if (lv !== 'care' && lv !== 'limit') return false;\n  if (s.brachy || s.heavy || s.age === 'senior') return false;\n  if (s.rh === '' || s.rh == null) return true;\n  const rh = Number(s.rh);\n  return !Number.isFinite(rh) || rh <= BANDANA_MAX_RH;\n}\n// snb:tool-result key the upsell maps: <tool>:fleece / :rain (vests), :coat-on (ID collar, never a vest), the hot :bandana tip, else the level.\nexport const resultKey = (tool, r) => tool + ':' + (r.gear || (r.bandana ? 'bandana' : r.level));\n\n// ---- \"Use my location\": US National Weather Service API (api.weather.gov; public domain, no key) ----\n// Coordinates are only used for the one /points request. They are never stored, sent to analytics or put in a URL.\nexport const NWS = 'https://api.weather.gov';\nexport const WX_CACHE_KEY = 'snb.ww.wx.v2';\nexport const WX_TTL_MS = 30 * 60 * 1000;\nexport const WX_TIMEOUT_MS = 8000;\n// No hourly period covers now: accept the next one only if it starts within 90 minutes.\nexport const NEXT_PERIOD_MS = 90 * 60 * 1000;\n\n// The API rejects more than 4 decimals; Number() also drops trailing zeros.\nexport const round4 = (n) => Number(Number(n).toFixed(4));\nexport function pointsUrl(lat, lon) {\n  if (!Number.isFinite(lat) || !Number.isFinite(lon)) return '';\n  return NWS + '/points/' + round4(lat) + ',' + round4(lon);\n}\n\n// \"10 mph\", \"5 to 10 mph\", \"Calm\", \"15 km/h\" \u2192 mph. A range reads as its top end (the cautious reading).\nexport function parseWindMph(v) {\n  if (v && typeof v === 'object') {\n    const n = Number(v.maxValue ?? v.value);\n    if (!Number.isFinite(n)) return NaN;\n    return /km_h|km\\/h/i.test(String(v.unitCode || '')) ? r1(n / 1.609344) : n;\n  }\n  const str = String(v ?? '').trim();\n  if (/^calm$/i.test(str)) return 0;\n  const nums = (str.match(/\\d+(?:\\.\\d+)?/g) || []).map(Number);\n  if (!nums.length) return NaN;\n  const top = Math.max(...nums);\n  return /km\\/?h|kph/i.test(str) ? r1(top / 1.609344) : top;\n}\n\n// Wind bucket for the tool's pills (calm 0, breezy ~10, windy ~20 mph): split at the midpoints.\nexport const windBucket = (mph) => (!(mph >= 5) ? 'calm' : mph < 15 ? 'breezy' : 'windy');\n\n// Temperature as \u00B0F from a plain number + unit letter, or an NWS quantitative value ({ unitCode, value }).\nexport function tempF(v, unit) {\n  if (v && typeof v === 'object') {\n    const n = Number(v.value);\n    if (v.value == null || !Number.isFinite(n)) return NaN;\n    return /degC/i.test(String(v.unitCode || '')) ? r1(toF(n)) : n;\n  }\n  const n = Number(v);\n  if (v == null || v === '' || !Number.isFinite(n)) return NaN;\n  return String(unit || 'F').toUpperCase() === 'C' ? r1(toF(n)) : n;\n}\n\n// Rain, snow and the like count as \"wet\" unless the forecast only gives a chance of it (then \u2265 50%).\nconst PRECIP = /rain|snow|sleet|shower|drizzle|storm|flurr|freezing|ice pellets|wintry|hail/i;\nexport function isWet(shortForecast, pop) {\n  const sf = String(shortForecast || '');\n  if (!PRECIP.test(sf)) return false;\n  if (!/chance/i.test(sf)) return true;\n  return Number(pop) >= 50;\n}\n\n// Sun vs shade for the heat check: daytime and not overcast, wet or foggy = sun (the cautious reading).\nexport function isSunny(shortForecast, isDaytime) {\n  if (!isDaytime) return false;\n  const sf = String(shortForecast || '');\n  if (/sunny|clear|fair|partly cloudy/i.test(sf)) return true;\n  return !/cloudy|overcast|fog|haze|smoke/i.test(sf) && !PRECIP.test(sf);\n}\n\n// The hourly period covering `now`, else the nearest one starting within NEXT_PERIOD_MS; never a stale or far one.\nexport const periodsOf = (json) => (json && json.properties && Array.isArray(json.properties.periods) ? json.properties.periods : []);\nexport function pickPeriod(periods, t) {\n  const cur = periods.find((x) => Date.parse(x.startTime) <= t && t < Date.parse(x.endTime));\n  if (cur) return cur;\n  let best = null, at = Infinity;\n  for (const x of periods) {\n    const s = Date.parse(x.startTime);\n    if (s > t && s - t <= NEXT_PERIOD_MS && s < at) { best = x; at = s; }\n  }\n  return best;\n}\n\n// Each field is read on its own: a missing one stays missing (NaN, '' or null), never a guess.\nexport function parseHourly(json, now = Date.now()) {\n  const periods = periodsOf(json);\n  if (!periods.length) return null;\n  const p = pickPeriod(periods, typeof now === 'number' ? now : Date.parse(now));\n  if (!p) return null;\n  const tF = tempF(p.temperature, p.temperatureUnit);\n  if (!Number.isFinite(tF)) return null;\n  const rh = p.relativeHumidity && p.relativeHumidity.value != null ? Number(p.relativeHumidity.value) : NaN;\n  const pop = p.probabilityOfPrecipitation && p.probabilityOfPrecipitation.value != null ? Number(p.probabilityOfPrecipitation.value) : NaN;\n  return {\n    tF: Math.round(tF), mph: parseWindMph(p.windSpeed), rh: Number.isFinite(rh) ? Math.round(rh) : NaN, pop,\n    sf: String(p.shortForecast || '').trim().slice(0, 80), day: typeof p.isDaytime === 'boolean' ? p.isDaytime : null, time: String(p.startTime || '')\n  };\n}\n\n// The parsed hour \u2192 the tool's inputs (temperature in \u00B0F; the widget converts to the chosen unit). Only the fields the\n// forecast actually gave are set; missingFields() lists the rest so the widget leaves them as they are and asks to check.\nexport function mapWeather(w, mode) {\n  if (!w || !Number.isFinite(w.tF)) return null;\n  const m = { t: Math.round(w.tF) };\n  if (mode === 'hot') {\n    if (Number.isFinite(w.rh)) m.h = Math.max(0, Math.min(100, Math.round(w.rh)));\n    if (w.day === false) m.s = 'shade';\n    else if (w.day === true && w.sf) m.s = isSunny(w.sf, true) ? 'sun' : 'shade';\n  } else {\n    if (Number.isFinite(w.mph)) { m.w = windBucket(w.mph); m.wm = Math.round(Math.max(0, w.mph)); }\n    if (w.sf) m.g = isWet(w.sf, w.pop) ? 'wet' : 'dry';\n    else if (Number.isFinite(w.pop)) m.g = w.pop >= 50 ? 'wet' : 'dry';\n  }\n  return m;\n}\nexport const missingFields = (m, mode) => (m ? (mode === 'hot' ? ['h', 's'] : ['w', 'g']).filter((k) => m[k] == null) : []);\n// Cold side: rain or snow moves the score by 2, so after a prefill that couldn't tell, the verdict waits for Dry or Wet.\nexport const awaitingPick = (mode, g) => mode === 'cold' && g !== 'dry' && g !== 'wet';\n\n// /points answer: the hourly forecast URL, or why there isn't one. 404 = outside NWS coverage (outside the US).\nexport function readPoints(status, json) {\n  if (status === 404) return { fail: 'outside' };\n  if (!(status >= 200 && status < 300)) return { fail: 'network' };\n  const u = json && json.properties && json.properties.forecastHourly;\n  if (typeof u !== 'string' || u.indexOf(NWS + '/') !== 0) return { fail: 'outside' };\n  const tz = json.properties.timeZone;\n  return typeof tz === 'string' && /^[A-Za-z]+(?:\\/[A-Za-z0-9_+-]+){0,2}$/.test(tz) ? { hourly: u, tz } : { hourly: u };\n}\n\n// Forecast hour in the forecast location's own time zone (from /points), or nothing if we can't be sure.\nexport function fmtTime(iso, tz, locale) {\n  if (!iso || !tz) return '';\n  try {\n    const d = new Date(iso);\n    if (Number.isNaN(d.getTime())) return '';\n    return new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit', timeZone: tz }).format(d);\n  } catch (e) { return ''; }\n}\n\n// Any failure \u2192 one of the friendly fallbacks. Geolocation error codes: 1 denied, 2 unavailable, 3 timeout.\nexport function failReason(e) {\n  if (!e) return 'network';\n  if (typeof e === 'string') return ['denied', 'outside', 'timeout', 'unsupported', 'network', 'stale'].includes(e) ? e : 'network';\n  if (e.code === 1) return 'denied';\n  if (e.code === 3 || e.name === 'AbortError' || e.name === 'TimeoutError') return 'timeout';\n  if (e.status === 404) return 'outside';\n  return 'network';\n}\n\n// Analytics gets the outcome only: success, denied or fail.\nexport const wxOutcome = (reason) => (reason === 'success' ? 'success' : reason === 'denied' ? 'denied' : 'fail');\n\n// Session cache of the forecast (never the coordinates), keyed by the NWS forecastHourly URL (grid office/x/y). The\n// location is looked up on every click; a cached forecast is reused only when the new location resolves to the same grid.\nconst PERIOD_KEYS = ['startTime', 'endTime', 'isDaytime', 'temperature', 'temperatureUnit', 'windSpeed', 'shortForecast', 'relativeHumidity', 'probabilityOfPrecipitation'];\nexport function readCache(raw, url, now = Date.now()) {\n  try {\n    const c = JSON.parse(raw || 'null');\n    if (!c || typeof c.at !== 'number' || now - c.at > WX_TTL_MS || now < c.at || !url || c.url !== url || !Array.isArray(c.p)) return null;\n    return c.p;\n  } catch (e) { return null; }\n}\nexport function writeCache(url, periods, now = Date.now()) {\n  const p = (Array.isArray(periods) ? periods : []).filter((x) => x && Date.parse(x.endTime) > now).slice(0, 3)\n    .map((x) => { const o = {}; for (const k of PERIOD_KEYS) if (x[k] !== undefined) o[k] = x[k]; return o; });\n  return JSON.stringify({ at: now, url: String(url || ''), p });\n}\n\n// Vest sizes by weight (lb) from the product size chart; overlaps pick the larger size.\nexport const VEST = [['4-6', 4, 7], ['6-8', 7, 12], ['8-10', 11, 18], ['10-12', 16, 28], ['12-14', 25, 38], ['14-16', 35, 44], ['16-18', 40, 49], ['18-20', 45, 59]];\nexport function vestSize(lb) {\n  if (!(lb > 0)) return '';\n  let hit = '';\n  for (const [z, lo, hi] of VEST) if (lb >= lo && lb <= hi) hit = z;\n  return hit;\n}\nexport const VEST_LB = [VEST[0][1], VEST[VEST.length - 1][2]];\n\n// What we check. Out of range gets a message, never a verdict for a different number.\nexport const TEMP_F = [-60, 140];\nexport const MAX_WIND_MPH = 150;\nconst numOr = (v) => (String(v ?? '').trim() === '' ? null : Number(v));\nexport function tempIssue(t, unit) {\n  const v = numOr(t);\n  if (v == null) return '';\n  if (!Number.isFinite(v)) return 'nan';\n  const f = unit === 'C' ? toF(v) : v;\n  return f < TEMP_F[0] || f > TEMP_F[1] ? 'range' : '';\n}\nexport function humidityIssue(h) {\n  const v = numOr(h);\n  if (v == null) return '';\n  if (!Number.isFinite(v)) return 'nan';\n  return v < 0 || v > 100 ? 'range' : '';\n}\n// Wind speed only arrives from the weather service or a shared link: keep it if it's a real speed, else fall back to the pill.\nexport function cleanWind(wm) {\n  const v = numOr(wm);\n  return v != null && Number.isFinite(v) && v >= 0 && v <= MAX_WIND_MPH ? String(Math.round(v)) : '';\n}\n// Weight typed for the vest: '' (no weight or a size found) or 'out' (outside the vest chart).\nexport function vestIssue(lb) {\n  if (lb === 0 || !Number.isFinite(lb)) return '';\n  return lb > 0 && vestSize(lb) ? '' : 'out';\n}\nexport function rangeNote(k, unit, S = {}) {\n  const c = unit === 'C';\n  if (k === 't') return (S.temp_range || 'That\\u2019s off the chart for a dog walk. We check {lo} to {hi}, so check the number and the \\u00b0F or \\u00b0C.')\n    .replace('{lo}', c ? Math.round(toC(TEMP_F[0])) + '\\u00b0C' : TEMP_F[0] + '\\u00b0F').replace('{hi}', c ? Math.round(toC(TEMP_F[1])) + '\\u00b0C' : TEMP_F[1] + '\\u00b0F');\n  if (k === 'h') return S.humidity_range || 'Humidity runs from 0 to 100%. Check the number, or leave it blank.';\n  if (k === 'nan') return S.number_only || 'Numbers only, please. Check the temperature and humidity boxes.';\n  if (k === 'vest') return (S.vest_range || 'That weight is outside our vest chart ({lo} to {hi}), so we can\\u2019t pick a size.')\n    .replace('{lo}', c ? Math.round(VEST_LB[0] / 2.20462) : VEST_LB[0]).replace('{hi}', c ? Math.round(VEST_LB[1] / 2.20462) + ' kg' : VEST_LB[1] + ' lb');\n  return '';\n}\n\n// Share state lives in the #r= fragment only (never sent to the server).\nconst KEYS = ['u', 't', 'w', 'g', 'z', 'c', 'v', 'a', 'h', 's', 'd', 'b', 'o', 'p', 'kg', 'wm'];\nexport function encode(st) {\n  const p = new URLSearchParams();\n  for (const k of KEYS) if (st[k] !== '' && st[k] != null && st[k] !== false) p.set(k, st[k] === true ? '1' : String(st[k]));\n  return p.toString();\n}\nexport function decode(str) {\n  const p = new URLSearchParams(String(str || '').replace(/^#?r=/, ''));\n  const st = {};\n  for (const k of KEYS) if (p.has(k)) st[k] = String(p.get(k)).slice(0, 12);\n  return st;\n}\n\n// Which tool owns a temperature (\u00B0F). A tool whose side doesn't match gives no verdict, only a handoff link to its\n// sibling that keeps the typed temperature and unit in the #r= fragment.\nexport const sideOf = (f) => (f < COLD_BELOW_F ? 'cold' : 'hot');\nexport function handoff(mode, f, st, otherUrl) {\n  if (!Number.isFinite(f) || sideOf(f) === mode || !otherUrl) return null;\n  return { side: sideOf(f), url: otherUrl + '#r=' + encodeURIComponent(encode({ u: st.u, t: st.t })) };\n}\n\n// Share card (\u00A722, layout \"verdict\"): pill level and the card's verdict label.\nexport const CARD_LEVEL = { ok: 'safe', care: 'caution', limit: 'caution', stay: 'toxic' };\n\nconst DEF = {\n  cold: {\n    ok: ['Good walk weather', 'On the Tufts chart, this sits in the no-risk zone for your dog. Enjoy it.'],\n    care: ['OK, with care', 'Risk is unlikely, but keep an eye on them and keep it moving.'],\n    limit: ['Keep it short', 'Potentially unsafe for your dog. A quick walk, then home to warm up.'],\n    stay: ['Stay in today', 'Dangerous or worse for your dog on the Tufts chart. Potty break, then back inside.']\n  },\n  hot: {\n    ok: ['Good walk weather', 'On the Tufts chart, this sits in the no-risk zone for your dog. Bring water anyway.'],\n    care: ['OK, with care', 'Risk is unlikely. Go slow, stick to shade and offer water.'],\n    limit: ['Keep it short and shady', 'Potentially unsafe for your dog. Go early or late, short and on grass.'],\n    stay: ['Skip the walk', 'Dangerous or worse for your dog on the Tufts chart. Play a sniff game inside instead.']\n  }\n};\n\nif (typeof window !== 'undefined' && window.customElements && !customElements.get('snb-dog-walk-weather')) {\n  const h = (tag, attrs, ...kids) => {\n    const el = document.createElement(tag);\n    for (const k in attrs || {}) {\n      const v = attrs[k];\n      if (v == null || v === false) continue;\n      if (k === 'text') el.textContent = v;\n      else if (k.startsWith('on')) el.addEventListener(k.slice(2), v);\n      else el.setAttribute(k, v === true ? '' : v);\n    }\n    for (const c of kids.flat()) if (c != null) el.append(c);\n    return el;\n  };\n  const push = (o) => { try { (window.dataLayer = window.dataLayer || []).push(o); } catch (e) { /* analytics never breaks the tool */ } };\n\n  class WalkWeather extends HTMLElement {\n    connectedCallback() {\n      if (this.hasAttribute('data-snb-mounted')) return;\n      // \u00A78 expiry: the methodology section marks an expired review; hide the calculator, the chart and note stay.\n      if (document.querySelector('[data-dt-review-expired]')) {\n        this.setAttribute('data-snb-review-expired', '');\n        return;\n      }\n      let cfg = {};\n      try { cfg = JSON.parse(this.querySelector('[data-snb-config]')?.textContent || '{}'); } catch (e) { cfg = {}; }\n      const mount = this.querySelector('[data-snb-mount]');\n      if (!mount) return;\n      try { this.build(cfg, mount); } catch (e) {\n        console.warn('[dogtools] mount failed; keeping server-rendered content', e);\n        this.setAttribute('data-snb-error', '');\n        return;\n      }\n      this.setAttribute('data-snb-mounted', '');\n    }\n\n    build(cfg, mount) {\n      const mode = this.dataset.mode === 'hot' ? 'hot' : 'cold';\n      const tool = mode === 'hot' ? 'dog-hot-walk' : 'dog-cold-walk';\n      const S = cfg.strings || {};\n      const V = Object.assign({}, DEF[mode], cfg.verdicts || {});\n      const uid = 'ww' + Math.random().toString(36).slice(2, 7);\n      let frag = '';\n      try { frag = decodeURIComponent((location.hash.match(/(?:^#|&)r=([^&]*)/) || [])[1] || ''); } catch (e) { frag = ''; }\n      const st = Object.assign({ u: cfg.unit === 'C' ? 'C' : 'F', t: '', w: 'calm', g: 'dry', z: 'medium', c: mode === 'hot' ? '' : 'medium', v: mode === 'hot' ? '' : 'no', a: 'adult', h: '', s: 'sun', d: '', b: '', o: '', p: 'na', kg: '', wm: '' }, decode(frag));\n      st.wm = cleanWind(st.wm);\n      const bad = { t: false, h: false, kg: false };\n      // Coat question UI: yes/no first, then the kind (fleece by default). st.v stays the shared, scored value.\n      st.vy = st.v === 'fleece' || st.v === 'rain' ? 'yes' : 'no';\n      st.vt = st.v === 'rain' ? 'rain' : 'fleece';\n      let started = false, lastKey = '', timer = 0;\n\n      const radio = (name, label, opts) => h('fieldset', { class: 'ww-f' },\n        h('legend', { class: 'ww-l', text: label }),\n        h('div', { class: 'ww-pills' }, opts.map(([v, txt, sub]) => h('label', { class: 'ww-pill' },\n          h('input', { type: 'radio', name: uid + name, value: v, 'data-k': name, checked: st[name] === v }),\n          h('span', null, txt, sub ? h('small', { text: sub }) : null)))));\n      const check = (name, label) => h('label', { class: 'ww-check' },\n        h('input', { type: 'checkbox', 'data-k': name, checked: st[name] === '1' }), h('span', { text: label }));\n      const num = (name, label, attrs) => h('label', { class: 'ww-f ww-num' }, h('span', { class: 'ww-l', text: label }),\n        h('input', Object.assign({ type: 'number', inputmode: 'decimal', 'data-k': name, value: st[name] }, attrs)));\n\n      const sizeOpts = [['toy', S.toy || 'Toy', S.toy_eg || 'Chihuahua, Yorkie'], ['small', S.small || 'Small', S.small_eg || 'Dachshund, Shih Tzu'],\n        ['medium', S.medium || 'Medium to large', S.medium_eg || 'Lab, Border Collie'], ['giant', S.giant || 'Giant', S.giant_eg || 'Great Dane, Newfoundland']];\n      const ageOpts = [['puppy', S.puppy || 'Under 6 months'], ['adult', S.adult || 'Adult'], ['senior', S.senior || 'Senior']];\n      const tempIn = num('t', '', { min: -60, max: 140, step: 1, required: true, 'aria-describedby': uid + 'th' });\n      const unitBox = radio('u', S.unit || 'Units', [['F', '\u00B0F'], ['C', '\u00B0C']]);\n      const tempLabel = tempIn.querySelector('.ww-l');\n      const weightIn = num('kg', '', { min: 0, max: 250, step: 0.5 });\n      const weightLabel = weightIn.querySelector('.ww-l');\n      const privacy = S.geo_privacy || 'We use your location once to look up the weather. It isn\\u2019t stored.';\n      const geoBtn = h('button', { type: 'button', class: 'dt-btn dt-btn--ghost ww-geo-btn', 'aria-describedby': uid + 'gn', text: S.geo || 'Use my location' });\n      const geoNote = h('p', { class: 'ww-geo-note dt-muted', id: uid + 'gn', role: 'status', 'aria-live': 'polite', text: privacy });\n\n      const coatType = radio('vt', S.worn_type || 'What kind of coat?', [['fleece', S.worn_fleece || 'Fleece or sweater'], ['rain', S.worn_rain || 'Waterproof']]);\n      coatType.hidden = st.vy !== 'yes';\n      const form = h('form', { class: 'ww-form', novalidate: true, onsubmit: (e) => e.preventDefault() },\n        h('div', { class: 'ww-geo' }, geoBtn, geoNote),\n        h('div', { class: 'ww-row' }, tempIn, unitBox),\n        h('p', { class: 'ww-hint dt-muted', id: uid + 'th', text: mode === 'hot' ? (S.temp_hint || 'The air temperature in your weather app, in the shade.') : (S.temp_hint || 'The air temperature in your weather app (not the \"feels like\").') }),\n        mode === 'cold' ? [\n          radio('w', S.wind || 'Wind', [['calm', S.calm || 'Calm', ' '], ['breezy', S.breezy || 'Breezy', '~10 mph'], ['windy', S.windy || 'Windy', '~20 mph']]),\n          radio('g', S.ground || 'Rain or snow?', [['dry', S.dry || 'Dry'], ['wet', S.wet || 'Wet, rain or snow']])\n        ] : [\n          num('h', S.humidity || 'Humidity % (optional)', { min: 0, max: 100, step: 1 }),\n          radio('s', S.sun || 'Sun or shade?', [['sun', S.sunny || 'Mostly sun'], ['shade', S.shady || 'Mostly shade']]),\n          radio('p', S.pavement || 'Back of your hand on the pavement for 7 seconds', [['na', S.pave_na || 'Not tested'], ['ok', S.pave_ok || 'Comfortable'], ['hot', S.pave_hot || 'Too hot to hold'], ['grass', S.pave_grass || 'Grass or trail only']])\n        ],\n        radio('z', S.size || 'Size', sizeOpts),\n        mode === 'cold'\n          ? [radio('c', S.coat || 'Coat', [['thin', S.thin || 'Short or thin'], ['medium', S.coat_medium || 'Medium'], ['thick', S.thick || 'Thick double coat', S.thick_eg || 'Husky, Malamute']]),\n            radio('vy', S.worn || 'Is your dog wearing a coat?', [['yes', S.worn_yes || 'Yes'], ['no', S.worn_no || 'No']]), coatType]\n          : h('div', { class: 'ww-checks' }, check('b', S.brachy || 'Flat-faced (Pug, Bulldog, Frenchie)'), check('c', S.thick_hot || 'Thick or double coat'), check('o', S.heavy || 'Carrying extra weight'), check('d', S.water || \"I'm bringing water for them\")),\n        radio('a', S.age || 'Age', ageOpts),\n        mode === 'cold' ? weightIn : null);\n\n      const out = h('div', { class: 'ww-out', 'aria-live': 'polite' });\n      const hint = h('p', { class: 'ww-empty dt-muted', text: S.empty || 'Add the temperature and their verdict shows up here.' });\n      const pickHint = h('p', { class: 'ww-empty dt-muted', text: S.pick_ground || 'Is it dry, or wet with rain or snow? Pick one above and their verdict shows up here.' });\n      out.append(hint);\n      mount.replaceChildren(form, out);\n\n      const labelUnits = () => {\n        tempLabel.textContent = (S.temp || 'Temperature') + ' (\u00B0' + st.u + ')';\n        weightLabel.textContent = (S.weight || 'Weight, for their vest size (optional)') + (st.u === 'C' ? ' (kg)' : ' (lb)');\n      };\n      // The wind pill shows the imported speed while it's in use; the pill defaults otherwise.\n      const WIND_SUB = { calm: ' ', breezy: '~10 mph', windy: '~20 mph' };\n      const syncWind = () => {\n        for (const el of form.querySelectorAll('[data-k=w]')) {\n          const small = el.nextElementSibling && el.nextElementSibling.querySelector('small');\n          if (!small) continue;\n          small.textContent = st.wm !== '' && st.w === el.value ? (S.wind_now || '{n} mph now').replace('{n}', Math.round(Number(st.wm))) : WIND_SUB[el.value];\n        }\n      };\n      const fmt = (f) => Math.round(st.u === 'C' ? toC(f) : f) + '\u00B0' + st.u;\n      const state = () => ({\n        mode, f: st.t === '' ? NaN : (st.u === 'C' ? toF(Number(st.t)) : Number(st.t)), wind: st.w, mph: mode === 'cold' && st.wm !== '' && Number.isFinite(Number(st.wm)) ? Math.min(150, Math.max(0, Number(st.wm))) : NaN, wet: st.g === 'wet', size: st.z, coat: mode === 'hot' ? (st.c === '1' ? 'thick' : '') : st.c, worn: mode === 'hot' ? '' : st.v, age: st.a,\n        rh: st.h, shade: st.s === 'shade', water: st.d === '1', brachy: st.b === '1', heavy: st.o === '1', pavement: st.p === 'grass' ? 'ok' : st.p\n      });\n\n      const why = {\n        toy: S.why_toy || 'Toy breed: +1 on the cold side', wet: S.why_wet || 'Wet, rain or snow: +2', thick: S.why_thick || 'Thick double coat: \u22121',\n        shade: S.why_shade || 'Shade: \u22121', water: S.why_water || 'Water along: \u22121', brachy: S.why_brachy || 'Flat-faced: +1', heavy: S.why_heavy || 'Extra weight: +1', thick_hot: S.why_thick_hot || 'Thick coat: +1',\n        puppy: S.why_puppy || 'Under 6 months: +1', senior: S.why_senior || 'Senior: +1'\n      };\n      const credits = {\n        worn_fleece: S.credit_fleece || 'Their fleece or sweater: \\u22121. We count it like a thicker coat, which Tufts scores one step better.',\n        worn_rain: S.credit_rain || 'Their waterproof coat: \\u22121. On a dry day we count it like a thicker coat, which Tufts scores one step better.',\n        worn_rain_wet: S.credit_rain_wet || 'Their waterproof coat: \\u22122. It keeps rain and snow off their back, so it offsets the +2 Tufts adds for wet weather.'\n      };\n      const tips = (r) => {\n        const t = [];\n        if (r.side === 'cold') {\n          if (r.level !== 'ok') t.push(S.tip_short || 'Keep it short and keep moving. Turn back at the first shiver.');\n          if (state().f < 20) t.push(S.tip_vca || 'Below 20\u00B0F, VCA vets suggest 5 to 10 minute walks, with a coat and booties.');\n          else if (r.gear === 'coat-on' && (st.g === 'wet' || state().f < 32)) t.push(S.tip_booties || 'Booties or a paw wax help with snow, ice and road salt.');\n          if (st.g === 'wet') t.push(S.tip_dry || 'Towel them dry, paws and belly too, as soon as you get in.');\n          t.push(S.tip_paws || 'After the walk, wipe their paws: snow balls between the toes and de-icer residue come off.');\n          if (r.level === 'stay') t.push(S.tip_inside || 'Swap the walk for a sniff game or a short training session inside.');\n        } else {\n          if (r.hotGround) t.push(S.tip_pave || 'The pavement failed the hand test: stick to grass and shade, or wait until it cools.');\n          if (st.b === '1') t.push(S.tip_brachy || 'Flat-faced dogs can overheat at moderate temperatures. Keep it extra short.');\n          if (st.c === '1') t.push(S.tip_coat || 'Thick coats trap heat, so they warm up faster. Take more breaks in the shade.');\n          t.push(S.tip_time || 'Go early morning or late evening, when it is coolest.');\n          t.push(S.tip_slow || 'Walk, don\\u2019t run, and skip the bike or the jog in the heat.');\n          if (r.level === 'stay') t.push(S.tip_inside_hot || 'Skip the walk. A sniff game or a lick mat inside burns energy too.');\n          t.push(S.tip_coat_off || 'Coats and vests come off for warm-weather walks.');\n        }\n        return t.slice(0, 4);\n      };\n\n      const shareHost = h('div', { class: 'ww-share', 'data-ref': 'sharehost' });\n      let shareApi = null, shareLoading = false, pendingOpts = null;\n\n      // No verdict on screen (awaiting a pick, wrong tool): drop any pending result and hide a prior upsell.\n      const clearResult = () => {\n        clearTimeout(timer);\n        if (!lastKey) return;\n        lastKey = '';\n        this.dispatchEvent(new CustomEvent('snb:tool-result', { bubbles: true, composed: true, detail: { v: 1, tool, key: tool + ':pending', mode: 'info', risk: 'pending', confidence: 0, data: {} } }));\n      };\n\n      const render = () => {\n        labelUnits();\n        if (mode === 'cold') syncWind();\n        const s = state();\n        // Out of range or not a number: say so instead of a verdict for some other temperature or humidity.\n        const ti = bad.t ? 'nan' : tempIssue(st.t, st.u);\n        const hi = mode === 'hot' ? (bad.h ? 'nan' : humidityIssue(st.h)) : '';\n        const issue = ti === 'range' ? 't' : hi === 'range' ? 'h' : ti || hi ? 'nan' : '';\n        if (issue) { clearResult(); out.replaceChildren(h('p', { class: 'ww-empty ww-empty--check', text: rangeNote(issue, st.u, S) })); return; }\n        const r = assess(s);\n        if (!r) { clearResult(); out.replaceChildren(hint); return; }\n        if (r.side === mode && awaitingPick(mode, st.g)) { clearResult(); out.replaceChildren(pickHint); return; }\n        const ho = handoff(mode, s.f, st, cfg.other_url);\n        if (r.side !== mode) {\n          // Wrong tool for this temperature: no verdict (this tool's copy would be wrong), only the sibling link.\n          clearResult();\n          const txt = (r.side === 'hot' ? (S.handoff_hot || '{t} is warm-weather territory, so the cold check doesn\\u2019t apply.') : (S.handoff_cold || '{t} is cold-weather territory, so the heat check doesn\\u2019t apply.')).replace('{t}', fmt(s.f));\n          out.replaceChildren(h('div', { class: 'ww-res ww-res--handoff', 'data-level': 'handoff' },\n            h('p', { class: 'ww-line', text: txt }),\n            ho ? h('p', { class: 'ww-other' }, h('a', { class: 'dt-btn', href: ho.url, text: r.side === 'hot' ? (S.other_hot || 'Check the heat instead \\u2192') : (S.other_cold || 'Check the cold instead \\u2192') })) : null));\n          return;\n        }\n        const v = V[r.level] || DEF[mode][r.level];\n        const feels = Math.round(r.feels) !== Math.round(s.f)\n          ? (mode === 'cold' ? (S.feels_cold || 'With the wind it feels like {t}.') : (S.feels_hot || 'With the humidity it feels like {t}.')).replace('{t}', fmt(r.feels)) : '';\n        const lb = st.kg === '' ? 0 : (st.u === 'C' ? Number(st.kg) * 2.20462 : Number(st.kg));\n        const vest = r.gear === 'fleece' || r.gear === 'rain' ? vestSize(lb) : '';\n        const vestOut = (r.gear === 'fleece' || r.gear === 'rain') && !vest && (bad.kg || (st.kg !== '' && vestIssue(lb)))\n          ? (bad.kg ? (S.vest_nan || 'Numbers only for their weight, so we can\\u2019t pick a vest size yet.') : rangeNote('vest', st.u, S)) : '';\n        const gearTxt = r.gear ? {\n          'no-coat': S.gear_none || 'No coat needed. Their own fur has this one.',\n          'coat-on': r.level === 'ok' || r.level === 'care'\n            ? (S.gear_coat_on || 'Their coat has this one covered. No extra layer needed.')\n            : (S.gear_coat_on_short || 'Their coat helps, and it\\u2019s still a short-walk day.'),\n          fleece: S.gear_fleece || 'A fleece layer helps: think a cozy vest for dogs with short or thin coats.',\n          rain: S.gear_rain || 'A waterproof shell helps most: wet fur loses heat fast.'\n        }[r.gear] : '';\n        const signs = String((r.side === 'cold' ? cfg.signs_cold : cfg.signs_hot) || '').split(/\\r?\\n/).map((x) => x.trim()).filter(Boolean).slice(0, 8);\n\n        out.replaceChildren(h('div', { class: 'ww-res ww-res--' + r.level, 'data-level': r.level },\n          h('p', { class: 'ww-kicker', text: (S.score || 'Tufts weather score: {n} of 5').replace('{n}', Math.min(5, r.score)) }),\n          h('h3', { class: 'ww-verdict', text: v[0] }),\n          h('p', { class: 'ww-line', text: v[1] }),\n          feels ? h('p', { class: 'ww-feels', text: feels }) : null,\n          r.why.length ? h('p', { class: 'ww-why dt-muted', text: (S.why || 'Adjusted for') + ': ' + r.why.map((k) => why[k]).join(' \u00B7 ') }) : null,\n          r.credit ? h('p', { class: 'ww-credit', text: credits[r.credit.k] }) : null,\n          gearTxt ? h('div', { class: 'ww-gear' }, h('p', { class: 'ww-l', text: S.gear || 'What to wear' }), h('p', { text: gearTxt }),\n            vest ? h('p', { class: 'ww-size' }, (S.vest_size || 'Their vest size: {size}.').replace('{size}', vest) + ' ', h('a', { href: '/pages/size-guide', text: S.measure || 'Measure their chest to confirm' }))\n              : vestOut ? h('p', { class: 'ww-size', 'data-ref': 'vest-out' }, vestOut + ' ', h('a', { href: '/pages/size-guide', text: S.measure_out || 'Measure their chest to find theirs' })) : null) : null,\n          r.bandana ? h('div', { class: 'ww-gear ww-bandana', 'data-ref': 'bandana' },\n            h('p', { class: 'ww-l', text: S.bandana || 'Cool-bandana trick' }),\n            h('p', { text: S.bandana_intro || 'On a short, easy walk in dry air, a wet cotton bandana can take the edge off.' }),\n            h('ol', null, [S.bandana_1 || 'Soak it in cool tap water.', S.bandana_2 || 'Wring it out so it\\u2019s damp, not dripping.',\n              S.bandana_3 || 'Tie it loosely: two fingers should fit underneath.', S.bandana_4 || 'Rewet it every 10 to 15 minutes, before it dries.'].map((x) => h('li', { text: x }))),\n            h('p', { text: S.bandana_freeze || 'Don\\u2019t freeze it. Ice is stiff and harsh on their neck, and it can\\u2019t cool by evaporation until it thaws. A short spell in the fridge is fine.' }),\n            h('p', { class: 'dt-muted', text: (s.rh === '' || s.rh == null ? (S.bandana_rh || 'It works best in dry air, so add the humidity above to check.') + ' ' : '') + (S.bandana_limit || 'It helps a little. It doesn\\u2019t make a hot walk safe, and if they\\u2019re overheating, take it off and cool them with water and a breeze.') })) : null,\n          h('div', { class: 'ww-cols' },\n            h('div', null, h('p', { class: 'ww-l', text: S.do || 'Do this' }), h('ul', null, tips(r).map((x) => h('li', { text: x })))),\n            signs.length ? h('div', null, h('p', { class: 'ww-l', text: r.side === 'cold' ? (S.stop_cold || 'Head home if you see') : (S.stop_hot || 'Stop, cool them and call your vet if you see') }), h('ul', null, signs.map((x) => h('li', { text: x })))) : null),\n          r.level === 'stay' ? null : shareHost));\n\n        const hash = '#r=' + encodeURIComponent(encode(st));\n        if (r.level !== 'stay') mountShare(r, v, hash);\n\n        const key = resultKey(tool, r);\n        const sig = key + r.level + vest;\n        if (sig === lastKey) return;\n        lastKey = sig;\n        clearTimeout(timer);\n        timer = setTimeout(() => {\n          try { history.replaceState(null, '', hash); } catch (e) { /* not fatal */ }\n          const risk = r.level === 'stay' ? 'caution' : 'none';\n          this.dispatchEvent(new CustomEvent('snb:tool-result', { bubbles: true, composed: true, detail: { v: 1, tool, key, mode: 'info', risk, confidence: 1, data: Object.assign({ variant: r.level }, vest ? { size: vest } : {}) } }));\n          push({ event: 'dogtool_result', tool, key, mode: 'info', risk, verdict: r.level });\n        }, 500);\n      };\n\n      // \u00A722 shared share component (dogtools-core chunk). The card is a weather verdict; the URL restores the check.\n      const mountShare = (r, v, hash) => {\n        const t = fmt(state().f);\n        const opts = {\n          slug: tool,\n          url: location.origin + location.pathname + hash,\n          title: (S.share_title || 'Our dog-walk weather check: {verdict}').replace('{verdict}', v[0]),\n          text: (S.share_text || '{verdict} at {t}: our dog-walk weather check.').replace('{verdict}', v[0]).replace('{t}', t),\n          tag: { line1: t.slice(0, 18), line2: v[0].slice(0, 28) },\n          invite: S.share_invite || (mode === 'hot' ? 'Too hot for a walk? Check yours \\u2192' : 'Too cold for a walk? Check yours \\u2192'),\n          card: { layout: 'verdict', headline: S.card_headline || (mode === 'hot' ? 'Hot walk check' : 'Cold walk check'),\n            fields: { level: CARD_LEVEL[r.level], label: v[0].slice(0, 18), food: (t + ' \\u00b7 ' + (S.card_score || 'Tufts score {n}/5').replace('{n}', Math.min(5, r.score))).slice(0, 30), line: v[1] } },\n          linkPreview: {},\n          serious: false\n        };\n        if (shareApi) { shareApi.update(opts); return; }\n        pendingOpts = opts;\n        if (shareLoading || !cfg.core_url) return;\n        shareLoading = true;\n        import(cfg.core_url).then((m) => {\n          if (!m || typeof m.m !== 'function') throw new Error('share');\n          shareApi = m.m(shareHost, pendingOpts);\n        }).catch(() => {\n          // Shared chunk unavailable: plain native share / copy link, never a broken page.\n          const b = h('button', { type: 'button', class: 'dt-btn dt-btn--ghost', text: S.share || 'Share this check' });\n          b.addEventListener('click', () => {\n            const u = pendingOpts.url;\n            if (navigator.share) navigator.share({ title: pendingOpts.title, text: pendingOpts.text, url: u }).then(() => push({ event: 'dogtool_share', tool, channel: 'native_url' }), () => {});\n            else if (navigator.clipboard) navigator.clipboard.writeText(u).then(() => { b.textContent = S.copied || 'Link copied'; push({ event: 'dogtool_share', tool, channel: 'copy' }); }, () => {});\n          });\n          shareHost.replaceChildren(b);\n        });\n      };\n\n      form.addEventListener('input', (e) => {\n        const el = e.target.closest('[data-k]');\n        if (!el) return;\n        const k = el.dataset.k;\n        if (k === 'u' && st.u !== el.value) {\n          if (st.t !== '') st.t = String(Math.round(el.value === 'C' ? toC(Number(st.t)) : toF(Number(st.t))));\n          if (st.kg !== '') st.kg = String(Math.round((el.value === 'C' ? Number(st.kg) / 2.20462 : Number(st.kg) * 2.20462) * 10) / 10);\n          form.querySelector('[data-k=t]').value = st.t;\n          form.querySelector('[data-k=kg]') && (form.querySelector('[data-k=kg]').value = st.kg);\n          // Rewriting the boxes clears any letters typed in them, so their \"numbers only\" state goes too.\n          bad.t = bad.kg = false;\n        }\n        st[k] = el.type === 'checkbox' ? (el.checked ? '1' : '') : el.value.trim().slice(0, 6);\n        if (el.type === 'number') bad[k] = !!(el.validity && el.validity.badInput);\n        if (k === 'w') st.wm = '';\n        if (k === 'vy' || k === 'vt') {\n          st.v = st.vy === 'yes' ? (st.vt === 'rain' ? 'rain' : 'fleece') : 'no';\n          coatType.hidden = st.vy !== 'yes';\n        }\n        const f = el.closest('[data-confirm]');\n        if (f) f.removeAttribute('data-confirm');\n        start();\n        render();\n      });\n\n      const start = () => {\n        if (started) return;\n        started = true;\n        this.dispatchEvent(new CustomEvent('snb:tool-pending', { bubbles: true, composed: true, detail: { tool, mode: 'info' } }));\n        push({ event: 'dogtool_start', tool });\n      };\n\n      // \"Use my location\": geolocation only on this click, then two GETs to api.weather.gov. Inputs stay editable.\n      const syncForm = () => {\n        for (const el of form.querySelectorAll('[data-k]')) {\n          const k = el.dataset.k;\n          if (el.type === 'radio') el.checked = st[k] === el.value;\n          else if (el.type === 'checkbox') el.checked = st[k] === '1';\n          else el.value = st[k] == null ? '' : st[k];\n        }\n      };\n      const FAIL = {\n        denied: S.geo_denied || 'No problem. Type the temperature from your weather app and we\\u2019ll take it from there.',\n        outside: S.geo_outside || 'The National Weather Service only covers the US, so type the temperature from your weather app.',\n        timeout: S.geo_timeout || 'The weather took too long to answer. Type the temperature from your weather app instead.',\n        network: S.geo_network || 'We couldn\\u2019t reach the weather service. Type the temperature from your weather app instead.',\n        stale: S.geo_stale || 'The forecast for right now isn\\u2019t out yet. Type the temperature from your weather app instead.',\n        unsupported: S.geo_unsupported || 'This browser can\\u2019t share a location. Type the temperature from your weather app instead.'\n      };\n      let geoBusy = false;\n      const busy = (on) => {\n        geoBusy = on;\n        geoBtn.textContent = on ? (S.geo_busy || 'Checking the weather\\u2026') : (S.geo || 'Use my location');\n        if (on) { geoBtn.setAttribute('aria-busy', 'true'); geoBtn.setAttribute('aria-disabled', 'true'); geoNote.textContent = S.geo_looking || 'Looking up the weather near you\\u2026'; }\n        else { geoBtn.removeAttribute('aria-busy'); geoBtn.removeAttribute('aria-disabled'); }\n      };\n      const report = (reason) => push({ event: 'dogtool_weather_lookup', tool, variant: wxOutcome(reason) });\n      const fail = (reason) => {\n        geoNote.textContent = FAIL[reason] || FAIL.network;\n        report(reason);\n        tempIn.querySelector('input').focus({ preventScroll: true });\n      };\n      const FIELD = { h: S.field_h || 'humidity', s: S.field_s || 'sun or shade', w: S.field_w || 'wind', g: S.field_g || 'rain or snow' };\n      const succeed = (w, tz) => {\n        const m = mapWeather(w, mode);\n        if (!m) { fail('stale'); return; }\n        st.t = String(st.u === 'C' ? Math.round(toC(m.t)) : m.t);\n        for (const k of ['w', 'g', 'h', 's']) if (m[k] != null) st[k] = String(m[k]);\n        if (mode === 'cold') st.wm = cleanWind(m.wm);\n        // Fields the forecast didn't give keep their current value and are flagged to check by hand.\n        const miss = missingFields(m, mode);\n        if (mode === 'cold' && miss.includes('g')) st.g = '';\n        for (const el of form.querySelectorAll('[data-confirm]')) el.removeAttribute('data-confirm');\n        for (const k of miss) { const f = form.querySelector('[data-k=' + k + ']'); const box = f && f.closest('.ww-f'); if (box) box.setAttribute('data-confirm', ''); }\n        bad.t = bad.h = false;\n        syncForm();\n        const when = fmtTime(w.time, tz);\n        const [a, b] = (S.geo_ok || 'Weather for your location, from the {nws}{time}. Your location isn\\u2019t stored.').split('{nws}');\n        const extra = [];\n        if (mode === 'cold' && m.wm != null) extra.push((S.geo_wind || 'Wind: {n} mph.').replace('{n}', m.wm));\n        if (miss.length) extra.push((S.geo_check || 'The forecast didn\\u2019t include {fields}, so please check {them} yourself.').replace('{fields}', miss.map((k) => FIELD[k]).join(S.and || ' or ')).replace('{them}', miss.length > 1 ? (S.them || 'them') : (S.it || 'it')));\n        geoNote.replaceChildren(a,\n          h('a', { href: 'https://www.weather.gov/', target: '_blank', rel: 'noopener', text: S.geo_nws || 'National Weather Service' }),\n          String(b || '').replace('{time}', when ? ', ' + when : '') + (extra.length ? ' ' + extra.join(' ') : ''));\n        report('success');\n        start();\n        render();\n      };\n      const getJson = async (url, signal, retry) => {\n        const res = await fetch(url, { signal, credentials: 'omit' });\n        if (res.status >= 500 && retry) return getJson(url, signal, false);\n        return { status: res.status, json: res.ok ? await res.json() : null };\n      };\n      const lookup = async () => {\n        if (geoBusy) return;\n        if (!navigator.geolocation || !window.fetch) { fail('unsupported'); return; }\n        busy(true);\n        let w = null, tz = '', reason = '';\n        try {\n          // Always ask for the current position, so a second click after moving gets the new place's weather.\n          const pos = await new Promise((res, rej) => navigator.geolocation.getCurrentPosition(res, rej, { enableHighAccuracy: false, timeout: WX_TIMEOUT_MS, maximumAge: 600000 }));\n          const ctl = typeof AbortController === 'function' ? new AbortController() : null;\n          const tm = setTimeout(() => ctl && ctl.abort(), WX_TIMEOUT_MS);\n          try {\n            const pt = await getJson(pointsUrl(pos.coords.latitude, pos.coords.longitude), ctl && ctl.signal, true);\n            const p = readPoints(pt.status, pt.json);\n            if (p.fail) throw p.fail;\n            tz = p.tz || '';\n            let periods = null;\n            try { periods = readCache(sessionStorage.getItem(WX_CACHE_KEY), p.hourly); } catch (e) { periods = null; }\n            const now = Date.now();\n            w = periods ? parseHourly({ properties: { periods } }, now) : null;\n            if (!w) {\n              const hr = await getJson(p.hourly, ctl && ctl.signal, true);\n              if (hr.status !== 200) throw 'network';\n              w = parseHourly(hr.json, now);\n              if (!w) throw periodsOf(hr.json).length ? 'stale' : 'network';\n              try { sessionStorage.setItem(WX_CACHE_KEY, writeCache(p.hourly, periodsOf(hr.json), now)); } catch (e) { /* private mode: no cache */ }\n            }\n          } finally { clearTimeout(tm); }\n        } catch (e) { reason = failReason(e); w = null; }\n        busy(false);\n        if (w) succeed(w, tz); else fail(reason || 'network');\n      };\n      geoBtn.addEventListener('click', lookup);\n      render();\n    }\n  }\n  customElements.define('snb-dog-walk-weather', WalkWeather);\n}\n"],
  "mappings": "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",
  "names": ["n"]
}
