{
  "version": 3,
  "sources": ["/cdn/shop/t/21/assets/ffs-fishing-report.js?ffs=20260822flyimg"],
  "sourcesContent": ["(function () {\n  'use strict';\n\n  // Build Your Box hero: swap stale demo filenames \u2192 latest (skip combo UI clip)\n  function ffsUpgradeBoxHeroVideo() {\n    var root = document.querySelector('[data-ffs-box-hero-video]');\n    if (!root) return;\n    /* Combo hero uses a dedicated UI clip + live deck \u2014 do not rewrite it */\n    if (root.hasAttribute('data-ffs-box-hero-combo')) return;\n    var video = root.querySelector('video');\n    var source = root.querySelector('source');\n    if (!video || !source) return;\n    var src = source.getAttribute('src') || '';\n    if (src.indexOf('ffs-box-builder-hero-v29.mp4') !== -1) return;\n    if (src.indexOf('ffs-box-builder-hero-ui.mp4') !== -1) return;\n    if (src.indexOf('ffs-box-builder-hero-box.mp4') !== -1) return;\n    var next = src\n      .replace(/ffs-box-builder-hero-v28\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v27\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v26\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v25\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v24\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v23\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v22\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v21\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v20\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v19\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v18\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v17\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v16\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v15\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v14\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v11\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v10\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v9\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v8\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero-v7\\.mp4/, 'ffs-box-builder-hero-v29.mp4')\n      .replace(/ffs-box-builder-hero\\.mp4/, 'ffs-box-builder-hero-v29.mp4');\n    if (next === src) return;\n    source.setAttribute('src', next);\n    var poster = video.getAttribute('poster') || '';\n    if (poster) {\n      video.setAttribute(\n        'poster',\n        poster\n          .replace(/ffs-box-builder-hero-v28-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v27-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v26-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v25-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v24-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v23-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v22-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v21-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v20-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v19-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v18-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v17-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v16-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v15-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v14-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v11-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v10-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v9-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v8-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-v7-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n          .replace(/ffs-box-builder-hero-poster\\.jpg/, 'ffs-box-builder-hero-v29-poster.jpg')\n      );\n    }\n    video.load();\n    var playPromise = video.play();\n    if (playPromise && typeof playPromise.catch === 'function') playPromise.catch(function () {});\n  }\n  ffsUpgradeBoxHeroVideo();\n  document.addEventListener('DOMContentLoaded', ffsUpgradeBoxHeroVideo);\n\n  const DATA = window.FFS_FISHING_REPORT;\n  if (!DATA) return;\n\n  /* Calendar is the source of truth. DATA.season.month used to freeze the\n     whole site on July even in August. Copy this month's board into season. */\n  (function ffsSyncSeasonFromCalendar() {\n    if (!DATA.seasonByMonth) return;\n    const m = new Date().getMonth() + 1;\n    const copy = DATA.seasonByMonth[m] || DATA.seasonByMonth[String(m)];\n    if (copy) DATA.season = copy;\n  })();\n\n  const FFS_FLY_CROP = {\n    '12-pack-glo-bug-egg-flies1.png': [50,77,576,576],\n    '12-pack-glo-bug-egg-flies2.png': [51,57,546,546],\n    '16_907ed57a-8c2d-43c0-b33f-266c9a2d9289.png': [127,172,817,817],\n    '17.png': [135,177,948,948],\n    '18_404e4f06-d684-47cd-ae2b-0fc3438bbe4f.png': [125,96,851,851],\n    '19.png': [167,141,600,600],\n    '1_5fef864e-d6f8-4a4f-a0fb-fdb7b960ad8a.png': [29,90,833,833],\n    '1copy5.jpg': [388,373,1162,1162],\n    '20.png': [140,213,774,774],\n    '21_babbae59-2672-4c5e-b913-bcc82db93c0a.png': [156,103,669,669],\n    '22.png': [59,92,862,862],\n    '23.png': [368,358,563,563],\n    '24.png': [320,326,855,855],\n    '25.png': [278,263,868,868],\n    '26.png': [261,211,1104,1104],\n    '27.png': [208,239,611,611],\n    '2copy.jpg': [479,472,1103,1103],\n    '3_ed1f81d5-dcd7-483f-8af6-0afe658c44d6.jpg': [409,426,1211,1211],\n    '400inchbull.png': [75,63,750,750],\n    '4_b7f02cb7-cbcc-478b-b088-fd4e245a10a6.jpg': [102,160,1618,1618],\n    '5.jpg': [211,100,1403,1403],\n    '8927319949542_a4e39f2a-8e15-4ef3-ad07-8f647ca73648.jpg': [242,108,962,962],\n    '8927327715558.jpg': [21,142,1120,1120],\n    '8927431000294_a5469287-336a-4058-b1fc-79c22b790534.jpg': [169,279,717,717],\n    '8927432147174_83c3c96a-a5c6-46ec-adc7-384b6b6b7863.jpg': [109,63,572,572],\n    '9024401473766_0292de21-6c0d-47d4-89b2-26e7df0f56d9.jpg': [404,380,1150,1150],\n    '9357419512038_2feeb64f-7c98-4a4c-a57f-22264c7397d4.jpg': [289,388,1097,1097],\n    '9357422854374_d38fb5cc-a2de-4fde-b899-c767ec71200e.jpg': [97,135,1642,1642],\n    '9357424525542_c51c56e7-fbfd-4f9e-8057-ded3c4664a7d.jpg': [203,103,1529,1529],\n    '9357425705190_224adf5f-ebb1-453e-b7b0-0f3035920945.jpg': [23,142,1658,1658],\n    '9357431406822.jpg': [171,148,1433,1433],\n    '9357442973926.jpg': [18,130,1139,1139],\n    '9441323516134_3f526f71-322b-4891-b123-ab686b00c5b9.jpg': [62,93,543,543],\n    '9441325154534_21f3b70f-e658-459c-8dbd-6b86f6786dc1.jpg': [110,61,700,700],\n    '9441694449894_43cdf499-14f9-42fd-a765-6e60d8e04785.jpg': [90,160,712,712],\n    '9441695105254_10789698-11b4-4b88-9c56-60187e92d125.jpg': [118,174,925,925],\n    '9441700217062_a69b6cd4-b101-4f70-9019-75b2e9b7529c.jpg': [204,216,683,683],\n    '9441701036262_7baa721b-2090-4ca1-84de-96b6428f3250.jpg': [165,134,591,591],\n    '9441703133414.jpg': [184,155,609,609],\n    '9441704214758_08938855-f2eb-4bac-ad59-61a5d892350e.jpg': [40,86,884,884],\n    '9441707327718_6c09b58b-fae4-4dc9-be02-bde1f53ef8d0.jpg': [444,458,420,420],\n    '9441708179686_af3be363-5b08-46cf-b83d-93666543f4ae.jpg': [425,464,612,612],\n    '9441711161574_aeaa0a51-c3d1-49ac-a042-869502c3dee2.jpg': [287,285,818,818],\n    '9441714667750_7b0423ee-59a9-45a5-9078-595ef3a94e2b.jpg': [270,265,1066,1066],\n    '9441715978470_ecc9ce05-cb8d-4c49-863d-843a2e51c2f0.jpg': [300,296,420,420],\n    '9441718501606_07455d54-982a-465b-b9ed-3855c0df1cc2.jpg': [443,505,426,426],\n    '9441719714022.jpg': [80,86,739,739],\n    '9441720926438.jpg': [296,234,1109,1109],\n    '9441721254118_2fb455dd-f17e-4fdf-862c-6676281dc7ba.jpg': [255,283,845,845],\n    '9441723056358_56ef77da-fa62-4e9f-bb21-1f3883da8985.jpg': [222,346,879,879],\n    '9441724104934.jpg': [500,512,420,420],\n    '9441724629222_9c59670f-e06d-492c-a2cb-1471855710dd.jpg': [549,586,701,701],\n    '9441725710566_e1bed3a0-4d72-48a8-992b-de2c6eb32e76.jpg': [553,653,714,714],\n    '9441728823526_12f8a60c-b913-4a66-bdfe-514d04612f72.jpg': [197,204,721,721],\n    '9441730134246_34bae7e2-ff91-4a54-bd99-0b099f4d3063.jpg': [220,273,525,525],\n    '9441731117286.jpg': [166,160,646,646],\n    '9441731477734_752fc103-57ae-47aa-9fc5-8eb6160db510.jpg': [378,434,763,763],\n    '9441732002022_ab63e9d5-9602-4c03-a9cd-775d9cdc663e.jpg': [360,400,849,849],\n    '9441732362470.jpg': [267,253,759,759],\n    '9441732853990.jpg': [462,446,451,451],\n    '9441733279974_b17a0cfc-671d-4700-a033-0c80b124cf8e.jpg': [165,137,718,718],\n    '9441735934182_fd7790ae-76b1-44d5-a01e-bbf24061c0b4.jpg': [172,248,683,683],\n    '9441736491238_e25e1278-05e4-4d40-8701-a2591faf5b1b.jpg': [457,420,628,628],\n    '9441736655078_c1fb2cdf-286b-4db8-b5d2-31b59f9b2a7d.jpg': [290,253,1004,1004],\n    '9441737179366_a106e71b-0774-4620-b7cc-52fb6a234316.jpg': [187,181,805,805],\n    '9441740423398.jpg': [471,461,757,757],\n    '9465820610790_716d7e98-3bca-4000-b281-81697c357904.jpg': [244,260,508,508],\n    '9465821593830_3a3a64a1-d95f-4aee-9275-4424eb5106f3.jpg': [214,209,453,453],\n    '9465822413030_31668b2a-2ea8-41fd-8f3d-0c582d8f9cd2.jpg': [268,204,1387,1387],\n    '9630815191270_73f4c96d-6cd2-48fe-b190-153677ed02a8.jpg': [163,111,1232,1232],\n    '9630815944934_64e9daa4-a395-49c3-9a74-da6a2a560e5d.jpg': [128,110,1087,1087],\n    '9630819778790_e7d16c76-ab0c-45fd-b765-f9e12aafbf73.jpg': [89,109,1021,1021],\n    '9630820597990.jpg': [428,438,1409,1409],\n    '9634788081894_e8406db1-6f18-42c4-b8b2-08cdc07d38f8.jpg': [214,169,726,726],\n    '9634795028710_a1b74da9-1795-4f10-b22e-bfb1da77293c.jpg': [61,160,1214,1214],\n    '9682298339558_bf19609f-800c-400e-b490-39dd89e0d954.jpg': [1002,940,1195,1195],\n    '9682307580134_9556bacd-ad35-489a-bc4d-6f4cc6abb8f7.jpg': [886,920,1434,1434],\n    '9744144400614_d4a1508b-20c2-478c-a909-92b0a8a44f50.jpg': [444,462,433,433],\n    '9744155476198.jpg': [318,424,997,997],\n    '9758180868326.jpg': [519,414,795,795],\n    '9758182768870.jpg': [297,272,1120,1120],\n    '9789650927846.jpg': [196,237,420,420],\n    '9789653942502.jpg': [144,147,1525,1525],\n    '9789655056614.jpg': [87,237,1263,1263],\n    '9789663412454_f759f3c9-8e54-4b94-b199-eb725d10fc38.jpg': [536,302,462,462],\n    'BigFatDundeeTaft.png': [330,372,664,664],\n    'Black-duracell-euro-jig-nymph.png': [330,409,1139,1139],\n    'DSC03202.jpg': [204,275,546,546],\n    'DSC03209.jpg': [522,460,1043,1043],\n    'DSC05212.jpg': [116,78,563,563],\n    'Georgia_Tech_Lover_s_photo.png': [312,339,613,613],\n    'Olive-duracell-euro-jig-nymph.png': [406,491,1498,1498],\n    'Pheasant_Tail-duracell-euro-jig-nymph.png': [362,499,1102,1102],\n    'Taft_Loves_EllerysLife.png': [234,288,627,627],\n    'Untitled_design-7.png': [435,392,824,824],\n    'Untitled_design-8_copy_11.jpg': [222,218,1474,1474],\n    'Untitleddesign-3copy2.jpg': [328,307,1095,1095],\n    'Untitleddesign-4copy11.jpg': [201,248,1511,1511],\n    'adams-dry-fly-trout.png': [147,133,770,770],\n    'barrs-emerger-bwo.png': [220,279,593,593],\n    'bead-body-scud-nymph.png': [434,400,1229,1229],\n    'bead-body-scud-nymph2.png': [432,435,1162,1162],\n    'bead-head-hares-ear-nymph.png': [422,524,973,973],\n    'bead-head-olive-hares-ear-nymph.png': [234,265,888,888],\n    'bead-head-pheasant-tail-nymph.png': [165,202,705,705],\n    'bead-head-prince-nymph.png': [226,290,871,871],\n    'blue-dun-dry-fly.png': [292,236,1141,1141],\n    'brassie-copper-midge-nymph.png': [295,318,906,906],\n    'bwo-olive-mayfly-emerger.png': [196,260,562,562],\n    'caddis-pupa-trout-nymph.png': [378,396,824,824],\n    'cdc-comparadun-dry-fly.png': [368,392,580,580],\n    'cdc-soft-hackle-sow-bug-jig.jpg': [384,375,1305,1305],\n    'chironomid-midge-pupa.png': [243,281,537,537],\n    'copper-john-green-nymph.png': [222,216,883,883],\n    'corn-fed-caddis-dry-fly.png': [427,447,950,950],\n    'foam-beetle-terrestrial-fly.png': [258,196,1086,1086],\n    'frenchie-hot-spot-nymph.png': [362,418,800,800],\n    'gut-bomb-bloodworm-midge.jpg': [282,268,1412,1412],\n    'hares-ear-flashback-nymph.png': [173,190,767,767],\n    'juju-baetis-nymph.png': [375,453,1050,1050],\n    'juju-baetis-nymph2.png': [436,546,1050,1050],\n    'lightning-bug-trout-nymph.png': [163,220,717,717],\n    'mother-shucker-midge-emerger.jpg': [120,268,1732,1732],\n    'pheasant-tail-flashback-nymph.png': [241,352,872,872],\n    'pmd-sparkle-dun-dry-fly.png': [140,128,903,903],\n    'purple-duracell-euro-jig-nymph.png': [174,138,881,881],\n    'renegade-dry-fly.png': [461,475,869,869],\n    'rojo-midge-nymph.png': [502,456,1101,1101],\n    'rouses-jdub-sow-bug.png': [395,418,1196,1196],\n    'rs2-mayfly-emerger.jpg': [468,512,1073,1073],\n    'rs2-mayfly-emerger.png': [360,350,691,691],\n    'shop-vac-trout-nymph.png': [228,244,536,536],\n    'silver-bullet-baetis-jig-nymph.png': [536,572,1962,1962],\n    'sulphur-parachute-dry-fly.png': [313,307,1069,1069],\n    'tailwater-rainbow-sow-bug.jpg': [517,538,1018,1018],\n    'top-secret-midge-nymph.jpg': [526,570,908,908],\n    'tungsten-red-dart-barbless-nymph.png': [317,413,1316,1316],\n    'tungsten-tailwater-sowbug.jpg': [406,410,1219,1219],\n    'two-bit-hooker-tungsten-nymph.png': [315,410,1018,1018],\n    'two-bit-hooker-tungsten-nymph2.png': [375,445,1011,1011],\n    'violet-tail-jig-tungsten-nymph.png': [804,776,1724,1724],\n    'wd40.png': [328,334,680,680],\n    'yellow-sally-dry.png': [346,311,851,851],\n    'zebra-midge-black-mirage.png': [406,470,1167,1167],\n    'zebra-midge-red-nymph.png': [199,196,479,479]\n  };\n\n  function ffsFlyFilename(src) {\n    if (!src) return '';\n    const path = String(src).split('?')[0];\n    const parts = path.split('/');\n    return parts[parts.length - 1] || '';\n  }\n\n  /** Same region-crop map as snippets/ffs-image-crop.liquid \u2014 fills small-in-frame flies. */\n  function ffsFlyThumbUrl(src, size, opts) {\n    const width = size || 240;\n    if (!src) return '';\n    let url = String(src).trim();\n    if (url.startsWith('//')) url = `https:${url}`;\n    const file = ffsFlyFilename(url);\n    const crop = FFS_FLY_CROP[file];\n    let parsed;\n    try {\n      parsed = new URL(url, window.location.origin);\n    } catch (err) {\n      return url;\n    }\n    parsed.searchParams.set('width', String(width));\n    parsed.searchParams.set('height', String(width));\n    const skipRegion = opts && opts.plain;\n    if (!crop || skipRegion) {\n      parsed.searchParams.set('crop', 'center');\n      parsed.searchParams.delete('crop_left');\n      parsed.searchParams.delete('crop_top');\n      parsed.searchParams.delete('crop_width');\n      parsed.searchParams.delete('crop_height');\n    } else {\n      const [left, top, cw, ch] = crop;\n      parsed.searchParams.set('crop', 'region');\n      parsed.searchParams.set('crop_left', String(left));\n      parsed.searchParams.set('crop_top', String(top));\n      parsed.searchParams.set('crop_width', String(cw));\n      parsed.searchParams.set('crop_height', String(ch));\n    }\n    return parsed.toString();\n  }\n\n  function ffsApplyFlyImageMap(map) {\n    if (!map || !DATA || !DATA.flyCatalog) return 0;\n    let n = 0;\n    Object.keys(DATA.flyCatalog).forEach((key) => {\n      const fly = DATA.flyCatalog[key];\n      if (!fly) return;\n      const live = map[fly.handle] || map[key];\n      if (!live) return;\n      let url = String(live).trim();\n      if (url.startsWith('//')) url = `https:${url}`;\n      if (url && fly.image !== url) {\n        fly.image = url;\n        n += 1;\n      }\n    });\n    return n;\n  }\n\n  const ffsShopRoot = () => window.Shopify?.routes?.root || '/';\n\n  async function ffsReadJson(path) {\n    const controller = new AbortController();\n    const timeout = setTimeout(() => controller.abort(), 10000);\n    try {\n      const res = await fetch(ffsShopRoot() + path, {\n        credentials: 'same-origin', cache: 'no-store', signal: controller.signal,\n      });\n      if (!res.ok) throw new Error('Store data could not be checked.');\n      return await res.json();\n    } finally {\n      clearTimeout(timeout);\n    }\n  }\n\n  async function ffsFetchFlyCatalog() {\n    const products = [];\n    // Follow full pages so a growing collection cannot make later flies disappear.\n    for (let page = 1; page <= 10; page += 1) {\n      const data = await ffsReadJson(`collections/all-flies/products.json?limit=250&page=${page}`);\n      if (!Array.isArray(data?.products)) throw new Error('Invalid fly catalog.');\n      products.push(...data.products);\n      if (data.products.length < 250) return products;\n    }\n    throw new Error('Fly catalog could not be fully checked.');\n  }\n\n  function ffsApplyLiveFlyCatalog(products) {\n    const variants = new Map();\n    const images = {};\n    products.forEach((product) => {\n      if (!product || typeof product.handle !== 'string') return;\n      const image = product.images?.[0]?.src || product.featured_image;\n      if (image) images[product.handle] = image;\n      (product.variants || []).forEach((variant) => variants.set(String(variant.id), variant));\n    });\n    ffsApplyFlyImageMap(images);\n    Object.values(DATA.flyCatalog || {}).forEach((fly) => {\n      const variant = variants.get(String(fly.variantId));\n      const price = typeof variant?.price === 'string' && variant.price.trim() !== ''\n        ? Number(variant.price) : NaN;\n      fly.stockVerified = typeof variant?.available === 'boolean' && Number.isFinite(price) && price >= 0;\n      if (!fly.stockVerified) return;\n      // This collection endpoint returns decimal dollars, unlike cart.js cents.\n      fly.price = Math.round(price * 100) / 100;\n      fly.soldOut = !variant.available;\n      fly.variantLabel = String(variant.title || '');\n    });\n  }\n\n  const USGS_IV = 'https://waterservices.usgs.gov/nwis/iv/?format=json&siteStatus=all&parameterCd=00060,00010';\n  const OPENVERSE_IMAGES = 'https://api.openverse.org/v1/images/';\n\n  const cToF = (c) => Math.round((parseFloat(c) * 9) / 5 + 32);\n\n  const fmtFlow = (cfs) => {\n    const n = parseFloat(cfs);\n    if (Number.isNaN(n)) return '\u2014';\n    return n >= 1000 ? `${Math.round(n).toLocaleString()} cfs` : `${Math.round(n)} cfs`;\n  };\n\n  const fmtTemp = (c) => {\n    const n = parseFloat(c);\n    if (Number.isNaN(n)) return '\u2014';\n    return `${cToF(n)}\u00B0F`;\n  };\n\n  const flowStatus = () => ({ label: '', tone: 'muted' });\n  const tempStatus = () => ({ label: '', tone: 'muted' });\n\n  class FfsFishingReport extends HTMLElement {\n    connectedCallback() {\n      this.root = this;\n      this.activeRegion = (DATA.regions[0] && DATA.regions[0].id) || 'northern_rockies';\n      this.activeRiverId = null;\n      this.hatchRegion = this.activeRegion;\n      /* Build Your Box uses State (not Fishing region). California first + default. */\n      this.boxState = 'CA';\n      this.boxRegion = this.primaryRegionForState(this.boxState) || 'california';\n      this.boxElevation = 'mid';\n      this.boxWaterType = 'river';\n      this.boxMonth = new Date().getMonth() + 1;\n      this.gaugeData = {};\n      this.boxQty = {};\n      this.boxExtraHandles = [];\n      this.boxAddedStack = [];\n      /* One of each across a 12-pattern curated box = 12 flies by default.\n         Shoppers can raise \u201Cof each\u201D or +/- per fly / add-more stepper. */\n      this.boxTargetCount = 12;\n      this.boxDefaultQty = 1;\n      this.boxMaxQty = 12;\n      this.dirQuery = '';\n      this.dirRegion = 'all';\n      this.dirType = 'all';\n      this.dirState = '';\n      this.dirBound = false;\n      this.selectedCatchWaterId = null;\n      this.catchPhotoCache = {};\n      this.catchRenderToken = 0;\n      this.applyUrlPreselect();\n      this.applyBoxSeason();\n      this.seedNamedWater();\n      this.boxEditRevision = 0;\n      const noteBoxEdit = (event) => {\n        if (!event.target.closest?.('[data-ffs-report-best-flies]')) return;\n        const control = event.target.closest('[data-qty-delta], [data-bulk-delta], [data-ffs-box-bulk-qty], [data-ffs-box-apply-bulk], [data-ffs-box-clear], [data-ffs-box-more-delta], select');\n        if (!control) return;\n        if (this.boxCartBusy || this.boxCartAttempt) {\n          event.preventDefault();\n          event.stopImmediatePropagation();\n          return;\n        }\n        this.boxEditRevision += 1;\n        this.boxCartMessage = '';\n      };\n      this.addEventListener('click', noteBoxEdit, true);\n      this.addEventListener('change', noteBoxEdit, true);\n      this.addEventListener('input', noteBoxEdit, true);\n      this.ensureBoxMoreDelegation();\n      this.addEventListener(\n        'error',\n        (e) => {\n          const img = e.target;\n          if (!img || img.tagName !== 'IMG' || !img.hasAttribute('data-ffs-img-fallback')) return;\n          const next = img.getAttribute('data-ffs-img-fallback');\n          img.removeAttribute('data-ffs-img-fallback');\n          if (next && img.getAttribute('src') !== next) img.setAttribute('src', next);\n        },\n        true\n      );\n      this.init();\n    }\n\n    /* ?state=&elevation=&water= deep links (report river cards \u2192 builder page).\n       Legacy ?region= still works \u2014 maps to a representative state in that region. */\n    applyUrlPreselect() {\n      const params = new URLSearchParams(window.location.search);\n      this.activeBoxWaterId = this.findDirectoryWater(params.get('waterId'))?.id || null;\n      let region = params.get('region');\n      /* Legacy single East bucket \u2192 Northeast */\n      if (region === 'east') region = 'northeast';\n      const state = String(params.get('state') || '').toUpperCase();\n      const elevation = params.get('elevation');\n      const water = params.get('water');\n      if (state && this.stateName(state) !== state) {\n        this.boxState = state;\n        this.boxRegion = this.primaryRegionForState(state) || this.boxRegion;\n        this.activeRegion = this.boxRegion;\n        this.hatchRegion = this.boxRegion;\n      } else if (region && DATA.regions.some((r) => r.id === region)) {\n        this.boxRegion = region;\n        this.activeRegion = region;\n        this.hatchRegion = region;\n        this.boxState = this.defaultStateForRegion(region) || this.boxState;\n      }\n      if (elevation && (DATA.boxElevations || []).some((e) => e.id === elevation)) {\n        this.boxElevation = elevation;\n      }\n      if (water && (DATA.boxWaterTypes || []).some((w) => w.id === water)) {\n        this.boxWaterType = water;\n      }\n      const monthRaw = params.get('month');\n      if (monthRaw) {\n        const asNum = Number(monthRaw);\n        if (Number.isInteger(asNum) && asNum >= 1 && asNum <= 12) {\n          this.boxMonth = asNum;\n        } else {\n          const idx = this.monthNames().findIndex(\n            (name) => name.toLowerCase() === String(monthRaw).toLowerCase()\n          );\n          if (idx >= 0) this.boxMonth = idx + 1;\n        }\n      }\n    }\n\n    applyBoxSeason() {\n      if (!DATA.seasonByMonth) return;\n      const m = this.reportMonth();\n      const copy = DATA.seasonByMonth[m] || DATA.seasonByMonth[String(m)];\n      if (copy) DATA.season = copy;\n    }\n\n    syncHatchToBox() {\n      if (!this.hasAttribute('data-sync-hatch')) return;\n      this.hatchRegion = this.boxRegion;\n      this.renderHatchTabs();\n      this.bindHatchTabs();\n      this.renderRegionalHatch();\n    }\n\n    /**\n     * Fallback region for any USPS state when we have no curated waters yet.\n     * Used so all 50 states can pick a box via regional boxSets.\n     */\n    fallbackRegionForState(stateAbbr) {\n      const map = {\n        AK: 'alaska',\n        AL: 'southern_appalachians',\n        AR: 'ozarks',\n        AZ: 'southwest',\n        CA: 'california',\n        CO: 'colorado',\n        CT: 'northeast',\n        DE: 'northeast',\n        FL: 'southern_appalachians',\n        GA: 'southern_appalachians',\n        HI: 'california',\n        IA: 'upper_midwest',\n        ID: 'northern_rockies',\n        IL: 'upper_midwest',\n        IN: 'upper_midwest',\n        KS: 'ozarks',\n        KY: 'southern_appalachians',\n        LA: 'ozarks',\n        MA: 'northeast',\n        MD: 'northeast',\n        ME: 'northeast',\n        MI: 'upper_midwest',\n        MN: 'upper_midwest',\n        MO: 'ozarks',\n        MS: 'southern_appalachians',\n        MT: 'northern_rockies',\n        NC: 'southern_appalachians',\n        ND: 'upper_midwest',\n        NE: 'upper_midwest',\n        NH: 'northeast',\n        NJ: 'northeast',\n        NM: 'southwest',\n        NV: 'southwest',\n        NY: 'northeast',\n        OH: 'upper_midwest',\n        OK: 'ozarks',\n        OR: 'pacific_northwest',\n        PA: 'northeast',\n        RI: 'northeast',\n        SC: 'southern_appalachians',\n        SD: 'upper_midwest',\n        TN: 'southern_appalachians',\n        TX: 'southwest',\n        UT: 'southwest',\n        VA: 'southern_appalachians',\n        VT: 'northeast',\n        WA: 'pacific_northwest',\n        WI: 'upper_midwest',\n        WV: 'southern_appalachians',\n        WY: 'northern_rockies',\n      };\n      return map[String(stateAbbr || '').toUpperCase()] || 'northern_rockies';\n    }\n\n    /** Region with the most directory waters for a USPS state abbr. */\n    primaryRegionForState(stateAbbr) {\n      const counts = {};\n      this.directoryWaters().forEach((w) => {\n        if (String(w.state || '').toUpperCase() !== String(stateAbbr || '').toUpperCase()) return;\n        if (!w.region) return;\n        counts[w.region] = (counts[w.region] || 0) + 1;\n      });\n      let best = '';\n      let n = 0;\n      Object.keys(counts).forEach((id) => {\n        if (counts[id] > n) {\n          n = counts[id];\n          best = id;\n        }\n      });\n      return best || this.fallbackRegionForState(stateAbbr);\n    }\n\n    /** Representative state when only a legacy region id is known. */\n    defaultStateForRegion(regionId) {\n      const map = {\n        northern_rockies: 'MT',\n        colorado: 'CO',\n        southwest: 'UT',\n        pacific_northwest: 'OR',\n        california: 'CA',\n        alaska: 'AK',\n        northeast: 'NY',\n        southern_appalachians: 'TN',\n        upper_midwest: 'MI',\n        ozarks: 'AR',\n        canadian_rockies: 'MT',\n      };\n      if (map[regionId]) return map[regionId];\n      const counts = {};\n      this.directoryWaters().forEach((w) => {\n        if (w.region !== regionId || !w.state) return;\n        counts[w.state] = (counts[w.state] || 0) + 1;\n      });\n      let best = '';\n      let n = 0;\n      Object.keys(counts).forEach((abbr) => {\n        if (counts[abbr] > n) {\n          n = counts[abbr];\n          best = abbr;\n        }\n      });\n      return best || 'MT';\n    }\n\n    /** All 50 US states A\u2192Z \u2014 used by Fishing Report directory browse. */\n    boxStateOptions() {\n      const counts = {};\n      this.directoryWaters().forEach((w) => {\n        if (!w.state) return;\n        counts[w.state] = (counts[w.state] || 0) + 1;\n      });\n      return Object.keys(this.allStateNames())\n        .map((abbr) => ({ abbr, name: this.stateName(abbr), count: counts[abbr] || 0 }))\n        .sort((a, b) => a.name.localeCompare(b.name));\n    }\n\n    /**\n     * Build Your Box State list \u2014 all 50 states, California pinned to the top.\n     */\n    boxBuilderStateOptions() {\n      const states = this.boxStateOptions();\n      states.sort((a, b) => {\n        if (a.abbr === 'CA') return -1;\n        if (b.abbr === 'CA') return 1;\n        return a.name.localeCompare(b.name);\n      });\n      return states;\n    }\n\n    waterTypeId(water) {\n      const type = String((water && water.type) || '').toLowerCase();\n      if (type.indexOf('tailwater') !== -1) return 'tailwater';\n      if (type.indexOf('creek') !== -1 || type.indexOf('limestone') !== -1) return 'creek';\n      if (type.indexOf('still') !== -1 || type.indexOf('lake') !== -1 || type.indexOf('reservoir') !== -1) {\n        return 'stillwater';\n      }\n      return 'river';\n    }\n\n    waterElevationId(water) {\n      const ft = parseInt(String((water && water.elevation) || '').replace(/[^0-9]/g, ''), 10);\n      if (ft && ft < 4000) return 'low';\n      if (ft && ft > 8000) return 'high';\n      return 'mid';\n    }\n\n    /**\n     * Seasonal fly handles for the selected state, ranked across matching\n     * directory waters (elev + water-type soft filter). Uses audited\n     * waterFlyPicks so MT \u2260 ID \u2260 WY even when they share a region.\n     */\n    stateSeasonalHandles() {\n      const catalog = DATA.flyCatalog || {};\n      const state = String(this.boxState || '').toUpperCase();\n      if (!state) return [];\n      const inState = this.directoryWaters().filter(\n        (w) => String(w.state || '').toUpperCase() === state\n      );\n      if (!inState.length) return [];\n\n      const matchFilters = (list) =>\n        list.filter((w) => {\n          if (this.boxWaterType && this.waterTypeId(w) !== this.boxWaterType) return false;\n          if (this.boxElevation && this.waterElevationId(w) !== this.boxElevation) return false;\n          return true;\n        });\n\n      let pool = matchFilters(inState);\n      if (!pool.length) {\n        pool = inState.filter((w) => this.waterTypeId(w) === this.boxWaterType);\n      }\n      if (!pool.length) {\n        /* Never mix lake boxes with river hopper lists. */\n        if (this.boxWaterType === 'stillwater') return [];\n        pool = inState;\n      }\n\n      const scores = {};\n      pool.forEach((w) => {\n        const pick = this.waterFlyPickEntry(w);\n        const handles = (pick && pick.handles) || [];\n        handles.forEach((handle, i) => {\n          if (!catalog[handle]) return;\n          scores[handle] = (scores[handle] || 0) + Math.max(1, 12 - i);\n        });\n      });\n\n      return Object.keys(scores).sort(\n        (a, b) => scores[b] - scores[a] || a.localeCompare(b)\n      );\n    }\n\n    init() {\n      this.boxDraftRestored = this.restoreBoxDraft();\n      if (!this.boxDraftRestored) this.resetBoxSelection();\n      this.restoreBoxAttempt();\n      this.boxStockLoading = true;\n      this.ensureActiveRiver();\n      this.renderRiverPickers();\n      this.renderHatchTabs();\n      this.renderRivers();\n      this.renderStaticSections();\n      this.renderBestFlies();\n      this.refreshBoxCatalog();\n      this.renderWatersDirectory();\n      this.renderWaterCatches();\n      this.bindHatchTabs();\n      this.bindInlineBoxLinks();\n      this.fetchGauges();\n      this.updateTimestamp();\n    }\n\n    // Keep a draft on this history entry so visiting a product or cart and\n    // returning does not discard the shopper's choices. New visits start fresh.\n    saveBoxDraft() {\n      if (!this.hasAttribute('data-ffs-box-origin') && !this.$('[data-ffs-report-best-flies]')) return false;\n      try {\n        const draft = {\n          version: 1,\n          page: location.pathname + location.search,\n          state: this.boxState,\n          elevation: this.boxElevation,\n          water: this.boxWaterType,\n          month: this.boxMonth,\n          waterId: this.activeBoxWaterId || null,\n          defaultQty: this.boxDefaultQty,\n          qty: { ...this.boxQty },\n          extraHandles: [...this.boxExtraHandles],\n          addedStack: [...this.boxAddedStack],\n          cartAttempt: this.boxCartAttempt || null,\n          cartAttemptClearedToken: this.boxAttemptClearedToken || '',\n        };\n        history.replaceState({ ...history.state, ffsBoxDraft: draft }, '');\n        return true;\n      } catch (_) {\n        return false;\n        // Browsers that restrict history storage can still use the builder.\n      }\n    }\n\n    restoreBoxDraft() {\n      if (!this.hasAttribute('data-ffs-box-origin') && !this.$('[data-ffs-report-best-flies]')) return false;\n      try {\n        const draft = history.state?.ffsBoxDraft;\n        if (!draft || draft.version !== 1 || draft.page !== location.pathname + location.search) return false;\n        if (!draft.state || this.stateName(draft.state) === draft.state) return false;\n        if (!(DATA.boxElevations || []).some((item) => item.id === draft.elevation)) return false;\n        if (!(DATA.boxWaterTypes || []).some((item) => item.id === draft.water)) return false;\n        if (!Number.isInteger(draft.month) || draft.month < 1 || draft.month > 12) return false;\n        if (!draft.qty || typeof draft.qty !== 'object' || Array.isArray(draft.qty)) return false;\n        const catalog = DATA.flyCatalog || {};\n        const validIdentities = (items) => Array.isArray(items)\n          ? items.map((handle) => this.flyIdentity(handle)).filter(Boolean) : [];\n        this.boxState = draft.state;\n        this.boxRegion = this.primaryRegionForState(this.boxState) || this.boxRegion;\n        this.boxElevation = draft.elevation;\n        this.boxWaterType = draft.water;\n        this.boxMonth = draft.month;\n        this.activeBoxWaterId = this.findDirectoryWater(draft.waterId)?.id || null;\n        this.seedNamedWater();\n        this.boxDefaultQty = this.clampBulkQty(draft.defaultQty);\n        this.boxQty = {};\n        for (const [key, fly] of Object.entries(catalog)) {\n          const handle = fly.handle || key;\n          // Current product identities take precedence over legacy aliases,\n          // including an explicit zero. Never add the two quantities together.\n          if (Object.hasOwn(draft.qty, handle)) this.setFlyQty(handle, draft.qty[handle]);\n          else if (Object.hasOwn(draft.qty, key)) this.setFlyQty(handle, draft.qty[key]);\n        }\n        this.boxExtraHandles = [...new Set(validIdentities(draft.extraHandles).map((item) => item.key))];\n        this.boxAddedStack = validIdentities(draft.addedStack).map((item) => item.handle);\n        this.applyBoxSeason();\n        return true;\n      } catch (_) {\n        return false;\n      }\n    }\n\n    /* On the fishing report page, \"Build a box for this water\" opens the box\n       builder inline (seeded to that water) instead of leaving the page. Pages\n       without the box panel (e.g. dir cards elsewhere) keep the normal link. */\n    bindInlineBoxLinks() {\n      if (!this.$('[data-ffs-box-panel]')) return;\n      this.addEventListener('click', (e) => {\n        const link = e.target.closest('.ffs-report__build-link');\n        if (!link || e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || (link.target && link.target !== '_self')) return;\n        const card = link.closest('[data-water-id]');\n        const waterId = card ? card.getAttribute('data-water-id') : this.selectedCatchWaterId;\n        const water = waterId ? this.findDirectoryWater(waterId) : null;\n        if (!water) return;\n        e.preventDefault();\n        this.openInlineBoxForWater(water);\n      });\n    }\n\n    openInlineBoxForWater(water) {\n      if (this.boxCartBusy || this.boxCartAttempt) return;\n      this.boxEditRevision = (this.boxEditRevision || 0) + 1;\n      const panel = this.$('[data-ffs-box-panel]');\n      if (!panel) return;\n      const qs = new URLSearchParams(String(this.builderHref(water)).split('?')[1] || '');\n      const region = qs.get('region');\n      const state = String(qs.get('state') || water.state || '').toUpperCase();\n      const elevation = qs.get('elevation');\n      const waterType = qs.get('water');\n      if (state && this.stateName(state) !== state) {\n        this.boxState = state;\n        this.boxRegion = this.primaryRegionForState(state) || region || this.boxRegion;\n      } else if (region && DATA.regions.some((r) => r.id === region)) {\n        this.boxRegion = region;\n        this.boxState = this.defaultStateForRegion(region) || this.boxState;\n      }\n      if (elevation && (DATA.boxElevations || []).some((el) => el.id === elevation)) this.boxElevation = elevation;\n      if (waterType && (DATA.boxWaterTypes || []).some((w) => w.id === waterType)) this.boxWaterType = waterType;\n      /* Audited seasonal picks (when present) + hatch matches seed the box.\n         Cap at the 12-fly target so the default stays a tight curated dozen. */\n      this.boxWaterHatchHandles = this.hotFliesForWater(water, this.boxTargetCount || 12).map(\n        (fly) => fly.handle\n      );\n      this.activeBoxWaterId = water.id || null;\n      this.resetBoxSelection();\n      this.renderBestFlies();\n      const title = this.$('[data-ffs-box-panel-title]');\n      const pick = this.waterFlyPickEntry(water);\n      if (title) {\n        const section = water.section ? ` \u00B7 ${water.section}` : '';\n        title.textContent = `Seasonal fly ideas for ${water.name}${section}`;\n      }\n      let noteEl = panel.querySelector('[data-ffs-box-water-note]');\n      if (!noteEl) {\n        noteEl = document.createElement('p');\n        noteEl.className = 'ffs-box__water-note';\n        noteEl.setAttribute('data-ffs-box-water-note', '');\n        if (title && title.parentNode) title.parentNode.insertBefore(noteEl, title.nextSibling);\n        else panel.insertBefore(noteEl, panel.firstChild);\n      }\n      // Legacy profile prose is not a verified observation.\n      noteEl.textContent = '';\n      noteEl.hidden = true;\n      panel.hidden = false;\n      panel.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n\n    escapeHtml(str) {\n      return String(str == null ? '' : str)\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;')\n        .replace(/\"/g, '&quot;');\n    }\n\n    waterNameTokens(water) {\n      const stop = new Set([\n        'river',\n        'lake',\n        'creek',\n        'fork',\n        'the',\n        'of',\n        'and',\n        'north',\n        'south',\n        'east',\n        'west',\n        'upper',\n        'lower',\n        'middle',\n      ]);\n      return String((water && water.name) || '')\n        .toLowerCase()\n        .replace(/[^a-z0-9\\s]/g, ' ')\n        .split(/\\s+/)\n        .filter((t) => t && t.length > 2 && !stop.has(t));\n    }\n\n    fishbrainSlug(name) {\n      return String(name || '')\n        .toLowerCase()\n        .replace(/&/g, ' and ')\n        .replace(/'/g, '')\n        .replace(/[^a-z0-9]+/g, '-')\n        .replace(/^-+|-+$/g, '');\n    }\n\n    fishbrainSlugAliases(name) {\n      const slug = this.fishbrainSlug(name);\n      const aliases = new Set([slug]);\n      if (slug === 'quake-lake') aliases.add('earthquake-lake');\n      if (slug === 'earthquake-lake') aliases.add('quake-lake');\n      if (slug === 'henrys-fork') aliases.add('henry-s-fork');\n      if (slug === 'henrys-lake') aliases.add('henry-s-lake');\n      if (slug === 'crowley-lake') aliases.add('lake-crowley');\n      if (slug === 'lake-crowley') aliases.add('crowley-lake');\n      if (slug === 'south-fork-snake-river') aliases.add('snake-river-palisades-res-american-falls-res');\n      /* Drop trailing type words so \"Strawberry Reservoir\" \u2248 strawberry */\n      const bare = slug\n        .replace(/-(reservoir|lake|river|creek|pond|fork|tailwater)$/g, '')\n        .replace(/^(lower|upper|north|south|east|west|middle)-/, '');\n      if (bare && bare.length > 3) aliases.add(bare);\n      if (bare) {\n        aliases.add(`${bare}-river`);\n        aliases.add(`${bare}-lake`);\n        aliases.add(`${bare}-reservoir`);\n        aliases.add(`${bare}-creek`);\n      }\n      return [...aliases].filter(Boolean);\n    }\n\n    fishbrainEntry(water) {\n      const data = window.FFS_FISHBRAIN_CATCHES;\n      if (!data || !data.byWaterId || !water) return null;\n      if (data.byWaterId[water.id]) return data.byWaterId[water.id];\n\n      /* Fallback: another directory stretch of the same water, or Fishbrain's\n         alternate name (Quake Lake \u2192 Earthquake Lake). Prefer same-state. */\n      const aliases = this.fishbrainSlugAliases(water.name);\n      const aliasSet = new Set(aliases);\n      const state = String(water.state || '').toUpperCase();\n      let best = null;\n      let bestScore = -1;\n\n      Object.keys(data.byWaterId).forEach((id) => {\n        const entry = data.byWaterId[id];\n        if (!entry || !entry.photos || !entry.photos.length) return;\n        const matched = this.fishbrainSlug(entry.matchedName || '');\n        let score = 0;\n\n        if (matched && aliasSet.has(matched)) score = 100;\n        else if (aliases.some((a) => a.length > 4 && (id === a || id.indexOf(`${a}-`) === 0 || id.indexOf(`-${a}-`) !== -1)))\n          score = 70;\n        else if (matched && aliases.some((a) => a.length > 5 && (matched.indexOf(a) !== -1 || a.indexOf(matched) !== -1)))\n          score = 40;\n        else return;\n\n        /* Prefer same state when the directory id encodes it */\n        if (state && id.indexOf(`-${state.toLowerCase()}`) !== -1) score += 25;\n        /* Prefer more photos as a weak tie-breaker */\n        score += Math.min(entry.photos.length, 6);\n\n        if (score > bestScore) {\n          bestScore = score;\n          best = entry;\n        }\n      });\n      return best;\n    }\n\n    async fetchOpenverseCatchPhotos(water) {\n      const q = `\"${water.name}\" (trout OR fishing OR catch OR flyfishing)`;\n      const params = new URLSearchParams({\n        q,\n        page_size: '12',\n        source: 'flickr,wikimedia',\n      });\n      const res = await fetch(`${OPENVERSE_IMAGES}?${params.toString()}`, {\n        headers: { Accept: 'application/json' },\n      });\n      if (!res.ok) throw new Error('Openverse unavailable');\n      const json = await res.json();\n      const tokens = this.waterNameTokens(water);\n      const results = (json.results || [])\n        .map((img) => {\n          const title = String(img.title || '');\n          const hay = `${title} ${img.foreign_landing_url || ''}`.toLowerCase();\n          let score = 0;\n          tokens.forEach((t) => {\n            if (hay.indexOf(t) !== -1) score += 10;\n          });\n          if (/trout|catch|fly|angler|fish/.test(hay)) score += 4;\n          return {\n            src: img.url,\n            species: title.split(/[-\u2013|]/)[0].trim() || water.name,\n            note: img.creator ? `Photo by ${img.creator}` : img.source || 'Openverse',\n            attribution: img.attribution || img.creator || img.source || 'Openverse',\n            href: img.foreign_landing_url || img.url,\n            score,\n            source: 'openverse',\n          };\n        })\n        .filter((p) => p.src)\n        .sort((a, b) => b.score - a.score);\n      return results.slice(0, 6);\n    }\n\n    async fetchLiveCatchPhotos(water) {\n      if (!water) return [];\n      if (this.catchPhotoCache[water.id]) return this.catchPhotoCache[water.id];\n\n      const fb = this.fishbrainEntry(water);\n      if (fb && Array.isArray(fb.photos) && fb.photos.length) {\n        const picked = fb.photos.slice(0, 6).map((p) => ({\n          src: p.src,\n          species: p.species || 'Catch',\n          note: p.note || water.section || water.name,\n          attribution: p.attribution || 'Fishbrain',\n          href: p.href || fb.fishbrainUrl || 'https://fishbrain.com/',\n          source: 'fishbrain',\n          fishbrainUrl: fb.fishbrainUrl,\n        }));\n        this.catchPhotoCache[water.id] = picked;\n        return picked;\n      }\n\n      let photos = [];\n      try {\n        photos = await this.fetchOpenverseCatchPhotos(water);\n      } catch (e) {\n        photos = [];\n      }\n\n      const picked = photos.slice(0, 6);\n      this.catchPhotoCache[water.id] = picked;\n      return picked;\n    }\n\n    findDirectoryWater(id) {\n      const waters = (window.FFS_WATERS_DIRECTORY && window.FFS_WATERS_DIRECTORY.waters) || [];\n      return waters.find((w) => w.id === id) || null;\n    }\n\n    setSelectedCatchWater(waterId, opts) {\n      const options = opts || {};\n      const changed = this.selectedCatchWaterId !== (waterId || null);\n      this.selectedCatchWaterId = waterId || null;\n      /* The inline box builder is per-water \u2014 hide it when the water changes */\n      const boxPanel = this.$('[data-ffs-box-panel]');\n      if (boxPanel && (changed || !this.selectedCatchWaterId)) boxPanel.hidden = true;\n      this.syncDetailPanels();\n      this.renderSelectedWaterReport();\n      this.renderWaterCatches();\n      if (options.scroll && waterId) {\n        const panel = this.$('[data-ffs-report-hatch]');\n        if (panel) panel.closest('.ffs-report__panel')?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n      }\n    }\n\n    syncDetailPanels() {\n      const show = !!this.selectedCatchWaterId;\n      this.$$('[data-ffs-detail-panel]').forEach((panel) => {\n        panel.hidden = !show;\n      });\n      if (!show) {\n        const boxPanel = this.$('[data-ffs-box-panel]');\n        if (boxPanel) boxPanel.hidden = true;\n      }\n    }\n\n    async renderWaterCatches() {\n      const mount = this.$('[data-ffs-report-catches]');\n      const title = this.$('[data-ffs-catches-title]');\n      if (!mount) return;\n\n      const token = ++this.catchRenderToken;\n      const water = this.selectedCatchWaterId ? this.findDirectoryWater(this.selectedCatchWaterId) : null;\n\n      if (!water) {\n        if (title) title.textContent = 'Catches from this water';\n        mount.innerHTML = '';\n        return;\n      }\n\n      if (title) title.textContent = `Catches near ${water.name}`;\n      mount.innerHTML = `\n        <div class=\"ffs-report__catches-loading\" role=\"status\" aria-live=\"polite\">\n          <span class=\"ffs-report__catches-spin\" aria-hidden=\"true\"></span>\n          <p>Finding catch photos for ${this.escapeHtml(water.name)}\u2026</p>\n        </div>`;\n\n      let catches = [];\n      try {\n        catches = await this.fetchLiveCatchPhotos(water);\n      } catch (e) {\n        catches = [];\n      }\n      if (token !== this.catchRenderToken) return;\n\n      if (!catches.length) {\n        mount.innerHTML = `\n          <div class=\"ffs-report__catches-empty\">\n            <p>No public catch photos for ${this.escapeHtml(water.name)} yet.</p>\n          </div>`;\n        return;\n      }\n\n      const show = catches.slice(0, 4);\n\n      /* Click opens an on-site lightbox \u2014 no outbound Fishbrain links. */\n      mount.innerHTML = `\n        <div class=\"ffs-report__catches-grid\" data-ffs-catches-grid>\n          ${show\n            .map(\n              (c, i) => `\n            <figure class=\"ffs-report__catch\">\n              <button\n                type=\"button\"\n                class=\"ffs-report__catch-media\"\n                data-ffs-catch-open\n                data-catch-src=\"${this.escapeHtml(c.src)}\"\n                data-catch-alt=\"${this.escapeHtml(c.species)} \u2014 ${this.escapeHtml(water.name)}\"\n                data-catch-index=\"${i}\"\n                aria-label=\"View larger: ${this.escapeHtml(c.species)} near ${this.escapeHtml(water.name)}\"\n              >\n                <img src=\"${this.escapeHtml(c.src)}\" alt=\"${this.escapeHtml(c.species)} \u2014 ${this.escapeHtml(water.name)}\" loading=\"lazy\" width=\"640\" height=\"800\">\n              </button>\n            </figure>`\n            )\n            .join('')}\n        </div>`;\n\n      this.bindCatchLightbox(mount);\n    }\n\n    ensureCatchLightbox() {\n      if (this._catchLightbox) return this._catchLightbox;\n      const root = document.createElement('div');\n      root.className = 'ffs-catch-lightbox';\n      root.hidden = true;\n      root.setAttribute('aria-hidden', 'true');\n      root.innerHTML = `\n        <button type=\"button\" class=\"ffs-catch-lightbox__backdrop\" data-ffs-catch-lb-close aria-label=\"Close photo\"></button>\n        <div class=\"ffs-catch-lightbox__dialog\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Catch photo\" tabindex=\"-1\">\n          <button type=\"button\" class=\"ffs-catch-lightbox__close\" data-ffs-catch-lb-close aria-label=\"Close\">\n            <span aria-hidden=\"true\">&times;</span>\n          </button>\n          <img class=\"ffs-catch-lightbox__img\" alt=\"\">\n          <p class=\"ffs-catch-lightbox__cap\"></p>\n        </div>`;\n      document.body.appendChild(root);\n\n      const close = () => {\n        root.hidden = true;\n        root.setAttribute('aria-hidden', 'true');\n        document.body.classList.remove('ffs-catch-lightbox-lock');\n        if (this._catchLightboxFocus && typeof this._catchLightboxFocus.focus === 'function') {\n          this._catchLightboxFocus.focus();\n        }\n        this._catchLightboxFocus = null;\n      };\n\n      root.querySelectorAll('[data-ffs-catch-lb-close]').forEach((btn) => {\n        btn.addEventListener('click', close);\n      });\n      document.addEventListener('keydown', (e) => {\n        if (e.key === 'Escape' && !root.hidden) close();\n      });\n\n      this._catchLightbox = { root, close };\n      return this._catchLightbox;\n    }\n\n    openCatchLightbox(src, alt, opener) {\n      if (!src) return;\n      const { root } = this.ensureCatchLightbox();\n      const img = root.querySelector('.ffs-catch-lightbox__img');\n      const cap = root.querySelector('.ffs-catch-lightbox__cap');\n      const dialog = root.querySelector('.ffs-catch-lightbox__dialog');\n      this._catchLightboxFocus = opener || document.activeElement;\n      if (img) {\n        img.src = src;\n        img.alt = alt || 'Catch photo';\n      }\n      if (cap) cap.textContent = alt || '';\n      root.hidden = false;\n      root.setAttribute('aria-hidden', 'false');\n      document.body.classList.add('ffs-catch-lightbox-lock');\n      if (dialog) dialog.focus({ preventScroll: true });\n    }\n\n    bindCatchLightbox(mount) {\n      if (!mount || mount.dataset.ffsCatchLbBound === '1') return;\n      mount.dataset.ffsCatchLbBound = '1';\n      mount.addEventListener('click', (e) => {\n        const btn = e.target.closest('[data-ffs-catch-open]');\n        if (!btn || !mount.contains(btn)) return;\n        this.openCatchLightbox(\n          btn.getAttribute('data-catch-src'),\n          btn.getAttribute('data-catch-alt'),\n          btn\n        );\n      });\n    }\n\n    $(sel) {\n      return this.root.querySelector(sel);\n    }\n\n    $$(sel) {\n      return this.root.querySelectorAll(sel);\n    }\n\n    riversInRegion(regionId) {\n      return DATA.rivers.filter((r) => r.region === regionId);\n    }\n\n    ensureActiveRiver() {\n      const rivers = this.riversInRegion(this.activeRegion);\n      if (!rivers.length) {\n        this.activeRiverId = null;\n        return;\n      }\n      if (!rivers.some((r) => r.siteId === this.activeRiverId)) {\n        this.activeRiverId = rivers[0].siteId;\n      }\n    }\n\n    enhanceSelect(select) {\n      if (!select || select.dataset.ffsEnhanced === '1') return;\n      select.dataset.ffsEnhanced = '1';\n      select.classList.add('ffs-select__native');\n\n      const wrap = document.createElement('div');\n      wrap.className = 'ffs-select';\n      select.parentNode.insertBefore(wrap, select);\n      wrap.appendChild(select);\n\n      const btn = document.createElement('button');\n      btn.type = 'button';\n      btn.className = 'ffs-select__btn';\n      btn.setAttribute('aria-haspopup', 'listbox');\n      btn.setAttribute('aria-expanded', 'false');\n      if (select.id) btn.id = `${select.id}-btn`;\n\n      const menu = document.createElement('ul');\n      menu.className = 'ffs-select__menu';\n      menu.setAttribute('role', 'listbox');\n      menu.hidden = true;\n\n      const syncLabel = () => {\n        const opt = select.options[select.selectedIndex];\n        btn.textContent = opt ? opt.textContent : '';\n      };\n\n      const syncMenu = () => {\n        menu.innerHTML = Array.from(select.options)\n          .map((opt, index) => {\n            const selected = opt.selected ? ' is-selected' : '';\n            return `<li role=\"option\" class=\"ffs-select__option${selected}\" data-index=\"${index}\" aria-selected=\"${opt.selected ? 'true' : 'false'}\">${opt.textContent}</li>`;\n          })\n          .join('');\n        syncLabel();\n      };\n\n      const close = () => {\n        wrap.classList.remove('is-open');\n        btn.setAttribute('aria-expanded', 'false');\n        menu.hidden = true;\n      };\n\n      const open = () => {\n        document.querySelectorAll('.ffs-select.is-open').forEach((el) => {\n          if (el === wrap) return;\n          el.classList.remove('is-open');\n          const otherBtn = el.querySelector('.ffs-select__btn');\n          const otherMenu = el.querySelector('.ffs-select__menu');\n          if (otherBtn) otherBtn.setAttribute('aria-expanded', 'false');\n          if (otherMenu) otherMenu.hidden = true;\n        });\n        syncMenu();\n        wrap.classList.add('is-open');\n        btn.setAttribute('aria-expanded', 'true');\n        menu.hidden = false;\n      };\n\n      const syncDisabled = () => {\n        const off = !!select.disabled;\n        btn.disabled = off;\n        wrap.classList.toggle('is-disabled', off);\n        if (off) close();\n      };\n\n      btn.addEventListener('click', (event) => {\n        event.preventDefault();\n        if (select.disabled || btn.disabled) return;\n        if (wrap.classList.contains('is-open')) close();\n        else open();\n      });\n\n      /* The native <select> stays focusable/tabbable for accessibility, but it's\n         visually clipped to 1px so the browser's own dropdown renders mis-anchored\n         (floats near the top of the page). Forward keyboard activation to our\n         custom menu instead of letting the native popup open at all. */\n      select.addEventListener('mousedown', (event) => {\n        event.preventDefault();\n      });\n\n      select.addEventListener('keydown', (event) => {\n        if (select.disabled) return;\n        const key = event.key;\n        if (key === 'Enter' || key === ' ' || key === 'Spacebar') {\n          event.preventDefault();\n          if (wrap.classList.contains('is-open')) close();\n          else open();\n          return;\n        }\n        if (key === 'ArrowDown' || key === 'ArrowUp' || key === 'Down' || key === 'Up') {\n          event.preventDefault();\n          if (!wrap.classList.contains('is-open')) {\n            open();\n            return;\n          }\n          const options = Array.from(menu.querySelectorAll('[data-index]'));\n          if (!options.length) return;\n          const dir = key === 'ArrowDown' || key === 'Down' ? 1 : -1;\n          const next = Math.min(options.length - 1, Math.max(0, select.selectedIndex + dir));\n          if (next === select.selectedIndex) return;\n          select.selectedIndex = next;\n          select.dispatchEvent(new Event('change', { bubbles: true }));\n          syncMenu();\n        }\n      });\n\n      menu.addEventListener('click', (event) => {\n        const item = event.target.closest('[data-index]');\n        if (!item || select.disabled) return;\n        const next = Number(item.dataset.index);\n        if (!Number.isFinite(next) || next === select.selectedIndex) {\n          close();\n          return;\n        }\n        select.selectedIndex = next;\n        select.dispatchEvent(new Event('change', { bubbles: true }));\n        syncMenu();\n        close();\n      });\n\n      document.addEventListener('click', (event) => {\n        if (!wrap.contains(event.target)) close();\n      });\n\n      document.addEventListener('keydown', (event) => {\n        if (event.key === 'Escape') close();\n      });\n\n      select.addEventListener('change', syncLabel);\n      select.addEventListener('ffs:sync-disabled', syncDisabled);\n      wrap.appendChild(btn);\n      wrap.appendChild(menu);\n      syncMenu();\n      syncDisabled();\n    }\n\n    enhanceSelects(root) {\n      if (!root) return;\n      root.querySelectorAll('select.ffs-report__select').forEach((select) => this.enhanceSelect(select));\n    }\n\n    renderRiverPickers() {\n      const wrap = this.$('[data-ffs-report-pickers]');\n      if (!wrap) return;\n      const rivers = this.riversInRegion(this.activeRegion);\n      const regionOptions = DATA.regions\n        .map((r) => {\n          const selected = r.id === this.activeRegion ? ' selected' : '';\n          return `<option value=\"${r.id}\"${selected}>${r.label}</option>`;\n        })\n        .join('');\n      const riverOptions = rivers\n        .slice()\n        .sort((a, b) => a.name.localeCompare(b.name) || a.section.localeCompare(b.section))\n        .map((r) => {\n          const selected = r.siteId === this.activeRiverId ? ' selected' : '';\n          return `<option value=\"${r.siteId}\"${selected}>${r.name}</option>`;\n        })\n        .join('');\n\n      wrap.innerHTML = `\n        <div class=\"ffs-report__picker\">\n          <label class=\"ffs-report__picker-label\" for=\"ffs-report-region-btn\">Region</label>\n          <select class=\"ffs-report__select\" id=\"ffs-report-region\" data-ffs-region-select>\n            ${regionOptions}\n          </select>\n        </div>\n        <div class=\"ffs-report__picker\">\n          <label class=\"ffs-report__picker-label\" for=\"ffs-report-river-btn\">Water</label>\n          <select class=\"ffs-report__select\" id=\"ffs-report-river\" data-ffs-river-select>\n            ${riverOptions}\n          </select>\n        </div>\n      `;\n\n      wrap.querySelector('[data-ffs-region-select]')?.addEventListener('change', (event) => {\n        this.activeRegion = event.target.value;\n        this.hatchRegion = this.activeRegion;\n        this.ensureActiveRiver();\n        this.renderRiverPickers();\n        this.renderRivers();\n        this.renderHatchTabs();\n        this.renderRegionalHatch();\n      });\n\n      wrap.querySelector('[data-ffs-river-select]')?.addEventListener('change', (event) => {\n        this.activeRiverId = event.target.value;\n        this.renderRivers();\n      });\n\n      this.enhanceSelects(wrap);\n    }\n\n    renderRivers() {\n      const grid = this.$('[data-ffs-report-rivers]');\n      if (!grid) return;\n      this.ensureActiveRiver();\n      const river = DATA.rivers.find((r) => r.siteId === this.activeRiverId);\n      grid.innerHTML = river ? this.riverCardHtml(river) : '<p class=\"ffs-report__empty\">No rivers in this region yet.</p>';\n    }\n\n    renderHatchTabs() {\n      const wrap = this.$('[data-ffs-hatch-tabs]');\n      if (!wrap) return;\n      const regionOptions = DATA.regions\n        .map((r) => {\n          const selected = r.id === this.hatchRegion ? ' selected' : '';\n          return `<option value=\"${r.id}\"${selected}>${r.label}</option>`;\n        })\n        .join('');\n\n      wrap.innerHTML = `\n        <div class=\"ffs-report__picker ffs-report__picker--hatch\">\n          <label class=\"ffs-report__picker-label\" for=\"ffs-hatch-region-btn\">Location</label>\n          <select class=\"ffs-report__select\" id=\"ffs-hatch-region\" data-ffs-hatch-region>\n            ${regionOptions}\n          </select>\n        </div>\n      `;\n\n      wrap.querySelector('[data-ffs-hatch-region]')?.addEventListener('change', (event) => {\n        this.hatchRegion = event.target.value;\n        this.activeRegion = this.hatchRegion;\n        this.ensureActiveRiver();\n        this.renderRegionalHatch();\n        this.renderRiverPickers();\n        this.renderRivers();\n      });\n\n      this.enhanceSelects(wrap);\n    }\n\n    bindHatchTabs() {\n      /* Hatch location select is bound inside renderHatchTabs() */\n    }\n\n    hatchHref(label) {\n      const map = DATA.hatchLinks || {};\n      return map[label] || '/collections/all-flies';\n    }\n\n    shopPatternsHref(river) {\n      const flies = river.flies || [];\n      const product = flies.find((url) => typeof url === 'string' && url.indexOf('/products/') === 0);\n      if (product) return product;\n      const collection = flies.find((url) => typeof url === 'string' && url.indexOf('/collections/') === 0);\n      if (collection) return collection;\n      if (river.hatches && river.hatches.length) return this.hatchHref(river.hatches[0]);\n      return '/collections/all-flies';\n    }\n\n    builderHref(river) {\n      const water = river.id ? this.findDirectoryWater(river.id) : this.directoryWaters().find(w =>\n        w.siteId && w.siteId === river.siteId && w.name === river.name);\n      const target = water || river;\n      const params = new URLSearchParams({region: target.region || '',\n        elevation: this.waterElevationId(target), water: this.waterTypeId(target),\n        month: String(this.reportMonth())});\n      if (target.state) params.set('state', String(target.state).toUpperCase());\n      if (water) params.set('waterId', water.id);\n      return `/pages/build-your-box?${params.toString()}`;\n    }\n\n    riverCardHtml(river) {\n      const g = this.gaugeData[river.siteId] || {};\n      const hasFlow = g.flow != null;\n      const hasTemp = g.temp != null;\n      const flow = hasFlow ? fmtFlow(g.flow) : '\u2014';\n      const temp = hasTemp ? fmtTemp(g.temp) : hasFlow ? 'N/A' : '\u2014';\n      const fStat = hasFlow ? flowStatus(g.flow) : { label: 'Updating', tone: 'muted' };\n      const tStat = hasTemp ? tempStatus(g.temp) : { label: hasFlow ? 'Unavailable' : 'Updating', tone: 'muted' };\n\n      return `\n        <article class=\"ffs-report__river-card\" data-site=\"${river.siteId}\">\n          <header class=\"ffs-report__river-head\">\n            <div>\n              <h3 class=\"ffs-report__river-name\">${river.name}</h3>\n              <p class=\"ffs-report__river-section\">${river.section} \u00B7 ${river.elevation} \u00B7 ${river.type}</p>\n            </div>\n          </header>\n          <div class=\"ffs-report__metrics\">\n            <div class=\"ffs-report__metric\">\n              <span class=\"ffs-report__metric-label\">Flow</span>\n              <strong class=\"ffs-report__metric-value\" data-flow=\"${river.siteId}\">${flow}</strong>\n              <span class=\"ffs-report__metric-status ffs-report__metric-status--${fStat.tone}\">${fStat.label}</span>\n            </div>\n            <div class=\"ffs-report__metric\">\n              <span class=\"ffs-report__metric-label\">Temp</span>\n              <strong class=\"ffs-report__metric-value\" data-temp=\"${river.siteId}\">${temp}</strong>\n              <span class=\"ffs-report__metric-status ffs-report__metric-status--${tStat.tone}\">${tStat.label}</span>\n            </div>\n          </div>\n          ${this.gaugeObservedHtml(g)}\n          <p class=\"ffs-report__river-notes\">Seasonal planning information; current local report verification is pending.</p>\n          <div class=\"ffs-report__river-ctas\">\n            <a class=\"ffs-report__build-link\" href=\"${this.builderHref(river)}\">Build a box for this water</a>\n          </div>\n        </article>\n      `;\n    }\n\n    renderStaticSections() {\n      this.syncDetailPanels();\n      this.renderSelectedWaterReport();\n      this.renderSources();\n    }\n\n    hatchTextLink(text) {\n      if (/^(Iso|Isonychia)(?:$|[^a-z])/i.test(String(text))) return `${this.escapeHtml(text)} (no verified catalog match)`;\n      const map = DATA.hatchLinks || {};\n      // Prefer exact map keys found inside the label (longest first)\n      const keys = Object.keys(map).sort((a, b) => b.length - a.length);\n      for (const key of keys) {\n        if (text === key || text.indexOf(key) !== -1) {\n          return `<a class=\"ffs-report__hatch-link\" href=\"${map[key]}\">${text}</a>`;\n        }\n      }\n      return text;\n    }\n\n    /* Box builder / legacy callers still invoke this name */\n    renderRegionalHatch() {\n      this.renderSelectedWaterReport();\n    }\n\n    formatReportUpdated(raw) {\n      if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(String(raw || ''))) return '';\n      const date = new Date(raw + 'T00:00:00Z');\n      if (Number.isNaN(date.getTime()) || date.toISOString().slice(0, 10) !== raw) return '';\n      return date.toLocaleDateString('en-US', {timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric'});\n    }\n\n    seedNamedWater() {\n      const water = this.findDirectoryWater(this.activeBoxWaterId);\n      if (!water) { this.activeBoxWaterId = null; this.boxWaterHatchHandles = null; return; }\n      this.boxState = water.state;\n      this.boxRegion = water.region;\n      this.boxElevation = this.waterElevationId(water);\n      this.boxWaterType = this.waterTypeId(water);\n      this.boxWaterHatchHandles = this.hotFliesForWater(water, this.boxTargetCount || 12).map(fly => fly.handle);\n    }\n\n    reportEvidence(water) {\n      const report = water.report || {};\n      const date = report.editorialDate || report.updated;\n      const dated = this.formatReportUpdated(date);\n      const sourceSafe = /^https:\\/\\//.test(String(report.sourceUrl || ''));\n      const verified = report.verificationStatus === 'verified' && sourceSafe &&\n        this.formatReportUpdated(report.observationDate) && this.formatReportUpdated(report.sourcePublishedDate) &&\n        Number.isFinite(Date.parse(report.reviewedAt));\n      // No inferred freshness. A verified report remains an explicitly dated observation.\n      return { verified: Boolean(verified), date: dated ? date : '', label: dated || 'date not recorded',\n        message: '' };\n    }\n\n    waterGuideLink(water) {\n      const map = {\n        'provo-river-near-charleston-ut': '/pages/middle-provo-river-fly-fishing',\n        'provo-river-provo-ut': '/pages/lower-provo-river-fly-fishing',\n        'green-river-flaming-gorge-ut': '/pages/green-river-flaming-gorge-fly-fishing',\n        'strawberry-reservoir-wasatch-county-ut-x63': '/pages/strawberry-reservoir-fly-fishing',\n        'snake-river-jackson-hole-wy': '/pages/snake-river-jackson-hole-fly-fishing',\n        'snake-river-south-fork-below-jackson-lake-wy-x36': '/pages/snake-river-jackson-hole-fly-fishing'\n      };\n      const href = map[water.id];\n      const live = window.FFS_PUBLISHED_WATER_GUIDES || [];\n      return href && live.includes(href) ? `<a href=\"${href}\">Read the water guide</a>` : '';\n    }\n\n    gaugeObservedHtml(gauge) {\n      const rows = ['flow', 'temp'].filter(key => gauge[key] != null).map(key => {\n        const stamp = gauge[key + 'ObservedAt'];\n        const date = new Date(stamp);\n        if (!stamp || Number.isNaN(date.getTime())) return `${key === 'flow' ? 'Flow' : 'Temperature'} observation time unavailable`;\n        const age = Date.now() - date.getTime();\n        const stale = age > 86400000 || age < -300000;\n        const text = date.toLocaleString('en-US', {timeZone: 'America/Denver', timeZoneName: 'short',\n          month: 'short', day: 'numeric', year: 'numeric', hour: 'numeric', minute: '2-digit'});\n        return `${key === 'flow' ? 'Flow' : 'Temperature'} observed <time datetime=\"${this.escapeHtml(stamp)}\">${this.escapeHtml(text)}</time>${stale ? ' \u2014 older than 24 hours or timestamp needs checking' : ''}`;\n      });\n      return rows.length ? `<p class=\"ffs-report__dir-updated\">${rows.join('<br>')}${this.gaugeFetchFailed ? '<br>Refresh failed; showing previously retrieved observations.' : ''}</p>` : '';\n    }\n\n    /** Region / elev / water-type box recipe handles for a directory water. */\n    boxSetHandlesForWater(water) {\n      const href = this.builderHref(water || {});\n      const params = new URLSearchParams(String(href).split('?')[1] || '');\n      const region = params.get('region') || 'northern_rockies';\n      const elevation = params.get('elevation') || 'mid';\n      const waterType = params.get('water') || 'river';\n      const key = `${region}|${elevation}|${waterType}`;\n      const fallback = 'northern_rockies|mid|river';\n      const catalog = DATA.flyCatalog || {};\n      const raw = (DATA.boxSets && DATA.boxSets[key]) || (DATA.boxSets && DATA.boxSets[fallback]) || [];\n      return this.seasonFilterHandles(\n        raw.filter((handle) => catalog[handle]),\n        waterType\n      );\n    }\n\n    /**\n     * Report month (1\u201312). Build Your Box can override via the Month dropdown\n     * (`this.boxMonth`); otherwise the real calendar month.\n     */\n    reportMonth() {\n      const n = Number(this.boxMonth);\n      if (Number.isInteger(n) && n >= 1 && n <= 12) return n;\n      return new Date().getMonth() + 1;\n    }\n\n    monthNames() {\n      return [\n        'January',\n        'February',\n        'March',\n        'April',\n        'May',\n        'June',\n        'July',\n        'August',\n        'September',\n        'October',\n        'November',\n        'December',\n      ];\n    }\n\n    calendarMonthName() {\n      return this.monthNames()[this.reportMonth() - 1] || 'August';\n    }\n\n    /** winter | spring | summer | lateSummer | earlyFall | fall */\n    seasonBucket() {\n      const m = this.reportMonth();\n      if (m === 8) return 'lateSummer';\n      if (m === 9) return 'earlyFall';\n      if (m === 6 || m === 7) return 'summer';\n      if (m >= 3 && m <= 5) return 'spring';\n      if (m === 10 || m === 11) return 'fall';\n      return 'winter';\n    }\n\n    hatchBoardForRegion(regionId) {\n      const raw = (DATA.regionalHatches || {})[regionId];\n      if (!raw) return null;\n      if (Array.isArray(raw.active)) return raw;\n      const key = this.seasonBucket();\n      return (\n        raw[key] ||\n        raw.lateSummer ||\n        raw.earlyFall ||\n        raw.summer ||\n        raw.fall ||\n        raw.spring ||\n        raw.winter ||\n        null\n      );\n    }\n\n    /**\n     * Drop flies that are not on the water this month (cicadas after June,\n     * hoppers in winter, river hoppers on lakes). Used on boxSets backfill\n     * so a static summer recipe cannot leak into January.\n     */\n    seasonFilterHandles(handles, waterType) {\n      const m = this.reportMonth();\n      const still = waterType === 'stillwater';\n      const catalog = DATA.flyCatalog || {};\n      return (handles || []).filter((h) => {\n        if (!h) return false;\n        const fly = catalog[h] || {};\n        if (fly.soldOut) return false;\n        const hay = `${h} ${fly.title || ''}`.toLowerCase();\n        if (still && /hopper|cicada|morrish|chubby/.test(hay)) return false;\n        if (/cicada/.test(hay) && m !== 5 && m !== 6) return false;\n        if (/hopper|morrish|chubby/.test(hay) && (m < 6 || m > 9)) return false;\n        if (/black-ant|foam-beetle|(^|[\\s-])beetle/.test(hay) && (m < 5 || m > 10)) return false;\n        if (/trico/.test(hay) && (m < 7 || m > 10)) return false;\n        if (/pmd|pale-morning|sparkle-dun/.test(hay) && (m < 5 || m > 9)) return false;\n        if (/yellow-sally/.test(hay) && (m < 6 || m > 8)) return false;\n        if (/salmonfly/.test(hay) && (m < 5 || m > 7)) return false;\n        if (/green-drake/.test(hay) && (m < 6 || m > 8)) return false;\n        if (/stimulator/.test(hay) && (m < 5 || m > 9)) return false;\n        if (/sulphur/.test(hay) && (m < 5 || m > 7)) return false;\n        if (/light-cahill/.test(hay) && (m < 5 || m > 8)) return false;\n        if (/(^|[\\s-])hex($|[\\s-])|hexagenia/.test(hay) && (m < 6 || m > 7)) return false;\n        if (/damsel/.test(hay) && (m < 5 || m > 9)) return false;\n        return true;\n      });\n    }\n\n    /** Kind budgets follow the calendar so winter boxes are not forced to 2 terrestrials. */\n    boxKindQuotas() {\n      const m = this.reportMonth();\n      if (m <= 4 || m >= 11) return { nymph: 6, dry: 4, terrestrial: 0, streamer: 2 };\n      if (m === 5 || m === 10) return { nymph: 5, dry: 4, terrestrial: 1, streamer: 2 };\n      return { nymph: 5, dry: 3, terrestrial: 2, streamer: 2 };\n    }\n\n    boxSeasonKitHandles() {\n      const kits = DATA.boxSeasonKits || {};\n      const bucket = this.seasonBucket();\n      const water = this.boxWaterType || 'river';\n      const pack = kits[bucket] || kits.summer || {};\n      return this.seasonFilterHandles(pack[water] || pack.river || [], water);\n    }\n\n    /**\n     * Audited per-water seasonal pick for this water (Utah first via\n     * DATA.waterFlyPicks). Returns { note, handles, character, waterClass, seasonKey }\n     * or null when that water has not been audited yet.\n     */\n    waterFlyPickEntry(water) {\n      if (!water || !water.id || !DATA.waterFlyPicks) return null;\n      const entry = DATA.waterFlyPicks[water.id];\n      if (!entry || !entry.seasons) return null;\n      const month = this.reportMonth();\n      const seasons = entry.seasons;\n      let match = null;\n      let seasonKey = '';\n      Object.keys(seasons).forEach((key) => {\n        const s = seasons[key];\n        if (!match && s && Array.isArray(s.months) && s.months.indexOf(month) !== -1) {\n          match = s;\n          seasonKey = key;\n        }\n      });\n      /* Never fall back to summer for a winter month \u2014 pick the season\n         whose months are closest on the calendar ring. */\n      if (!match) {\n        let bestDist = 99;\n        Object.keys(seasons).forEach((key) => {\n          const s = seasons[key];\n          (s && s.months ? s.months : []).forEach((mm) => {\n            const n = Number(mm);\n            if (!(n >= 1 && n <= 12)) return;\n            const dist = Math.min(Math.abs(n - month), 12 - Math.abs(n - month));\n            if (dist < bestDist) {\n              bestDist = dist;\n              match = s;\n              seasonKey = key;\n            }\n          });\n        });\n      }\n      if (!match) return null;\n      const waterType =\n        entry.waterClass === 'stillwater' || entry.waterClass === 'tailwater' || entry.waterClass === 'creek'\n          ? entry.waterClass\n          : this.waterTypeId(water);\n      return {\n        note: match.note || '',\n        handles: this.seasonFilterHandles(\n          Array.isArray(match.handles) ? match.handles : [],\n          waterType\n        ),\n        character: entry.character || '',\n        waterClass: entry.waterClass || '',\n        seasonKey,\n      };\n    }\n\n    /**\n     * Season staples that fish broadly right now. Stillwater deliberately\n     * skips river hoppers/cicadas \u2014 lakes want chironomids, scuds, damsels.\n     * Flowing water adds a stonefly nymph in spring/summer; tailwaters add a scud.\n     */\n    seasonalStapleHandles(water) {\n      const type = String((water && water.type) || '').toLowerCase();\n      const stillwater = type.indexOf('still') !== -1 || type.indexOf('lake') !== -1 || type.indexOf('reservoir') !== -1;\n      const tailwater = type.indexOf('tailwater') !== -1;\n      const waterType = stillwater ? 'stillwater' : tailwater ? 'tailwater' : type.indexOf('creek') !== -1 ? 'creek' : 'river';\n      const kit = ((DATA.boxSeasonKits || {})[this.seasonBucket()] || {})[waterType];\n      if (kit && kit.length) return this.seasonFilterHandles(kit, waterType);\n      const m = this.reportMonth();\n      if (stillwater) {\n        return m <= 4 || m >= 11\n          ? ['zebra-midge', 'bead-head-scud', 'olive-wooly-bugger', 'parachute-bwo', 'adams-dry']\n          : ['zebra-midge', 'bead-head-scud', 'damsel-nymph', 'adams-dry', 'olive-wooly-bugger', 'black-ant'];\n      }\n      if (m <= 4 || m >= 11) {\n        const out = ['parachute-bwo', 'zebra-midge', 'olive-wooly-bugger', 'juju-baetis-nymph'];\n        if (tailwater) out.push('bead-head-scud');\n        return out;\n      }\n      if (m === 8 || m === 9) {\n        const out = ['morrish-foam-hopper', 'black-ant', 'parachute-trico', 'zebra-midge', 'olive-wooly-bugger'];\n        if (tailwater) out.push('bead-head-scud');\n        return out;\n      }\n      const out = ['parachute-bwo', 'black-ant', 'zebra-midge', 'olive-wooly-bugger'];\n      if (m >= 6 && m <= 10) out.splice(1, 0, 'morrish-foam-hopper');\n      out.push('golden-stone-fly-nymph');\n      if (tailwater) out.push('bead-head-scud');\n      return this.seasonFilterHandles(out, waterType);\n    }\n\n    /**\n     * Hot flies for a selected water \u2014 FFS catalog only.\n     * 1) Audited per-water seasonal picks (waterFlyPicks) when present\n     * 2) Hatch matches (round-robin over the water's hatch list)\n     * 3) Season staples (water-type aware)\n     * 4) Box-set backfill so coverage stays complete\n     */\n    hotFliesForWater(water, limit) {\n      const cap = limit || 8;\n      const catalog = DATA.flyCatalog || {};\n      const waterType = this.waterTypeId(water);\n      const seen = new Set();\n      const out = [];\n      const push = (handle) => {\n        if (!handle || seen.has(handle) || !catalog[handle]) return;\n        if (!this.seasonFilterHandles([handle], waterType).length) return;\n        if (out.length >= cap) return;\n        seen.add(handle);\n        out.push(catalog[handle]);\n      };\n      const pick = this.waterFlyPickEntry(water);\n      if (pick && pick.handles && pick.handles.length) {\n        pick.handles.forEach(push);\n      }\n      (this.waterHatchHandles(water) || []).forEach(push);\n      this.seasonalStapleHandles(water).forEach(push);\n      if (out.length < Math.min(5, cap)) {\n        (this.boxSetHandlesForWater(water) || []).forEach(push);\n      }\n      return out;\n    }\n\n    /**\n     * Best Time Window slots from hatch dayparts + seasonal ranking.\n     * Optional USGS temp nudge: warm water favors early windows.\n     */\n    bestTimeWindowsForWater(water) {\n      const dayparts = DATA.hatchDayparts || {};\n      const regionBoard = this.hatchBoardForRegion((water && water.region) || '');\n      const wordMatch = (haystack, term) => {\n        const esc = String(term).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n        return new RegExp(`(^|[^a-z])${esc}([^a-z]|$)`, 'i').test(String(haystack));\n      };\n      const seasonRank = (hatch) => {\n        if (!regionBoard) return 1;\n        const inList = (arr) => (arr || []).some((item) => wordMatch(item, hatch) || wordMatch(hatch, item));\n        if (inList(regionBoard.active)) return 3;\n        if (inList(regionBoard.emerging)) return 2;\n        if (inList(regionBoard.winding)) return 0.5;\n        return 1;\n      };\n\n      const g = water && water.siteId ? this.gaugeData[water.siteId] || {} : {};\n      const warm = g.temp != null && Number(g.temp) >= 64;\n      const cold = g.temp != null && Number(g.temp) <= 48;\n\n      const scored = [];\n      (water.hatches || []).forEach((hatch) => {\n        let part = dayparts[hatch];\n        if (!part) {\n          const key = Object.keys(dayparts).find((k) => wordMatch(k, hatch) || wordMatch(hatch, k));\n          if (key) part = dayparts[key];\n        }\n        if (!part) return;\n        let rank = seasonRank(hatch);\n        if (warm && /morning|early|low light/i.test(part.label)) rank += 1.2;\n        if (warm && /midday|afternoon terrestrial/i.test(part.label)) rank -= 0.8;\n        if (cold && /midday|afternoon/i.test(part.label)) rank += 0.5;\n        scored.push({\n          hatch,\n          start: part.start,\n          end: part.end,\n          label: part.label,\n          tip: part.tip || hatch,\n          rank,\n        });\n      });\n\n      scored.sort((a, b) => b.rank - a.rank);\n      const windows = [];\n      const seenKeys = new Set();\n      scored.forEach((slot) => {\n        const key = `${slot.start}|${slot.end}`;\n        if (seenKeys.has(key) || windows.length >= 3) return;\n        seenKeys.add(key);\n        const clock = slot.end ? `${slot.start} \u2013 ${slot.end}` : slot.start;\n        windows.push({\n          clock,\n          label: slot.label,\n          tip: slot.tip,\n          hatch: slot.hatch,\n        });\n      });\n\n      if (!windows.length) {\n        const m = this.reportMonth();\n        if (m === 12 || m <= 2) {\n          windows.push({\n            clock: 'Late morning \u2013 afternoon',\n            label: 'Winter nymph window',\n            tip: 'Midges and BWOs in the slowest water; streamers on cloudy afternoons',\n            hatch: '',\n          });\n        } else if (m >= 3 && m <= 5) {\n          windows.push({\n            clock: 'Afternoon',\n            label: 'Spring hatch window',\n            tip: 'BWOs and caddis as cloud cover and water temps allow',\n            hatch: '',\n          });\n        } else if (m === 8) {\n          windows.push({\n            clock: 'Dawn and dusk',\n            label: 'August terrestrial window',\n            tip: 'Tricos at first light; hoppers and ants 11\u20134; caddis at dusk',\n            hatch: '',\n          });\n        } else if (m >= 9) {\n          windows.push({\n            clock: 'Afternoon \u2013 evening',\n            label: 'Fall olive window',\n            tip: 'BWOs on cloudy afternoons; streamers at last light',\n            hatch: '',\n          });\n        } else {\n          windows.push({\n            clock: 'Morning \u2013 evening',\n            label: 'Prime summer window',\n            tip: 'Fish cooler bookends of the day; nymph deeper through midday heat',\n            hatch: '',\n          });\n        }\n      }\n      return windows;\n    }\n\n    waterReportBody(water) {\n      const report = water.report || {};\n      const g = water.siteId ? this.gaugeData[water.siteId] || {} : {};\n      const hasFlow = g.flow != null;\n      const hasTemp = g.temp != null;\n      const flow = hasFlow ? fmtFlow(g.flow) : null;\n      const temp = hasTemp ? fmtTemp(g.temp) : null;\n      const fStat = hasFlow ? flowStatus(g.flow) : null;\n      const tStat = hasTemp ? tempStatus(g.temp) : null;\n      const evidence = this.reportEvidence(water);\n      const condition = evidence.verified ? report.condition || '' : '';\n      const cond = String(condition).toLowerCase();\n      const conditionTone =\n        cond.indexOf('excellent') !== -1 || cond === 'prime' || cond.indexOf('great') !== -1\n          ? 'excellent'\n          : cond.indexOf('poor') !== -1 || cond.indexOf('bad') !== -1 || cond.indexOf('tough') !== -1\n            ? 'bad'\n            : 'decent';\n      const summary = String(report.summary || '').trim();\n      const hatches = Array.isArray(water.hatches) ? water.hatches.filter(Boolean) : [];\n      const metaBits = [water.section, water.type, water.elevation].filter(Boolean);\n      const timeWindows = []; // Unverified generic clock windows are not dated local observations.\n\n      const conditionBlock = condition\n        ? `<p class=\"ffs-water-report__condition ffs-water-report__condition--${conditionTone}\">\n            <span class=\"ffs-water-report__condition-label\">Conditions in the dated report</span>\n            <strong>${this.escapeHtml(condition)}</strong>\n          </p>`\n        : '';\n\n      const gaugeLine = (label, value, stat) =>\n        `<p class=\"ffs-water-report__gauge ffs-water-report__gauge--${stat.tone}\">\n          <em>${label}</em>\n          <strong>${value}</strong>\n          ${stat.label ? `<span>${stat.label}</span>` : ''}\n        </p>`;\n      const gaugeBits = [];\n      if (flow) gaugeBits.push(gaugeLine('Flow', flow, fStat));\n      if (temp) gaugeBits.push(gaugeLine('Temp', temp, tStat));\n      const gaugesBlock = gaugeBits.length\n        ? `<div class=\"ffs-water-report__gauges\" aria-label=\"Latest retrieved gauge observations\">${gaugeBits.join('')}</div>`\n        : '';\n\n      const timeBlock = timeWindows.length\n        ? `<div class=\"ffs-water-report__times\">\n            <h3 class=\"ffs-water-report__subhead\">Best time window</h3>\n            <ul class=\"ffs-water-report__time-list\">\n              ${timeWindows\n                .map(\n                  (w) => `<li>\n                    <strong class=\"ffs-water-report__time-clock\">${this.escapeHtml(w.clock)}</strong>\n                    <span class=\"ffs-water-report__time-tip\">${this.escapeHtml(w.tip)}</span>\n                  </li>`\n                )\n                .join('')}\n            </ul>\n          </div>`\n        : '';\n\n      const hatchLinks = hatches.map((h) => `<li>${this.hatchTextLink(h)}</li>`).join('');\n      const buildCta = `<div class=\"ffs-water-report__cta\">\n            <a class=\"ffs-report__build-link\" href=\"${this.builderHref(water)}\">Build a box for this water</a>\n          </div>`;\n      const hatchesBlock = hatches.length\n        ? `<div class=\"ffs-water-report__hatches\">\n            <h3 class=\"ffs-water-report__subhead\">Seasonal fly ideas \u2014 verify locally</h3>\n            <ul class=\"ffs-water-report__hatch-list\">${hatchLinks}</ul>\n            ${buildCta}\n          </div>`\n        : buildCta;\n\n      const detail = evidence.verified ? summary : '';\n      const sourceLine = evidence.verified ? `<p><a href=\"${this.escapeHtml(report.sourceUrl)}\" target=\"_blank\" rel=\"noopener noreferrer\">Report source</a> \u00B7 observed ${this.formatReportUpdated(report.observationDate)} \u00B7 source published ${this.formatReportUpdated(report.sourcePublishedDate)}</p>` : '';\n      const summaryBlock = detail\n        ? `<div class=\"ffs-water-report__summary\">\n            <h3 class=\"ffs-water-report__subhead\">Dated report notes</h3>\n            <p>${this.escapeHtml(detail)}</p>\n          </div>`\n        : '';\n\n      return `\n        <div class=\"ffs-water-report\">\n          ${metaBits.length ? `<p class=\"ffs-water-report__meta\">${metaBits.map((b) => this.escapeHtml(b)).join(' \u00B7 ')}</p>` : ''}\n          <p>Editorial entry: ${this.escapeHtml(evidence.label)}.</p>\n          ${sourceLine}\n          ${conditionBlock}\n          ${gaugesBlock}\n          ${this.gaugeObservedHtml(g)}\n          ${timeBlock}\n          ${summaryBlock}\n          ${hatchesBlock}\n          ${this.waterGuideLink(water)}\n        </div>\n      `;\n    }\n\n    renderSelectedWaterReport() {\n      const el = this.$('[data-ffs-report-hatch]');\n      const title = this.$('[data-ffs-water-report-title]');\n      if (!el) return;\n\n      const water = this.selectedCatchWaterId ? this.findDirectoryWater(this.selectedCatchWaterId) : null;\n      if (!water) {\n        if (title) title.textContent = 'Fishing report';\n        el.innerHTML = '';\n        return;\n      }\n\n      if (title) title.textContent = `${water.name} fishing report`;\n      el.innerHTML = this.waterReportBody(water);\n    }\n\n    money(n) {\n      return `$${Number(n).toFixed(2)}`;\n    }\n\n    flyThumbUrl(src, size) {\n      return ffsFlyThumbUrl(src, size);\n    }\n\n    openFlyQuickView(productUrl, opener) {\n      const modal = document.getElementById(this.dataset.ffsBoxModal);\n      if (!modal || !opener || typeof modal.show !== 'function') {\n        this.saveBoxDraft();\n        window.location.href = productUrl;\n        return;\n      }\n      opener.setAttribute('data-product-url', productUrl);\n      modal.show(opener);\n    }\n\n    regionMeta(id) {\n      return (DATA.regions || []).find((r) => r.id === id) || { id, label: id, blurb: '' };\n    }\n\n    regionLabel(id) {\n      return this.regionMeta(id).label || id;\n    }\n\n    elevationMeta(id) {\n      return (DATA.boxElevations || []).find((e) => e.id === id) || { id, label: id, short: '' };\n    }\n\n    waterTypeMeta(id) {\n      return (DATA.boxWaterTypes || []).find((w) => w.id === id) || { id, label: id, short: '' };\n    }\n\n    flyKind(fly) {\n      const kind = (fly && fly.kind) || 'dry';\n      if (kind === 'terrestrial' || kind === 'nymph' || kind === 'streamer') return kind;\n      return 'dry';\n    }\n\n    flyDotStyle(kind) {\n      if (kind === 'terrestrial') return ' style=\"background:#74b3e3\"';\n      if (kind === 'streamer') return ' style=\"background:#1a3a5c\"';\n      return '';\n    }\n\n    flyKindLabel(kind) {\n      if (kind === 'terrestrial') return 'Terrestrial';\n      if (kind === 'nymph') return 'Nymph';\n      if (kind === 'streamer') return 'Streamer';\n      return 'Dry';\n    }\n\n    flyKindOrder(kind) {\n      if (kind === 'nymph') return 0;\n      if (kind === 'dry') return 1;\n      if (kind === 'terrestrial') return 2;\n      if (kind === 'streamer') return 3;\n      return 4;\n    }\n\n    baseBoxHandles() {\n      const key = `${this.boxRegion}|${this.boxElevation}|${this.boxWaterType}`;\n      const fallback = 'california|mid|river';\n      const raw = this.seasonFilterHandles(\n        (DATA.boxSets && DATA.boxSets[key]) || (DATA.boxSets && DATA.boxSets[fallback]) || [],\n        this.boxWaterType\n      );\n      const seasonalKit = this.boxSeasonKitHandles();\n      /* Prefer: (1) water-specific hot flies from report builder,\n         (2) state-scoped seasonal waterFlyPicks,\n         (3) calendar kit so states with no directory waters still change by month,\n         then backfill from the filtered regional boxSets recipe. */\n      let must = this.boxWaterHatchHandles;\n      if ((!must || !must.length) && this.boxState) {\n        must = this.stateSeasonalHandles();\n      }\n      if (!must || !must.length) {\n        must = seasonalKit;\n      }\n      const recipe = [...seasonalKit, ...raw];\n      if (must && must.length) {\n        return this.enforceBoxKindBalance([...must, ...recipe], must);\n      }\n      return this.enforceBoxKindBalance(recipe);\n    }\n\n    /**\n     * Flies from the catalog that imitate this water's own hatch list, ranked\n     * by this month's regional hatch board: active hatches first, emerging\n     * next, winding-down last. Each hatch pulls from its curated fly set\n     * (signature dry + nymph stage), interleaved round-robin so every hatch\n     * on the water is covered before any hatch doubles up.\n     */\n    waterHatchHandles(water) {\n      const catalog = DATA.flyCatalog || {};\n      const sets = DATA.hatchFlySets || {};\n      const links = DATA.hatchLinks || {};\n      const regionBoard = this.hatchBoardForRegion(water.region);\n      const wordMatch = (haystack, term) => {\n        const esc = String(term).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n        return new RegExp(`(^|[^a-z])${esc}([^a-z]|$)`, 'i').test(String(haystack));\n      };\n      const seasonRank = (hatch) => {\n        if (!regionBoard) return 1;\n        const inList = (arr) => (arr || []).some((item) => wordMatch(item, hatch) || wordMatch(hatch, item));\n        if (inList(regionBoard.active)) return 3;\n        if (inList(regionBoard.emerging)) return 2;\n        if (inList(regionBoard.winding)) return 0.5;\n        return 1;\n      };\n      const handleFromUrl = (url) => {\n        const m = String(url || '').match(/\\/products\\/([a-z0-9-]+)/);\n        return m ? m[1] : null;\n      };\n\n      /* Ordered flies for one hatch: curated set first, legacy matching as fallback */\n      const fliesForHatch = (hatch) => {\n        let set = sets[hatch];\n        if (!set) {\n          const key = Object.keys(sets).find((k) => wordMatch(k, hatch) || wordMatch(hatch, k));\n          if (key) set = sets[key];\n        }\n        const out = [];\n        const push = (h) => {\n          if (h && catalog[h] && out.indexOf(h) === -1) out.push(h);\n        };\n        (set || []).forEach(push);\n        if (!out.length) {\n          Object.entries(links).forEach(([label, url]) => {\n            if (!wordMatch(label, hatch) && !wordMatch(hatch, label)) return;\n            push(handleFromUrl(url));\n          });\n          Object.keys(catalog).forEach((h) => {\n            if (wordMatch(catalog[h].title, hatch)) push(h);\n          });\n        }\n        return out;\n      };\n\n      const ranked = (water.hatches || [])\n        .map((hatch, i) => ({ i, rank: seasonRank(hatch), flies: fliesForHatch(hatch) }))\n        .filter((entry) => entry.flies.length)\n        .filter((entry) => !regionBoard || entry.rank >= 2)\n        .sort((a, b) => b.rank - a.rank || a.i - b.i);\n\n      const seen = new Set();\n      const out = [];\n      const maxLen = ranked.reduce((m, entry) => Math.max(m, entry.flies.length), 0);\n      for (let round = 0; round < maxLen; round++) {\n        ranked.forEach((entry) => {\n          const handle = entry.flies[round];\n          if (!handle || seen.has(handle)) return;\n          seen.add(handle);\n          out.push(handle);\n        });\n      }\n      return this.seasonFilterHandles(out, this.waterTypeId(water));\n    }\n\n    /**\n     * Curated box targets 12 patterns. Kind mix follows the selected month\n     * (no terrestrials in winter; hopper/ant windows in summer).\n     * mustInclude (water/state hot flies) are preferred first, then kind\n     * quotas fill from the recipe / fitness pool \u2014 hard-capped at boxTargetCount.\n     */\n    enforceBoxKindBalance(handles, mustInclude) {\n      const catalog = DATA.flyCatalog || {};\n      const quotas = this.boxKindQuotas();\n      const target = Math.max(1, Number(this.boxTargetCount) || 12);\n      const mustList = this.seasonFilterHandles(\n        (mustInclude || []).filter((h) => catalog[h]),\n        this.boxWaterType\n      );\n      const picked = { nymph: [], dry: [], terrestrial: [], streamer: [] };\n      const seen = new Set();\n      const total = () =>\n        picked.nymph.length + picked.dry.length + picked.terrestrial.length + picked.streamer.length;\n\n      const tryAdd = (handle, respectQuota) => {\n        if (total() >= target) return;\n        const fly = catalog[handle];\n        if (!fly || fly.soldOut || seen.has(handle)) return;\n        const kind = this.flyKind(fly);\n        if (respectQuota && picked[kind].length >= quotas[kind]) return;\n        picked[kind].push(handle);\n        seen.add(handle);\n      };\n\n      /* Prefer water/state seeds inside kind budgets, then recipe / fitness.\n         Only ignore quotas if still short of the 12-fly target. */\n      mustList.forEach((handle) => tryAdd(handle, true));\n      (handles || []).forEach((handle) => tryAdd(handle, true));\n      this.fitnessRankedHandles().forEach((handle) => tryAdd(handle, true));\n      if (total() < target) {\n        mustList.forEach((handle) => tryAdd(handle, false));\n        this.fitnessRankedHandles().forEach((handle) => tryAdd(handle, false));\n      }\n\n      return [...picked.nymph, ...picked.dry, ...picked.terrestrial, ...picked.streamer];\n    }\n\n    /** Rank catalog flies for current region / elevation / water (used to backfill quotas). */\n    fitnessRankedHandles() {\n      const catalog = DATA.flyCatalog || {};\n      const scores = {};\n      Object.entries(DATA.boxSets || {}).forEach(([key, handles]) => {\n        const [region, elev, water] = key.split('|');\n        let weight = 0;\n        if (region === this.boxRegion) weight += 4;\n        if (elev === this.boxElevation) weight += 2;\n        if (water === this.boxWaterType) weight += 3;\n        if (!weight) return;\n        (handles || []).forEach((handle) => {\n          if (!catalog[handle]) return;\n          scores[handle] = (scores[handle] || 0) + weight;\n        });\n      });\n      Object.keys(catalog).forEach((handle) => {\n        if (scores[handle] == null) scores[handle] = 0;\n      });\n      return this.seasonFilterHandles(\n        Object.keys(scores).sort((a, b) => scores[b] - scores[a] || a.localeCompare(b)),\n        this.boxWaterType\n      );\n    }\n\n    currentBoxFlies() {\n      const catalog = DATA.flyCatalog || {};\n      const seen = new Set();\n      const selectedKeys = Object.keys(this.boxQty || {}).filter((handle) => this.flyQty(handle) > 0)\n        .map((handle) => this.flyIdentity(handle)?.key).filter(Boolean);\n      const handles = [...this.baseBoxHandles(), ...(this.boxExtraHandles || []), ...selectedKeys].filter((handle) => {\n        if (!handle || seen.has(handle) || !catalog[handle]) return false;\n        seen.add(handle);\n        return true;\n      });\n      return handles\n        .map((handle) => catalog[handle])\n        .filter(Boolean)\n        .slice()\n        .sort((a, b) => {\n          const byKind = this.flyKindOrder(this.flyKind(a)) - this.flyKindOrder(this.flyKind(b));\n          if (byKind !== 0) return byKind;\n          return String(a.title || '').localeCompare(String(b.title || ''));\n        });\n    }\n\n    /** Score catalog flies by how often they show up in nearby box sets for this water. */\n    relevantFlyCandidates(limit = 5) {\n      const catalog = DATA.flyCatalog || {};\n      const present = new Set(this.currentBoxFlies().map((f) => this.flyIdentity(f.handle)?.key));\n      const counts = { nymph: 0, dry: 0, terrestrial: 0, streamer: 0 };\n      this.currentBoxFlies().forEach((f) => {\n        counts[this.flyKind(f)] += 1;\n      });\n      /* Prefer kinds that are still light when the shopper asks for more */\n      const kindBonus = (kind) => {\n        if (kind === 'nymph' && counts.nymph < 8) return 8;\n        if (kind === 'dry' && counts.dry < 6) return 5;\n        if (kind === 'terrestrial' && counts.terrestrial < 4) return 4;\n        if (kind === 'streamer' && counts.streamer < 4) return 4;\n        return 0;\n      };\n      const scores = {};\n\n      Object.entries(DATA.boxSets || {}).forEach(([key, handles]) => {\n        const [region, elev, water] = key.split('|');\n        let weight = 0;\n        if (region === this.boxRegion) weight += 3;\n        if (elev === this.boxElevation) weight += 1;\n        if (water === this.boxWaterType) weight += 2;\n        if (!weight) return;\n        (handles || []).forEach((handle) => {\n          if (!catalog[handle] || present.has(handle)) return;\n          const kind = this.flyKind(catalog[handle]);\n          scores[handle] = (scores[handle] || 0) + weight + kindBonus(kind);\n        });\n      });\n\n      /* Also allow any remaining catalog fly if nearby sets are exhausted */\n      Object.keys(catalog).forEach((handle) => {\n        if (present.has(handle) || scores[handle]) return;\n        const kind = this.flyKind(catalog[handle]);\n        scores[handle] = 0.5 + kindBonus(kind);\n      });\n\n      return this.seasonFilterHandles(\n        Object.keys(scores).filter((handle) => !catalog[handle]?.soldOut)\n          .sort((a, b) => scores[b] - scores[a] || a.localeCompare(b))\n          .slice(0, Math.max(0, limit * 4)),\n        this.boxWaterType\n      ).slice(0, Math.max(0, limit));\n    }\n\n    addMoreRelevantFlies(count = 1) {\n      const qty = this.boxDefaultQty;\n      let added = 0;\n      let lastHandle = '';\n      let remaining = Math.max(0, Math.round(Number(count) || 0));\n      if (!remaining) return '';\n      if (!this.boxAddedStack) this.boxAddedStack = [];\n\n      /* Prefer restoring cleared patterns already in the list */\n      const cleared = this.currentBoxFlies().filter((f) => !f.soldOut && this.flyQty(f.handle) <= 0);\n      cleared.slice(0, remaining).forEach((f) => {\n        this.setFlyQty(f.handle, qty);\n        this.boxAddedStack.push(f.handle);\n        lastHandle = f.handle;\n        added += 1;\n        remaining -= 1;\n      });\n      if (!remaining) return lastHandle;\n\n      const extras = this.relevantFlyCandidates(remaining);\n      if (!this.boxExtraHandles) this.boxExtraHandles = [];\n      extras.forEach((handle) => {\n        if (!this.boxExtraHandles.includes(handle)) this.boxExtraHandles.push(handle);\n        this.setFlyQty(handle, qty);\n        this.boxAddedStack.push(handle);\n        lastHandle = handle;\n        added += 1;\n      });\n      return lastHandle;\n    }\n\n    /**\n     * Remove one fly from the box: undo the latest \u201Cadd more\u201D first, otherwise\n     * subtract one from the curated selection (so \u2212 works from the default dozen).\n     */\n    removeOneAddedFly() {\n      if (this.boxAddedStack && this.boxAddedStack.length) {\n        const handle = this.boxAddedStack.pop();\n        this.setFlyQty(handle, 0);\n        return true;\n      }\n      const selected = this.selectedFlyList();\n      if (!selected.length) return false;\n      const last = selected[selected.length - 1];\n      this.setFlyQty(last.handle, 0);\n      return true;\n    }\n\n    flyIdentity(handle) {\n      if (typeof handle !== 'string') return null;\n      const catalog = DATA.flyCatalog || {};\n      const key = Object.hasOwn(catalog, handle) ? handle\n        : Object.keys(catalog).find((key) => catalog[key]?.handle === handle);\n      if (!key || !catalog[key]) return null;\n      return { key, handle: catalog[key].handle || key };\n    }\n\n    flyQty(handle) {\n      const identity = this.flyIdentity(handle);\n      if (!identity) return 0;\n      const n = Number(this.boxQty[identity.handle] || 0);\n      return Number.isFinite(n) && n > 0 ? n : 0;\n    }\n\n    setFlyQty(handle, qty) {\n      const identity = this.flyIdentity(handle);\n      if (!identity) return;\n      handle = identity.handle;\n      const next = Math.max(0, Math.min(this.boxMaxQty, Math.round(Number(qty) || 0)));\n      if (next <= 0) delete this.boxQty[handle];\n      else this.boxQty[handle] = next;\n    }\n\n    clampBulkQty(qty) {\n      const next = Math.round(Number(qty) || 0);\n      return Math.max(1, Math.min(this.boxMaxQty, next));\n    }\n\n    applyBulkQty(qty = this.boxDefaultQty) {\n      this.boxDefaultQty = this.clampBulkQty(qty);\n      this.selectedFlyList().filter((fly) => !fly.soldOut).forEach((fly) => this.setFlyQty(fly.handle, this.boxDefaultQty));\n    }\n\n    resetBoxSelection(qty = this.boxDefaultQty) {\n      this.boxQty = {};\n      this.boxExtraHandles = [];\n      this.boxAddedStack = [];\n      this.currentBoxFlies().forEach((f) => {\n        this.boxQty[f.handle] = qty;\n      });\n    }\n\n    clearBoxSelection() {\n      this.boxQty = {};\n    }\n\n    selectedFlyList() {\n      return this.currentBoxFlies()\n        .map((f) => ({ ...f, qty: this.flyQty(f.handle) }))\n        .filter((f) => f.qty > 0);\n    }\n\n    boxTotals() {\n      const selected = this.selectedFlyList();\n      const patterns = selected.length;\n      const count = selected.reduce((sum, f) => sum + f.qty, 0);\n      const total = selected.reduce((sum, f) => sum + Number(f.price || 0) * f.qty, 0);\n      return { count, patterns, total, available: this.currentBoxFlies().length };\n    }\n\n    syncBoxBanner() {\n      if (this.$('[data-ffs-box-panel]')) return;\n      const season = this.$('[data-ffs-box-season]');\n      if (season) season.textContent = this.calendarMonthName();\n    }\n\n    setBoxFiltersDisabled(disabled) {\n      const el = this.$('[data-ffs-report-best-flies]');\n      if (!el) return;\n      el.querySelectorAll(\n        '[data-ffs-box-region], [data-ffs-box-state], [data-ffs-box-elevation], [data-ffs-box-water], [data-ffs-box-month]'\n      ).forEach((sel) => {\n        sel.disabled = !!disabled;\n        sel.dispatchEvent(new Event('ffs:sync-disabled'));\n      });\n    }\n\n    resolveFindingPhoto(src) {\n      if (!src) return '';\n      if (src.startsWith('//')) return `${window.location.protocol}${src}`;\n      return src;\n    }\n\n    captureBoxFocus(el) {\n      if (!el) return null;\n      const active = document.activeElement;\n      if (!active || !el.contains(active) || !active.matches('button, input, select, a')) return null;\n      const attributes = ['data-fly-handle', 'data-qty-delta', 'data-bulk-delta',\n        'data-ffs-box-more-delta', 'data-ffs-box-bulk-qty', 'data-ffs-box-apply-bulk',\n        'data-ffs-box-clear', 'data-ffs-box-new', 'data-ffs-box-add', 'data-ffs-box-qv', 'data-product-url'];\n      const values = attributes.filter((name) => active.hasAttribute(name))\n        .map((name) => [name, active.getAttribute(name)]);\n      if (!active.id && !values.length) return null;\n      return { id: active.id, tag: active.tagName, className: active.className, values,\n        rowIndex: [...el.querySelectorAll('[data-fly-row]')].indexOf(active.closest('[data-fly-row]')) };\n    }\n\n    restoreBoxFocus(el, saved) {\n      if (!saved) return;\n      // Never take focus back from a dialog or another part of the page.\n      const active = document.activeElement;\n      if (active && active !== document.body && !el.contains(active)) return;\n      let target = [...el.querySelectorAll('button, input, select, a')].find((node) =>\n        saved.id ? node.id === saved.id\n          : node.tagName === saved.tag && node.className === saved.className\n            && saved.values.every(([name, value]) => node.getAttribute(name) === value));\n      if (!target && saved.rowIndex >= 0) {\n        const rows = el.querySelectorAll('[data-fly-row]');\n        const row = rows[Math.min(saved.rowIndex, rows.length - 1)];\n        const delta = saved.values.find(([name]) => name === 'data-qty-delta')?.[1];\n        target = row && [...row.querySelectorAll('[data-qty-delta]')]\n          .find((node) => node.getAttribute('data-qty-delta') === delta);\n      }\n      if (!target || target.disabled) target = el.querySelector('[data-ffs-box-more-delta=\"1\"]:not(:disabled)')\n        || el.querySelector('[data-ffs-box-clear]');\n      target?.focus({ preventScroll: true });\n      const announcement = this.$('[data-ffs-box-announcement]');\n      const { count, total } = this.boxTotals();\n      const message = `${count} ${count === 1 ? 'fly' : 'flies'} selected. ${this.money(total)} total.`;\n      if (announcement && announcement.textContent !== message) announcement.textContent = message;\n    }\n\n    renderBestFlies() {\n      const el = this.$('[data-ffs-report-best-flies]');\n      if (!el) return;\n      const savedFocus = this.captureBoxFocus(el);\n      let announcement = this.$('[data-ffs-box-announcement]');\n      if (!announcement) {\n        announcement = document.createElement('span');\n        announcement.className = 'visually-hidden';\n        announcement.setAttribute('data-ffs-box-announcement', '');\n        announcement.setAttribute('role', 'status');\n        announcement.setAttribute('aria-live', 'polite');\n        announcement.setAttribute('aria-atomic', 'true');\n        this.appendChild(announcement);\n      }\n      /* Always clear loading locks even if catalog is missing */\n      this.setBoxFiltersDisabled(false);\n      if (!DATA || !DATA.flyCatalog) {\n        el.innerHTML = `<p class=\"ffs-box__empty\">Fly catalog is still loading \u2014 refresh and try again.</p>`;\n        return;\n      }\n\n      const namedWater = this.findDirectoryWater(this.activeBoxWaterId);\n      const waterTitle = this.$('[data-ffs-box-panel-title]');\n      if (waterTitle) waterTitle.textContent = namedWater ? `Seasonal fly ideas for ${namedWater.name} \u00B7 ${namedWater.section}` : 'Seasonal fly ideas';\n      const oldNote = this.$('[data-ffs-box-water-note]');\n      if (oldNote) oldNote.hidden = true;\n      const flies = this.currentBoxFlies();\n      const { count, patterns, total, available } = this.boxTotals();\n\n      const stateOptions = this.boxBuilderStateOptions()\n        .map((s) => {\n          const selected = s.abbr === this.boxState ? ' selected' : '';\n          return `<option value=\"${s.abbr}\"${selected}>${s.name}</option>`;\n        })\n        .join('');\n\n      const elevOptions = (DATA.boxElevations || [])\n        .map((e) => {\n          const selected = e.id === this.boxElevation ? ' selected' : '';\n          const short = e.short ? ` \u2014 ${e.short}` : '';\n          return `<option value=\"${e.id}\"${selected}>${e.label}${short}</option>`;\n        })\n        .join('');\n\n      const waterOptions = (DATA.boxWaterTypes || [])\n        .map((w) => {\n          const selected = w.id === this.boxWaterType ? ' selected' : '';\n          const short = w.short ? ` \u2014 ${w.short}` : '';\n          return `<option value=\"${w.id}\"${selected}>${w.label}${short}</option>`;\n        })\n        .join('');\n\n      const monthOptions = this.monthNames()\n        .map((name, index) => {\n          const value = index + 1;\n          const selected = value === this.reportMonth() ? ' selected' : '';\n          return `<option value=\"${value}\"${selected}>${name}</option>`;\n        })\n        .join('');\n\n      const flyCard = (fly) => {\n        const qty = this.flyQty(fly.handle);\n        const on = qty > 0;\n        const kind = this.flyKind(fly);\n        const productUrl = `/products/${fly.handle}`;\n        const thumb = fly.image ? this.flyThumbUrl(fly.image, 280) : '';\n        const fallback = ffsFlyThumbUrl(fly.image, 280, { plain: true });\n        const cropped = FFS_FLY_CROP[ffsFlyFilename(fly.image)] ? '1' : '0';\n        return `\n          <article class=\"ffs-box__fly${on ? ' is-selected' : ''}\" data-fly-row=\"${fly.handle}\">\n            <button\n              type=\"button\"\n              class=\"ffs-box__fly-media\"\n              data-ffs-box-qv\n              data-product-url=\"${productUrl}\"\n              aria-haspopup=\"dialog\"\n              aria-label=\"Quick view ${fly.title}\"\n            >\n              ${thumb ? `<img\n                src=\"${thumb}\"\n                alt=\"\"\n                width=\"140\"\n                height=\"140\"\n                loading=\"lazy\"\n                decoding=\"async\"\n                data-cropped=\"${cropped}\"\n                data-ffs-img-fallback=\"${fallback}\"\n              >` : '<span>Image loading</span>'}\n            </button>\n            <div class=\"ffs-box__fly-copy\">\n              <button\n                type=\"button\"\n                class=\"ffs-box__fly-title\"\n                data-ffs-box-qv\n                data-product-url=\"${productUrl}\"\n                aria-haspopup=\"dialog\"\n              >\n                <span class=\"ffs-box__dot ffs-box__dot--${kind}\"${this.flyDotStyle(kind)} aria-hidden=\"true\"></span>\n                ${fly.title}\n              </button>\n              <span>${fly.why}</span>\n              ${fly.soldOut ? `<span>Unavailable${fly.variantLabel ? `: ${this.escapeHtml(fly.variantLabel)}` : ''}</span>` : ''}\n            </div>\n            <div class=\"ffs-box__fly-controls\">\n              <span class=\"ffs-box__fly-price\">${this.money(fly.price)}</span>\n              <div class=\"ffs-box__qty\" role=\"group\" aria-label=\"Quantity for ${fly.title}\">\n                <button type=\"button\" class=\"ffs-box__qty-btn\" data-qty-delta=\"-1\" data-fly-handle=\"${fly.handle}\" aria-label=\"Remove one ${fly.title}\">\u2212</button>\n                <span class=\"ffs-box__qty-val\" data-qty-val>${qty}</span>\n                <button type=\"button\" class=\"ffs-box__qty-btn\" data-qty-delta=\"1\" data-fly-handle=\"${fly.handle}\" aria-label=\"Add one ${fly.title}\" ${fly.soldOut ? 'disabled' : ''}>+</button>\n              </div>\n            </div>\n          </article>\n        `;\n      };\n\n      const kindGroups = [\n        { id: 'nymph', label: 'Nymphs' },\n        { id: 'dry', label: 'Dries' },\n        { id: 'terrestrial', label: 'Terrestrials' },\n        { id: 'streamer', label: 'Streamers' },\n      ]\n        .map((group) => {\n          const groupFlies = flies.filter(\n            (f) => this.flyKind(f) === group.id && this.flyQty(f.handle) > 0\n          );\n          if (!groupFlies.length) return '';\n          return `\n            <section class=\"ffs-box__group\" data-fly-kind=\"${group.id}\">\n              <h3 class=\"ffs-box__group-title\">\n                <span class=\"ffs-box__dot ffs-box__dot--${group.id}\"${this.flyDotStyle(group.id)} aria-hidden=\"true\"></span>\n                ${group.label}\n              </h3>\n              <div class=\"ffs-box__grid\">${groupFlies.map(flyCard).join('')}</div>\n            </section>\n          `;\n        })\n        .join('');\n\n      const summaryLabel =\n        count > 0\n          ? `${count} ${count === 1 ? 'fly' : 'flies'}`\n          : 'No flies selected';\n\n      const isReportBoxPanel = !!this.$('[data-ffs-box-panel]');\n      const monthPicker = isReportBoxPanel\n        ? ''\n        : `\n            <div class=\"ffs-report__picker ffs-box__picker\">\n              <label class=\"ffs-box__filter-label\" for=\"ffs-box-month-btn\">Month</label>\n              <select class=\"ffs-report__select\" id=\"ffs-box-month\" data-ffs-box-month>\n                ${monthOptions}\n              </select>\n            </div>\n          `;\n\n      el.innerHTML = `\n        <div class=\"ffs-box\">\n          ${namedWater ? `<p>${this.escapeHtml(namedWater.name)} \u00B7 ${this.escapeHtml(namedWater.section)} \u00B7 ${this.calendarMonthName()}. Seasonal planning suggestions; verify current conditions locally.</p>` : ''}\n          <div class=\"ffs-box__filters ffs-report__pickers\">\n            <div class=\"ffs-report__picker ffs-box__picker\">\n              <label class=\"ffs-box__filter-label\" for=\"ffs-box-state-btn\">State</label>\n              <select class=\"ffs-report__select\" id=\"ffs-box-state\" data-ffs-box-state>\n                ${stateOptions}\n              </select>\n            </div>\n            <div class=\"ffs-report__picker ffs-box__picker\">\n              <label class=\"ffs-box__filter-label\" for=\"ffs-box-elevation-btn\">Elevation</label>\n              <select class=\"ffs-report__select\" id=\"ffs-box-elevation\" data-ffs-box-elevation>\n                ${elevOptions}\n              </select>\n            </div>\n            <div class=\"ffs-report__picker ffs-box__picker\">\n              <label class=\"ffs-box__filter-label\" for=\"ffs-box-water-btn\">Water type</label>\n              <select class=\"ffs-report__select\" id=\"ffs-box-water\" data-ffs-box-water>\n                ${waterOptions}\n              </select>\n            </div>\n            ${monthPicker}\n          </div>\n\n          <div class=\"ffs-box__groups\">${kindGroups}</div>\n          <div class=\"ffs-box__bar\">\n            <div class=\"ffs-box__bar-main\">\n              <div class=\"ffs-box__bar-ctas\">\n                <button type=\"button\" class=\"ffs-box__cta\" data-ffs-box-add ${count ? '' : 'disabled'}>\n                  <span class=\"ffs-box__cta-copy\">\n                    <span class=\"ffs-box__cta-label\">Add to cart</span>\n                    <span class=\"ffs-box__cta-meta\">\n                      <span data-ffs-box-count>${summaryLabel}</span>\n                      <span aria-hidden=\"true\">\u00B7</span>\n                      <span data-ffs-box-total>${this.money(total)}</span>\n                    </span>\n                  </span>\n                </button>\n                <div class=\"ffs-box__more\">\n                  <span class=\"ffs-box__more-label\">Add or remove flies</span>\n                  <span class=\"ffs-box__more-stepper\" role=\"group\" aria-label=\"Add or remove one hand-picked fly\">\n                    <button\n                      type=\"button\"\n                      class=\"ffs-box__more-btn ffs-box__more-btn--minus\"\n                      data-ffs-box-more-delta=\"-1\"\n                      aria-label=\"Remove one hand-picked fly\"\n                      ${count > 0 ? '' : 'disabled'}\n                    >\u2212</button>\n                    <button\n                      type=\"button\"\n                      class=\"ffs-box__more-btn ffs-box__more-btn--plus\"\n                      data-ffs-box-more-delta=\"1\"\n                      aria-label=\"Add one hand-picked fly\"\n                      ${this.relevantFlyCandidates(1).length || this.currentBoxFlies().some((f) => !f.soldOut && this.flyQty(f.handle) <= 0) ? '' : 'disabled'}\n                    >+</button>\n                  </span>\n                </div>\n              </div>\n              <div class=\"ffs-box__actions\">\n                <div class=\"ffs-box__bulk\" role=\"group\" aria-label=\"Set quantity of each fly\">\n                  <button type=\"button\" class=\"ffs-box__bulk-btn\" data-bulk-delta=\"-1\" aria-label=\"Decrease of-each quantity\">\u2212</button>\n                  <input\n                    class=\"ffs-box__bulk-input\"\n                    type=\"number\"\n                    min=\"1\"\n                    max=\"${this.boxMaxQty}\"\n                    value=\"${this.boxDefaultQty}\"\n                    inputmode=\"numeric\"\n                    data-ffs-box-bulk-qty\n                    aria-label=\"Quantity of each\"\n                  >\n                  <button type=\"button\" class=\"ffs-box__bulk-btn\" data-bulk-delta=\"1\" aria-label=\"Increase of-each quantity\">+</button>\n                  <button type=\"button\" class=\"ffs-box__bulk-apply\" data-ffs-box-apply-bulk>of each</button>\n                </div>\n                <button type=\"button\" class=\"ffs-box__ghost\" data-ffs-box-clear>Clear</button>\n                ${this.boxCartAttempt ? '<button type=\"button\" class=\"ffs-box__ghost\" data-ffs-box-new>Start a new box</button>' : ''}\n              </div>\n            </div>\n            <p class=\"ffs-box__status\" data-ffs-box-status hidden></p>\n          </div>\n        </div>\n      `;\n\n      const scrollHandle = this.boxScrollHandle;\n      this.boxScrollHandle = null;\n      if (scrollHandle) {\n        const row = el.querySelector('[data-fly-row=\"' + scrollHandle + '\"]');\n        const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n        row?.scrollIntoView({ block: 'center', behavior: reduceMotion ? 'auto' : 'smooth' });\n      }\n\n      const onFilterChange = (setter) => (event) => {\n        setter(event.target.value);\n        this.resetBoxSelection();\n        this.showBoxLoadingThenRender();\n      };\n\n      el.querySelector('[data-ffs-box-state]')?.addEventListener(\n        'change',\n        onFilterChange((v) => {\n          this.boxState = String(v || '').toUpperCase();\n          this.boxRegion = this.primaryRegionForState(this.boxState) || this.boxRegion;\n          this.activeBoxWaterId = null;\n          this.boxWaterHatchHandles = null;\n          this.syncHatchToBox();\n        })\n      );\n      el.querySelector('[data-ffs-box-elevation]')?.addEventListener(\n        'change',\n        onFilterChange((v) => {\n          this.boxElevation = v;\n          this.activeBoxWaterId = null;\n          this.boxWaterHatchHandles = null;\n        })\n      );\n      el.querySelector('[data-ffs-box-water]')?.addEventListener(\n        'change',\n        onFilterChange((v) => {\n          this.boxWaterType = v;\n          this.activeBoxWaterId = null;\n          this.boxWaterHatchHandles = null;\n        })\n      );\n      el.querySelector('[data-ffs-box-month]')?.addEventListener(\n        'change',\n        onFilterChange((v) => {\n          const n = Number(v);\n          this.boxMonth = Number.isInteger(n) && n >= 1 && n <= 12 ? n : new Date().getMonth() + 1;\n          this.applyBoxSeason();\n          this.seedNamedWater();\n          this.syncHatchToBox();\n        })\n      );\n\n      this.enhanceSelects(el);\n\n      el.querySelectorAll('[data-ffs-box-qv]').forEach((btn) => {\n        btn.addEventListener('click', (event) => {\n          event.preventDefault();\n          const url = btn.getAttribute('data-product-url');\n          if (url) this.openFlyQuickView(url, btn);\n        });\n      });\n\n      el.querySelectorAll('[data-qty-delta]').forEach((btn) => {\n        btn.addEventListener('click', () => {\n          const handle = btn.dataset.flyHandle;\n          const delta = Number(btn.dataset.qtyDelta) || 0;\n          this.setFlyQty(handle, this.flyQty(handle) + delta);\n          this.renderBestFlies();\n        });\n      });\n\n      const bulkInput = el.querySelector('[data-ffs-box-bulk-qty]');\n      const readBulkQty = () => this.clampBulkQty(bulkInput?.value || this.boxDefaultQty);\n\n      el.querySelectorAll('[data-bulk-delta]').forEach((btn) => {\n        btn.addEventListener('click', () => {\n          const next = this.clampBulkQty(readBulkQty() + (Number(btn.dataset.bulkDelta) || 0));\n          if (bulkInput) bulkInput.value = String(next);\n          this.applyBulkQty(next);\n          this.renderBestFlies();\n        });\n      });\n\n      el.querySelector('[data-ffs-box-apply-bulk]')?.addEventListener('click', () => {\n        this.applyBulkQty(readBulkQty());\n        this.renderBestFlies();\n      });\n\n      bulkInput?.addEventListener('keydown', (event) => {\n        if (event.key !== 'Enter') return;\n        event.preventDefault();\n        this.applyBulkQty(readBulkQty());\n        this.renderBestFlies();\n      });\n\n      bulkInput?.addEventListener('change', () => {\n        const next = readBulkQty();\n        bulkInput.value = String(next);\n        this.boxDefaultQty = next;\n        this.saveBoxDraft();\n      });\n\n      el.querySelector('[data-ffs-box-clear]')?.addEventListener('click', () => {\n        this.clearBoxSelection();\n        this.renderBestFlies();\n      });\n\n      el.querySelector('[data-ffs-box-add]')?.addEventListener('click', () => this.addBoxToCart());\n      el.querySelector('[data-ffs-box-new]')?.addEventListener('click', () => {\n        if (this.boxCartBusy) return;\n        this.boxAttemptClearedToken = this.boxCartAttempt?.token || '';\n        this.boxCartAttempt = null;\n        this.boxCartMessage = '';\n        this.clearBoxSelection();\n        this.boxEditRevision += 1;\n        this.persistBoxAttempt();\n        this.renderBestFlies();\n      });\n      this.saveBoxDraft();\n      this.updateBoxPurchaseState();\n      this.restoreBoxFocus(el, savedFocus);\n      this.updateBoxPurchaseState();\n    }\n\n    ensureBoxMoreDelegation() {\n      if (this._boxMoreDelegated) return;\n      this._boxMoreDelegated = true;\n      this.addEventListener('click', (event) => {\n        const origin = event.target instanceof Element ? event.target : event.target.parentElement;\n        const btn = origin?.closest('[data-ffs-box-more-delta]');\n        if (!btn || btn.disabled) return;\n        event.preventDefault();\n        const delta = Number(btn.getAttribute('data-ffs-box-more-delta')) || 0;\n        if (!delta) return;\n        if (delta > 0) {\n          const handle = this.addMoreRelevantFlies(1);\n          if (!handle) return;\n          this.boxScrollHandle = handle;\n        } else if (!this.removeOneAddedFly()) {\n          return;\n        }\n        this.renderBestFlies();\n      });\n    }\n\n    showBoxLoadingThenRender() {\n      const el = this.$('[data-ffs-report-best-flies]');\n      if (!el) {\n        this.renderBestFlies();\n        return;\n      }\n\n      const box = el.querySelector('.ffs-box');\n      const reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n      const finding = window.__ffsBoxFinding || {};\n      const photo = this.resolveFindingPhoto(\n        finding.photo || (finding.photos && finding.photos[0]) || ''\n      );\n\n      this.syncBoxBanner();\n      if (box) box.classList.add('is-finding');\n\n      /* Clean pop-up \u2014 floats over the existing box instead of replacing/collapsing it,\n         so nothing shifts or disappears underneath while the pick is running. */\n      el.querySelector('.ffs-box__finding-overlay')?.remove();\n      const overlay = document.createElement('div');\n      overlay.className = `ffs-box__finding-overlay${reduceMotion ? ' is-reduced' : ''}`;\n      overlay.setAttribute('role', 'status');\n      overlay.setAttribute('aria-live', 'polite');\n      overlay.setAttribute('aria-busy', 'true');\n      overlay.innerHTML = `\n        <div class=\"ffs-box__finding-backdrop\" aria-hidden=\"true\"></div>\n        <div class=\"ffs-box__finding-card\">\n          ${\n            photo\n              ? `<div class=\"ffs-box__finding-photo-wrap\">\n                  <img class=\"ffs-box__finding-photo\" src=\"${photo}\" alt=\"\" width=\"640\" height=\"480\" decoding=\"async\">\n                </div>`\n              : ''\n          }\n          <span class=\"ffs-box__finding-spin\" aria-hidden=\"true\"></span>\n          <p class=\"ffs-box__finding-text-clean\">Selecting the best flies for your water<span class=\"ffs-box__finding-dots-clean\" aria-hidden=\"true\"></span></p>\n        </div>\n      `;\n      el.appendChild(overlay);\n\n      /* Soft-lock filters during the beat; always cleared in renderBestFlies */\n      this.setBoxFiltersDisabled(true);\n\n      const loadId = (this._boxLoadId = (this._boxLoadId || 0) + 1);\n      clearTimeout(this._boxLoadTimer);\n      this._boxLoadTimer = setTimeout(() => {\n        if (loadId !== this._boxLoadId) return;\n        try {\n          this.renderBestFlies();\n        } catch (err) {\n          console.error('[ffs-box] renderBestFlies failed', err);\n          this.setBoxFiltersDisabled(false);\n          if (box) box.classList.remove('is-finding');\n          el.querySelector('.ffs-box__finding-overlay')?.remove();\n          const groups = el.querySelector('.ffs-box__groups');\n          if (groups) {\n            groups.innerHTML =\n              '<p class=\"ffs-box__empty\">Couldn\u2019t load flies for that water \u2014 try another selection.</p>';\n          }\n        }\n      }, reduceMotion ? 350 : 1100);\n    }\n\n    boxLineProperties(boxLabel) {\n      const stateName = this.stateName(this.boxState) || this.boxState || this.regionLabel(this.boxRegion);\n      const elev = this.elevationMeta(this.boxElevation);\n      const water = this.waterTypeMeta(this.boxWaterType);\n      const monthName = this.calendarMonthName();\n      const summary = [stateName, elev.label, water.label, monthName].filter(Boolean).join(' \u00B7 ');\n      const fromBuilderPage =\n        this.hasAttribute('data-ffs-box-origin') ||\n        String(window.location.pathname || '').indexOf('/pages/build-your-box') !== -1;\n      if (fromBuilderPage) {\n        return {\n          'Build Your Box': summary,\n          _ffs_source: 'build_your_box',\n        };\n      }\n      return {\n        _ffs_custom_box: boxLabel || summary,\n        _ffs_source: 'fishing_report',\n      };\n    }\n\n    async refreshBoxCatalog() {\n      if (this.boxCatalogPromise) return this.boxCatalogPromise;\n      const revision = this.boxEditRevision || 0;\n      this.boxStockLoading = true;\n      this.boxStockError = false;\n      this.updateBoxPurchaseState();\n      this.boxCatalogPromise = (async () => {\n        try {\n          const products = await ffsFetchFlyCatalog();\n          ffsApplyLiveFlyCatalog(products);\n          if (!this.boxInitialStockSettled && !this.boxDraftRestored && !this.boxCartAttempt && !this.boxCartBusy\n            && !(this.boxEditRevision || 0) && revision === (this.boxEditRevision || 0)) {\n            this.resetBoxSelection();\n          }\n          this.boxInitialStockSettled = true;\n          return true;\n        } catch (_) {\n          Object.values(DATA.flyCatalog || {}).forEach((fly) => { fly.stockVerified = false; });\n          this.boxStockError = true;\n          return false;\n        } finally {\n          this.boxStockLoading = false;\n          this.boxCatalogPromise = null;\n          this.renderBestFlies();\n        }\n      })();\n      return this.boxCatalogPromise;\n    }\n\n    updateBoxPurchaseState() {\n      const el = this.$('[data-ffs-report-best-flies]');\n      if (!el) return;\n      const selected = this.selectedFlyList();\n      const unavailable = selected.filter((fly) => fly.stockVerified && fly.soldOut);\n      const unknown = selected.some((fly) => !fly.stockVerified);\n      const pending = !!this.boxCartAttempt;\n      const locked = !!this.boxCartBusy || pending;\n      if (locked) {\n        el.querySelectorAll('button, input, select').forEach((control) => { control.disabled = true; });\n        this.setBoxFiltersDisabled(true);\n      }\n      const cta = el.querySelector('[data-ffs-box-add]');\n      if (cta) {\n        cta.disabled = !!this.boxCartBusy || (!pending && (!selected.length || this.boxStockLoading || unavailable.length > 0));\n        cta.querySelector('.ffs-box__cta-label').textContent = this.boxCartBusy ? 'Checking your box\u2026'\n          : pending ? 'Review cart' : this.boxStockLoading ? 'Checking availability\u2026'\n            : unknown && selected.length ? 'Check availability' : 'Add to cart';\n      }\n      const newBox = el.querySelector('[data-ffs-box-new]');\n      if (newBox) newBox.disabled = !!this.boxCartBusy;\n      const message = this.boxCartMessage || (pending\n        ? 'This box has already been sent to your cart. Review your cart before starting a new box.'\n        : unavailable.length ? `Unavailable in the selected size or color: ${unavailable.map((fly) => fly.title).join(', ')}. Remove these flies to continue.`\n          : this.boxStockError ? 'Availability could not be checked. Your selection is saved. Choose Check availability to try again.'\n            : unknown && !this.boxStockLoading && selected.length ? 'Some selected flies could not be verified. Choose Check availability to try again.' : '');\n      const status = el.querySelector('[data-ffs-box-status]');\n      if (status) {\n        status.hidden = !message;\n        status.textContent = message;\n        status.classList.toggle('is-error', !!message && !this.boxCartBusy);\n      }\n      const announcement = this.$('[data-ffs-box-announcement]');\n      if (announcement && message && announcement.textContent !== message) announcement.textContent = message;\n      if (announcement && !message && announcement.textContent === this.boxLastPurchaseMessage) announcement.textContent = '';\n      this.boxLastPurchaseMessage = message;\n    }\n\n    boxAttemptStorageKey() {\n      return `ffs-box-attempt:${location.pathname}${location.search}`;\n    }\n\n    persistBoxAttempt() {\n      this.boxStorageClock = Math.max(this.boxStorageClock || 0, Date.now()) + 1;\n      if (this.boxCartAttempt) this.boxCartAttempt.savedAt = this.boxStorageClock;\n      const historySaved = this.saveBoxDraft() === true;\n      let sessionSaved = false;\n      try {\n        if (this.boxCartAttempt) sessionStorage.setItem(this.boxAttemptStorageKey(), JSON.stringify(this.boxCartAttempt));\n        else if (this.boxAttemptClearedToken) sessionStorage.setItem(this.boxAttemptStorageKey(), JSON.stringify({\n          kind: 'cleared', token: this.boxAttemptClearedToken, savedAt: this.boxStorageClock,\n        }));\n        else sessionStorage.removeItem(this.boxAttemptStorageKey());\n        sessionSaved = true;\n      } catch (_) { /* History still protects this entry when session storage is restricted. */ }\n      return historySaved || sessionSaved;\n    }\n\n    restoreBoxAttempt() {\n      const valid = (candidate) => {\n        if (!candidate || !/^ffs-[a-z0-9-]{10,100}$/i.test(candidate.token || '')\n          || !Array.isArray(candidate.items) || !candidate.items.length || candidate.items.length > 250) return false;\n        const seen = new Set();\n        return candidate.items.every((item) => {\n          if (!item || typeof item !== 'object' || !Number.isSafeInteger(item.id) || item.id <= 0 || seen.has(item.id)\n            || !Number.isInteger(item.quantity) || item.quantity < 1 || item.quantity > this.boxMaxQty\n            || typeof item.title !== 'string' || typeof item.handle !== 'string') return false;\n          seen.add(item.id);\n          return true;\n        });\n      };\n      const stamp = (candidate) => Number.isSafeInteger(candidate?.savedAt) && candidate.savedAt >= 0 ? candidate.savedAt : 0;\n      let attempt = null;\n      try {\n        const draft = history.state?.ffsBoxDraft;\n        if (draft?.page === location.pathname + location.search) {\n          if (valid(draft.cartAttempt)) attempt = draft.cartAttempt;\n          this.boxAttemptClearedToken = typeof draft.cartAttemptClearedToken === 'string' ? draft.cartAttemptClearedToken : '';\n        }\n      } catch (_) { /* Session storage may still contain the pending operation. */ }\n      try {\n        const saved = JSON.parse(sessionStorage.getItem(this.boxAttemptStorageKey()) || 'null');\n        // Either storage can lag after a failed write. Recover the newest valid\n        // record; suppress only the exact operation explicitly cleared by the user.\n        if (valid(saved) && saved.token !== this.boxAttemptClearedToken\n          && (!attempt || stamp(saved) > stamp(attempt))) attempt = saved;\n        else if (saved?.kind === 'cleared' && typeof saved.token === 'string' && /^ffs-[a-z0-9-]{10,100}$/i.test(saved.token)\n          && !Object.hasOwn(saved, 'items') && Number.isSafeInteger(saved.savedAt) && saved.savedAt > 0) {\n          const clearsHistory = attempt?.token === saved.token && stamp(saved) >= stamp(attempt);\n          if (clearsHistory || (!attempt && !this.boxDraftRestored)) {\n            // A failed history write can retain both the old gate and its flies.\n            // Restore the explicit empty reset before initial stock hydration.\n            attempt = null;\n            this.boxCartAttempt = null;\n            this.boxCartMessage = '';\n            this.boxQty = {};\n            this.boxExtraHandles = [];\n            this.boxAddedStack = [];\n            this.boxDraftRestored = true;\n            this.boxEditRevision = (this.boxEditRevision || 0) + 1;\n            this.boxAttemptClearedToken = saved.token;\n          }\n          this.boxStorageClock = Math.max(this.boxStorageClock || 0, stamp(saved));\n        }\n      } catch (_) { /* The valid history record can still protect this entry. */ }\n      if (!attempt) return;\n      this.boxStorageClock = stamp(attempt);\n      this.boxCartAttempt = attempt;\n      this.boxCartMessage = typeof attempt.message === 'string' ? attempt.message : '';\n      // The persisted submission is authoritative while gated, including when\n      // an older readable history draft survived a failed history write.\n      {\n        const choice = attempt.selection;\n        if (choice && choice.state && this.stateName(choice.state) !== choice.state\n          && (DATA.boxElevations || []).some((item) => item.id === choice.elevation)\n          && (DATA.boxWaterTypes || []).some((item) => item.id === choice.water)\n          && Number.isInteger(choice.month) && choice.month >= 1 && choice.month <= 12) {\n          this.boxState = choice.state;\n          this.boxRegion = this.primaryRegionForState(choice.state) || this.boxRegion;\n          this.boxElevation = choice.elevation;\n          this.boxWaterType = choice.water;\n          this.boxMonth = choice.month;\n          this.boxDefaultQty = this.clampBulkQty(choice.defaultQty);\n          this.applyBoxSeason();\n        }\n        this.boxQty = {};\n        this.boxExtraHandles = [];\n        attempt.items.forEach((item) => {\n          const identity = this.flyIdentity(item.handle);\n          if (identity && String(DATA.flyCatalog[identity.key]?.variantId) === String(item.id)) {\n            this.setFlyQty(identity.handle, item.quantity);\n            this.boxExtraHandles.push(identity.key);\n          }\n        });\n      }\n    }\n\n    async reconcileBoxAttempt(attempt) {\n      const cart = await ffsReadJson('cart.js');\n      if (!Array.isArray(cart?.items)) throw new Error('Cart could not be verified.');\n      const quantities = new Map();\n      const targets = new Set(attempt.items.map((item) => String(item.id)));\n      let unexpected = false;\n      cart.items.forEach((line) => {\n        if (line.properties?._ffs_box_attempt !== attempt.token) return;\n        const id = String(line.variant_id || line.id);\n        if (!targets.has(id) || !Number.isInteger(line.quantity) || line.quantity < 0) {\n          unexpected = true;\n          return;\n        }\n        quantities.set(id, (quantities.get(id) || 0) + line.quantity);\n      });\n      const missing = attempt.items.map((item) => ({ ...item,\n        missing: Math.max(0, item.quantity - (quantities.get(String(item.id)) || 0)),\n      })).filter((item) => item.missing > 0);\n      const complete = !unexpected && attempt.items.every((item) => quantities.get(String(item.id)) === item.quantity);\n      const added = attempt.items.reduce((sum, item) => sum + (quantities.get(String(item.id)) || 0), 0);\n      return { complete, added, missing };\n    }\n\n    async addBoxToCart() {\n      if (this.boxCartBusy) return;\n      if (this.boxCartAttempt) {\n        window.location.href = ffsShopRoot() + 'cart';\n        return;\n      }\n      const selected = this.selectedFlyList();\n      if (!selected.length) return;\n      const desired = selected.map((fly) => ({ ...fly }));\n      const stateName = this.stateName(this.boxState) || this.boxState || this.regionLabel(this.boxRegion);\n      const properties = this.boxLineProperties(`${this.boxTotals().count} flies \u00B7 ${stateName} \u00B7 ${this.elevationMeta(this.boxElevation).label} \u00B7 ${this.waterTypeMeta(this.boxWaterType).label} \u00B7 ${this.calendarMonthName()}`);\n      const selection = { state: this.boxState, elevation: this.boxElevation, water: this.boxWaterType,\n        month: this.boxMonth, defaultQty: this.boxDefaultQty };\n      const prices = new Map(desired.map((fly) => [String(fly.variantId), fly.price]));\n      const focus = this.captureBoxFocus(this.$('[data-ffs-report-best-flies]'));\n      this.boxCartBusy = true;\n      this.boxCartMessage = '';\n      this.updateBoxPurchaseState();\n      let postStarted = false;\n      try {\n        if (!await this.refreshBoxCatalog()) return;\n        const plan = desired.map((fly) => {\n          const identity = this.flyIdentity(fly.handle);\n          const live = identity && DATA.flyCatalog[identity.key];\n          return live && String(live.variantId) === String(fly.variantId) ? { ...live, qty: fly.qty } : null;\n        });\n        if (!plan.length || plan.some((fly) => !fly || !fly.stockVerified || fly.soldOut)) return;\n        if (plan.some((fly) => prices.get(String(fly.variantId)) !== fly.price)) {\n          this.boxCartMessage = 'Prices have changed. Please review the updated total, then choose Add to cart.';\n          return;\n        }\n        if (plan.some((fly) => !Number.isSafeInteger(Number(fly.variantId))\n          || !Number.isInteger(fly.qty) || fly.qty < 1 || fly.qty > this.boxMaxQty)) {\n          this.boxCartMessage = 'This selection could not be verified. Please review the selected quantities.';\n          return;\n        }\n        const count = plan.reduce((sum, fly) => sum + fly.qty, 0);\n        const attempt = {\n          token: `ffs-${crypto.randomUUID()}`,\n          items: plan.map((fly) => ({ id: Number(fly.variantId), quantity: fly.qty,\n            handle: fly.handle, title: fly.title })),\n          phase: 'pending', selection,\n        };\n        this.boxCartAttempt = attempt;\n        if (!this.persistBoxAttempt()) {\n          this.boxCartAttempt = null;\n          this.boxCartMessage = 'Your browser could not save this selection. Please reload before adding it to your cart.';\n          return;\n        }\n        // One request, never an automatic retry. Shopify can partially fulfill even a 422.\n        postStarted = true;\n        let responseCompleted = false;\n        const postController = new AbortController();\n        const postTimeout = setTimeout(() => postController.abort(), 20000);\n        try {\n          await fetch(ffsShopRoot() + 'cart/add.js', {\n            method: 'POST', credentials: 'same-origin', signal: postController.signal,\n            headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n            body: JSON.stringify({ items: attempt.items.map((item) => ({\n              id: item.id, quantity: item.quantity,\n              properties: { ...properties, _ffs_box_attempt: attempt.token },\n            })) }),\n          });\n          responseCompleted = true;\n        } catch (_) { /* Reconcile a response lost after Shopify may have changed the cart. */ }\n        finally { clearTimeout(postTimeout); }\n        try {\n          const result = await this.reconcileBoxAttempt(attempt);\n          if (result.complete) {\n            attempt.phase = 'complete';\n            this.persistBoxAttempt();\n            document.dispatchEvent(new CustomEvent('cart:refresh'));\n            window.location.href = ffsShopRoot() + 'cart';\n            return;\n          }\n          attempt.phase = responseCompleted ? 'partial' : 'uncertain';\n          const missing = result.missing.map((item) => `${item.missing} ${item.title}`).join(', ');\n          this.boxCartMessage = responseCompleted\n            ? `${result.added} of ${count} flies are confirmed in your cart. ${missing ? `Not confirmed: ${missing}. ` : ''}Your selection is saved. Review your cart before starting a new box.`\n            : 'The cart result could not be confirmed. Some flies may already be in your cart. Your selection is saved. Review your cart before starting a new box.';\n        } catch (_) {\n          attempt.phase = 'uncertain';\n          this.boxCartMessage = 'The cart result could not be confirmed. Some flies may already be in your cart. Your selection is saved. Review your cart before starting a new box.';\n        }\n        attempt.message = this.boxCartMessage;\n        this.persistBoxAttempt();\n      } catch (_) {\n        this.boxCartMessage = postStarted\n          ? 'The cart result could not be confirmed. Some flies may already be in your cart. Review your cart before starting a new box.'\n          : 'The box could not be checked. Your selection is saved. Please try again.';\n      } finally {\n        this.boxCartBusy = false;\n        this.renderBestFlies();\n        const el = this.$('[data-ffs-report-best-flies]');\n        if (el) this.restoreBoxFocus(el, focus);\n        this.updateBoxPurchaseState();\n      }\n    }\n\n    renderSources() {\n      const el = this.$('[data-ffs-report-sources]');\n      if (!el) return;\n      const dir = window.FFS_WATERS_DIRECTORY;\n      const list = (dir && dir.sources && dir.sources.length ? dir.sources : null) || DATA.sources || [];\n      el.innerHTML = list\n        .map(\n          (s) =>\n            `<a class=\"ffs-report__source-chip\" href=\"${s.url}\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>${s.name}</strong><span>${s.desc}</span></a>`\n        )\n        .join('');\n    }\n\n    directoryWaters() {\n      const dir = window.FFS_WATERS_DIRECTORY;\n      return (dir && Array.isArray(dir.waters) ? dir.waters : []) || [];\n    }\n\n    /* Landing state: the directory used to render an empty grid until you searched,\n       which left the page looking broken. Seed it with marquee waters instead. */\n    featuredDirectoryWaters() {\n      const wanted = [\n        'madison river',\n        'yellowstone river',\n        'south fork snake river',\n        'south platte river',\n        'green river',\n        'san juan river',\n        'deschutes river',\n        'truckee river',\n        'bighorn river',\n        'fryingpan river',\n        'gunnison river',\n        'yakima river',\n      ];\n      const waters = this.directoryWaters();\n      const picked = [];\n      const seen = {};\n      wanted.forEach((term) => {\n        const hit = waters.find((w) => {\n          const n = String(w.name || '').toLowerCase();\n          return !seen[w.id] && (n === term || n.indexOf(term) === 0);\n        });\n        if (hit) {\n          seen[hit.id] = true;\n          picked.push(hit);\n        }\n      });\n      return picked.slice(0, 12);\n    }\n\n    regionLabel(regionId) {\n      const fromData = (DATA.regions || []).find((r) => r.id === regionId);\n      if (fromData) return fromData.shortLabel || fromData.label;\n      const dir = window.FFS_WATERS_DIRECTORY;\n      const fromDir = dir && (dir.regions || []).find((r) => r.id === regionId);\n      return (fromDir && (fromDir.shortLabel || fromDir.label)) || regionId;\n    }\n\n    filteredDirectoryWaters() {\n      const dir = window.FFS_WATERS_DIRECTORY || {};\n      const west = dir.westRegions || [\n        'northern_rockies',\n        'colorado',\n        'southwest',\n        'pacific_northwest',\n        'california',\n      ];\n      const q = String(this.dirQuery || '')\n        .trim()\n        .toLowerCase();\n      const hasQuery = q.length >= 2;\n      if (!hasQuery && !this.dirState) return [];\n      const scored = [];\n      this.directoryWaters().forEach((w) => {\n        if (this.dirState && w.state !== this.dirState) return;\n        if (this.dirRegion === 'west' && west.indexOf(w.region) === -1) return;\n        if (this.dirRegion !== 'all' && this.dirRegion !== 'west' && w.region !== this.dirRegion) return;\n        if (this.dirType === 'lake' && String(w.type).toLowerCase() !== 'lake') return;\n        if (this.dirType === 'river') {\n          const t = String(w.type).toLowerCase();\n          if (t === 'lake') return;\n        }\n        if (this.dirType === 'tailwater' && String(w.type).toLowerCase().indexOf('tailwater') === -1) return;\n        if (this.dirType === 'creek') {\n          const t = String(w.type).toLowerCase();\n          if (t.indexOf('creek') === -1 && t.indexOf('limestone') === -1 && t.indexOf('spring') === -1) return;\n        }\n        /* State-only browse: no text ranking, include every water in the state */\n        if (!hasQuery) {\n          scored.push(Object.assign({ _dirScore: 1 }, w));\n          return;\n        }\n        /* Rank so name matches always beat mentions buried in report text:\n           4 = name starts with query, 3 = name contains it,\n           2 = section/state/type/region matches, 1 = hatch/summary/source only */\n        const name = String(w.name || '').toLowerCase();\n        const near = [w.section, w.state, w.type, w.region, this.regionLabel(w.region)].join(' ').toLowerCase();\n        const far = [(w.hatches || []).join(' '), (w.report && w.report.summary) || '', (w.report && w.report.source) || ''].join(' ').toLowerCase();\n        let score = 0;\n        if (name.indexOf(q) === 0) score = 4;\n        else if (name.indexOf(q) !== -1) score = 3;\n        else if (near.indexOf(q) !== -1) score = 2;\n        else if (far.indexOf(q) !== -1) score = 1;\n        if (score) scored.push(Object.assign({ _dirScore: score }, w));\n      });\n      return scored;\n    }\n\n    /** All 50 USPS abbreviations \u2192 full names */\n    allStateNames() {\n      return {\n        AL: 'Alabama', AK: 'Alaska', AZ: 'Arizona', AR: 'Arkansas', CA: 'California',\n        CO: 'Colorado', CT: 'Connecticut', DE: 'Delaware', FL: 'Florida', GA: 'Georgia',\n        HI: 'Hawaii', ID: 'Idaho', IL: 'Illinois', IN: 'Indiana', IA: 'Iowa',\n        KS: 'Kansas', KY: 'Kentucky', LA: 'Louisiana', ME: 'Maine', MD: 'Maryland',\n        MA: 'Massachusetts', MI: 'Michigan', MN: 'Minnesota', MS: 'Mississippi', MO: 'Missouri',\n        MT: 'Montana', NE: 'Nebraska', NV: 'Nevada', NH: 'New Hampshire', NJ: 'New Jersey',\n        NM: 'New Mexico', NY: 'New York', NC: 'North Carolina', ND: 'North Dakota', OH: 'Ohio',\n        OK: 'Oklahoma', OR: 'Oregon', PA: 'Pennsylvania', RI: 'Rhode Island', SC: 'South Carolina',\n        SD: 'South Dakota', TN: 'Tennessee', TX: 'Texas', UT: 'Utah', VT: 'Vermont',\n        VA: 'Virginia', WA: 'Washington', WV: 'West Virginia', WI: 'Wisconsin', WY: 'Wyoming',\n      };\n    }\n\n    /** USPS abbreviation \u2192 full state name for the state dropdown */\n    stateName(abbr) {\n      const names = this.allStateNames();\n      return names[abbr] || abbr;\n    }\n\n    bindWatersDirectory() {\n      if (this.dirBound) return;\n      const search = this.$('[data-ffs-waters-search]');\n      const stateSelect = this.$('[data-ffs-dir-state]');\n      const regionWrap = this.$('[data-ffs-dir-region-filters]');\n      const typeWrap = this.$('[data-ffs-dir-type-filters]');\n      const grid = this.$('[data-ffs-report-waters-grid]');\n      const suggest = this.$('[data-ffs-dir-suggest]');\n      if (!grid) return;\n      this.dirBound = true;\n\n      if (search) {\n        search.addEventListener('input', () => {\n          this.dirQuery = search.value || '';\n          this.renderWatersDirectory(true);\n        });\n      }\n\n      if (stateSelect) {\n        /* Populate from the directory itself: every state with waters, A\u2192Z */\n        const counts = {};\n        this.directoryWaters().forEach((w) => {\n          if (w.state) counts[w.state] = (counts[w.state] || 0) + 1;\n        });\n        const options = Object.keys(counts)\n          .map((abbr) => ({ abbr, name: this.stateName(abbr) }))\n          .sort((a, b) => a.name.localeCompare(b.name))\n          .map((s) => `<option value=\"${s.abbr}\">${s.name} (${counts[s.abbr]})</option>`)\n          .join('');\n        stateSelect.innerHTML = `<option value=\"\">Select state</option>${options}`;\n        stateSelect.addEventListener('change', () => {\n          this.dirState = stateSelect.value || '';\n          this.renderWatersDirectory(true);\n        });\n      }\n\n      if (regionWrap) {\n        regionWrap.addEventListener('click', (e) => {\n          const btn = e.target.closest('[data-dir-region]');\n          if (!btn) return;\n          this.dirRegion = btn.getAttribute('data-dir-region') || 'west';\n          this.renderWatersDirectory();\n        });\n      }\n\n      if (typeWrap) {\n        typeWrap.addEventListener('click', (e) => {\n          const btn = e.target.closest('[data-dir-type]');\n          if (!btn) return;\n          this.dirType = btn.getAttribute('data-dir-type') || 'all';\n          this.renderWatersDirectory();\n        });\n      }\n\n      if (suggest) {\n        suggest.addEventListener('click', (e) => {\n          const btn = e.target.closest('[data-dir-suggest]');\n          if (!btn || !search) return;\n          const term = btn.getAttribute('data-dir-suggest') || '';\n          search.value = term;\n          this.dirQuery = term;\n          search.focus();\n          this.renderWatersDirectory(true);\n        });\n      }\n\n      grid.addEventListener('click', (e) => {\n        if (e.target.closest('a')) return;\n        const card = e.target.closest('[data-dir-select-water]');\n        if (card) {\n          const waterId = card.getAttribute('data-dir-select-water');\n          if (waterId) this.selectCatchFromCard(waterId);\n        }\n      });\n\n      grid.addEventListener('keydown', (e) => {\n        if (e.key !== 'Enter' && e.key !== ' ') return;\n        const card = e.target.closest('[data-dir-select-water]');\n        if (!card || e.target.closest('a')) return;\n        e.preventDefault();\n        const waterId = card.getAttribute('data-dir-select-water');\n        if (waterId) this.selectCatchFromCard(waterId);\n      });\n    }\n\n    selectCatchFromCard(waterId) {\n      const water = this.findDirectoryWater(waterId);\n      this.setSelectedCatchWater(waterId, { scroll: true });\n      if (water && water.region && DATA.regions.some((r) => r.id === water.region)) {\n        this.hatchRegion = water.region;\n      }\n      this.$$('[data-dir-select-water]').forEach((el) => {\n        const on = el.getAttribute('data-dir-select-water') === waterId;\n        el.classList.toggle('is-selected', on);\n        el.setAttribute('aria-pressed', on ? 'true' : 'false');\n      });\n    }\n\n    directoryCardHtml(water) {\n      const report = water.report || {};\n      const g = water.siteId ? this.gaugeData[water.siteId] || {} : {};\n      const hasFlow = g.flow != null;\n      const hasTemp = g.temp != null;\n      const flow = hasFlow ? fmtFlow(g.flow) : null;\n      const temp = hasTemp ? fmtTemp(g.temp) : null;\n      const fStat = hasFlow ? flowStatus(g.flow) : null;\n      const tStat = hasTemp ? tempStatus(g.temp) : null;\n      const evidence = this.reportEvidence(water);\n      const condition = evidence.verified ? 'Dated report' : '';\n      const cond = String(condition).toLowerCase();\n      const tone =\n        cond.indexOf('excellent') !== -1 || cond === 'prime' || cond.indexOf('great') !== -1\n          ? 'excellent'\n          : cond.indexOf('poor') !== -1 || cond.indexOf('bad') !== -1 || cond.indexOf('tough') !== -1\n            ? 'bad'\n            : cond.indexOf('fair') !== -1 || cond.indexOf('slow') !== -1\n              ? 'fair'\n              : cond.indexOf('good') !== -1\n                ? 'good'\n                : 'ok';\n      const updatedRaw = evidence.date;\n      const updatedLabel = evidence.label;\n      const metrics =\n        flow || temp\n          ? `<div class=\"ffs-report__dir-metrics\">\n              ${\n                flow\n                  ? `<span class=\"ffs-report__dir-metric ffs-report__dir-metric--${fStat.tone}\"><em>Flow</em> <strong>${flow}</strong></span>`\n                  : ''\n              }\n              ${\n                temp\n                  ? `<span class=\"ffs-report__dir-metric ffs-report__dir-metric--${tStat.tone}\"><em>Temp</em> <strong>${temp}</strong></span>`\n                  : ''\n              }\n            </div>`\n          : '';\n\n      return `\n        <article class=\"ffs-report__dir-card${this.selectedCatchWaterId === water.id ? ' is-selected' : ''}\" data-water-id=\"${water.id}\" data-dir-select-water=\"${water.id}\" tabindex=\"0\" role=\"button\" aria-pressed=\"${this.selectedCatchWaterId === water.id ? 'true' : 'false'}\">\n          <header class=\"ffs-report__dir-card-head\">\n            <div>\n              <p class=\"ffs-report__dir-meta\">${[water.state, water.type].filter(Boolean).join(' \u00B7 ')}</p>\n              <h3 class=\"ffs-report__dir-name\">${water.name}</h3>\n              <p class=\"ffs-report__dir-section\">${water.section}${water.elevation ? ` \u00B7 ${water.elevation}` : ''}</p>\n            </div>\n            ${condition ? `<span class=\"ffs-report__dir-condition ffs-report__dir-condition--${tone}\">${condition}</span>` : ''}\n          </header>\n          ${metrics}\n          ${this.gaugeObservedHtml(g)}\n          <footer class=\"ffs-report__dir-foot\">\n            ${\n              updatedLabel\n                ? `<p class=\"ffs-report__dir-updated\">Editorial entry <time datetime=\"${updatedRaw}\">${updatedLabel}</time></p>`\n                : ''\n            }\n            ${this.waterGuideLink(water)}\n          </footer>\n        </article>\n      `;\n    }\n\n    renderWatersDirectory(skipChrome) {\n      const grid = this.$('[data-ffs-report-waters-grid]');\n      if (!grid) return;\n      this.bindWatersDirectory();\n\n      const q = String(this.dirQuery || '').trim();\n      const stateBrowse = Boolean(this.dirState);\n      const searching = q.length >= 2 || stateBrowse;\n      const regionWrap = this.$('[data-ffs-dir-region-filters]');\n      const typeWrap = this.$('[data-ffs-dir-type-filters]');\n      const suggest = this.$('[data-ffs-dir-suggest]');\n      const count = this.$('[data-ffs-dir-count]');\n\n      /* Region/type filter chips retired 20260716 \u2014 search covers all waters;\n         relevance ranking puts the named water first. */\n      if (regionWrap) {\n        regionWrap.hidden = true;\n        regionWrap.innerHTML = '';\n      }\n      if (typeWrap) {\n        typeWrap.hidden = true;\n        typeWrap.innerHTML = '';\n      }\n\n      if (suggest) {\n        if (!searching) {\n          const ideas = ['Madison', 'Yellowstone', 'Truckee', 'San Juan', 'Deschutes', 'Crowley', 'Henry\\'s Fork', 'South Platte', 'Green River', 'Yakima'];\n          suggest.hidden = false;\n          suggest.innerHTML = `<p class=\"ffs-report__dir-suggest-label\">Popular searches</p><div class=\"ffs-report__dir-suggest-list\">${ideas\n            .map((term) => `<button type=\"button\" class=\"ffs-report__dir-chip\" data-dir-suggest=\"${term}\">${term}</button>`)\n            .join('')}</div>`;\n        } else if (stateBrowse && q.length < 2) {\n          /* Browsing a whole state \u2014 the grid already lists everything */\n          suggest.hidden = true;\n          suggest.innerHTML = '';\n        } else {\n          /* Typeahead: as the user types, offer matching water names \u2014\n             clicking one fills the search box (delegated handler above). */\n          const ql = q.toLowerCase();\n          const seen = {};\n          const names = [];\n          this.directoryWaters().forEach((w) => {\n            const n = String(w.name || '');\n            const nl = n.toLowerCase();\n            if (seen[nl] || nl.indexOf(ql) === -1) return;\n            seen[nl] = true;\n            names.push(n);\n          });\n          names.sort((a, b) => {\n            const as = a.toLowerCase().indexOf(ql) === 0 ? 0 : 1;\n            const bs = b.toLowerCase().indexOf(ql) === 0 ? 0 : 1;\n            return as - bs || a.localeCompare(b);\n          });\n          const top = names.filter((n) => n.toLowerCase() !== ql).slice(0, 6);\n          if (top.length) {\n            suggest.hidden = false;\n            suggest.innerHTML = `<p class=\"ffs-report__dir-suggest-label\">Suggested</p><div class=\"ffs-report__dir-suggest-list\">${top\n              .map((term) => `<button type=\"button\" class=\"ffs-report__dir-chip\" data-dir-suggest=\"${term.replace(/\"/g, '&quot;')}\">${term}</button>`)\n              .join('')}</div>`;\n          } else {\n            suggest.hidden = true;\n            suggest.innerHTML = '';\n          }\n        }\n      }\n\n      if (!searching) {\n        const featured = this.featuredDirectoryWaters();\n        if (count) {\n          count.hidden = true;\n          count.textContent = '';\n        }\n        grid.innerHTML = featured.length ? featured.map((w) => this.directoryCardHtml(w)).join('') : '';\n        this.selectedCatchWaterId = null;\n        this.syncDetailPanels();\n        this.renderSelectedWaterReport();\n        this.renderWaterCatches();\n        return;\n      }\n\n      const matched = this.filteredDirectoryWaters().sort((a, b) => {\n        const ds = (b._dirScore || 0) - (a._dirScore || 0);\n        if (ds) return ds;\n        const an = `${a.name} ${a.section}`.toLowerCase();\n        const bn = `${b.name} ${b.section}`.toLowerCase();\n        return an < bn ? -1 : an > bn ? 1 : 0;\n      });\n      /* State browse shows every water in the state; text search stays capped */\n      const limit = stateBrowse && q.length < 2 ? Infinity : 12;\n      const waters = limit === Infinity ? matched : matched.slice(0, limit);\n      if (count) {\n        count.hidden = false;\n        if (stateBrowse && q.length < 2) {\n          count.textContent = `${matched.length} water${matched.length === 1 ? '' : 's'} in ${this.stateName(this.dirState)}`;\n        } else {\n          count.textContent =\n            matched.length > limit\n              ? `Showing ${waters.length} of ${matched.length} matches \u2014 refine your search`\n              : `${matched.length} match${matched.length === 1 ? '' : 'es'}`;\n        }\n      }\n\n      /* Keep selection only if that water is still in the result set \u2014 never auto-pick */\n      const stillSelected = waters.some((w) => w.id === this.selectedCatchWaterId);\n      if (!stillSelected) {\n        this.selectedCatchWaterId = null;\n      }\n\n      this.syncDetailPanels();\n      this.renderSelectedWaterReport();\n\n      const emptyMsg =\n        stateBrowse && q.length >= 2\n          ? `No ${this.stateName(this.dirState)} waters match \u201C${q.replace(/[<>&]/g, '')}\u201D. Clear the search or pick another state.`\n          : `No waters match \u201C${q.replace(/[<>&]/g, '')}\u201D. Try another river, lake, or state.`;\n      grid.innerHTML = waters.length\n        ? waters.map((w) => this.directoryCardHtml(w)).join('')\n        : `<p class=\"ffs-report__dir-empty\">${emptyMsg}</p>`;\n      this.renderWaterCatches();\n    }\n\n    async fetchGauges() {\n      const ids = [...new Set(DATA.rivers.map(r => r.siteId).filter(Boolean))].join(',');\n      this.gaugeRequestedAt = new Date().toISOString();\n      try {\n        const res = await fetch(`${USGS_IV}&sites=${ids}`);\n        if (!res.ok) throw new Error('USGS unavailable');\n        const json = await res.json();\n        if (!Array.isArray(json?.value?.timeSeries)) throw new Error('Invalid USGS response');\n        const next = {};\n        json.value.timeSeries.forEach(ts => {\n          const siteId = ts.sourceInfo?.siteCode?.[0]?.value;\n          const param = ts.variable?.variableCode?.[0]?.value;\n          const field = param === '00060' ? 'flow' : param === '00010' ? 'temp' : null;\n          const noData = Number(ts.variable?.noDataValue);\n          const values = (ts.values || []).flatMap(group => group.value || []);\n          const last = values.filter(item => item.value != null && String(item.value).trim() !== '' &&\n            Number.isFinite(Number(item.value)) && Number(item.value) !== noData &&\n            Number.isFinite(Date.parse(item.dateTime)))\n            .sort((a, b) => Date.parse(a.dateTime) - Date.parse(b.dateTime)).pop();\n          if (!siteId || !field || !last) return;\n          if (!next[siteId]) next[siteId] = {};\n          next[siteId][field] = Number(last.value);\n          next[siteId][field + 'ObservedAt'] = last.dateTime;\n          next[siteId][field + 'Qualifiers'] = last.qualifiers || [];\n        });\n        this.gaugeData = next;\n        this.gaugeRetrievedAt = new Date().toISOString();\n        this.gaugeFetchFailed = false;\n        this.$('[data-ffs-report-status]')?.classList.remove('is-error');\n        const status = this.$('[data-ffs-report-status-text]');\n        if (status) status.textContent = 'USGS observations shown with their own timestamps; provisional and not a wading-safety rating.';\n        this.renderRivers();\n        this.renderWatersDirectory(true);\n        this.renderSelectedWaterReport();\n        this.updateTimestamp(true);\n      } catch (e) {\n        this.gaugeFetchFailed = true;\n        this.$('[data-ffs-report-status]')?.classList.add('is-error');\n        const status = this.$('[data-ffs-report-status-text]');\n        if (status) status.textContent = 'Gauge refresh failed. Any displayed readings retain their original observation times; no current editorial report is implied.';\n        this.renderRivers();\n        this.renderWatersDirectory(true);\n        this.renderSelectedWaterReport();\n        this.updateTimestamp(false);\n      }\n    }\n\n    updateTimestamp(live) {\n      const el = this.$('[data-ffs-report-updated]');\n      if (!el) return;\n      const stamp = this.gaugeRetrievedAt;\n      el.textContent = stamp ? `Gauge data retrieved ${new Date(stamp).toLocaleString('en-US', {timeZone: 'America/Denver', timeZoneName: 'short'})}. Observation times are shown per reading.` :\n        this.gaugeFetchFailed ? 'Gauge data could not be retrieved.' : 'Loading gauge data\u2026';\n    }\n  }\n\n  if (!customElements.get('ffs-fishing-report')) {\n    customElements.define('ffs-fishing-report', FfsFishingReport);\n  }\n})();\n"],
  "mappings": "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",
  "names": ["picked", "out", "key"]
}
