{"version":3,"file":"dist.js","sources":["../../node_modules/@lit/context/lib/context-request-event.js","../../resources/javascript/cleanup.js","../../node_modules/@preact/signals-core/dist/signals-core.module.js","../../resources/javascript/util.js","../../resources/javascript/session.js","../../resources/javascript/util/command.js","../../resources/javascript/Comparison.js","../../resources/javascript/events.js","../../resources/javascript/util/array.js","../../resources/javascript/RootElement.js","../../resources/javascript/CounterElement.js","../../resources/javascript/index.js"],"sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nclass s extends Event{constructor(s,t,e,o){super(\"context-request\",{bubbles:!0,composed:!0}),this.context=s,this.contextTarget=t,this.callback=e,this.subscribe=o??!1}}export{s as ContextRequestEvent};\n//# sourceMappingURL=context-request-event.js.map\n","// @ts-check\n\nlet counter = 0;\nconst cleanupIds = new WeakMap();\nconst cleanups = new Map();\n\nconst finalizationRegistry = new FinalizationRegistry((id) => {\n  const fns = cleanups.get(id) ?? [];\n  cleanups.delete(id);\n\n  for (const fn of fns) {\n    fn();\n  }\n});\n\n/**\n * @param {object} object\n * @returns {string}\n */\nconst objectId = (object) => {\n  if (cleanupIds.has(object)) {\n    return cleanupIds.get(object);\n  }\n\n  let id = Date.now();\n  while (cleanups.has(id)) {\n    id = counter++;\n  }\n\n  cleanupIds.set(object, id);\n  return id.toString();\n}\n\n/**\n * @param {object} object\n * @param {function} callback\n * @returns {void}\n */\nexport const registerCleanup = (object, callback) => {\n  const id = objectId(object);\n\n  const fns = cleanups.get(id) ?? [];\n  fns.push(callback);\n  cleanups.set(id, fns);\n\n  finalizationRegistry.register(object, id);\n};\n","var i=Symbol.for(\"preact-signals\");function t(){if(!(s>1)){var i,t=!1;while(void 0!==h){var r=h;h=void 0;f++;while(void 0!==r){var o=r.o;r.o=void 0;r.f&=-3;if(!(8&r.f)&&c(r))try{r.c()}catch(r){if(!t){i=r;t=!0}}r=o}}f=0;s--;if(t)throw i}else s--}function r(i){if(s>0)return i();s++;try{return i()}finally{t()}}var o=void 0;function n(i){var t=o;o=void 0;try{return i()}finally{o=t}}var h=void 0,s=0,f=0,v=0;function e(i){if(void 0!==o){var t=i.n;if(void 0===t||t.t!==o){t={i:0,S:i,p:o.s,n:void 0,t:o,e:void 0,x:void 0,r:t};if(void 0!==o.s)o.s.n=t;o.s=t;i.n=t;if(32&o.f)i.S(t);return t}else if(-1===t.i){t.i=0;if(void 0!==t.n){t.n.p=t.p;if(void 0!==t.p)t.p.n=t.n;t.p=o.s;t.n=void 0;o.s.n=t;o.s=t}return t}}}function u(i){this.v=i;this.i=0;this.n=void 0;this.t=void 0}u.prototype.brand=i;u.prototype.h=function(){return!0};u.prototype.S=function(i){if(this.t!==i&&void 0===i.e){i.x=this.t;if(void 0!==this.t)this.t.e=i;this.t=i}};u.prototype.U=function(i){if(void 0!==this.t){var t=i.e,r=i.x;if(void 0!==t){t.x=r;i.e=void 0}if(void 0!==r){r.e=t;i.x=void 0}if(i===this.t)this.t=r}};u.prototype.subscribe=function(i){var t=this;return E(function(){var r=t.value,n=o;o=void 0;try{i(r)}finally{o=n}})};u.prototype.valueOf=function(){return this.value};u.prototype.toString=function(){return this.value+\"\"};u.prototype.toJSON=function(){return this.value};u.prototype.peek=function(){var i=o;o=void 0;try{return this.value}finally{o=i}};Object.defineProperty(u.prototype,\"value\",{get:function(){var i=e(this);if(void 0!==i)i.i=this.i;return this.v},set:function(i){if(i!==this.v){if(f>100)throw new Error(\"Cycle detected\");this.v=i;this.i++;v++;s++;try{for(var r=this.t;void 0!==r;r=r.x)r.t.N()}finally{t()}}}});function d(i){return new u(i)}function c(i){for(var t=i.s;void 0!==t;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function a(i){for(var t=i.s;void 0!==t;t=t.n){var r=t.S.n;if(void 0!==r)t.r=r;t.S.n=t;t.i=-1;if(void 0===t.n){i.s=t;break}}}function l(i){var t=i.s,r=void 0;while(void 0!==t){var o=t.p;if(-1===t.i){t.S.U(t);if(void 0!==o)o.n=t.n;if(void 0!==t.n)t.n.p=o}else r=t;t.S.n=t.r;if(void 0!==t.r)t.r=void 0;t=o}i.s=r}function y(i){u.call(this,void 0);this.x=i;this.s=void 0;this.g=v-1;this.f=4}(y.prototype=new u).h=function(){this.f&=-3;if(1&this.f)return!1;if(32==(36&this.f))return!0;this.f&=-5;if(this.g===v)return!0;this.g=v;this.f|=1;if(this.i>0&&!c(this)){this.f&=-2;return!0}var i=o;try{a(this);o=this;var t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++}}catch(i){this.v=i;this.f|=16;this.i++}o=i;l(this);this.f&=-2;return!0};y.prototype.S=function(i){if(void 0===this.t){this.f|=36;for(var t=this.s;void 0!==t;t=t.n)t.S.S(t)}u.prototype.S.call(this,i)};y.prototype.U=function(i){if(void 0!==this.t){u.prototype.U.call(this,i);if(void 0===this.t){this.f&=-33;for(var t=this.s;void 0!==t;t=t.n)t.S.U(t)}}};y.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var i=this.t;void 0!==i;i=i.x)i.t.N()}};Object.defineProperty(y.prototype,\"value\",{get:function(){if(1&this.f)throw new Error(\"Cycle detected\");var i=e(this);this.h();if(void 0!==i)i.i=this.i;if(16&this.f)throw this.v;return this.v}});function w(i){return new y(i)}function _(i){var r=i.u;i.u=void 0;if(\"function\"==typeof r){s++;var n=o;o=void 0;try{r()}catch(t){i.f&=-2;i.f|=8;g(i);throw t}finally{o=n;t()}}}function g(i){for(var t=i.s;void 0!==t;t=t.n)t.S.U(t);i.x=void 0;i.s=void 0;_(i)}function p(i){if(o!==this)throw new Error(\"Out-of-order effect\");l(this);o=i;this.f&=-2;if(8&this.f)g(this);t()}function b(i){this.x=i;this.u=void 0;this.s=void 0;this.o=void 0;this.f=32}b.prototype.c=function(){var i=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var t=this.x();if(\"function\"==typeof t)this.u=t}finally{i()}};b.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;_(this);a(this);s++;var i=o;o=this;return p.bind(this,i)};b.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.o=h;h=this}};b.prototype.d=function(){this.f|=8;if(!(1&this.f))g(this)};function E(i){var t=new b(i);try{t.c()}catch(i){t.d();throw i}return t.d.bind(t)}export{u as Signal,r as batch,w as computed,E as effect,d as signal,n as untracked};//# sourceMappingURL=signals-core.module.js.map\n","// TODO implement this method in a shared package.\n/**\n * Fix a given URL for use in the current environment.\n *\n * Changes the hostname and adds the locale path prefix if not already present.\n *\n * @param {URL | string} url\n * @returns {URL}\n */\nexport const fixSiteURL = (url) => (url instanceof URL ? url : new URL(url, window.location.href));\n","export const loadComparisonState = (instance) => {\n\n  if (!('sessionStorage' in window)) {\n    return null;\n  }\n  const data = sessionStorage.getItem(`product-comparison-${instance}`);\n  if (!data) {\n    return null;\n  }\n\n  return JSON.parse(data);\n};\n\nexport const saveComparisonState = (instance, state) => {\n  if (!('sessionStorage' in window)) {\n    return;\n  }\n  sessionStorage.setItem(`product-comparison-${instance}`, JSON.stringify(state));\n};\n\nexport const clearAllComparisonStates = (filter) => {\n  if (!('sessionStorage' in window)) {\n    return;\n  }\n\n  for (let i = sessionStorage.length - 1; i >= 0; i--) {\n    const key = sessionStorage.key(i);\n    if (key && key.startsWith('product-comparison-')) {\n\n      if (filter) {\n        const instance = key.substring('product-comparison-'.length);\n        if (!filter({ instance })) {\n          continue;\n        }\n      }\n\n      sessionStorage.removeItem(key);\n    }\n  }\n}\n","export const CommandEvent = globalThis.CommandEvent || class CommandEvent extends Event {\n  constructor(type, options) {\n    super(type, options);\n\n    const { source, command } = options;\n    this.source = source;\n    this.command = command;\n  }\n};\n\nexport const isInvokerCommandsApiSupported = () => (\n  'command' in HTMLButtonElement.prototype &&\n  'commandForElement' in HTMLButtonElement.prototype &&\n  'command' in (CommandEvent || {}).prototype\n);\n\nexport const polyfillInvokerCommandsApi = (container) => {\n  if (!isInvokerCommandsApiSupported()) {\n    container.addEventListener('click', (e) => {\n      const button = e.target.closest('button');\n      if (!button) {\n        return;\n      }\n\n      e.stopPropagation();\n\n      const command = button.getAttribute('command');\n      const commandFor = button.getAttribute('commandfor');\n      if (command && commandFor) {\n        const commandForElement = document.getElementById(commandFor);\n        commandForElement?.dispatchEvent(new CommandEvent('command', {\n          source: button,\n          command,\n          bubbles: true,\n        }));\n      }\n    });\n  }\n};\n","// @ts-check\n\nimport { batch, computed, Signal, signal } from '@preact/signals-core';\nimport Dialog from 'dialog';\nimport { fixSiteURL } from './util';\nimport { loadComparisonState, saveComparisonState } from './session';\nimport { initComparisonRoot } from './events';\nimport { polyfillInvokerCommandsApi } from './util/command';\nimport { arrayEquals } from './util/array';\n\nexport const overlayLoadedEvent = 'product-comparison-overlay-loaded';\n\n/**\n * @typedef {{ key: string, parentKey?: string }} Product\n */\n\n/**\n * Comparison\n *\n * This class holds the state of a single instance of the product comparison tool.\n *\n * Products are identified by a string, but the meaning is not important except\n * that each distinct value must represent a distinct product configuration.\n */\nexport default class Comparison {\n  /**\n   * @type {string}\n   */\n  #instance;\n\n  /**\n   * @type {Signal<string>}\n   */\n  #id;\n\n  /**\n   * @type {Signal<object[]>}\n   */\n  #products;\n\n  /**\n   * @type {import('@preact/signals-core').ReadonlySignal<number>}\n   */\n  #productCount;\n\n  /**\n   * @type {Signal<number>}\n   */\n  #minProductCount;\n\n  /**\n   * @type {Signal<boolean>}\n   */\n  #loaded;\n\n  /**\n   * @type {Signal<boolean>}\n   */\n  #updating;\n\n  /**\n   * @type {string}\n   */\n  #overlayContainerSelector = '.product-comparison-overlay';\n\n  /**\n   * @type {AbortController|null}\n   */\n  #abortController = null;\n\n  /**\n   * @param {string} instance\n   * @param {boolean} [loadState=true] - Whether to load the state from session storage.\n   */\n  constructor(instance, loadState = true) {\n    this.#instance = instance;\n    this.#id = signal('');\n    this.#products = signal([]);\n    this.#productCount = computed(() => this.#products.value.length);\n    this.#minProductCount = signal(1);\n    this.#loaded = signal(false);\n    this.#updating = signal(false);\n\n    if (loadState) {\n      const state = loadComparisonState(this.#instance);\n      if (state) {\n        this.#updateStateFromResult(state, false);\n      }\n    }\n\n    this.#load();\n  }\n\n  get instance() {\n    return this.#instance;\n  }\n\n  get id() {\n    return this.#id;\n  }\n\n  get products() {\n    return this.#products;\n  }\n\n  get productCount() {\n    return this.#productCount;\n  }\n\n  get minProductCount() {\n    return this.#minProductCount;\n  }\n\n  get loaded() {\n    return this.#loaded;\n  }\n\n  get updating() {\n    return this.#updating;\n  }\n\n  /**\n   * @param {Product} product\n   */\n  async addProduct(product) {\n    this.#updateProducts((products) => {\n      // Add the product to the end of the array. If it already exists, move it\n      // to the end.\n      return [\n        ...products.filter(({ key, parentKey }) => (\n          key !== product.key &&\n          (parentKey === null || parentKey !== product.parentKey)\n        )),\n        product,\n      ];\n    });\n  }\n\n  /**\n   * @param {Product} oldProduct\n   * @param {Product} newProduct\n   */\n  async replaceProduct(oldProduct, newProduct) {\n    await this.#updateProducts((products) => {\n      const index = products.findIndex(({ key, parentKey }) => key === oldProduct.key || parentKey === oldProduct.parentKey);\n      if (index !== -1) {\n        products[index] = newProduct;\n      } else {\n        products.push(newProduct);\n      }\n\n      return products;\n    });\n  }\n\n  /**\n   * @param {Product} product\n   */\n  async removeProduct(product) {\n    await this.#updateProducts((products) => {\n      const index = products.findIndex(({ key, parentKey }) => key === product.key || (parentKey !== null && parentKey === product.parentKey));\n      if (index !== -1) {\n        products.splice(index, 1);\n      }\n\n      return products;\n    });\n  }\n\n  async removeAllProducts() {\n    return await this.#updateProducts(() => {\n      return [];\n    });\n  }\n\n  async #load() {\n    const abortController = new AbortController();\n    this.#abortController?.abort();\n    this.#abortController = abortController;\n\n    let notFound = false;\n    try {\n      this.#updating.value = true;\n\n      const id = this.#id.value;\n      if (!id) {\n        this.#loaded.value = true;\n        return;\n      }\n\n      try {\n        const url = fixSiteURL(`/_/api/product-comparison/v1/comparison/${this.#instance}/${id}`);\n        const response = await fetch(url, {\n          signal: abortController.signal,\n        });\n\n        if (response.status != 200) {\n          notFound = response.status === 404;\n          throw new Error('Failed to load comparison');\n        }\n\n        const result = await response.json();\n\n        this.#updateStateFromResult(result);\n        this.#loaded.value = true;\n      } catch (e) {\n        if (notFound) {\n          this.#updateStateFromResult(null);\n        }\n\n        this.#loaded.value = true; // TODO have a think about this.\n        // TODO: handle error\n      }\n    } finally {\n      this.#updating.value = false;\n    }\n  }\n\n  async #updateProducts(update) {\n    const abortController = new AbortController();\n    this.#abortController?.abort();\n    this.#abortController = abortController;\n\n    let newProducts, oldProducts, changed;\n    batch(() => {\n      oldProducts = this.#products.value;\n      newProducts = update([...oldProducts]);\n\n      if (!arrayEquals(oldProducts, newProducts)) {\n        this.#products.value = newProducts;\n        changed = true;\n        this.#updating.value = true;\n      }\n    });\n\n    if (!changed) {\n      return; // No changes, nothing to do.\n    }\n\n    try {\n      /** @type {RequestInit} */\n      const requestOptions = {\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          products: newProducts.map(({ key }) => key),\n        }),\n        credentials: 'same-origin',\n        signal: abortController.signal,\n      }\n\n      let response;\n\n      const id = this.#id.value;\n      if (!id) {\n        const url = fixSiteURL(`/_/api/product-comparison/v1/comparison/${this.#instance}`);\n\n        response = await fetch(url, Object.assign(requestOptions, {\n          method: 'POST',\n        }));\n      } else {\n        const url = fixSiteURL(`/_/api/product-comparison/v1/comparison/${this.#instance}/${id}`);\n\n        response = await fetch(url, Object.assign(requestOptions, {\n          method: 'PUT',\n        }));\n      }\n\n      if (response.status !== 200) {\n        throw new Error('Failed to update products');\n      }\n\n      const result = await response.json();\n\n      this.#updateStateFromResult(result);\n    } catch (e) {\n      batch(() => {\n        this.#products.value = oldProducts;\n        this.#updating.value = false;\n      });\n\n      // TODO: handle error\n    } finally {\n      if (this.#productCount.value === 0) {\n        this.closeOverlay();\n      } else {\n        this.reloadOverlay(); // Reloads the overlay if it is open.\n      }\n    }\n  }\n\n  #updateStateFromResult(result, updateSessionStorage = true) {\n    batch(() => {\n      this.#id.value = result?.id;\n      this.#products.value = result?.products ?? [];\n      this.#updating.value = false;\n\n      if (updateSessionStorage) {\n        saveComparisonState(this.#instance, result);\n      }\n    });\n  }\n\n  openOverlay({ replace, stack = true } = {}) {\n    const id = this.#id.value;\n    if (!id) {\n      return;\n    }\n\n    const comparison = this;\n    const containerSelector = this.#overlayContainerSelector;\n\n    const url = fixSiteURL(`/_/api/product-comparison/v1/comparison/${this.#instance}/${id}/overlay`);\n    Dialog.load(url.toString(), {\n      modifiers: ['takeover', 'product-comparison'],\n      stack,\n      replace,\n      callback: function () {\n        const dialog = this;\n        const container = dialog.content.querySelector(containerSelector);\n\n        polyfillInvokerCommandsApi(container);\n\n        initComparisonRoot(container, comparison)\n\n        container.dispatchEvent(new CustomEvent(overlayLoadedEvent, {\n          bubbles: true,\n          detail: {\n            comparison,\n            dialog,\n          },\n        }));\n      },\n      close: function () {\n        const dialog = this;\n        const container = dialog.content.querySelector(containerSelector);\n        container.remove();\n      },\n    });\n  }\n\n  reloadOverlay() {\n    if (this.#getComparisonOverlay()) {\n      this.openOverlay({ replace: true, stack: false });\n    }\n  }\n\n  closeOverlay() {\n    this.#getComparisonOverlay()?.close();\n  }\n\n  /**\n   * Get the comparison overlay if it is open.\n   */\n  #getComparisonOverlay() {\n    const current = Dialog.current;\n\n    if (current?.content?.querySelector(this.#overlayContainerSelector)) {\n      return current;\n    }\n    return null;\n  }\n}\n","// @ts-check\n\nimport { ContextEvent, createContext } from '@lit/context';\nimport { registerCleanup } from './cleanup';\nimport { effect } from '@preact/signals-core';\nimport * as signals from '@preact/signals-core';\nimport Comparison from './Comparison';\n\nexport const comparisonContext = createContext(Symbol('d3r-product-comparison'));\n\nconst commandPrefix = '--product-comparison';\n// keep-sorted start\nexport const commandAddProduct = `${commandPrefix}-add-product`;\nexport const commandCloseOverlay = `${commandPrefix}-close-overlay`;\nexport const commandRemoveAllProducts = `${commandPrefix}-remove-all-products`;\nexport const commandRemoveProduct = `${commandPrefix}-remove-product`;\n// keep-sorted end\n\nconst eventPrefix = 'd3r-product-comparison';\nexport const eventAddProduct = `${eventPrefix}-add-product`;\nexport const eventRemoveProduct = `${eventPrefix}-remove-product`;\n\n/**\n * Extracts product data from a DOM element.\n * @param {HTMLButtonElement|HTMLInputElement} element\n * @returns {import('./Comparison').Product}\n */\nconst dataFromElement = (element) => ({\n  key: element.value,\n  parentKey: element.dataset.productComparisonParentKey,\n});\n\n/**\n * Initializes the comparison root with event listeners.\n *\n * @param {HTMLElement} element\n * @param {Comparison} comparison\n * @returns {() => void} A cleanup function to remove event listeners.\n */\nexport const initComparisonRoot = (element, comparison) => {\n  const onContextRequest = ({ context, callback }) => {\n    if (context === comparisonContext) {\n      callback(comparison);\n    }\n  };\n\n  const onCommand = ({ command, source }) => {\n    switch (command) {\n      case commandAddProduct:\n        comparison.addProduct(dataFromElement(source));\n        break;\n\n      case commandCloseOverlay:\n        comparison.closeOverlay();\n        break;\n\n      case commandRemoveAllProducts:\n        comparison.removeAllProducts();\n        break;\n\n      case commandRemoveProduct:\n        comparison.removeProduct(dataFromElement(source));\n        break;\n    }\n  };\n\n  const onAddProduct = ({ detail }) => {\n    comparison.addProduct(detail);\n  };\n\n  const onRemoveProduct = ({ detail }) => {\n    comparison.removeProduct(detail);\n  };\n\n  const cleanup = () => {\n    element.removeEventListener('context-request', onContextRequest);\n    // @ts-ignore\n    element.removeEventListener('command', onCommand);\n    // @ts-ignore\n    element.removeEventListener(eventAddProduct, onAddProduct);\n    // @ts-ignore\n    element.removeEventListener(eventRemoveProduct, onRemoveProduct);\n  };\n\n  element.addEventListener('context-request', onContextRequest);\n  // @ts-ignore\n  element.addEventListener('command', onCommand);\n  // @ts-ignore\n  element.addEventListener(eventAddProduct, onAddProduct);\n  // @ts-ignore\n  element.addEventListener(eventRemoveProduct, onRemoveProduct);\n\n  return cleanup;\n};\n\n/**\n * @param {HTMLElement} element\n * @param {function(Comparison, object):any} callback A callback that optionally returns a cleanup function.\n */\nexport const withComparisonState = (element, callback) => {\n  /** @type {(() => void) | null} */\n  let cleanup = null;\n  registerCleanup(element, () => { cleanup?.(); });\n\n  // Dispatch an event to get a reference to the comparison state.\n  element.dispatchEvent(new ContextEvent(\n    comparisonContext,\n    element,\n    (comparison) => {\n      cleanup?.();\n\n      // We pass all exported symbols from the '@preact/signals-core' module,\n      // for use in the callback. Although the code that imports this module\n      // could itself import this package, currently this can lead to signal\n      // graph sharding due to having multiple copies of 'signal-polyfill.\n      cleanup = callback(comparison, { signals }) ?? null;\n    },\n    true,\n  ));\n}\n\n/**\n * @param {HTMLInputElement} element\n */\nexport const attatchInputState = (element) => {\n  // When the input state changes, dispatch an event.\n  // An ancestor element is expected to be listening for this event, using it to\n  // update the comparison state.\n  element.addEventListener('change', () => {\n    // Disable the element, until the state is updated.\n    element.disabled = true;\n\n    const event = element.checked ? eventAddProduct : eventRemoveProduct;\n\n    // Dispatch the event.\n    element.dispatchEvent(new CustomEvent(event, {\n      bubbles: true,\n      detail: dataFromElement(element),\n    }));\n  });\n\n  // When the comparison state changes, update the input state.\n  withComparisonState(element, (comparison) => effect(() => {\n    const { key, parentKey } = dataFromElement(element);\n\n    element.hidden = false;\n    element.checked = comparison.products.value.some((product) => product.key === key || (parentKey !== null && product.parentKey === parentKey));\n    element.disabled = comparison.updating.value;\n  }));\n};\n\n/**\n * Initialise a \"Clear all\" button.\n *\n * @param {HTMLButtonElement} button\n */\nexport const initClearButton = (button) => {\n  button.disabled = true;\n  button.hidden = true;\n\n  let onClick = () => { };\n  withComparisonState(button, (comparison) => {\n    return effect(() => {\n      onClick = () => { comparison.removeAllProducts(); };\n\n      button.disabled = comparison.productCount.value < comparison.minProductCount.value;\n      button.hidden = comparison.updating.value;\n    });\n  });\n\n  button.addEventListener('click', () => onClick());\n};\n\n/**\n * Initialise a \"Compare products\" button.\n *\n * @param {HTMLButtonElement} button\n */\nexport const initCompareButton = (button) => {\n  button.disabled = true;\n\n  let onClick = () => { };\n  withComparisonState(button, (comparison) => {\n    return effect(() => {\n      onClick = () => { comparison.openOverlay(); };\n\n      button.disabled = !comparison.loaded.value || comparison.productCount.value < comparison.minProductCount.value;\n    });\n  });\n\n  button.addEventListener('click', () => onClick());\n};\n\nexport const initComparisonSelectionBar = (bar) => {\n  bar ??= document.querySelector('.product-comparison-bar');\n  if (!(bar instanceof HTMLElement)) {\n    return;\n  }\n\n  withComparisonState(bar, (comparison) => {\n    return effect(() => {\n      bar.hidden = comparison.productCount.value < comparison.minProductCount.value;\n    });\n  });\n};\n","export const arrayEquals = (a, b) => {\n  if (a === b) {\n    return true;\n  }\n  if (!Array.isArray(a) || !Array.isArray(b)) {\n    return false;\n  }\n  if (a.length !== b.length) {\n    return false;\n  }\n  for (let i = 0; i < a.length; i++) {\n    if (a[i] !== b[i]) {\n      return false;\n    }\n  }\n  return true;\n};\n","import { effect } from '@preact/signals-core';\nimport Comparison from './Comparison';\nimport { initClearButton, initCompareButton, initComparisonRoot, withComparisonState } from './events';\n\nexport default class RootElement extends HTMLElement {\n  /**\n   * @type {Comparison} The comparison model.\n   */\n  comparison;\n\n  /**\n   * @type {() => void | null}\n   */\n  #disconnectedCleanup = null;\n\n  constructor() {\n    super();\n\n    const instance = this.getAttribute('instance') || 'default';\n\n    const loadState = this.getAttribute('state') === 'true';\n\n    this.comparison = new Comparison(instance, loadState);\n  }\n\n  connectedCallback() {\n    /** @type {HTMLElement} */\n    let eventRoot = this;\n\n    const eventRootSelector = this.getAttribute('selector');\n    if (eventRootSelector) {\n      eventRoot = this.closest(eventRootSelector);\n    }\n\n    this.#disconnectedCleanup = initComparisonRoot(eventRoot, this.comparison);\n\n    for (const button of eventRoot.querySelectorAll('.product-comparison-button--compare')) {\n      initCompareButton(button);\n    }\n\n    for (const button of eventRoot.querySelectorAll('.product-comparison-button--clear-all')) {\n      initClearButton(button);\n    }\n\n    for (const bar of eventRoot.querySelectorAll('.product-comparison-bar')) {\n      withComparisonState(bar, (comparison) => effect(() => {\n        bar.classList.toggle('product-comparison-bar--multiple-selected', comparison.productCount.value > 1);\n      }));\n    }\n  }\n\n  disconnectedCallback() {\n    this.#disconnectedCleanup?.();\n  }\n}\n\ncustomElements.define('d3r-product-comparison-root', RootElement);\n","// @ts-check\n\nimport { effect } from '@preact/signals-core';\nimport { withComparisonState } from './events';\n\nexport default class CounterElement extends HTMLElement {\n  /**\n   * @type {number|null}\n   */\n  #count = null;\n\n  connectedCallback() {\n    this.#setCount(null);\n\n    withComparisonState(this, (comparison) => effect(() => {\n      this.#setCount(comparison.productCount.value);\n    }));\n  }\n\n  #setCount(count) {\n    if (this.#count !== count) {\n      this.#count = count;\n      this.#render();\n    }\n  }\n\n  #render() {\n    const count = this.#count;\n    this.hidden = !Number.isInteger(count);\n\n    const template = this.getAttribute(count === 1 ? 'single' : 'multiple') ?? '';\n    this.textContent = template.replace(/\\{count\\}/g, count?.toString() ?? '');\n  }\n}\n\ncustomElements.define('d3r-product-comparison-counter', CounterElement);\n","// @ts-check\n\nimport {\n  attatchInputState,\n  initComparisonRoot,\n  initComparisonSelectionBar,\n  withComparisonState,\n} from './events';\n\n// Side-effect imports\nimport './RootElement'; // This must be registered first!\nimport './CounterElement';\nimport { clearAllComparisonStates } from './session';\n\nexport {\n  // keep-sorted start\n  attatchInputState,\n  clearAllComparisonStates,\n  initComparisonRoot,\n  initComparisonSelectionBar,\n  withComparisonState,\n  // keep-sorted end\n};\n\n// Globals\nglobalThis.d3r = globalThis.d3r || {};\nglobalThis.d3r.globals = globalThis.d3r.globals || {};\nglobalThis.d3r.globals.productComparison = {\n  // keep-sorted start\n  attatchInputState,\n  clearAllComparisonStates,\n  initComparisonSelectionBar,\n  withComparisonState,\n  // keep-sorted end\n};\n\ndocument.dispatchEvent(new CustomEvent('d3r-product-comparison-ready', {\n  bubbles: true,\n}));\n"],"names":["Event","constructor","s","t","e","o","super","bubbles","composed","this","context","contextTarget","callback","subscribe","counter","cleanupIds","WeakMap","cleanups","Map","finalizationRegistry","FinalizationRegistry","id","_cleanups$get","fns","get","delete","fn","registerCleanup","object","_cleanups$get2","has","Date","now","set","toString","objectId","push","register","i","Symbol","for","h","r","f","c","v","n","S","p","x","u","d","a","l","U","y","call","g","w","_","Error","b","E","bind","prototype","brand","value","valueOf","toJSON","peek","Object","defineProperty","N","fixSiteURL","url","URL","window","location","href","clearAllComparisonStates","filter","sessionStorage","length","key","startsWith","instance","substring","removeItem","CommandEvent","globalThis","type","options","source","command","polyfillInvokerCommandsApi","container","HTMLButtonElement","addEventListener","button","target","closest","stopPropagation","getAttribute","commandFor","commandForElement","document","getElementById","dispatchEvent","_instance","_classPrivateFieldLooseKey","_id","_products","_productCount","_minProductCount","_loaded","_updating","_overlayContainerSelector","_abortController","_load","_updateProducts","_updateStateFromResult","_getComparisonOverlay","Comparison","loadState","_getComparisonOverlay2","_updateStateFromResult2","_updateProducts2","_load2","writable","_classPrivateFieldLooseBase","signal","computed","state","data","getItem","JSON","parse","loadComparisonState","products","productCount","minProductCount","loaded","updating","addProduct","product","parentKey","replaceProduct","oldProduct","newProduct","index","findIndex","removeProduct","splice","removeAllProducts","openOverlay","replace","stack","comparison","containerSelector","Dialog","load","modifiers","content","querySelector","initComparisonRoot","CustomEvent","detail","dialog","close","remove","reloadOverlay","closeOverlay","_classPrivateFieldLoo","async","_classPrivateFieldLoo4","abortController","AbortController","abort","notFound","response","fetch","status","result","json","update","_classPrivateFieldLoo5","newProducts","oldProducts","changed","batch","arrayEquals","Array","isArray","requestOptions","headers","body","stringify","map","credentials","assign","method","updateSessionStorage","_result$products","setItem","_current$content","current","comparisonContext","commandPrefix","commandAddProduct","commandCloseOverlay","commandRemoveAllProducts","commandRemoveProduct","eventPrefix","eventAddProduct","eventRemoveProduct","dataFromElement","element","dataset","productComparisonParentKey","onContextRequest","onCommand","onAddProduct","onRemoveProduct","cleanup","removeEventListener","withComparisonState","ContextEvent","_callback","signals","attatchInputState","disabled","event","checked","effect","hidden","some","initClearButton","onClick","initCompareButton","initComparisonSelectionBar","bar","HTMLElement","_disconnectedCleanup","RootElement","connectedCallback","eventRoot","eventRootSelector","querySelectorAll","classList","toggle","disconnectedCallback","_classPrivateFieldLoo2","_classPrivateFieldLoo3","customElements","define","_count","_setCount","_render","CounterElement","args","_render2","_setCount2","count","_this$getAttribute","_count$toString","Number","isInteger","template","textContent","d3r","globals","productComparison"],"mappings":"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","x_google_ignoreList":[0,2]}