{
  "version": 3,
  "sources": ["/cdn/shop/t/202/assets/tool-dog-birthday.js?x=1794182125056"],
  "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// Dog birthday + Gotcha Day (tools dog-birthday + dog-gotcha-day): pupcake builder, printable sign, party checklist.\n// Calories: USDA FoodData Central (SR Legacy). Portion: treats \u226410% of daily calories (AKC), with the resting energy\n// requirement 70 \u00D7 kg^0.75 (Merck Veterinary Manual) as a cautious floor. Pure logic is exported for\n// scripts/dogtools/tool-dog-birthday.test.js.\n\n// kcal per 100 g (USDA FDC SR Legacy: 168944, 169714, 168450, 172470, 171287, 173944, 171284).\nexport const KCAL = { flour: 332, rice_flour: 366, pumpkin: 34, pb: 598, egg: 143, banana: 89, yogurt: 61, water: 0 };\n// Grams per US cup (USDA FDC portion weights; peanut butter 2 Tbsp = 32 g).\nexport const G_CUP = { flour: 120, rice_flour: 158, pumpkin: 245, pb: 256, banana: 225, yogurt: 245, water: 240 };\n// Pandoy's pupcakes, by weight. About 24 mini pupcakes.\nexport const BASE = {\n  batter: [['flour', 120], ['pumpkin', 122], ['pb', 64], ['egg', 50], ['water', 60]],\n  frosting: [['yogurt', 61], ['pb', 16]],\n  minis: 24\n};\nexport const EGG_G = 50;\nexport const EGG_SWAP_PUMPKIN_G = 30;\n// Optional mini biscuit topper: packs vary, so we count a fixed, deliberately high 10 kcal each.\nexport const TOPPER_KCAL = 10;\n// p = no peanut butter, d = no dairy, w = no wheat, e = no egg\nexport const ALLERGIES = ['p', 'd', 'w', 'e'];\nexport const SIZES = { toy: 5, small: 15, medium: 35, large: 65, giant: 110 };\nexport const LB = 0.45359237;\n\nconst r1 = (n) => Math.round(n * 10) / 10;\n\n// perMini is one serving: a mini pupcake, plus TOPPER_KCAL when the biscuit topper is chosen.\nexport function recipe(x, topper) {\n  const has = (k) => String(x || '').includes(k);\n  const sw = (id) => (id === 'pb' && has('p') ? 'banana' : id === 'flour' && has('w') ? 'rice_flour' : id);\n  let batter = BASE.batter.map(([id, g]) => [sw(id), g]);\n  if (has('e')) batter = batter.filter(([id]) => id !== 'egg').map(([id, g]) => [id, id === 'pumpkin' ? g + EGG_SWAP_PUMPKIN_G : g]);\n  const frosting = BASE.frosting.map(([id, g]) => [id === 'yogurt' && has('d') ? 'pumpkin' : sw(id), g]);\n  const kcal = [...batter, ...frosting].reduce((t, [id, g]) => t + g * KCAL[id] / 100, 0);\n  const cake = r1(kcal / BASE.minis);\n  return { batter, frosting, kcal: r1(kcal), cake, topper: !!topper, perMini: r1(cake + (topper ? TOPPER_KCAL : 0)), swaps: ALLERGIES.filter(has) };\n}\n\n// Method lines follow the swaps, so a step never names an ingredient the recipe left out.\nexport function adaptStep(line, x) {\n  const has = (k) => String(x || '').includes(k);\n  let t = String(line || '');\n  if (has('e')) t = t.replace(/,? (?:an |the )?eggs?\\b/gi, '');\n  if (has('p')) t = t.replace(/\\bpeanut butter\\b/gi, 'mashed banana');\n  if (has('w')) t = t.replace(/\\b(?:whole wheat )?flour\\b/gi, 'rice flour');\n  if (has('d')) t = t.replace(/\\b(?:plain )?yogurt\\b/gi, 'pumpkin');\n  return t.replace(/\\s{2,}/g, ' ');\n}\n// Allergens the optional biscuit must also be free of.\nexport const TOPPER_FREE = { p: 'peanut', d: 'dairy', w: 'wheat', e: 'egg' };\n\n// Resting energy requirement (kcal/day), Merck: 70 \u00D7 kg^0.75.\nexport const rer = (kg) => (kg > 0 ? 70 * Math.pow(kg, 0.75) : 0);\nexport const allowance = (kg) => r1(0.1 * rer(kg));\n\n// Largest slice, in quarter mini pupcakes, that stays inside the 10% treat allowance.\nexport function portion(kg, perMini) {\n  if (!(kg > 0) || !(perMini > 0)) return null;\n  const a = allowance(kg);\n  const q = Math.floor(a / (perMini / 4));\n  return { quarters: q, kcal: r1(q * perMini / 4), allowance: a, tiny: q < 1 };\n}\n\n// Dogs at the party, a whole number from 1 to MAX_DOGS. 20 is a real dog party and keeps one recipe a home bake\n// (20 giant dogs is a 2\u00BD\u00D7 batch). Never silent: issue says what we changed so the widget can say so.\nexport const MAX_DOGS = 20;\nexport function guestCount(raw) {\n  const s = String(raw ?? '').trim();\n  if (s === '') return { n: 1, asked: null, issue: 'empty' };\n  const v = Number(s);\n  if (!Number.isFinite(v)) return { n: 1, asked: null, issue: 'nan' };\n  if (v < 0.5) return { n: 1, asked: v, issue: 'min' };\n  const r = Math.round(v);\n  if (r > MAX_DOGS) return { n: MAX_DOGS, asked: r, issue: 'max', times: Math.ceil(r / MAX_DOGS) };\n  return { n: r, asked: v, issue: r !== v ? 'whole' : '' };\n}\nexport function guestNote(g, name, S = {}) {\n  const nm = name || S.they || 'your dog';\n  if (g.issue === 'max') {\n    return (g.times <= 10 ? (S.guests_max || 'We plan parties of up to {max} dogs, so this recipe feeds {max}. For all {asked}, bake it {k} times.')\n      : (S.guests_max_many || 'We plan parties of up to {max} dogs, so this recipe feeds {max}. For a bigger crowd, bake one batch for every {max} dogs.'))\n      .replace(/\\{max\\}/g, MAX_DOGS).replace('{asked}', g.asked).replace('{k}', g.times);\n  }\n  if (g.issue === 'empty') return (S.guests_empty || 'Nobody on the guest list yet, so we counted {name}.').replace('{name}', nm);\n  if (g.issue === 'min') return (S.guests_min || 'Every party has at least one guest, so we counted {name}.').replace('{name}', nm);\n  if (g.issue === 'whole') return (S.guests_whole || 'Dogs come whole, so we counted {n}.').replace('{n}', g.n);\n  if (g.issue === 'nan') return (S.guests_nan || 'Numbers only here. For now we counted {name} on their own.').replace('{name}', nm);\n  return '';\n}\n// The party line under the recipe yield: always the number the batch was sized for, plus the bake-it-again note past the cap.\nexport function partyText(g, name, S = {}) {\n  const nm = name || S.they || 'your dog';\n  const base = g.n > 1 ? (S.party || 'Enough for {d} dogs sized like {name}. Bigger or smaller guests: run their weight too.').replace('{d}', g.n).replace('{name}', nm) : '';\n  return g.issue === 'max' ? (base + ' ' + guestNote(g, nm, S)).trim() : base;\n}\n\n// Batch size in half-batch steps (a half batch is 12 minis), so every dog at the party gets the same slice.\nexport function batchFor(dogs, quarters) {\n  const n = guestCount(dogs).n;\n  const need = Math.ceil(n * Math.max(0, quarters) / 4);\n  return { dogs: n, need, mult: Math.max(0.5, Math.ceil(need / (BASE.minis / 2)) / 2) };\n}\n// How the batch was worked out, so the flour and water trace back: \"20 dogs \u00D7 up to 3 minis each = 60 minis \u2192 2\u00BD batches.\"\n// Tiny dogs get a lick of frosting, not a pupcake, so their line says that and the bake is the smallest one.\nexport function basisText(b, quarters, S = {}, tiny = false) {\n  const q = fmtQuarters(Math.max(1, quarters));\n  const m = b.mult === 0.5 ? (S.half_batch || '\u00BD batch') : b.mult === 1 ? (S.one_batch || '1 batch')\n    : (S.batches || '{m} batches').replace('{m}', String(b.mult).replace('.5', '\\u00bd').replace(/^0/, ''));\n  if (tiny) {\n    return (S.basis_tiny || '{d} {dogs} \\u00d7 a lick of frosting each \\u2192 {b}, the smallest bake.')\n      .replace('{d}', b.dogs).replace('{dogs}', b.dogs === 1 ? (S.dog || 'dog') : (S.dogs || 'dogs')).replace('{b}', m);\n  }\n  return (S.basis || '{d} {dogs} \\u00d7 up to {q} {mq} each = {n} {mn} \\u2192 {b}.')\n    .replace('{d}', b.dogs).replace('{dogs}', b.dogs === 1 ? (S.dog || 'dog') : (S.dogs || 'dogs'))\n    .replace('{q}', q).replace('{mq}', quarters > 4 ? (S.minis_s || 'minis') : (S.mini_s || 'mini'))\n    .replace('{n}', b.need).replace('{mn}', b.need === 1 ? (S.mini_s || 'mini') : (S.minis_s || 'minis')).replace('{b}', m);\n}\n\n// Weight for the slice: 1 to 250 lb (about 0.5 to 113 kg). Outside that we ask them to check rather than size a slice.\nexport const W_LB = [1, 250];\nexport function weightIssue(w, unit) {\n  const s = String(w ?? '').trim();\n  if (s === '') return '';\n  const v = Number(s);\n  if (!Number.isFinite(v)) return 'nan';\n  const lb = unit === 'kg' ? v / LB : v;\n  return lb < W_LB[0] ? 'low' : lb > W_LB[1] ? 'high' : '';\n}\nexport function weightNote(issue, unit, S = {}) {\n  if (!issue) return '';\n  if (issue === 'nan') return S.weight_nan || 'Numbers only for their weight, please.';\n  return (S.weight_range || 'Check their weight: we size slices for dogs from {lo} to {hi}.')\n    .replace('{lo}', unit === 'kg' ? '0.5' : String(W_LB[0])).replace('{hi}', unit === 'kg' ? Math.round(W_LB[1] * LB) + ' kg' : W_LB[1] + ' lb');\n}\n\n// The number on the sign: whole years, 1 to 30. Anything else gets a note, never a quiet swap.\nexport function ageNote(raw, mode, bad, S = {}) {\n  const s = String(raw ?? '').trim();\n  const blank = mode === 'gotcha' ? (S.age_blank_g || 'Home for good') : (S.age_blank || 'Party time');\n  if (bad) return (S.age_nan || 'Numbers only for the sign. Leave it blank for a \\u201c{b}\\u201d sign.').replace('{b}', blank);\n  if (s === '') return '';\n  const v = Number(s);\n  if (!Number.isFinite(v)) return (S.age_nan || 'Numbers only for the sign. Leave it blank for a \\u201c{b}\\u201d sign.').replace('{b}', blank);\n  const a = Math.round(v);\n  if (a < 1 || a > 30) return (S.age_range || 'Signs count from 1 to 30 years, so this one says \\u201c{b}\\u201d.').replace('{b}', blank);\n  if (a !== v) return (S.age_whole || 'Whole years on the sign, so it says {n}.').replace('{n}', a);\n  return '';\n}\n\nconst FR = { 0: '', 1: '\u00BC', 2: '\u00BD', 3: '\u00BE' };\nexport function fmtQuarters(q) {\n  const w = Math.floor(q / 4), f = FR[q % 4];\n  return (w ? String(w) : '') + f || '0';\n}\nconst EIGHTHS = { 0: '', 1: '\u215B', 2: '\u00BC', 3: '\u215C', 4: '\u00BD', 5: '\u215D', 6: '\u00BE', 7: '\u215E' };\n// Rough kitchen measure for a weight; grams stay the reference.\nexport function measure(id, g) {\n  if (id === 'egg') return '';\n  const cups = g / G_CUP[id];\n  const tbsp = cups * 16;\n  if (tbsp < 3.5) {\n    const t = Math.max(0.5, Math.round(tbsp * 2) / 2);\n    return (Number.isInteger(t) ? String(t) : (Math.floor(t) || '') + '\u00BD') + ' Tbsp';\n  }\n  const e = Math.round(cups * 8);\n  const w = Math.floor(e / 8);\n  const txt = (w ? String(w) : '') + EIGHTHS[e % 8];\n  return txt + (e > 8 ? ' cups' : ' cup');\n}\nexport function eggs(mult) {\n  const w = Math.floor(mult), half = mult % 1 >= 0.5;\n  return (w ? String(w) : '') + (half ? '\u00BD' : '');\n}\nexport const scale = (list, mult) => list.map(([id, g]) => [id, Math.round(g * mult)]);\n\nexport const ING = {\n  flour: 'whole wheat flour', rice_flour: 'white rice flour', pumpkin: 'plain canned pumpkin, not pie filling', pb: 'peanut butter, xylitol-free and unsalted',\n  egg: 'egg', banana: 'ripe banana, mashed', yogurt: 'plain unsweetened yogurt', water: 'water'\n};\n// The bold amount in a recipe line; the server-rendered recipe uses the same text for the default batch.\nexport function amount(id, g, mult) {\n  if (id === 'egg') return eggs(mult) + ' ' + (mult > 1 ? 'eggs' : 'egg');\n  const m = measure(id, g);\n  return g + ' g' + (m ? ' (about ' + m + ')' : '');\n}\n// Method lines follow the swaps. Swapped batter is untested, so no clock time. Topper: one extra step before the last.\nexport function methodSteps(text, rc, S = {}) {\n  let out = String(text || '').split(/\\r?\\n/).map((x) => adaptStep(x.trim(), rc.swaps.join(''))).filter(Boolean).slice(0, 8);\n  if (rc.swaps.length) out = out.map((x) => (/\\bminutes?\\b/i.test(x) ? (S.step_swap || 'Bake until a toothpick comes out clean. Swapped batter isn\\u2019t tested, so go by the toothpick, not the clock.') : x));\n  if (rc.topper) out.splice(Math.max(0, out.length - 1), 0, S.topper_step || 'Add one mini dog biscuit on top of each.');\n  return out;\n}\n// Pandoy's recipe rewritten in place for one dog: amounts for the batch, plus the yield.\nexport function scaled(x, topper, mult) {\n  const rc = recipe(x, topper);\n  const rows = (list) => scale(list, mult).map(([id, g]) => [id, g, amount(id, g, mult)]);\n  return { rc, mult, minis: Math.round(BASE.minis * mult), batter: rows(rc.batter), frosting: rows(rc.frosting) };\n}\n\nexport const cleanName = (s) => String(s || '').replace(/[<>{}\\\\]/g, '').replace(/\\s+/g, ' ').trim().slice(0, 18);\nexport function signLines(mode, name, age) {\n  const n = cleanName(name);\n  const a = Math.round(Number(age));\n  const ok = Number.isFinite(a) && a > 0 && a <= 30;\n  if (mode === 'gotcha') {\n    return { top: 'Happy Gotcha Day', name: n, num: ok ? String(a) : '', unit: ok ? (a === 1 ? 'year home' : 'years home') : '', line: ok ? '' : 'Home for good' };\n  }\n  return { top: 'Happy Birthday', name: n, num: ok ? String(a) : '', unit: ok ? 'today' : '', line: ok ? '' : 'Party time' };\n}\n\n// Share state (#r=): name, age, weight, unit, allergies, health flag, dogs at the party, biscuit topper.\nconst KEYS = ['n', 'a', 'w', 'u', 'x', 'h', 'g', 'b'];\nexport function encode(st) {\n  const p = new URLSearchParams();\n  for (const k of KEYS) {\n    const v = st[k];\n    if (v === '' || v == null || v === false) continue;\n    p.set(k, v === true ? '1' : String(v));\n  }\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, k === 'n' ? 18 : 6);\n  if (st.n != null) st.n = cleanName(st.n);\n  if (st.x != null) st.x = ALLERGIES.filter((c) => st.x.includes(c)).join('');\n  return st;\n}\n\n// Sign layout on a 4:5 canvas (unit = width / 1200). Deterministic confetti so preview and download match.\nexport const SIGN = { w: 2400, h: 3000 };\nconst PAL = {\n  birthday: { arch: '#FED4BE', flags: ['#EE7F23', '#19365B', '#FED4BE', '#E6E3FA'] },\n  gotcha: { arch: '#E6E3FA', flags: ['#19365B', '#EE7F23', '#E6E3FA', '#FED4BE'] }\n};\nconst INK = '#19365B', SURFACE = '#FDF7EE', ACCENT = '#EE7F23';\nexport function confetti(n) {\n  let s = 7;\n  const rnd = () => ((s = (s * 16807) % 2147483647) / 2147483647);\n  const out = [];\n  while (out.length < n) {\n    const x = rnd(), y = 0.16 + rnd() * 0.7;\n    if (x > 0.08 && x < 0.92) continue; // outside the arch only\n    out.push({ x, y, r: 6 + rnd() * 10, c: Math.floor(rnd() * 3) });\n  }\n  return out;\n}\n\n// Cover-fits an image into a circle (the user's photo on the sign).\nfunction circleImage(ctx, img, cx, cy, r) {\n  const iw = img.naturalWidth || img.width, ih = img.naturalHeight || img.height;\n  if (!iw || !ih) return;\n  const s = Math.max((2 * r) / iw, (2 * r) / ih);\n  ctx.save();\n  ctx.beginPath(); ctx.arc(cx, cy, r, 0, Math.PI * 2); ctx.clip();\n  ctx.drawImage(img, cx - (iw * s) / 2, cy - (ih * s) / 2, iw * s, ih * s);\n  ctx.restore();\n}\n\n// art: the tool drawing (main image, or a corner sticker when photo is set). photo: the user's own image, on-device only.\nexport function drawSign(ctx, W, H, L, mode, logo, art, photo) {\n  const u = W / 1200, P = PAL[mode] || PAL.birthday;\n  const DISPLAY = \"'Recoleta Bold', Georgia, serif\", HAND = \"'Amatic SC Bold', 'Comic Sans MS', cursive\";\n  ctx.save();\n  ctx.fillStyle = SURFACE; ctx.fillRect(0, 0, W, H);\n  // bunting\n  const bx0 = -20 * u, bx1 = W + 20 * u, by = 70 * u, sag = 90 * u, flags = 11;\n  ctx.strokeStyle = INK; ctx.lineWidth = 4 * u;\n  ctx.beginPath(); ctx.moveTo(bx0, by); ctx.quadraticCurveTo(W / 2, by + sag * 2, bx1, by); ctx.stroke();\n  const yAt = (t) => (1 - t) * (1 - t) * by + 2 * (1 - t) * t * (by + sag * 2) + t * t * by;\n  for (let i = 0; i < flags; i++) {\n    const t0 = (i + 0.15) / flags, t1 = (i + 0.85) / flags, tm = (t0 + t1) / 2;\n    const x0 = bx0 + (bx1 - bx0) * t0, x1 = bx0 + (bx1 - bx0) * t1, xm = bx0 + (bx1 - bx0) * tm;\n    ctx.fillStyle = P.flags[i % P.flags.length];\n    ctx.beginPath(); ctx.moveTo(x0, yAt(t0)); ctx.lineTo(x1, yAt(t1)); ctx.lineTo(xm, yAt(tm) + 120 * u); ctx.closePath(); ctx.fill();\n    ctx.lineWidth = 3 * u; ctx.stroke();\n  }\n  // confetti\n  for (const d of confetti(26)) {\n    ctx.fillStyle = [ACCENT, INK, P.flags[2]][d.c];\n    ctx.beginPath(); ctx.arc(d.x * W, d.y * H, d.r * u, 0, Math.PI * 2); ctx.fill();\n  }\n  // arch\n  const ax = 130 * u, aw = W - 260 * u, ay = 300 * u, ah = 1010 * u, ar = aw / 2;\n  ctx.fillStyle = P.arch;\n  ctx.beginPath(); ctx.moveTo(ax, ay + ah); ctx.lineTo(ax, ay + ar); ctx.arc(ax + ar, ay + ar, ar, Math.PI, 0); ctx.lineTo(ax + aw, ay + ah);\n  ctx.arcTo(ax + aw, ay + ah + 40 * u, ax + aw - 40 * u, ay + ah + 40 * u, 40 * u); ctx.lineTo(ax + 40 * u, ay + ah + 40 * u);\n  ctx.arcTo(ax, ay + ah + 40 * u, ax, ay + ah, 40 * u); ctx.closePath(); ctx.fill();\n  ctx.textAlign = 'center'; ctx.textBaseline = 'alphabetic';\n  const fit = (txt, font, max, start, min) => {\n    let s = start;\n    ctx.font = font.replace('{s}', s * u);\n    while (s > min && ctx.measureText(txt).width > max) { s -= 4; ctx.font = font.replace('{s}', s * u); }\n    return s;\n  };\n  // Picture in the dome: the drawing by default; the user's photo (round, inked rim) with the drawing as a corner sticker.\n  const pcx = W / 2, pcy = ay + 300 * u;\n  const hasPhoto = !!(photo && (photo.naturalWidth || photo.width));\n  const hasArt = !!(art && art.naturalWidth);\n  if (hasPhoto) {\n    const r = 255 * u;\n    ctx.fillStyle = '#FFFFFF'; ctx.beginPath(); ctx.arc(pcx, pcy, r + 16 * u, 0, Math.PI * 2); ctx.fill();\n    circleImage(ctx, photo, pcx, pcy, r);\n    ctx.strokeStyle = INK; ctx.lineWidth = 6 * u;\n    ctx.beginPath(); ctx.arc(pcx, pcy, r + 16 * u, 0, Math.PI * 2); ctx.stroke();\n    if (hasArt) {\n      const s = 250 * u;\n      ctx.save(); ctx.translate(pcx + 250 * u, pcy + 170 * u); ctx.rotate(0.12);\n      ctx.drawImage(art, -s / 2, -s / 2, s, s);\n      ctx.restore();\n    }\n  } else if (hasArt) {\n    const s = 560 * u;\n    ctx.drawImage(art, pcx - s / 2, pcy - s / 2 + 10 * u, s, s);\n  }\n  // Age sticker overlapping the picture (opposite corner from the photo sticker).\n  if (L.num) {\n    const r = 112 * u, bx = hasPhoto ? pcx - 255 * u : pcx + 250 * u, byy = pcy + 190 * u;\n    ctx.fillStyle = ACCENT; ctx.beginPath(); ctx.arc(bx, byy, r, 0, Math.PI * 2); ctx.fill();\n    ctx.strokeStyle = '#FFFFFF'; ctx.lineWidth = 8 * u; ctx.stroke();\n    ctx.fillStyle = '#FFFFFF';\n    fit(L.num, '900 {s}px ' + DISPLAY, r * 1.4, 120, 50);\n    ctx.fillText(L.num, bx, byy + 26 * u);\n    fit(L.unit, 'bold {s}px ' + HAND, r * 1.6, 52, 30);\n    ctx.fillText(L.unit, bx, byy + 78 * u);\n  }\n  ctx.fillStyle = INK;\n  const topY = ay + 760 * u;\n  fit(L.top, 'bold {s}px ' + HAND, aw - 140 * u, 150, 80);\n  ctx.fillText(L.top, W / 2, topY);\n  const name = L.name || '';\n  const ns = fit(name + (name ? '!' : ''), '900 {s}px ' + DISPLAY, aw - 120 * u, 190, 70);\n  const nameY = topY + 30 * u + ns * u * 0.9;\n  if (name) ctx.fillText(name + '!', W / 2, nameY);\n  if (!L.num && L.line) {\n    fit(L.line, 'bold {s}px ' + HAND, aw - 160 * u, 90, 50);\n    ctx.fillText(L.line, W / 2, Math.min(nameY + 110 * u, ay + ah + 10 * u));\n  }\n  // wordmark\n  const fy = 1400 * u;\n  if (logo && logo.naturalWidth) {\n    const lh = 110 * u, lw = lh * logo.naturalWidth / logo.naturalHeight;\n    ctx.drawImage(logo, W / 2 - lw / 2, fy - lh / 2 - 20 * u, lw, lh);\n  } else {\n    ctx.fillStyle = INK; ctx.font = '900 ' + 64 * u + 'px ' + DISPLAY;\n    ctx.fillText('Sniff & Bark', W / 2, fy);\n  }\n  ctx.restore();\n}\n\nif (typeof window !== 'undefined' && window.customElements && !customElements.get('snb-dog-birthday')) {\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  let fontsP = null;\n  const fonts = () => fontsP || (fontsP = Promise.race([\n    Promise.all([\"900 100px 'Recoleta Bold'\", \"bold 100px 'Amatic SC Bold'\"].map((f) => document.fonts.load(f))).catch(() => null),\n    new Promise((r) => setTimeout(r, 3000))\n  ]));\n  const logos = {};\n  const loadLogo = (src) => logos[src] || (logos[src] = new Promise((res) => {\n    if (!src) return res(null);\n    const i = new Image();\n    i.crossOrigin = 'anonymous';\n    i.onload = () => res(i); i.onerror = () => res(null);\n    i.src = src;\n  }));\n\n  // Party checklist (server-rendered in the guide): ticks persist on this device only.\n  const initChecklists = () => {\n    for (const list of document.querySelectorAll('[data-bd-checklist]')) {\n      if (list.hasAttribute('data-bd-ready')) continue;\n      list.setAttribute('data-bd-ready', '');\n      const key = 'snb.bd.' + (list.dataset.bdChecklist || 'birthday');\n      const boxes = [...list.querySelectorAll('input[type=checkbox][data-id]')];\n      const out = list.querySelector('[data-bd-progress]');\n      let saved = [];\n      try { saved = JSON.parse(localStorage.getItem(key) || '[]'); } catch (e) { saved = []; }\n      boxes.forEach((b) => { b.checked = saved.includes(b.dataset.id); });\n      const sync = () => {\n        const on = boxes.filter((b) => b.checked);\n        if (out) {\n          out.textContent = (out.dataset.tpl || '{n} of {t} planned').replace('{n}', on.length).replace('{t}', boxes.length);\n          list.toggleAttribute('data-bd-done', on.length === boxes.length);\n        }\n        try { localStorage.setItem(key, JSON.stringify(on.map((b) => b.dataset.id))); } catch (e) { /* private mode */ }\n      };\n      list.addEventListener('change', sync);\n      sync();\n    }\n  };\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initChecklists); else initChecklists();\n\n  class DogBirthday extends HTMLElement {\n    connectedCallback() {\n      if (this.hasAttribute('data-snb-mounted')) return;\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 === 'gotcha' ? 'gotcha' : 'birthday';\n      const tool = mode === 'gotcha' ? 'dog-gotcha-day' : 'dog-birthday';\n      const S = cfg.strings || {};\n      const uid = 'bd' + 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({ n: '', a: '', w: '', u: cfg.unit === 'kg' ? 'kg' : 'lb', x: '', h: '', g: '1', b: '' }, decode(frag));\n      let started = false, lastKey = '', timer = 0, signTimer = 0, signKey = '';\n\n      const field = (label, input, hint) => h('label', { class: 'bd-f' }, h('span', { class: 'bd-l', text: label }), input, hint ? h('small', { class: 'dt-muted', text: hint }) : null);\n      const nameIn = h('input', { type: 'text', 'data-k': 'n', maxlength: 18, autocomplete: 'off', autocapitalize: 'words', enterkeyhint: 'next', value: st.n, placeholder: S.name_ph || 'Your dog\\u2019s name' });\n      const ageIn = h('input', { type: 'number', inputmode: 'numeric', 'data-k': 'a', min: 1, max: 30, step: 1, value: st.a, 'aria-describedby': uid + 'an' });\n      const wIn = h('input', { type: 'number', inputmode: 'decimal', 'data-k': 'w', min: st.u === 'kg' ? 0.5 : W_LB[0], max: st.u === 'kg' ? Math.round(W_LB[1] * LB) : W_LB[1], step: 0.5, value: st.w, 'aria-describedby': uid + 'wh' });\n      const unitBox = h('div', { class: 'bd-seg', role: 'radiogroup', 'aria-label': S.unit || 'Units' },\n        ['lb', 'kg'].map((v) => h('label', { class: 'bd-pill' }, h('input', { type: 'radio', name: uid + 'u', value: v, 'data-k': 'u', checked: st.u === v }), h('span', { text: v }))));\n      const sizeBtns = h('div', { class: 'bd-chips', role: 'group', 'aria-label': S.sizes || 'Or tap a size' },\n        Object.entries(SIZES).map(([k, lb]) => h('button', { type: 'button', class: 'bd-chip', 'data-size': k, text: (S['size_' + k] || k[0].toUpperCase() + k.slice(1)) })));\n      const check = (c, label) => h('label', { class: 'bd-check' }, h('input', { type: 'checkbox', 'data-x': c, checked: st.x.includes(c) }), h('span', { text: label }));\n      const healthBox = h('label', { class: 'bd-check' }, h('input', { type: 'checkbox', 'data-k': 'h', checked: st.h === '1' }), h('span', { text: S.health || 'Diabetes, pancreatitis or a prescription diet' }));\n      const topperBox = h('label', { class: 'bd-check' }, h('input', { type: 'checkbox', 'data-k': 'b', checked: st.b === '1' }), h('span', { text: S.topper_opt || 'Mini dog biscuit on top (we count 10 kcal)' }));\n      const guestsIn = h('input', { type: 'number', inputmode: 'numeric', 'data-k': 'g', min: 1, max: MAX_DOGS, step: 1, value: st.g, 'aria-describedby': uid + 'gn' });\n      // Out-of-range notes sit under their own field and are read out when they appear.\n      const ageNoteEl = h('p', { class: 'bd-note', id: uid + 'an', role: 'status', hidden: true });\n      const guestNoteEl = h('p', { class: 'bd-note', id: uid + 'gn', role: 'status', hidden: true });\n      const bad = { a: false, w: false, g: false };\n      let guests = guestCount(st.g);\n      // A shared link can carry any number: show the one we use.\n      if (guests.issue) { st.g = String(guests.n); guestsIn.value = st.g; }\n      const showNote = (el, txt) => { if (el.textContent !== txt) el.textContent = txt; el.hidden = !txt; };\n      const setWeightRange = () => {\n        wIn.min = st.u === 'kg' ? '0.5' : String(W_LB[0]);\n        wIn.max = String(st.u === 'kg' ? Math.round(W_LB[1] * LB) : W_LB[1]);\n      };\n\n      const form = h('form', { class: 'bd-form', novalidate: true, onsubmit: (e) => e.preventDefault() },\n        h('div', { class: 'bd-row' },\n          field(S.name || 'Their name', nameIn),\n          field(mode === 'gotcha' ? (S.years || 'Years home') : (S.age || 'Turning'), ageIn)),\n        ageNoteEl,\n        h('div', { class: 'bd-row bd-row--w' }, field(S.weight || 'Their weight', wIn), unitBox),\n        h('p', { class: 'bd-hint dt-muted', id: uid + 'wh', text: S.weight_hint || 'Weight sets the slice. Not sure? Tap the closest size.' }),\n        sizeBtns,\n        h('fieldset', { class: 'bd-f' }, h('legend', { class: 'bd-l', text: S.skip || 'Leave out (allergies or tummy trouble)' }),\n          h('div', { class: 'bd-checks' }, check('p', S.x_p || 'Peanut butter'), check('d', S.x_d || 'Dairy'), check('w', S.x_w || 'Wheat'), check('e', S.x_e || 'Egg'), healthBox)),\n        h('div', { class: 'bd-checks' }, topperBox),\n        field(S.guests || 'Dogs at the party', guestsIn),\n        guestNoteEl);\n\n      const cake = h('div', { class: 'bd-out', 'aria-live': 'polite' });\n      const cakeEmpty = h('p', { class: 'bd-empty dt-muted', text: S.empty || 'Add their weight and their pupcake slice shows up here.' });\n      cake.append(cakeEmpty);\n      const canvas = h('canvas', { class: 'bd-canvas', width: 480, height: 600, role: 'img', 'aria-label': '' });\n      // Their own photo on the sign: read on-device only (object URL), never uploaded or stored.\n      let photo = null, photoUrl = '';\n      const photoIn = h('input', { type: 'file', accept: 'image/*', class: 'bd-photo-in', id: uid + 'ph' });\n      const photoLbl = h('label', { class: 'dt-btn dt-btn--ghost bd-photo-btn', for: uid + 'ph', text: S.photo_add || 'Add their photo' });\n      const photoRm = h('button', { type: 'button', class: 'bd-photo-rm', hidden: true, text: S.photo_rm || 'Use the drawing instead' });\n      const signBox = h('div', { class: 'bd-sign', hidden: true },\n        h('h3', { class: 'bd-h3', text: mode === 'gotcha' ? (S.sign_h_g || 'Their Gotcha Day sign') : (S.sign_h || 'Their birthday sign') }),\n        h('div', { class: 'bd-frame' }, canvas),\n        h('div', { class: 'bd-photo' }, photoIn, photoLbl, photoRm),\n        h('div', { class: 'bd-actions' },\n          h('button', { type: 'button', class: 'dt-btn', 'data-act': 'png', text: S.download || 'Download sign (PNG)' }),\n          h('button', { type: 'button', class: 'dt-btn dt-btn--ghost', 'data-act': 'print', text: S.print || 'Print it' })),\n        h('p', { class: 'bd-hint dt-muted', text: S.sign_hint || 'Prints on letter or A4 paper. Made on your device; nothing is uploaded.' }));\n      const signEmpty = h('p', { class: 'bd-empty dt-muted', text: S.sign_empty || 'Type their name and their sign appears here.' });\n      const shareHost = h('div', { class: 'bd-share' });\n      const signWrap = h('div', { class: 'bd-out bd-out--sign', 'aria-live': 'polite' }, signEmpty, signBox, shareHost);\n      mount.replaceChildren(form, cake, signWrap);\n\n      // The Birthday / Gotcha Day switch carries the typed state to the sibling page.\n      const other = this.closest('[data-bd-root]')?.querySelector('[data-bd-other]');\n      const kg = () => { const w = Number(st.w); return w > 0 ? (st.u === 'kg' ? w : w * LB) : 0; };\n\n      const li = ([id, g, amt]) => h('li', null, h('strong', { text: amt }), id === 'egg' ? ' (about ' + g + ' g)' : ' ' + (S['i_' + id] || ING[id]));\n\n      // Pandoy's recipe is server-rendered once (default batch, for crawlers and JSON-LD); a result rewrites its\n      // amounts, yield and method in place, and Reset puts the original text back.\n      const rx = this.closest('[data-bd-root]')?.querySelector('[data-bd-recipe]');\n      const q = (sel) => (rx ? rx.querySelector(sel) : null);\n      const R = { yield: q('[data-bd-yield]'), batter: q('[data-bd-list=batter]'), frosting: q('[data-bd-list=frosting]'), steps: q('[data-bd-steps]') };\n      const pan = q('[data-bd-pan]'), note = q('[data-bd-scaled]'), noteText = q('[data-bd-scaled-text]'), resetBtn = q('[data-bd-reset]');\n      const ssr = Object.fromEntries(Object.entries(R).map(([k, el]) => [k, el ? el.innerHTML : '']));\n      let rxHeld = false;\n      const rxReset = () => {\n        if (!rx || !rx.hasAttribute('data-bd-on')) return;\n        for (const [k, el] of Object.entries(R)) if (el) el.innerHTML = ssr[k];\n        if (pan) pan.hidden = false;\n        if (note) note.hidden = true;\n        rx.removeAttribute('data-bd-on');\n      };\n      const rxScale = (sc, nm, sliceTxt, party) => {\n        if (!rx || rxHeld || !R.batter || !R.frosting || !R.steps) return;\n        const { rc, mult } = sc;\n        const untested = rc.swaps.length > 0;\n        const b = mult === 1 ? (S.full || 'full') : mult === 0.5 ? (S.half || 'half') : (S.times || '{m}\\u00d7').replace('{m}', String(mult).replace('.5', '\\u00bd'));\n        const yieldTxt = (untested ? (S.batch_swap || 'A {b} batch makes roughly {n} mini pupcakes, about {k} kcal each. Swaps may change the yield.') : (S.batch || 'A {b} batch makes about {n} mini pupcakes, {k} kcal each.'))\n          .replace('{b}', b).replace('{n}', sc.minis).replace('{k}', Math.round(rc.perMini));\n        if (R.yield) R.yield.replaceChildren(h('strong', { text: sliceTxt }), ' ' + yieldTxt + (party ? ' ' + party : ''));\n        // Same ingredients as the page text: only the bold amounts change, so its wording and links stay.\n        const inPlace = (el, rows, k) => {\n          el.innerHTML = ssr[k];\n          const items = el.querySelectorAll(':scope > li');\n          if (untested || items.length < rows.length) return false;\n          rows.forEach(([id, g, amt], i) => {\n            const s = items[i].querySelector('strong');\n            if (s) s.textContent = amt;\n            if (id === 'egg' && s && s.nextSibling) s.nextSibling.textContent = ' (about ' + g + ' g)';\n          });\n          return true;\n        };\n        if (!inPlace(R.batter, sc.batter, 'batter')) R.batter.replaceChildren(...sc.batter.map(li));\n        const keep = inPlace(R.frosting, sc.frosting, 'frosting');\n        if (keep) [...R.frosting.querySelectorAll(':scope > li')].slice(sc.frosting.length).forEach((x) => x.remove());\n        R.frosting.replaceChildren(...(keep ? R.frosting.children : sc.frosting.map(li)), h('li', { text: rc.topper\n          ? (S.topper_line || 'One mini dog biscuit on each. We count it as 10 kcal to stay on the safe side; check your pack.') + (untested ? ' ' + (S.topper_free || 'Pick one with no {a}.').replace('{a}', rc.swaps.map((c) => TOPPER_FREE[c]).join(', ')) : '')\n          : (S.topper_none || 'No biscuit on top: the slice is just the pupcake. Tick the biscuit box to add one.') }));\n        R.steps.replaceChildren(...methodSteps(cfg.steps, rc, S).map((x) => h('li', { text: x })));\n        // The one-pan note is written for a full, unswapped batch.\n        if (pan) pan.hidden = mult !== 1 || untested;\n        if (note && noteText) { noteText.textContent = (S.scaled || 'Scaled for {name}.').replace('{name}', nm); note.hidden = false; }\n        rx.setAttribute('data-bd-on', '');\n      };\n      resetBtn?.addEventListener('click', () => {\n        rxHeld = true;\n        rxReset();\n        renderCake();\n        rx.focus({ preventScroll: true });\n      });\n\n      const renderCake = () => {\n        const wIssue = bad.w ? 'nan' : weightIssue(st.w, st.u);\n        if (wIssue) {\n          cake.replaceChildren(h('p', { class: 'bd-empty bd-empty--check', text: weightNote(wIssue, st.u, S) }));\n          rxReset();\n          return null;\n        }\n        const w = kg();\n        if (!w) { cake.replaceChildren(cakeEmpty); rxReset(); return null; }\n        const rc = recipe(st.x, st.b === '1');\n        const p = portion(w, rc.perMini);\n        const dogs = guests.n;\n        const b = batchFor(dogs, p.tiny ? 1 : p.quarters);\n        const vet = st.h === '1';\n        const nm = cleanName(st.n) || (S.they || 'your dog');\n        const wTxt = st.u === 'kg' ? r1(w) + ' kg' : Math.round(w / LB) + ' lb';\n        const head = vet ? (S.vet_h || 'Ask your vet before any cake')\n          : p.tiny ? (S.tiny_h || 'A fingertip of frosting')\n            : (S.slice_h || 'Up to {q}').replace('{q}', fmtQuarters(p.quarters) + ' ' + (p.quarters > 4 ? (S.minis || 'mini pupcakes') : (S.mini || 'mini pupcake')));\n        const line = vet ? (S.vet_line || 'With diabetes, pancreatitis or a prescription diet, even a small treat can matter. Your vet can say yes, no or how much. The sign and the party ideas still work.')\n          : p.tiny ? (S.tiny_line || 'Even a quarter pupcake is more than the 10% treat allowance (about {a} kcal a day) for {w}. A lick of frosting or one piece of their usual food on a plate is plenty.').replace('{a}', Math.round(p.allowance)).replace('{w}', wTxt)\n            : (S.slice_line || 'About {k} kcal ({s}): inside the 10% treat allowance (about {a} kcal) for {name} at {w}. Skip other treats that day.').replace('{k}', Math.round(p.kcal))\n              .replace('{s}', rc.topper ? (S.with_topper || 'biscuit topper counted as 10 kcal') : (S.no_topper || 'no biscuit on top')).replace('{a}', Math.round(p.allowance)).replace('{name}', nm).replace('{w}', wTxt);\n        const swaps = { p: S.sw_p || 'Banana instead of peanut butter', d: S.sw_d || 'Pumpkin frosting instead of yogurt', w: S.sw_w || 'Rice flour instead of wheat', e: S.sw_e || 'Extra pumpkin instead of egg' };\n        const untested = rc.swaps.length > 0;\n        if (vet) rxReset();\n        else {\n          const sliceTxt = (p.tiny ? (S.rx_tiny || '{name}\\u2019s slice: a lick of frosting.') : (S.rx_slice || '{name}\\u2019s slice: up to {q}.'))\n            .replace('{name}', nm).replace('{q}', fmtQuarters(p.quarters) + ' ' + (p.quarters > 4 ? (S.minis || 'mini pupcakes') : (S.mini || 'mini pupcake')));\n          const party = [basisText(b, p.tiny ? 1 : p.quarters, S, p.tiny), p.tiny ? '' : (S.rule || 'Every slice stays inside the 10% treat rule, so slices are small on purpose.'), partyText(guests, nm, S)].filter(Boolean).join(' ');\n          rxScale(scaled(st.x, rc.topper, b.mult), nm, sliceTxt, party);\n        }\n        cake.replaceChildren(h('div', { class: 'bd-res' + (vet ? ' bd-res--vet' : '') },\n          h('p', { class: 'bd-kicker', text: S.kicker || 'Their pupcake slice' }),\n          h('h3', { class: 'bd-verdict', text: head }),\n          h('p', { class: 'bd-line', text: line }),\n          vet ? null : h('p', { class: 'bd-basis', 'data-bd-basis': '', text: basisText(b, p.tiny ? 1 : p.quarters, S, p.tiny) }),\n          untested ? h('p', { class: 'bd-swaps' }, h('strong', { text: (S.untested || 'Untested suggestion') + ': ' }), rc.swaps.map((c) => swaps[c]).join(' \\u00b7 ') + '. ' + (S.untested_line || 'We haven\\u2019t kitchen-tested swaps, so texture and bake time may change.')) : null,\n          !vet && rx && !rxHeld ? h('a', { class: 'bd-jump', href: '#' + (rx.id || 'dog-birthday-recipe'), text: (S.jump || 'Pandoy\\u2019s recipe below is now scaled for {name} \\u2193').replace('{name}', nm) }) : null));\n        return { key: tool + ':party', variant: vet ? 'vet' : p.tiny ? 'tiny' : 'slice', q: p.quarters };\n      };\n\n      const drawPreview = () => {\n        const L = signLines(mode, st.n, st.a);\n        if (!L.name) { signBox.hidden = true; signEmpty.hidden = false; shareHost.replaceChildren(); return null; }\n        signBox.hidden = false; signEmpty.hidden = true;\n        canvas.setAttribute('aria-label', [L.top, L.name, L.num ? L.num + ' ' + L.unit : L.line].join(', '));\n        const k = L.top + L.name + L.num + (photo ? photoUrl : '');\n        if (k !== signKey) {\n          signKey = k;\n          clearTimeout(signTimer);\n          signTimer = setTimeout(() => Promise.all([fonts(), loadLogo(cfg.logo), loadLogo(cfg.art)]).then(([, logo, art]) => {\n            const dpr = Math.min(2, window.devicePixelRatio || 1);\n            canvas.width = 480 * dpr; canvas.height = 600 * dpr;\n            drawSign(canvas.getContext('2d'), canvas.width, canvas.height, signLines(mode, st.n, st.a), mode, logo, art, photo);\n          }), 120);\n        }\n        return L;\n      };\n\n      const setPhoto = (file) => {\n        if (photoUrl) URL.revokeObjectURL(photoUrl);\n        photo = null; photoUrl = '';\n        photoRm.hidden = true; photoLbl.textContent = S.photo_add || 'Add their photo';\n        if (file && /^image\\//.test(file.type)) {\n          photoUrl = URL.createObjectURL(file);\n          const img = new Image();\n          img.onload = () => {\n            photo = img; photoRm.hidden = false; photoLbl.textContent = S.photo_change || 'Change photo';\n            signKey = ''; drawPreview();\n          };\n          img.onerror = () => { URL.revokeObjectURL(img.src); photoUrl = ''; };\n          img.src = photoUrl;\n        }\n        signKey = ''; drawPreview();\n      };\n      photoIn.addEventListener('change', () => { setPhoto(photoIn.files && photoIn.files[0]); photoIn.value = ''; });\n      photoRm.addEventListener('click', () => setPhoto(null));\n\n      const fullSign = () => Promise.all([fonts(), loadLogo(cfg.logo), loadLogo(cfg.art)]).then(([, logo, art]) => {\n        const c = document.createElement('canvas');\n        c.width = SIGN.w; c.height = SIGN.h;\n        const L = signLines(mode, st.n, st.a);\n        drawSign(c.getContext('2d'), c.width, c.height, L, mode, logo, art, photo);\n        const blob = () => new Promise((res, rej) => c.toBlob((b) => (b ? res(b) : rej(new Error('blob'))), 'image/png'));\n        // A cross-origin logo or drawing can taint the canvas: redraw with the text wordmark and the photo only.\n        return blob().catch(() => { drawSign(c.getContext('2d'), c.width, c.height, L, mode, null, null, photo); return blob(); }).then((b) => ({ b, L }));\n      });\n      const fileName = (L) => (L.name.replace(/[^\\w-]+/g, '-').replace(/^-|-$/g, '') || 'dog') + (mode === 'gotcha' ? '-gotcha-day' : '-birthday') + '-sign.png';\n      signBox.addEventListener('click', (e) => {\n        const btn = e.target.closest('[data-act]');\n        if (!btn) return;\n        const act = btn.dataset.act;\n        btn.disabled = true;\n        fullSign().then(({ b, L }) => {\n          const url = URL.createObjectURL(b);\n          if (act === 'png') {\n            const a = h('a', { href: url, download: fileName(L) });\n            document.body.append(a); a.click(); a.remove();\n          } else {\n            document.querySelector('.bd-print')?.remove();\n            const img = h('img', { class: 'bd-print', src: url, alt: '' });\n            document.body.append(img);\n            img.decode().catch(() => {}).then(() => { window.print(); });\n          }\n          setTimeout(() => URL.revokeObjectURL(url), 60000);\n          push({ event: 'dogtool_share', tool, channel: act === 'png' ? 'sign_png' : 'sign_print' });\n          if (lastSig !== 'gift') emit({ key: tool + ':gift', variant: 'sign' }, 'gift');\n        }).catch(() => {}).finally(() => { btn.disabled = false; });\n      });\n\n      // \u00A722 shared share component (dogtools-core chunk): a badge card with the greeting.\n      let shareApi = null, shareLoading = false, pendingOpts = null;\n      const mountShare = (L) => {\n        const sub = L.num ? L.num + ' ' + L.unit : L.line;\n        const hash = '#r=' + encodeURIComponent(encode(st));\n        const opts = {\n          slug: tool,\n          url: location.origin + location.pathname + hash,\n          title: L.top + ', ' + L.name + '!',\n          text: (mode === 'gotcha' ? (S.share_text_g || 'Happy Gotcha Day, {name}! {sub}.') : (S.share_text || 'Happy Birthday, {name}! {sub}.')).replace('{name}', L.name).replace('{sub}', sub),\n          tag: { line1: L.name.slice(0, 18), line2: (L.top).slice(0, 28) },\n          invite: mode === 'gotcha' ? (S.invite_g || 'Planning a Gotcha Day? Make their sign \\u2192') : (S.invite || 'Birthday coming up? Make their sign \\u2192'),\n          card: { layout: 'badge', headline: L.top, fields: L.num\n            ? { title: L.name + '!', sub, seal: L.num, ring: mode === 'gotcha' ? (L.num === '1' ? 'YEAR HOME' : 'YEARS HOME') : 'BIRTHDAY' }\n            : { title: L.name + '!', sub, mark: 'heart', ring: mode === 'gotcha' ? 'GOTCHA DAY' : 'BIRTHDAY' } },\n          artSticker: true,\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          const b = h('button', { type: 'button', class: 'dt-btn dt-btn--ghost', text: S.share || 'Share the link' });\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      let lastSig = '';\n      const emit = (r, sig) => {\n        lastSig = sig;\n        this.dispatchEvent(new CustomEvent('snb:tool-result', { bubbles: true, composed: true, detail: { v: 1, tool, key: r.key, mode: 'info', risk: 'none', confidence: 1, data: { variant: r.variant } } }));\n        push({ event: 'dogtool_result', tool, key: r.key, mode: 'info', risk: 'none', verdict: r.variant });\n      };\n\n      const render = () => {\n        showNote(guestNoteEl, guestNote(guests, cleanName(st.n), S));\n        showNote(ageNoteEl, ageNote(st.a, mode, bad.a, S));\n        const r = renderCake();\n        const L = drawPreview();\n        if (L) mountShare(L);\n        const hash = '#r=' + encodeURIComponent(encode(st));\n        if (other) other.setAttribute('href', other.dataset.bdOther + hash);\n        if (!r && !L) return;\n        const sig = r ? r.key + r.variant + r.q : 'sign';\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          // Cake answered: party outfit. Only a sign so far: the engraved gift.\n          if (r && r.variant !== 'vet') emit(r, 'party');\n          else if (!r && L && lastSig !== 'gift') emit({ key: tool + ':gift', variant: 'sign' }, 'gift');\n        }, 600);\n      };\n\n      form.addEventListener('click', (e) => {\n        const c = e.target.closest('[data-size]');\n        if (!c) return;\n        const lb = SIZES[c.dataset.size];\n        st.w = String(st.u === 'kg' ? Math.round(lb * LB) : lb);\n        wIn.value = st.w;\n        bad.w = false;\n        form.querySelectorAll('[data-size]').forEach((x) => x.setAttribute('aria-pressed', String(x === c)));\n        rxHeld = false;\n        start(); render();\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      form.addEventListener('input', (e) => {\n        const el = e.target;\n        if (el.dataset.x) {\n          st.x = ALLERGIES.filter((c) => (c === el.dataset.x ? el.checked : st.x.includes(c))).join('');\n        } else if (el.dataset.k) {\n          const k = el.dataset.k;\n          if (k === 'u' && st.u !== el.value && st.w !== '') {\n            st.w = String(Math.round((el.value === 'kg' ? Number(st.w) * LB : Number(st.w) / LB) * 10) / 10);\n            wIn.value = st.w;\n          }\n          if (k === 'w') form.querySelectorAll('[data-size]').forEach((x) => x.removeAttribute('aria-pressed'));\n          if (k in bad) bad[k] = !!(el.validity && el.validity.badInput);\n          if (k === 'g') {\n            guests = bad.g ? { n: 1, asked: null, issue: 'nan' } : guestCount(el.value);\n            st.g = String(guests.n);\n          } else st[k] = el.type === 'checkbox' ? (el.checked ? '1' : '') : k === 'n' ? cleanName(el.value) : el.value.trim().slice(0, 6);\n          if (k === 'u') setWeightRange();\n        } else return;\n        rxHeld = false;\n        start();\n        render();\n      });\n      // When they leave the field, the box shows the number we actually used (999 becomes 20, 0 or empty becomes 1).\n      guestsIn.addEventListener('change', () => {\n        if (guests.issue && guestsIn.value !== String(guests.n)) guestsIn.value = String(guests.n);\n      });\n      render();\n    }\n  }\n  customElements.define('snb-dog-birthday', DogBirthday);\n}\n"],
  "mappings": "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",
  "names": []
}
