{
  "version": 3,
  "sources": ["overlays.js"],
  "sourcesContent": ["/*\n * static/js/overlays.js \u2014 Shared overlay dismiss + toast auto-dismiss (SNOW-486).\n *\n * Loaded on every public page (public/templates/public/base.html, defer).\n * Two independent, self-contained pieces:\n *\n * 1. The \"\u00D7\" standard \u2014 one delegated `document` click listener for every\n *    [data-action=\"dismiss\"] control. On click:\n *      - finds the closest [data-overlay] ancestor. A click with no such\n *        ancestor is a silent no-op \u2014 some overlays intentionally never\n *        carry [data-overlay] because they own a bespoke show/hide idiom\n *        this generic handler can't safely drive (the mutation-queue\n *        toast's slide transition \u2014 templates/includes/_toast_banner.html\n *        \u2014 and #offmap-banner's hidden/flex dual toggle \u2014 see\n *        public/templates/public/map.html); their own JS keeps binding\n *        its own dismiss listener directly.\n *      - hides it using the idiom the element declares:\n *        `data-overlay-hide=\"class\"` toggles the Tailwind `hidden` CLASS\n *        (every shell-chrome banner/toast/modal); the default toggles the\n *        HTML5 `hidden` ATTRIBUTE (map-internal overlays and sheets \u2014\n *        #map-help-overlay, #favourite-sheet, #report-sheet).\n *        Never flips which idiom an element uses.\n *      - optionally persists a localStorage flag via\n *        `data-overlay-persist=\"key=value\"`.\n *      - dispatches a bubbling `overlay:dismissed` CustomEvent\n *        (`detail.overlay` = the element) so the owning module can run\n *        teardown beyond hide (map_sheet.js deactivates the place-picker\n *        and clears the sheet's content for both map sheets, and drops the\n *        shared toast's auto-dismiss timer; map_help.js sets aria-hidden\n *        and restores focus) without binding its own\n *        \u00D7-click listener.\n *\n * 2. A shared toast auto-dismiss controller \u2014 any element carrying\n *    `data-toast-timeout=\"<ms>\"` (an opt-in on templates/includes/_toast.html)\n *    is watched for becoming visible and hidden again that many ms later,\n *    via the same idiom-aware hide as above. The three offline toasts in\n *    public/partials/_map_embed.html opt in at 6000ms; a toast whose text\n *    is rewritten between reveals (map_sheet.js's #map-sheet-toast) runs\n *    its own timer instead, since a text change fires no mutation the\n *    observer below watches for and so would not re-arm this one.\n */\n\n(function overlayDismissInit() {\n  'use strict';\n\n  /**\n   * Hide `el` using the idiom it declares.\n   * @param {HTMLElement} el\n   */\n  function hideOverlay(el) {\n    if (el.dataset.overlayHide === 'class') {\n      el.classList.add('hidden');\n    } else {\n      el.setAttribute('hidden', '');\n    }\n  }\n\n  /**\n   * Whether `el` is currently hidden, per the idiom it declares.\n   * @param {HTMLElement} el\n   * @returns {boolean}\n   */\n  function isOverlayHidden(el) {\n    return el.dataset.overlayHide === 'class'\n      ? el.classList.contains('hidden')\n      : el.hasAttribute('hidden');\n  }\n\n  /**\n   * Persist a `data-overlay-persist=\"key=value\"` declaration to\n   * localStorage, tolerating storage errors (private mode / full quota) \u2014\n   * matching every other localStorage write in this codebase\n   * (map_tour_offer.js, map_help.js, pwa_install.js).\n   * @param {string} declaration\n   */\n  function persist(declaration) {\n    const eq = declaration.indexOf('=');\n    if (eq < 0) return;\n    const key = declaration.slice(0, eq);\n    const value = declaration.slice(eq + 1);\n    try {\n      localStorage.setItem(key, value);\n    } catch (_err) {\n      // Ignore \u2014 this session's dismissed state simply doesn't persist.\n    }\n  }\n\n  document.addEventListener('click', function (event) {\n    const target = /** @type {HTMLElement} */ (event.target);\n    if (!target || !target.closest) return;\n    const trigger = target.closest('[data-action=\"dismiss\"]');\n    if (!trigger) return;\n    const overlay = /** @type {HTMLElement|null} */ (\n      trigger.closest('[data-overlay]')\n    );\n    if (!overlay) return;\n\n    hideOverlay(overlay);\n    if (overlay.dataset.overlayPersist) persist(overlay.dataset.overlayPersist);\n\n    overlay.dispatchEvent(\n      new CustomEvent('overlay:dismissed', {\n        bubbles: true,\n        detail: { overlay: overlay },\n      }),\n    );\n  });\n\n  // ---------------------------------------------------------------------\n  // Shared toast auto-dismiss controller.\n  // ---------------------------------------------------------------------\n\n  /** @type {WeakMap<Element, number>} */\n  const timers = new WeakMap();\n\n  /**\n   * (Re)arm or clear a toast's auto-dismiss timer based on its current\n   * visibility. Called on load and whenever the element's class/hidden\n   * attribute changes, so a toast revealed at any point after page load\n   * still gets its timer started.\n   * @param {HTMLElement} el\n   */\n  function syncToastTimer(el) {\n    const existing = timers.get(el);\n    if (existing) {\n      clearTimeout(existing);\n      timers.delete(el);\n    }\n    if (isOverlayHidden(el)) return;\n    const ms = parseInt(el.dataset.toastTimeout || '', 10);\n    if (!ms) return;\n    timers.set(\n      el,\n      setTimeout(function () {\n        hideOverlay(el);\n      }, ms),\n    );\n  }\n\n  document.querySelectorAll('[data-toast-timeout]').forEach(function (el) {\n    syncToastTimer(/** @type {HTMLElement} */ (el));\n    new MutationObserver(function () {\n      syncToastTimer(/** @type {HTMLElement} */ (el));\n    }).observe(el, { attributes: true, attributeFilter: ['class', 'hidden'] });\n  });\n})();\n"],
  "mappings": "CA0CC,UAA8B,CAC7B,aAMA,SAASA,EAAYC,EAAI,CACnBA,EAAG,QAAQ,cAAgB,QAC7BA,EAAG,UAAU,IAAI,QAAQ,EAEzBA,EAAG,aAAa,SAAU,EAAE,CAEhC,CAOA,SAASC,EAAgBD,EAAI,CAC3B,OAAOA,EAAG,QAAQ,cAAgB,QAC9BA,EAAG,UAAU,SAAS,QAAQ,EAC9BA,EAAG,aAAa,QAAQ,CAC9B,CASA,SAASE,EAAQC,EAAa,CAC5B,MAAMC,EAAKD,EAAY,QAAQ,GAAG,EAClC,GAAIC,EAAK,EAAG,OACZ,MAAMC,EAAMF,EAAY,MAAM,EAAGC,CAAE,EAC7BE,EAAQH,EAAY,MAAMC,EAAK,CAAC,EACtC,GAAI,CACF,aAAa,QAAQC,EAAKC,CAAK,CACjC,MAAe,CAEf,CACF,CAEA,SAAS,iBAAiB,QAAS,SAAUC,EAAO,CAClD,MAAMC,EAAqCD,EAAM,OACjD,GAAI,CAACC,GAAU,CAACA,EAAO,QAAS,OAChC,MAAMC,EAAUD,EAAO,QAAQ,yBAAyB,EACxD,GAAI,CAACC,EAAS,OACd,MAAMC,EACJD,EAAQ,QAAQ,gBAAgB,EAE7BC,IAELX,EAAYW,CAAO,EACfA,EAAQ,QAAQ,gBAAgBR,EAAQQ,EAAQ,QAAQ,cAAc,EAE1EA,EAAQ,cACN,IAAI,YAAY,oBAAqB,CACnC,QAAS,GACT,OAAQ,CAAE,QAASA,CAAQ,CAC7B,CAAC,CACH,EACF,CAAC,EAOD,MAAMC,EAAS,IAAI,QASnB,SAASC,EAAeZ,EAAI,CAC1B,MAAMa,EAAWF,EAAO,IAAIX,CAAE,EAK9B,GAJIa,IACF,aAAaA,CAAQ,EACrBF,EAAO,OAAOX,CAAE,GAEdC,EAAgBD,CAAE,EAAG,OACzB,MAAMc,EAAK,SAASd,EAAG,QAAQ,cAAgB,GAAI,EAAE,EAChDc,GACLH,EAAO,IACLX,EACA,WAAW,UAAY,CACrBD,EAAYC,CAAE,CAChB,EAAGc,CAAE,CACP,CACF,CAEA,SAAS,iBAAiB,sBAAsB,EAAE,QAAQ,SAAUd,EAAI,CACtEY,EAA2CZ,CAAG,EAC9C,IAAI,iBAAiB,UAAY,CAC/BY,EAA2CZ,CAAG,CAChD,CAAC,EAAE,QAAQA,EAAI,CAAE,WAAY,GAAM,gBAAiB,CAAC,QAAS,QAAQ,CAAE,CAAC,CAC3E,CAAC,CACH,GAAG",
  "names": ["hideOverlay", "el", "isOverlayHidden", "persist", "declaration", "eq", "key", "value", "event", "target", "trigger", "overlay", "timers", "syncToastTimer", "existing", "ms"]
}
