{
  "version": 3,
  "sources": ["/cdn/shop/t/15/assets/product-form.js"],
  "sourcesContent": ["/**\n * G\u00F6ssl Theme - Product Form v3\n * Handles color swatches, size grid, Swiper gallery, lightbox, and add to cart.\n */\n\n(function() {\n  'use strict';\n\n  // Logical size ordering for Gr\u00F6\u00DFe option\n  var SIZE_ORDER = [\n    'XXS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', 'XXXL',\n    '0', '1', '2', '3', '4', '4+', '5', '5+', '6', '6+',\n    '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38',\n    '39', '40', '41', '42', '44', '46', '48', '50', '52', '54', '56', '58', '60',\n    '62', '64', '86', '92', '98', '104', '110', '116', '122', '128', '134', '140',\n    '146', '152', '158', '164', '170', '176'\n  ];\n\n  /**\n   * Extract color code from linked option value.\n   * \"Marine 550\" \u2192 \"550\", \"rosa 61\" \u2192 \"61\"\n   */\n  function extractColorCode(optionValue) {\n    if (!optionValue) return null;\n    var match = optionValue.match(/\\s(\\d+)$/);\n    return match ? match[1] : null;\n  }\n\n  /**\n   * a11y #902: the strike (.unavailable) is only grey on screen - a struck size or colour says it in its\n   * accessible name too, in the add button's own word: 'sold_out' (the variant exists, none left) or\n   * 'unavailable' (this combination does not exist). null clears it. The button's own name is kept in\n   * data-a11y-name; a button without an aria-label (sticky bar) is named by its text.\n   */\n  function setUnavailable(btn, reason) {\n    btn.classList.toggle('unavailable', !!reason);\n    if (!('a11yName' in btn.dataset)) btn.dataset.a11yName = btn.getAttribute('aria-label') || '';\n    var name = btn.dataset.a11yName;\n    if (reason) {\n      var word = reason === 'sold_out'\n        ? window.g26tText('products.product.sold_out', 'Ausverkauft')\n        : window.g26tText('products.product.unavailable', 'Nicht verf\u00FCgbar');\n      btn.setAttribute('aria-label', (name || btn.textContent.trim()) + ', ' + word);\n    } else if (name) {\n      btn.setAttribute('aria-label', name);\n    } else {\n      btn.removeAttribute('aria-label');\n    }\n  }\n\n  class ProductForm {\n    constructor(section) {\n      this.section = section;\n      this.form = section.querySelector('[data-product-form]');\n      this.productJson = section.querySelector('[data-product-json]');\n\n      if (!this.form || !this.productJson) return;\n\n      this.product = JSON.parse(this.productJson.textContent);\n      this.variantIdInput = this.form.querySelector('[data-variant-id]');\n      this.addToCartBtn = this.form.querySelector('[data-add-to-cart]');\n\n      // Vorbestellung (pre-order). main-product.liquid renders this hidden input\n      // only for products carrying the \"Vorbestellung\" selling plan. We POST to\n      // /cart/add.js instead of submitting the form, so the plan has to be read\n      // out and put on the line item by hand \u2014 without it the line books as an\n      // ordinary oversold sale with no pre-order marking anywhere.\n      var sellingPlanInput = this.form.querySelector('[data-selling-plan]');\n      this.preorderPlanId = sellingPlanInput ? sellingPlanInput.value : '';\n      // r187 (Birgit 01.10.2026): pre-order per size - see isPreorderVariant / syncPreorderUi.\n      this.sellingPlanInput = sellingPlanInput;\n      this.preorderBox = section.querySelector('[data-preorder]');\n      this.preorderNotes = {};\n      var notesEl = section.querySelector('[data-preorder-notes]');\n      if (notesEl) { try { this.preorderNotes = JSON.parse(notesEl.textContent); } catch (e) {} }\n      this.priceContainer = section.querySelector('[data-product-price]');\n      this.skuElement = section.querySelector('[data-product-sku]');\n      this.selectedColorLabel = section.querySelector('[data-selected-color]');\n      this.inventory = {};\n      var invEl = section.querySelector('[data-product-inventory]');\n      if (invEl) { try { this.inventory = JSON.parse(invEl.textContent); } catch (e) {} }\n      // 22.10.2026: the low-stock line and the sizes with 1-4 pieces left (snippets/low-stock.liquid)\n      this.lowStock = section.querySelector('[data-low-stock]');\n      this.lowStockMap = {};\n      var lowEl = section.querySelector('[data-product-low-stock]');\n      if (lowEl) { try { this.lowStockMap = JSON.parse(lowEl.textContent) || {}; } catch (e) {} }\n\n      // Swiper instances\n      this.mainSwiper = null;\n      this.thumbsSwiper = null;\n\n      // Lightbox elements\n      this.lightbox = section.querySelector('[data-lightbox]');\n      this.lightboxSwiper = null;\n      this.lightboxCounter = section.querySelector('[data-lightbox-counter]');\n\n      // 22.10.2026 (SJ: \"a blue shirt is clicked, it might go to a yellow shirt to start with\"): what the link named.\n      // ?variant= names a colour and a size; with size=open (snippets/product-colour-url.liquid - cards, rows, the\n      // quick view) only the colour, and the size stays the visitor's (size memory) as on a plain visit - or none\n      // at all (SJ's card a, same day: no size of the page's own choosing). The named colour stays on the page even\n      // when it is sold out or has no photo: the hide passes below leave its swatch.\n      var requested = new URL(window.location.href);\n      var requestedId = requested.searchParams.get('variant');\n      this._urlVariant = requestedId ? (this.product.variants.find(function(v) { return String(v.id) === requestedId; }) || null) : null;\n      this._sizeOpen = requested.searchParams.get('size') === 'open';\n      var farbeAt = (this.product.options || []).indexOf('Farbe');\n      this._urlColour = this._urlVariant && farbeAt > -1 ? this._urlVariant.options[farbeAt] : null;\n\n      // Apply URL variant param BEFORE reading active state\n      this.applyUrlVariant();\n\n      this.currentVariant = this.getVariantFromOptions();\n\n      this.hideNoImageColors();\n      this.hideOutOfStockColors();\n      this.keepColourSelected();\n      // 06.10.2026: a ?variant= link (or the featured variant) can name a colour\n      // these two passes hide - no photo or sold out. They move the selection to the first\n      // visible colour, and the form now follows it the way a click on that swatch would:\n      // the same size in that colour when it exists, otherwise the no-variant state. Before,\n      // the form kept the hidden colour's variant, so the page showed one colour and the cart\n      // got the other (94558 Sneaker, ?variant= braun 80 showed gold-schwarz, added braun).\n      // onVariantChange() without an option name: the gallery is filtered further down,\n      // once Swiper has loaded, from the swatch that is active by then.\n      if (this._colourMoved) this.onVariantChange();\n      this.sortSizeButtons();\n      this.updateSizeAvailability();\n      this.updateColorAvailability();\n      // SJ 22.10.2026 (card a): no size of the page's own choosing any more - selectDefaultSize() picked the middle\n      // size whenever a colour change left none. The size comes from the link (a plain ?variant=), the visitor's\n      // memory (applySizeMemory below) or the visitor; until then the button asks for it.\n\n      // Update UI to match the selected variant\n      this.updatePrice();\n      this.updateSku();\n      this.updateAddToCartButton();\n      this.updateStockStatus();\n\n      // Swiper may not be loaded yet (CDN script at bottom of body)\n      var self = this;\n      if (typeof Swiper !== 'undefined') {\n        this.initSwiper();\n        this.filterSlidesByColor();\n      } else {\n        // Wait for Swiper to load\n        var check = setInterval(function() {\n          if (typeof Swiper !== 'undefined') {\n            clearInterval(check);\n            self.initSwiper();\n            self.filterSlidesByColor();\n          }\n        }, 50);\n        // Give up after 5s\n        setTimeout(function() { clearInterval(check); }, 5000);\n      }\n\n      this.bindEvents();\n\n      // r154 (SJ 12.09): size memory \u2014 preselect the size this visitor chose last\n      // in the same family (after bindEvents, so the programmatic click runs the\n      // real pipeline). A ?variant= deep link always wins.\n      this.applySizeMemory();\n      // canonical, og:url and hreflang are the plain product URL anyway. The address bar keeps the size marker only\n      // while no size is chosen (updateUrl): a reload or a shared link then opens the colour without a size, and once\n      // a size is chosen it names that variant (22.10.2026)\n      if (this._sizeOpen) this.updateUrl();\n\n      // Re-apply variant on bfcache restore (back/forward navigation)\n      window.addEventListener('pageshow', function(e) {\n        if (e.persisted) {\n          self.applyUrlVariant();\n          self.currentVariant = self.getVariantFromOptions();\n          self.filterSlidesByColor();\n          self.updatePrice();\n          self.updateSku();\n          self.updateAddToCartButton();\n          self.updateStockStatus();\n          self.updateSizeAvailability();\n        }\n      });\n    }\n\n    /**\n     * Initialize Swiper instances for main image and thumbnails.\n     */\n    initSwiper() {\n      var self = this;\n      var mainEl = this.section.querySelector('[data-product-main-swiper]');\n      var thumbsEl = this.section.querySelector('[data-product-thumbs-swiper]');\n\n      if (!mainEl) return;\n\n      // The thumb rail is a plain flex row of 40px tiles in the media-band overlay,\n      // so it needs no Swiper instance \u2014 only click wiring. Leaving thumbsSwiper null\n      // also keeps the main swiper off the Thumbs module, which never coped with\n      // slides being added and removed on every colour change.\n      if (thumbsEl) {\n        thumbsEl.querySelectorAll('.swiper-slide').forEach(function(thumb) {\n          if (thumb.dataset.thumbBound) return;\n          thumb.dataset.thumbBound = '1';\n          thumb.addEventListener('click', function() {\n            // 22.10.2026: the band slide of the same picture (data-media-id), not a position that a colour filter\n            // or the loop of another swiper may have shifted\n            var idx = self.bandIndexOf(thumb.dataset.mediaId);\n            if (idx < 0) idx = parseInt(thumb.dataset.slideIndex, 10);\n            if (!isNaN(idx) && idx > -1 && self.mainSwiper) {\n              self.mainSwiper.slideTo(idx, 300);\n            }\n          });\n        });\n      }\n\n      // slidesPerView 'auto' is what makes the band a filmstrip: each slide keeps its\n      // natural width at full band height, so a portrait shot fills ~39% of the\n      // viewport and the next image peeks in, as in the Figma PDP.\n      this.mainSwiper = new Swiper(mainEl, {\n        initialSlide: 0,\n        spaceBetween: 0,\n        slidesPerView: 'auto',\n        // r37 SJ: the band must scroll horizontally like the native carousels \u2014\n        // trackpad/wheel input moves it (drag + touch already work via Swiper\n        // defaults). forceToAxis keeps vertical page scroll untouched;\n        // releaseOnEdges hands the gesture back to the page at both ends.\n        mousewheel: { forceToAxis: true, releaseOnEdges: true },\n        navigation: {\n          nextEl: mainEl.querySelector('.swiper-button-next'),\n          prevEl: mainEl.querySelector('.swiper-button-prev'),\n        },\n        // Swiper's a11y module overwrites the buttons' aria-label with its own\n        // English defaults, so the German strings have to be passed in here.\n        a11y: {\n          prevSlideMessage: window.g26t('sections.collection_gallery.previous_image', 'Vorheriges Bild'),\n          nextSlideMessage: window.g26t('sections.collection_gallery.next_image', 'N\u00E4chstes Bild'),\n        },\n        on: {\n          slideChange: function() {\n            // Update lightbox starting index when slide changes\n            self._currentSlideIndex = this.activeIndex;\n            self.updateBandCounter();\n          },\n          click: function(swiper, event) {\n            // Open lightbox on click (but not on the overlay controls). 22.10.2026 (SJ: \"a front may open a back, a\n            // detail a front - no rhyme or reason\"): on the CLICKED picture. The band is a filmstrip with two or three\n            // pictures in view, and the lightbox used to open on the band's activeIndex - the leftmost one.\n            if (event.target.closest('.g26-pdp__band-nav')) return;\n            var slide = (event.target.closest && event.target.closest('.swiper-slide')) || swiper.clickedSlide;\n            self.openLightbox(slide ? slide.dataset.mediaId : null);\n          },\n        },\n      });\n\n      this.updateBandCounter();\n      this.updateThumbRail();\n    }\n\n    /**\n     * Media-band counter (\"2 von 6\"). Counts the slides currently in the band,\n     * which is the filtered set for the selected colour, not every product image.\n     */\n    updateBandCounter() {\n      var el = this.section.querySelector('[data-band-counter]');\n      if (!el) return;\n      var total = this.mainSwiper && this.mainSwiper.slides ? this.mainSwiper.slides.length : 0;\n      el.hidden = total < 2;\n      if (total) el.textContent = window.g26tText('products.product.media.counter', '{{ current }} von {{ total }}', { current: this.mainSwiper.activeIndex + 1, total: total });\n    }\n\n    // The position of a picture (data-media-id) in the band as it stands - the selected colour's set. -1 when absent.\n    bandIndexOf(mediaId) {\n      if (!this.mainSwiper || !mediaId) return -1;\n      var slides = Array.prototype.slice.call(this.mainSwiper.slides || []);\n      for (var i = 0; i < slides.length; i++) if (slides[i].dataset.mediaId === String(mediaId)) return i;\n      return -1;\n    }\n\n    /**\n     * Cap the thumb rail at five tiles. Beyond that the last tile becomes a\n     * \"+N\" counter that opens the lightbox, so the rail never outgrows the\n     * corner of the media band.\n     */\n    updateThumbRail() {\n      var rail = this.section.querySelector('[data-product-thumbs-swiper]');\n      if (!rail) return;\n      var more = this.section.querySelector('[data-thumbs-more]');\n      var thumbs = Array.from(rail.querySelectorAll('.swiper-slide'));\n      var MAX_TILES = 5;\n      var shown = thumbs.length <= MAX_TILES ? thumbs.length : MAX_TILES - 1;\n\n      thumbs.forEach(function(thumb, i) {\n        thumb.classList.toggle('is-hidden', i >= shown);\n      });\n\n      if (!more) return;\n      var hidden = thumbs.length - shown;\n      more.hidden = hidden <= 0;\n      more.textContent = hidden > 0 ? '+' + hidden : '';\n    }\n\n    /**\n     * Apply variant from URL param (?variant=XXXXX) by activating the correct swatches/buttons.\n     * This ensures JS state matches the URL even on bfcache restore or client-side navigation.\n     */\n    applyUrlVariant() {\n      var url = new URL(window.location.href);\n      var variantId = url.searchParams.get('variant');\n\n      // Fall back to featured variant from data attribute if no URL param\n      if (!variantId) {\n        var section = this.section.closest('[data-featured-variant]');\n        variantId = section ? section.dataset.featuredVariant : null;\n      }\n      if (!variantId) return;\n\n      var variantIdNum = parseInt(variantId, 10);\n      var variant = this.product.variants.find(function(v) {\n        return v.id === variantIdNum;\n      });\n      if (!variant) return;\n\n      // SJ 22.10.2026 (card a): only a plain ?variant= names the size (a cart or order line, the feed, a size-filtered\n      // card). A colour link (size=open) and the featured fallback name the colour, and the size grid stays as the\n      // server rendered it - no size - unless the product has a single size. Read from the address bar each time, so a\n      // back/forward restore follows the state it was left in (updateUrl keeps size=open while no size is chosen).\n      var sizeNamed = !!url.searchParams.get('variant') && url.searchParams.get('size') !== 'open';\n      var leaveSize = !sizeNamed && this.sizeChoice();\n\n      // Activate the correct option buttons/swatches for this variant\n      var self = this;\n      this.product.options.forEach(function(optName, idx) {\n        var optValue = variant.options[idx];\n        var group = self.section.querySelector('[data-option-index=\"' + idx + '\"]');\n        if (!group) return;\n        if (leaveSize && group.dataset.optionName === 'Gr\u00F6\u00DFe') return;\n\n        if (group.tagName === 'SELECT') {\n          group.value = optValue;\n          return;\n        }\n\n        // Deactivate all, activate the matching one\n        var buttons = group.querySelectorAll('[data-value]');\n        var foundMatch = false;\n        buttons.forEach(function(btn) {\n          btn.classList.remove('active');\n          if (btn.dataset.value === optValue) {\n            btn.classList.add('active');\n            foundMatch = true;\n          }\n        });\n\n        // Update color label if this is the Farbe option\n        if (foundMatch && optName === 'Farbe' && self.selectedColorLabel) {\n          var activeSwatch = group.querySelector('.active');\n          if (activeSwatch) {\n            self.selectedColorLabel.textContent = activeSwatch.dataset.displayName || activeSwatch.title || '';\n          }\n        }\n      });\n\n      // r83 (adversarial review F1): run the real update pipeline instead of\n      // hand-writing the input. onVariantChange() derives the variant from the\n      // buttons just activated and updates price, CTA, stock line, size/colour\n      // availability AND dispatches variant:change \u2014 so the back-in-stock block\n      // reacts to a ?variant= deep link exactly like to a click. Before this,\n      // a deep link to a sold-out variant kept the server-rendered state\n      // (dead \"Ausverkauft\" button, no notify form).\n      this.onVariantChange();\n    }\n\n    /**\n     * r154 size memory: when the visitor chose a size in this family before and the\n     * product carries it in stock (not struck, not hidden by a Schnitt), click that\n     * button so price, stock line, URL and sticky bar follow. Never overrides a\n     * ?variant= deep link. Shows a small \u201EIhre Gr\u00F6\u00DFe 38 vorausgew\u00E4hlt\" hint.\n     */\n    applySizeMemory() {\n      var P = window.GoesslPersonal;\n      if (!P || !P.sizes) return;\n      // The pipeline above has already written ?variant= for the default pick, so the deep-link test reads the URL\n      // the page was REQUESTED with, kept by the constructor. 22.10.2026: a colour link (size=open) chose the colour\n      // only - the remembered size still applies there.\n      if (this._urlVariant && !this._sizeOpen) return;\n      var grid = this.section.querySelector('.goessl-product__size-grid[data-option-name=\"Gr\u00F6\u00DFe\"]');\n      if (!grid || grid.hidden) return;\n      var buttons = Array.from(grid.querySelectorAll('.goessl-product__size-btn')).filter(function(b) {\n        return b.style.display !== 'none' && !b.classList.contains('unavailable');\n      });\n      if (!buttons.length) return;\n      var fam = this.sizeFamily();\n      var pick = P.sizes.match(fam, buttons.map(function(b) { return b.dataset.value; }));\n      if (!pick) return;\n      var btn = buttons.find(function(b) { return b.dataset.value === pick; });\n      if (!btn) return;\n      // r160 (Frau Adler 14.09): read the memory BEFORE the programmatic click. An apron size\n      // derived from the remembered Dirndl size must stay derived - the click handler skips\n      // remember() while _autoPick is set - so a later Dirndl size still leads the apron.\n      var entry = P.sizes.get(fam) || {};\n      if (!btn.classList.contains('active')) { this._autoPick = true; try { btn.click(); } finally { this._autoPick = false; } }\n      var hint = this.section.querySelector('[data-size-hint]');\n      if (hint) {\n        hint.textContent = entry.derived\n          ? window.g26tText('personal.size_preselected_derived', 'Gr\u00F6\u00DFe {{ size }} vorausgew\u00E4hlt, entspricht Ihrer Gr\u00F6\u00DFe {{ derived }}', { size: P.sizes.parse(pick).clean, derived: entry.derived })\n          : window.g26t('personal.size_preselected', 'Ihre Gr\u00F6\u00DFe {{ size }} vorausgew\u00E4hlt', { size: P.sizes.parse(pick).clean });\n        hint.dataset.size = pick;\n        hint.hidden = false;\n      }\n    }\n\n    // r192: the size-memory family of this product - all its Gr\u00F6\u00DFe values (sold out included) and the selected\n    // Schnitt tell a men's shirt's collar sizes from the Konfektion sizes (GoesslPersonal.sizes.familyFor).\n    // r197 (#353): the SKUs of the selected Schnitt's variants decide - its value is translated on /en (\"Collar size\").\n    sizeFamily() {\n      var p = this.product || {};\n      var si = (p.options || []).indexOf('Gr\u00F6\u00DFe');\n      var values = si < 0 ? [] : (p.variants || []).map(function(v) { return v.options[si]; });\n      var cutName = this.getSchnittOptionName();\n      var cut = cutName ? this.getSelectedOptionValue(cutName) : null;\n      var ci = cutName ? (p.options || []).indexOf(cutName) : -1;\n      var skus = (p.variants || []).filter(function(v) { return ci < 0 || cut == null || v.options[ci] === cut; }).map(function(v) { return v.sku; });\n      return window.GoesslPersonal.sizes.familyFor(p, values, cut, skus);\n    }\n\n    // r190b: the hint speaks for the preselected size only - another size hides it, that size again shows it\n    syncSizeHint() {\n      var hint = this.section.querySelector('[data-size-hint]');\n      if (hint && hint.dataset.size) hint.hidden = this.getSelectedOptionValue('Gr\u00F6\u00DFe') !== hint.dataset.size;\n    }\n\n    // \u2500\u2500 No size until one is chosen (SJ 22.10.2026, card pdp-ainote-size-2210 = a) \u2500\u2500\n    // The page picked a size on its own (the colour's first size that could be bought, e.g. rosa XXL) and it went\n    // into the cart unseen. Now a product with more than one size opens without one (main-product.liquid size_open):\n    // the button asks for it and leads to the sizes, the price covers the colour's sizes, and notify-me, the low-stock\n    // line and a per-size pre-order note wait for the size.\n\n    // the visible Gr\u00F6\u00DFe grid (a single-size product carries a hidden one with its size selected)\n    sizeGrid() {\n      var grid = this.section.querySelector('.goessl-product__size-grid[data-option-name=\"Gr\u00F6\u00DFe\"]');\n      return grid && !grid.hidden ? grid : null;\n    }\n\n    // the product asks for a size: its grid is shown with more than one size\n    sizeChoice() {\n      var grid = this.sizeGrid();\n      return !!grid && grid.querySelectorAll('.goessl-product__size-btn').length > 1;\n    }\n\n    // no size chosen yet - none selected in the grid (a Schnitt change that hides the selected size clears it too)\n    sizeMissing() {\n      var grid = this.sizeGrid();\n      return !!grid && !grid.querySelector('.goessl-product__size-btn.active');\n    }\n\n    // The buy button without a size: the message under the sizes, the first size that can be bought focused, the\n    // grid in view - the pattern of the apron check (product-addons.js validate)\n    askForSize() {\n      var grid = this.sizeGrid();\n      if (!grid) return;\n      var alert = this.section.querySelector('[data-size-alert]');\n      if (alert) alert.hidden = false;\n      var shown = Array.from(grid.querySelectorAll('.goessl-product__size-btn')).filter(function(b) { return b.style.display !== 'none'; });\n      var first = shown.find(function(b) { return !b.classList.contains('unavailable'); }) || shown[0];\n      if (first) first.focus({ preventScroll: true });\n      if (grid.scrollIntoView) grid.scrollIntoView({ block: 'center', behavior: 'smooth' });\n    }\n\n    hideSizeAlert() {\n      var alert = this.section.querySelector('[data-size-alert]');\n      if (alert) alert.hidden = true;\n    }\n\n    // the variants of the selected colour (and Schnitt), every size\n    colourVariants() {\n      var p = this.product || {};\n      var si = (p.options || []).indexOf('Gr\u00F6\u00DFe');\n      var self = this;\n      var sel = (p.options || []).map(function(name) { return self.getSelectedOptionValue(name); });\n      return (p.variants || []).filter(function(v) {\n        return v.options.every(function(o, i) { return i === si || o === sel[i]; });\n      });\n    }\n\n    // The price while no size is chosen, the rule of main-product.liquid (so_*): the colour's sizes that can be\n    // bought, else all of them - one price or the range; a was-price only when every one of them has one, the lowest\n    colourPrice() {\n      var all = this.colourVariants();\n      var pool = all.filter(function(v) { return v.available; });\n      if (!pool.length) pool = all;\n      if (!pool.length) return null;\n      var prices = pool.map(function(v) { return v.price; });\n      var compare = pool.every(function(v) { return v.compare_at_price > v.price; })\n        ? Math.min.apply(null, pool.map(function(v) { return v.compare_at_price; })) : 0;\n      return { min: Math.min.apply(null, prices), max: Math.max.apply(null, prices), compare: compare };\n    }\n\n    // the sticky bar's button says what the main button says\n    syncStickyLabel(text) {\n      var sticky = document.querySelector('[data-sticky-cart]');\n      if (sticky) sticky.textContent = text;\n    }\n\n    /**\n     * Read the selected value for a given option name.\n     */\n    getSelectedOptionValue(name) {\n      var group = this.section.querySelector('[data-option-name=\"' + name + '\"]');\n      if (!group) return null;\n      if (group.tagName === 'SELECT') return group.value;\n      var active = group.querySelector('.active');\n      return active ? active.dataset.value : null;\n    }\n\n    getOptionIndex(name) {\n      var group = this.section.querySelector('[data-option-name=\"' + name + '\"]');\n      return group ? parseInt(group.dataset.optionIndex) : -1;\n    }\n\n    // The one way a colour swatch becomes the selected one - a click, or a hide pass\n    // moving the selection off a colour it hides (06.10.2026). The caller runs onVariantChange.\n    selectColorSwatch(btn) {\n      var group = btn.closest('[data-option-name]') || this.section;\n      group.querySelectorAll('.goessl-product__color-swatch').forEach(function(b) {\n        b.classList.remove('active');\n        b.setAttribute('aria-pressed', 'false');\n      });\n      btn.classList.add('active');\n      btn.setAttribute('aria-pressed', 'true');\n      if (this.selectedColorLabel) {\n        this.selectedColorLabel.textContent = btn.dataset.displayName || btn.title || '';\n      }\n    }\n\n    getSelectedColorCode() {\n      // Liquid sets data-color-code on each swatch from the variant SKU (source of truth).\n      // Reading from the active swatch avoids parsing the option text, which fails for\n      // colors like \"wei\u00DF 10\" where \"10\" is a sub-shade, not the color_no (97).\n      var active = this.section.querySelector('.goessl-product__color-swatch.active');\n      if (active && active.dataset.colorCode) return active.dataset.colorCode;\n      return extractColorCode(this.getSelectedOptionValue('Farbe'));\n    }\n\n    // Returns the name of the third option (e.g. \"Schnitt\") if present, else null.\n    // Schnitt was added in 2026-05 for Lederhose products with multiple size systems\n    // (Standardgr\u00F6\u00DFe 36\u201350 vs. Hosengr\u00F6\u00DFe 44\u201358); each Schnitt has a different\n    // size scale, so size buttons must be filtered by current Schnitt selection.\n    getSchnittOptionName() {\n      if (!this.product || !this.product.options) return null;\n      for (var i = 0; i < this.product.options.length; i++) {\n        var name = this.product.options[i];\n        if (name && name !== 'Farbe' && name !== 'Gr\u00F6\u00DFe') return name;\n      }\n      return null;\n    }\n\n    bindEvents() {\n      var self = this;\n\n      document.addEventListener('variant:change', function() { self.syncSizeHint(); });\n\n      // Color swatch clicks\n      this.section.querySelectorAll('.goessl-product__color-swatch').forEach(function(btn) {\n        btn.addEventListener('click', function() {\n          self.selectColorSwatch(btn);\n          self.onVariantChange('Farbe');\n          // still no size (SJ 22.10.2026): the remembered one, if this colour has it\n          if (self.sizeMissing()) self.applySizeMemory();\n        });\n      });\n\n      // Size button clicks\n      this.section.querySelectorAll('.goessl-product__size-btn').forEach(function(btn) {\n        btn.addEventListener('click', function() {\n          var group = btn.closest('[data-option-name]');\n          group.querySelectorAll('.goessl-product__size-btn').forEach(function(b) {\n            b.classList.remove('active');\n            b.setAttribute('aria-pressed', 'false');\n          });\n          btn.classList.add('active');\n          btn.setAttribute('aria-pressed', 'true');\n          if (group.dataset.optionName === 'Gr\u00F6\u00DFe') self.hideSizeAlert();\n          self.onVariantChange('Gr\u00F6\u00DFe');\n          // r154: remember the choice for the next product of the same family\n          // (r160: not for the automatic pre-selection, which would freeze a derived apron size)\n          if (group.dataset.optionName === 'Gr\u00F6\u00DFe' && window.GoesslPersonal && !self._autoPick) {\n            window.GoesslPersonal.sizes.remember(self.sizeFamily(), btn.dataset.value);\n          }\n        });\n      });\n\n      // Fallback <select> elements\n      this.section.querySelectorAll('.goessl-product__option-select').forEach(function(select) {\n        select.addEventListener('change', function() {\n          self.onVariantChange(this.dataset.optionName);\n        });\n      });\n\n      // \"+N\" tile on the thumb rail \u2192 the lightbox on the first picture the rail does not show (22.10.2026; it\n      // opened on whatever picture the band happened to start with)\n      var moreBtn = this.section.querySelector('[data-thumbs-more]');\n      if (moreBtn) {\n        moreBtn.addEventListener('click', function() {\n          var firstHidden = self.section.querySelector('[data-product-thumbs-swiper] .swiper-slide.is-hidden');\n          self.openLightbox(firstHidden ? firstHidden.dataset.mediaId : null);\n        });\n      }\n\n      // Lightbox events\n      if (this.lightbox) {\n        this.lightbox.querySelectorAll('[data-lightbox-close]').forEach(function(el) {\n          el.addEventListener('click', self.closeLightbox.bind(self));\n        });\n\n        this._onKeydown = function(e) {\n          if (self.lightbox.getAttribute('aria-hidden') !== 'false') return;\n          if (e.key === 'Escape') self.closeLightbox();\n        };\n        document.addEventListener('keydown', this._onKeydown);\n      }\n\n      // Gutschein: recipient fields (only rendered on a gift-card product)\n      this.initGiftCardRecipient();\n\n      // Form submit\n      this.form.addEventListener('submit', this.onSubmit.bind(this));\n    }\n\n    // \u2500\u2500 Gutschein recipient form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    // Shopify's native recipient properties. While the box is unticked every\n    // field is disabled, so nothing is sent and the buyer gets the Gutschein\n    // by e-mail as before. The date window (today \u2026 today + 90 days) is set\n    // from the visitor's own clock, because the page HTML may be cached.\n    initGiftCardRecipient() {\n      var wrap = this.form.querySelector('[data-gc-recipient]');\n      this.gcRecipient = wrap || null;\n      if (!wrap) return;\n\n      var toggle = wrap.querySelector('[data-gcr-toggle]');\n      var fields = wrap.querySelector('[data-gcr-fields]');\n      var note = wrap.querySelector('[data-gcr-self-note]');\n      var sendOn = wrap.querySelector('[data-gcr-send-on]');\n      if (!toggle || !fields) return;\n      this.form.noValidate = true;\n\n      var pad = function(n) { return n < 10 ? '0' + n : String(n); };\n      var iso = function(d) { return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate()); };\n      if (sendOn) {\n        var today = new Date();\n        var last = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 90);\n        sendOn.min = iso(today);\n        sendOn.max = iso(last);\n      }\n\n      var self = this;\n      var apply = function() {\n        var on = toggle.checked;\n        fields.hidden = !on;\n        toggle.setAttribute('aria-expanded', on ? 'true' : 'false');\n        if (note) note.hidden = on;\n        var inputs = fields.querySelectorAll('input, textarea');\n        for (var i = 0; i < inputs.length; i++) inputs[i].disabled = !on;\n        self.setGiftCardRecipientError('');\n      };\n      toggle.addEventListener('change', apply);\n      apply();\n    }\n\n    setGiftCardRecipientError(message, field) {\n      var wrap = this.gcRecipient;\n      if (!wrap) return;\n      var box = wrap.querySelector('[data-gcr-error]');\n      var marked = wrap.querySelectorAll('[aria-invalid=\"true\"]');\n      for (var i = 0; i < marked.length; i++) marked[i].removeAttribute('aria-invalid');\n      if (box) {\n        box.textContent = message || '';\n        box.hidden = !message;\n      }\n      if (message && field) {\n        field.setAttribute('aria-invalid', 'true');\n        try { field.focus(); } catch (e) { /* ignore */ }\n      }\n    }\n\n    // Returns null when the box is unticked, false when a field is wrong (the\n    // error is already on screen), otherwise the properties for the cart line.\n    readGiftCardRecipient() {\n      var wrap = this.gcRecipient;\n      if (!wrap) return null;\n      var toggle = wrap.querySelector('[data-gcr-toggle]');\n      if (!toggle || !toggle.checked) return null;\n\n      var email = wrap.querySelector('[data-gcr-email]');\n      var sendOn = wrap.querySelector('[data-gcr-send-on]');\n      var value = email ? email.value.trim() : '';\n      if (!value || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n        this.setGiftCardRecipientError(wrap.getAttribute('data-err-email'), email);\n        return false;\n      }\n      if (sendOn && sendOn.value && ((sendOn.min && sendOn.value < sendOn.min) || (sendOn.max && sendOn.value > sendOn.max))) {\n        this.setGiftCardRecipientError(wrap.getAttribute('data-err-date'), sendOn);\n        return false;\n      }\n\n      var props = { '__shopify_send_gift_card_to_recipient': 'on', 'Recipient email': value };\n      var inputs = wrap.querySelectorAll('[data-gcr-fields] input[name], [data-gcr-fields] textarea[name]');\n      for (var i = 0; i < inputs.length; i++) {\n        var m = /^properties\\[(.+)\\]$/.exec(inputs[i].name);\n        if (!m || m[1] === 'Recipient email' || m[1] === '__shopify_offset') continue;\n        var v = inputs[i].value.trim();\n        if (v) props[m[1]] = v;\n      }\n      props['__shopify_offset'] = String(new Date().getTimezoneOffset());\n      this.setGiftCardRecipientError('');\n      return props;\n    }\n\n    sortSizeButtons() {\n      var grids = this.section.querySelectorAll('.goessl-product__size-grid');\n      grids.forEach(function(grid) {\n        // Only the Gr\u00F6\u00DFe grid needs the ladder sort \u2014 other option grids (e.g. gift-card\n        // Nennwerte \"\u20AC 100,00\") render in server order and localeCompare would scramble them\n        if (grid.dataset.optionName && grid.dataset.optionName !== 'Gr\u00F6\u00DFe') return;\n        var buttons = Array.from(grid.querySelectorAll('.goessl-product__size-btn'));\n        if (buttons.length <= 1) return;\n\n        buttons.sort(function(a, b) {\n          var aVal = a.dataset.value;\n          var bVal = b.dataset.value;\n          // Pure-integer sizes sort numerically \u2014 the SIZE_ORDER ladder only lists\n          // even clothing sizes, so odd hat sizes (55/57/59/61) would fall to the end\n          if (/^\\d+$/.test(aVal) && /^\\d+$/.test(bVal)) return parseInt(aVal, 10) - parseInt(bVal, 10);\n          var aIdx = SIZE_ORDER.indexOf(aVal);\n          var bIdx = SIZE_ORDER.indexOf(bVal);\n          if (aIdx !== -1 && bIdx !== -1) return aIdx - bIdx;\n          if (aIdx !== -1) return -1;\n          if (bIdx !== -1) return 1;\n          var aNum = parseFloat(aVal);\n          var bNum = parseFloat(bVal);\n          if (!isNaN(aNum) && !isNaN(bNum)) return aNum - bNum;\n          return aVal.localeCompare(bVal);\n        });\n\n        buttons.forEach(function(btn) { grid.appendChild(btn); });\n      });\n    }\n\n    /**\n     * Hide color swatches that have no product images.\n     */\n    hideNoImageColors() {\n      var swatches = this.section.querySelectorAll('.goessl-product__color-swatch');\n      if (swatches.length <= 1) return;\n\n      var mainSlides = this.section.querySelectorAll('[data-product-main-swiper] .swiper-slide');\n      var hiddenCount = 0;\n\n      var keep = this._urlColour;\n      swatches.forEach(function(swatch) {\n        var colorCode = swatch.dataset.colorCode;\n        if (!colorCode) return;\n        if (keep && swatch.dataset.value === keep) return;   // the colour the link named stays (22.10.2026)\n\n        var hasImages = Array.from(mainSlides).some(function(slide) {\n          return slide.dataset.colorCode === colorCode;\n        });\n\n        if (!hasImages) {\n          swatch.style.display = 'none';\n          hiddenCount++;\n        }\n      });\n\n      if (hiddenCount > 0) {\n        var activeSwatch = this.section.querySelector('.goessl-product__color-swatch.active');\n        if (activeSwatch && activeSwatch.style.display === 'none') {\n          var firstVisible = this.section.querySelector('.goessl-product__color-swatch:not([style*=\"display: none\"])');\n          if (firstVisible) {\n            this.selectColorSwatch(firstVisible);\n            this._colourMoved = true;   // the constructor lets the form follow\n          }\n        }\n      }\n    }\n\n    hideOutOfStockColors() {\n      var colorIdx = this.getOptionIndex('Farbe');\n      if (colorIdx === -1) return;\n\n      var swatches = this.section.querySelectorAll('.goessl-product__color-swatch');\n      if (swatches.length <= 1) return;\n\n      var variants = this.product.variants;\n      var hiddenCount = 0;\n      var keep = this._urlColour;\n\n      swatches.forEach(function(swatch) {\n        var colorValue = swatch.dataset.value;\n        // the colour the link named stays, sold out or not: its sizes show struck and the notify-me form takes the\n        // button's place, instead of the page jumping to another colour (22.10.2026)\n        if (keep && colorValue === keep) return;\n        var hasAvailable = variants.some(function(v) {\n          return v.options[colorIdx] === colorValue && v.available;\n        });\n        if (!hasAvailable) {\n          swatch.style.display = 'none';\n          hiddenCount++;\n        }\n      });\n\n      if (hiddenCount > 0) {\n        var activeSwatch = this.section.querySelector('.goessl-product__color-swatch.active');\n        if (activeSwatch && activeSwatch.style.display === 'none') {\n          var firstVisible = this.section.querySelector('.goessl-product__color-swatch:not([style*=\"display: none\"])');\n          if (firstVisible) {\n            this.selectColorSwatch(firstVisible);\n            this._colourMoved = true;   // the constructor lets the form follow\n          }\n        }\n      }\n    }\n\n    // A link can name a colour that has no swatch at all (no photo, no colour chip): then no swatch is active after\n    // applyUrlVariant, and the first visible one takes over the way the hide passes move a hidden selection.\n    keepColourSelected() {\n      var swatches = Array.from(this.section.querySelectorAll('.goessl-product__color-swatch'));\n      if (!swatches.length) return;\n      if (swatches.some(function(s) { return s.classList.contains('active') && s.style.display !== 'none'; })) return;\n      var first = swatches.find(function(s) { return s.style.display !== 'none'; });\n      if (!first) return;\n      this.selectColorSwatch(first);\n      this._colourMoved = true;\n    }\n\n    getVariantFromOptions() {\n      var options = [];\n      var groups = {};\n\n      this.section.querySelectorAll('[data-option-index]').forEach(function(el) {\n        groups[el.dataset.optionIndex] = el;\n      });\n\n      for (var i = 0; i < this.product.options.length; i++) {\n        var g = groups[i];\n        if (!g) { options.push(''); continue; }\n        if (g.tagName === 'SELECT') {\n          options.push(g.value);\n        } else {\n          var active = g.querySelector('.active');\n          options.push(active ? active.dataset.value : '');\n        }\n      }\n\n      return this.product.variants.find(function(variant) {\n        return variant.options.every(function(option, index) {\n          return option === options[index];\n        });\n      });\n    }\n\n    onVariantChange(changedOptionName) {\n      this.currentVariant = this.getVariantFromOptions();\n\n      if (!this.currentVariant) {\n        // r63 (SJ): the combination doesn't exist (colour with a partial size\n        // range). The visual context must STILL follow the click \u2014 gallery and\n        // size strikes always reflect the chosen colour. r68 (SJ): the chosen\n        // size SURVIVES the colour switch \u2014 it renders struck+selected and the\n        // missing-combo path below (stock line + notify-me) speaks for it.\n        // Only a size hidden by a Schnitt change (different size system, the\n        // button is display:none) still gets deselected \u2014 an invisible\n        // selection would drive price/BIS with a size the grid doesn't show.\n        if (changedOptionName === 'Farbe') {\n          this.filterSlidesByColor();\n          this.updateSizeAvailability();\n          var activeSize = this.section.querySelector('.goessl-product__size-btn.active');\n          if (activeSize && activeSize.style.display === 'none') {\n            activeSize.classList.remove('active');\n            activeSize.setAttribute('aria-pressed', 'false');\n          }\n        }\n        if (changedOptionName !== 'Farbe' && changedOptionName !== 'Gr\u00F6\u00DFe') {\n          this.updateSizeAvailability();\n        }\n        // SJ 22.10.2026: no size chosen yet is not a missing combination - the button asks for the size (not\n        // \"Nicht verf\u00FCgbar\"), the price covers the colour's sizes, and the address bar names the colour only\n        var noSize = this.sizeMissing();\n        this.updateColorAvailability();\n        this.updateAddToCartButton(false);\n        // r68: clear the stale id \u2014 the store line and the availability modal\n        // read this input and must not answer for the PREVIOUS variant\n        this.variantIdInput.value = '';\n        // r66 (SJ): the rest of the page must not go stale either \u2014 stock line\n        // shows \"Nicht verf\u00FCgbar\" (updateStockStatus handles null), and the\n        // BIS block gets a variant:change with variant:null + the selection, so\n        // notify-me works even for a colour/size combo that has no variant yet\n        // (recorded as demand for manual follow-up in the partner dash).\n        this.updateStockStatus();\n        if (noSize) {\n          this.updatePrice();\n          this.updateUrl(changedOptionName === 'Farbe');\n          document.querySelectorAll('[data-sticky-size].active').forEach(function(b) { b.classList.remove('active'); });\n        }\n        var sizeBtnNV = this.section.querySelector('.goessl-product__size-btn.active');\n        document.dispatchEvent(new CustomEvent('variant:change', {\n          detail: {\n            variant: null,\n            missing: !noSize,\n            sizeOpen: noSize,\n            options: null,\n            colorValue: this.getSelectedOptionValue('Farbe') || '',\n            sizeValue: sizeBtnNV ? sizeBtnNV.dataset.value : ''\n          }\n        }));\n        return;\n      }\n\n      this.variantIdInput.value = this.currentVariant.id;\n      this.hideSizeAlert();\n      this.updatePrice();\n      this.updateSku();\n      this.updateAddToCartButton();\n      this.updateStockStatus();\n      this.updateUrl();\n\n      if (changedOptionName === 'Farbe') {\n        this.filterSlidesByColor();\n        this.updateVariantImage();\n        this.updateSizeAvailability();\n        this.updateColorAvailability();\n      }\n\n      if (changedOptionName === 'Gr\u00F6\u00DFe') {\n        this.updateVariantImage();\n        // r63: with a size chosen, grey out the colours that don't carry it\n        this.updateColorAvailability();\n      }\n\n      // Schnitt or any other 3rd option: re-filter visible sizes since each\n      // Schnitt has its own size scale (Lederhose: Standardgr\u00F6\u00DFe vs Hosengr\u00F6\u00DFe),\n      // and re-grey colours not available in the newly-selected Schnitt (#523).\n      if (changedOptionName !== 'Farbe' && changedOptionName !== 'Gr\u00F6\u00DFe') {\n        this.updateSizeAvailability();\n        this.updateColorAvailability();\n      }\n\n      // Dispatch event for sticky bar and other listeners\n      document.dispatchEvent(new CustomEvent('variant:change', {\n        detail: {\n          variant: this.currentVariant,\n          price: this.currentVariant.price,\n          options: this.currentVariant.options\n        }\n      }));\n    }\n\n    /**\n     * Filter Swiper slides to show only images for the selected color.\n     * Physically swaps slides in/out of the wrapper and recreates Swiper.\n     */\n    /**\n     * The one colour rule of the band, the thumbs and the lightbox (team lead 22.10.2026: they must not drift apart),\n     * the same main-product.liquid paints server-side (img_offs): a colour with photos of its own shows them plus the\n     * uncoded ones; a colour without (hex-chip colourways, r63) shows every photo, so the band is never blank. Before,\n     * an uncoded photo counted as \"own\", so a colour without own photos showed only the uncoded ones here while the\n     * server painted all of them.\n     */\n    slideFilter(slides, colorCode) {\n      var own = !!colorCode && slides.some(function(s) { return s.dataset.colorCode === colorCode; });\n      return function(slide) {\n        return !own || !slide.dataset.colorCode || slide.dataset.colorCode === colorCode;\n      };\n    }\n\n    filterSlidesByColor() {\n      var colorCode = this.getSelectedColorCode();\n      if (!colorCode) return;\n\n      var mainWrapper = this.section.querySelector('[data-product-main-swiper] .swiper-wrapper');\n      var thumbsWrapper = this.section.querySelector('[data-product-thumbs-swiper] .swiper-wrapper');\n      if (!mainWrapper) return;\n\n      // Cache all slides on first call\n      if (!this._allMainSlides) {\n        this._allMainSlides = Array.from(mainWrapper.querySelectorAll('.swiper-slide'));\n        this._allThumbSlides = thumbsWrapper ? Array.from(thumbsWrapper.querySelectorAll('.swiper-slide')) : [];\n        // the server painted only the selected colour (--off on the rest, main-product.liquid); from here this filter owns the set\n        this._allMainSlides.forEach(function(s) { s.classList.remove('g26-pdp__slide--off'); });\n        this._allThumbSlides.forEach(function(s) { s.classList.remove('g26-pdp__thumb--off'); });\n      }\n\n      // Destroy existing swipers before modifying DOM\n      if (this.mainSwiper) { this.mainSwiper.destroy(true, true); this.mainSwiper = null; }\n      if (this.thumbsSwiper) { this.thumbsSwiper.destroy(true, true); this.thumbsSwiper = null; }\n\n      // Remove all children from wrappers\n      while (mainWrapper.firstChild) mainWrapper.removeChild(mainWrapper.firstChild);\n      if (thumbsWrapper) while (thumbsWrapper.firstChild) thumbsWrapper.removeChild(thumbsWrapper.firstChild);\n\n      // Append only the slides the colour rule shows (slideFilter - the rule main-product.liquid paints server-side)\n      var show = this.slideFilter(this._allMainSlides, colorCode);\n      this._allMainSlides.forEach(function(slide) {\n        if (show(slide)) mainWrapper.appendChild(slide);\n      });\n      this._allThumbSlides.forEach(function(slide) {\n        if (show(slide)) thumbsWrapper.appendChild(slide);\n      });\n\n      // Update thumb data-slide-index to match new sequential order\n      if (thumbsWrapper) {\n        thumbsWrapper.querySelectorAll('.swiper-slide').forEach(function(thumb, i) {\n          thumb.dataset.slideIndex = i;\n        });\n      }\n\n      // Recreate swipers with filtered slides\n      this.initSwiper();\n    }\n\n    updateSizeAvailability() {\n      var colorIdx = this.getOptionIndex('Farbe');\n      var sizeIdx = this.getOptionIndex('Gr\u00F6\u00DFe');\n      if (colorIdx === -1 || sizeIdx === -1) return;\n\n      var selectedColor = this.getSelectedOptionValue('Farbe');\n      if (!selectedColor) return;\n\n      var schnittName = this.getSchnittOptionName();\n      var schnittIdx = schnittName ? this.getOptionIndex(schnittName) : -1;\n      var selectedSchnitt = schnittName ? this.getSelectedOptionValue(schnittName) : null;\n\n      var sizeGrid = this.section.querySelector('.goessl-product__size-grid[data-option-name=\"Gr\u00F6\u00DFe\"]');\n      if (!sizeGrid) return;\n\n      var variants = this.product.variants;\n      var stickyBar = document.querySelector('[data-sticky-bar]');\n      var firstAvailable = null;\n      var hasActiveVisible = false;\n\n      sizeGrid.querySelectorAll('.goessl-product__size-btn').forEach(function(btn) {\n        var sizeValue = btn.dataset.value;\n        var variant = variants.find(function(v) {\n          if (v.options[colorIdx] !== selectedColor) return false;\n          if (v.options[sizeIdx] !== sizeValue) return false;\n          if (schnittIdx !== -1 && v.options[schnittIdx] !== selectedSchnitt) return false;\n          return true;\n        });\n\n        // Mirror visibility on sticky bar size button\n        var stickyBtn = stickyBar ? stickyBar.querySelector('[data-sticky-size=\"' + CSS.escape(sizeValue) + '\"]') : null;\n\n        if (!variant && schnittIdx !== -1) {\n          // Size doesn't exist for this color+schnitt combo (different size scale).\n          // Hide entirely rather than gray out \u2014 it's a different size system.\n          btn.style.display = 'none';\n          setUnavailable(btn, null);\n          if (stickyBtn) stickyBtn.style.display = 'none';\n        } else if (!variant) {\n          // r63 (SJ): the colour simply doesn't come in this size (partial size\n          // ranges, e.g. absorbed till colourways). Same size system \u2192 strike it.\n          // Falling through to \"available\" here is what showed phantom sizes.\n          btn.style.display = '';\n          setUnavailable(btn, 'unavailable');\n          if (stickyBtn) {\n            stickyBtn.style.display = '';\n            setUnavailable(stickyBtn, 'unavailable');\n          }\n        } else if (variant && !variant.available) {\n          btn.style.display = '';\n          setUnavailable(btn, 'sold_out');\n          if (stickyBtn) {\n            stickyBtn.style.display = '';\n            setUnavailable(stickyBtn, 'sold_out');\n          }\n        } else {\n          btn.style.display = '';\n          setUnavailable(btn, null);\n          if (stickyBtn) {\n            stickyBtn.style.display = '';\n            setUnavailable(stickyBtn, null);\n          }\n          if (variant && variant.available) {\n            if (!firstAvailable) firstAvailable = btn;\n            if (btn.classList.contains('active')) hasActiveVisible = true;\n          }\n        }\n      });\n\n      // If a Schnitt change hid the previously-active size (different size\n      // system, button display:none), that selection goes. r68 (SJ): a size\n      // that is merely STRUCK (colour gap, same size system) keeps the\n      // selection \u2014 the missing-combo path renders it struck+selected with the\n      // notify-me box. SJ 22.10.2026 (card a): no size of the page's own\n      // choosing - this used to jump to the first available size of the new\n      // scale, and picked one on the first load of every Schnitt product\n      // (Lederhosen opened on 50); the visitor or the remembered size chooses.\n      if (schnittIdx !== -1 && !hasActiveVisible) {\n        var prev = sizeGrid.querySelector('.goessl-product__size-btn.active');\n        if (prev && prev.style.display === 'none') {\n          prev.classList.remove('active');\n          prev.setAttribute('aria-pressed', 'false');\n          // Defer variant refresh so the calling onVariantChange can finish first\n          var self = this;\n          setTimeout(function() {\n            self.onVariantChange('Gr\u00F6\u00DFe');\n            if (self.sizeMissing()) self.applySizeMemory();\n          }, 0);\n        }\n      }\n    }\n\n    /**\n     * #523 \u2014 grey out color swatches not available in the SELECTED STYLE (Schnitt).\n     * Multi-cut products (e.g. a Schnitt option alongside Farbe/Gr\u00F6\u00DFe) can offer a\n     * colour in one cut but not another. When a Schnitt is selected, any colour with\n     * no available variant in that Schnitt gets `.unavailable` (greyed + strike),\n     * mirroring updateSizeAvailability for sizes. No-op for single-Schnitt products\n     * (hideOutOfStockColors already hides fully-OOS colours there). Never hides \u2014 only\n     * greys, so the customer still sees the colour exists.\n     */\n    updateColorAvailability() {\n      // r63 (SJ): greying is now driven by the WHOLE selection, not only Schnitt \u2014\n      // with a size selected, every colour that has no available variant in that\n      // size greys out (mirror of the size grid). Greyed swatches stay clickable:\n      // the grey is information, not a lock, and clicking still switches photos.\n      var colorIdx = this.getOptionIndex('Farbe');\n      if (colorIdx === -1) return;\n\n      var schnittName = this.getSchnittOptionName();\n      var schnittIdx = schnittName ? this.getOptionIndex(schnittName) : -1;\n      var selectedSchnitt = schnittName ? this.getSelectedOptionValue(schnittName) : null;\n\n      var sizeIdx = this.getOptionIndex('Gr\u00F6\u00DFe');\n      var activeSizeBtn = this.section.querySelector('.goessl-product__size-btn.active');\n      var selectedSize = (sizeIdx !== -1 && activeSizeBtn) ? activeSizeBtn.dataset.value : null;\n\n      if (!selectedSchnitt && !selectedSize) {\n        // nothing selected to gate on \u2192 clear any stale greys\n        this.section.querySelectorAll('.goessl-product__color-swatch.unavailable')\n          .forEach(function(s) { setUnavailable(s, null); });\n        return;\n      }\n\n      var variants = this.product.variants;\n      var swatches = this.section.querySelectorAll('.goessl-product__color-swatch');\n      if (swatches.length <= 1) return;\n\n      var self = this;\n      var activeWentUnavailableBySchnitt = false;\n      var firstAvailable = null;\n\n      swatches.forEach(function(swatch) {\n        // Skip swatches already hidden (no image / fully OOS) \u2014 leave them hidden.\n        if (swatch.style.display === 'none') return;\n        var colorValue = swatch.dataset.value;\n        if (!colorValue) return;\n        var matching = variants.filter(function(v) {\n          if (v.options[colorIdx] !== colorValue) return false;\n          if (selectedSchnitt && schnittIdx !== -1 && v.options[schnittIdx] !== selectedSchnitt) return false;\n          if (selectedSize && v.options[sizeIdx] !== selectedSize) return false;\n          return true;\n        });\n        var availableForSelection = matching.some(function(v) { return v.available; });\n        if (availableForSelection) {\n          setUnavailable(swatch, null);\n          if (!firstAvailable) firstAvailable = swatch;\n        } else {\n          setUnavailable(swatch, matching.length ? 'sold_out' : 'unavailable');\n          if (swatch.classList.contains('active') && selectedSchnitt) {\n            // Auto-switch remains a Schnitt-only behaviour (#523): check the\n            // Schnitt dimension alone so a size-driven grey never yanks the\n            // customer off the colour they are looking at.\n            var availableInSchnitt = variants.some(function(v) {\n              return v.options[colorIdx] === colorValue\n                && v.options[schnittIdx] === selectedSchnitt\n                && v.available;\n            });\n            if (!availableInSchnitt) activeWentUnavailableBySchnitt = true;\n          }\n        }\n      });\n\n      // If the active colour is unavailable in this Schnitt, switch to the first\n      // available colour so the PDP never sits on an all-sold-out colour after a\n      // Schnitt change (mirrors the size-grid behaviour).\n      if (activeWentUnavailableBySchnitt && firstAvailable) {\n        var active = this.section.querySelector('.goessl-product__color-swatch.active');\n        if (active) active.classList.remove('active');\n        firstAvailable.classList.add('active');\n        if (this.selectedColorLabel) {\n          this.selectedColorLabel.textContent = firstAvailable.dataset.displayName || firstAvailable.title || '';\n        }\n        setTimeout(function() { self.onVariantChange('Farbe'); }, 0);\n      }\n    }\n\n    updatePrice() {\n      if (!this.priceContainer) return;\n      // the selected variant's price; without a size (SJ 22.10.2026) the colour's sizes - one price or the range\n      var v = this.currentVariant;\n      var p = v ? { min: v.price, max: v.price, compare: v.compare_at_price || 0 } : (this.sizeMissing() ? this.colourPrice() : null);\n      if (!p) return;\n\n      var taxOld = this.priceContainer.querySelector('.goessl-product__tax-inline');\n      var taxText = taxOld ? taxOld.textContent : '';\n      while (this.priceContainer.firstChild) {\n        this.priceContainer.removeChild(this.priceContainer.firstChild);\n      }\n\n      var sticky = document.querySelector('[data-sticky-price]');\n      if (p.max > p.min) {\n        var rangeSpan = document.createElement('span');\n        rangeSpan.className = 'goessl-product__price-regular';\n        rangeSpan.textContent = this.formatMoney(p.min) + '\\u00a0\\u2013\\u00a0' + this.formatMoney(p.max);\n        this.priceContainer.appendChild(rangeSpan);\n        if (sticky) sticky.textContent = rangeSpan.textContent;\n      } else if (p.compare > p.min) {\n        var compareSpan = document.createElement('span');\n        compareSpan.className = 'goessl-product__price-compare';\n        compareSpan.textContent = this.formatMoney(p.compare);\n\n        var saleSpan = document.createElement('span');\n        saleSpan.className = 'goessl-product__price-sale';\n        saleSpan.textContent = this.formatMoney(p.min);\n\n        var discountPct = Math.round((p.compare - p.min) * 100 / p.compare);\n        var badgeSpan = document.createElement('span');\n        badgeSpan.className = 'goessl-product__discount-badge';\n        badgeSpan.textContent = '\u2212' + discountPct + '%';\n\n        // Order matches the Liquid render and the design: was-price, discount, now-price.\n        this.priceContainer.appendChild(compareSpan);\n        this.priceContainer.appendChild(badgeSpan);\n        this.priceContainer.appendChild(saleSpan);\n      } else {\n        var priceSpan = document.createElement('span');\n        priceSpan.className = 'goessl-product__price-regular';\n        priceSpan.textContent = this.formatMoney(p.min);\n        this.priceContainer.appendChild(priceSpan);\n      }\n      if (sticky && p.max <= p.min) sticky.textContent = this.formatMoney(p.min);\n\n      // Re-add inline tax note - the server's wording (a B2B account reads \"zzgl. MwSt.\")\n      var taxSpan = document.createElement('span');\n      taxSpan.className = 'goessl-product__tax-inline';\n      taxSpan.textContent = taxText || window.g26tText('products.product.include_taxes', 'inkl. MwSt.');\n      this.priceContainer.appendChild(taxSpan);\n    }\n\n    updateSku() {\n      if (!this.skuElement) return;\n      this.skuElement.textContent = this.currentVariant ? this.currentVariant.sku || '' : '';\n    }\n\n    updateAddToCartButton(variantExists) {\n      if (variantExists === undefined) variantExists = true;\n      if (!this.addToCartBtn) return;\n\n      if (!variantExists || !this.currentVariant) {\n        if (this.sizeMissing()) {\n          // SJ 22.10.2026: no size yet - the button asks for one and leads to the sizes (onSubmit -> askForSize)\n          this.addToCartBtn.disabled = false;\n          this.addToCartBtn.textContent = window.g26tText('products.product.choose_size', 'Gr\u00F6\u00DFe w\u00E4hlen');\n        } else {\n          this.addToCartBtn.disabled = true;\n          this.addToCartBtn.textContent = window.theme && window.theme.strings ? window.theme.strings.unavailable : window.g26tText('products.product.unavailable', 'Nicht verf\u00FCgbar');\n        }\n        this.syncStickyLabel(this.addToCartBtn.textContent);\n        this.syncCtaWithBis();\n        this.syncPreorderUi();\n        return;\n      }\n\n      if (this.currentVariant.available) {\n        this.addToCartBtn.disabled = false;\n        this.addToCartBtn.textContent = this.isPreorderVariant(this.currentVariant)\n          ? window.g26tText('products.product.preorder', 'Vorbestellen')\n          : this.addToCartLabel();\n      } else {\n        this.addToCartBtn.disabled = true;\n        this.addToCartBtn.textContent = window.theme && window.theme.strings ? window.theme.strings.soldOut : window.g26tText('products.product.sold_out', 'Ausverkauft');\n      }\n      this.syncStickyLabel(this.addToCartBtn.textContent);\n      this.syncCtaWithBis();\n      this.syncPreorderUi();\n    }\n\n    addToCartLabel() {\n      return window.theme && window.theme.strings ? window.theme.strings.addToCart : window.g26t('products.product.add_to_cart', 'In den Warenkorb');\n    }\n\n    // r187 (Birgit 01.10.2026: delivered pre-order pieces still read \"Vorbestellung\"): inside a\n    // pre-order product a size WITH online stock sells normally - no selling plan, normal button,\n    // no delivery date; a size without stock stays a pre-order. Stock = the tracked quantity in\n    // [data-product-inventory] (Liquid counts only locations that fulfil online orders; a placed\n    // pre-order makes it negative) - the rule of snippets/preorder-stock.liquid.\n    isPreorderVariant(variant) {\n      if (!this.preorderPlanId) return false;\n      if (!variant) return true;\n      var q = this.inventory ? this.inventory[variant.id] : null;\n      return !(typeof q === 'number' && q > 0);\n    }\n\n    // Puts the pre-order furniture in step with the selected size: the hidden selling_plan input\n    // (disabled = not posted by the no-JS form), the date + note box, the sticky-bar label. Runs on\n    // load too, so a ?variant= link lands in the right state. A colour/size combination without a\n    // variant keeps the box as it was - there is no size to answer for.\n    syncPreorderUi() {\n      if (!this.preorderPlanId) return;\n      var v = this.currentVariant;\n      var pre, noteFrom;\n      if (v) {\n        pre = this.isPreorderVariant(v);\n        noteFrom = v;\n      } else if (this.sizeMissing()) {\n        // SJ 22.10.2026: no size yet - the note speaks for the colour only when every size of it is a pre-order\n        // (main-product.liquid colour_preorder); nothing is posted without a size\n        var self = this;\n        var pool = this.colourVariants();\n        pre = pool.length > 0 && pool.every(function(x) { return self.isPreorderVariant(x); });\n        noteFrom = pool[0];\n        if (this.sellingPlanInput) this.sellingPlanInput.disabled = true;\n      } else {\n        return;   // a colour without the chosen size keeps the box as it was - there is no size to answer for\n      }\n      if (v && this.sellingPlanInput) this.sellingPlanInput.disabled = !pre;\n      if (this.preorderBox) {\n        this.preorderBox.hidden = !pre;\n        this.preorderBox.classList.toggle('g26-pdp__preorder--no-size', !v);   // the reserve link waits for a size\n        var date = this.preorderBox.querySelector('[data-preorder-date]');\n        if (date) {\n          var t = (pre && noteFrom && this.preorderNotes[String(noteFrom.id)]) || '';\n          date.textContent = t;\n          date.hidden = !t;\n        }\n      }\n      // the sticky bar's label follows the main button (updateAddToCartButton, which runs this)\n    }\n\n    // r78b (SJ): no grey \"Ausverkauft\" block \u2014 the notify-me form replaces the CTA.\n    // Deferred a tick so the BIS variant:change listener settles its visibility first;\n    // rule: CTA hidden exactly when the BIS box is visible (covers sold-out and\n    // missing-combo-with-size, and restores the button when a buyable size is picked).\n    syncCtaWithBis() {\n      var btn = this.addToCartBtn;\n      if (!btn) return;\n      setTimeout(function () {\n        var bis = document.querySelector('[data-bis]');\n        btn.hidden = !!(bis && !bis.hidden);\n      }, 0);\n    }\n\n    // Low stock (SJ 22.10.2026: she bought the last green XL with no warning). r68 dropped the element this used to\n    // write ([data-stock-status]) and it returned early ever since. Now the store row's low-stock line: shown only while\n    // the selected size has 1-4 pieces left across every location that ships online orders - \"Nur noch 1 verf\u00FCgbar\",\n    // else \"Auf Lager, weniger als 5 verf\u00FCgbar\" - and hidden for more, for a size that is sold out or missing, and for\n    // a pre-order size (it sells beyond its stock; snippets/low-stock.liquid lists only deny-policy sizes anyway).\n    updateStockStatus() {\n      var box = this.lowStock;\n      if (!box) return;\n      var v = this.currentVariant;\n      var q = v && v.available && !this.isPreorderVariant(v) ? Number(this.lowStockMap[String(v.id)]) : 0;\n      if (!(q >= 1 && q <= 4)) { box.hidden = true; return; }\n      var text = box.querySelector('[data-low-stock-text]') || box;\n      text.textContent = q === 1\n        ? window.g26tText('products.product.stock_last_one', 'Nur noch 1 verf\u00FCgbar')\n        : window.g26tText('products.product.stock_low', 'Auf Lager, weniger als {{ count }} verf\u00FCgbar', { count: 5 });\n      box.hidden = false;\n    }\n\n    // colourChanged: the visitor picked another colour while no size is chosen\n    updateUrl(colourChanged) {\n      if (!window.history.replaceState) return;\n      var url = new URL(window.location.href);\n      if (this.currentVariant) {\n        url.searchParams.set('variant', this.currentVariant.id);\n        // the address bar names the variant on the page - a reload or a shared link opens exactly it (22.10.2026)\n        if (url.searchParams.get('size') === 'open') url.searchParams.delete('size');\n      } else if (this.sizeMissing()) {\n        // SJ 22.10.2026: no size chosen - the colour only, as a colour link names it (snippets/product-colour-url.liquid:\n        // the colour's first variant that can be bought, else its first, and size=open), so a reload or a shared link\n        // opens the colour without inventing a size. A plain visit keeps its plain address until the colour changes.\n        if (!colourChanged && !url.searchParams.get('variant')) return;\n        var pool = this.colourVariants();\n        var named = url.searchParams.get('variant');\n        // a colour link that already names this colour stays as it came\n        if (url.searchParams.get('size') === 'open' && pool.some(function(x) { return String(x.id) === named; })) return;\n        var pick = pool.find(function(x) { return x.available; }) || pool[0];\n        if (!pick) return;\n        url.searchParams.set('variant', pick.id);\n        url.searchParams.set('size', 'open');\n      } else {\n        return;\n      }\n      window.history.replaceState({}, '', url.toString());\n    }\n\n    updateVariantImage() {\n      // After filterSlidesByColor, the gallery only contains the current color's images.\n      // Just slide to index 0 (the front image for this color).\n      if (this.mainSwiper) {\n        this.mainSwiper.slideTo(0, 0);\n      }\n    }\n\n    async onSubmit(e) {\n      e.preventDefault();\n\n      // SJ 22.10.2026: no size chosen - the button leads to the sizes instead of guessing one\n      if (!this.currentVariant && this.sizeMissing()) { this.askForSize(); return; }\n      if (!this.currentVariant || !this.currentVariant.available) return;\n\n      // r190: a ticked add-on (apron) needs its size before anything goes into the cart\n      var addonsBlock = this.section.querySelector('[data-addons]');\n      if (addonsBlock && window.GoesslAddons && !window.GoesslAddons.validate(addonsBlock)) return;\n\n      // a11y #902: the button that sent the piece to the cart (this one or the sticky bar's) gets focus back when\n      // the cart drawer closes - read it now, disabling the button below drops focus to the page\n      var opener = document.activeElement && document.activeElement !== document.body ? document.activeElement : this.addToCartBtn;\n      this.addToCartBtn.disabled = true;\n      var originalText = this.addToCartBtn.textContent;\n      this.addToCartBtn.textContent = window.theme && window.theme.strings ? window.theme.strings.loading : window.g26tText('products.product.adding', 'Wird hinzugef\u00FCgt...');\n\n      // Hidden line-item property carrying the Intex article number for\n      // store-team lookup in Shopify Admin (Steyr/Bergheim search Intex by\n      // this). Sourced from the `Artikelnr:<value>` tag mirrored by fn39.\n      // _-prefix = admin-only (hidden from customer-facing cart/checkout).\n      var lineItem = { id: this.currentVariant.id, quantity: 1 };\n      // r187: only a size without stock carries the plan; a size with stock is an ordinary sale\n      if (this.isPreorderVariant(this.currentVariant)) lineItem.selling_plan = Number(this.preorderPlanId);\n      try {\n        var tags = (this.product && this.product.tags) || [];\n        for (var t = 0; t < tags.length; t++) {\n          if (typeof tags[t] === 'string' && tags[t].indexOf('Artikelnr:') === 0) {\n            var v = tags[t].slice(10).trim();\n            if (v) lineItem.properties = { '_Artikel-Nr': v };\n            break;\n          }\n        }\n      } catch (e) { /* ignore */ }\n\n      // Gutschein: recipient properties (null = box unticked, false = a field is wrong)\n      var gcProps = this.readGiftCardRecipient();\n      if (gcProps === false) {\n        this.addToCartBtn.textContent = originalText;\n        this.addToCartBtn.disabled = false;\n        return;\n      }\n      if (gcProps) {\n        lineItem.properties = lineItem.properties || {};\n        for (var gk in gcProps) {\n          if (Object.prototype.hasOwnProperty.call(gcProps, gk)) lineItem.properties[gk] = gcProps[gk];\n        }\n      }\n\n      try {\n        var response = await fetch(window.g26url('cart/add.js'), {\n          method: 'POST',\n          headers: {\n            'Content-Type': 'application/json',\n            'Accept': 'application/json'\n          },\n          body: JSON.stringify(lineItem)\n        });\n\n        if (!response.ok) {\n          if (gcProps && this.gcRecipient) {\n            // Shopify names the field (email / send_on / message / name); its own sentences are\n            // half English (\"Send on muss innerhalb von 90 Tagen ...\") and change shape with the\n            // payload, so the page answers in its own words and marks the field.\n            var gcWrap = this.gcRecipient;\n            var gcMessage = gcWrap.getAttribute('data-err-generic');\n            var gcField = null;\n            try {\n              var gcBody = await response.json();\n              var gcErrors = (gcBody && (gcBody.errors || gcBody.description)) || {};\n              if (gcErrors && typeof gcErrors === 'object') {\n                if (gcErrors.email) {\n                  gcMessage = gcWrap.getAttribute('data-err-email');\n                  gcField = gcWrap.querySelector('[data-gcr-email]');\n                } else if (gcErrors.send_on) {\n                  gcMessage = gcWrap.getAttribute('data-err-date');\n                  gcField = gcWrap.querySelector('[data-gcr-send-on]');\n                }\n              }\n            } catch (parseError) { /* keep the generic message */ }\n            this.setGiftCardRecipientError(gcMessage, gcField);\n          }\n          throw new Error('Failed to add to cart');\n        }\n\n        // r190: the ticked add-ons follow the main piece in one more request. The main piece is in the cart\n        // either way; if the add-ons fail, the drawer says so and they stay ticked for another try.\n        var addonItems = addonsBlock && window.GoesslAddons ? window.GoesslAddons.items(addonsBlock) : [];\n        if (addonItems.length) {\n          try {\n            var addonResponse = await fetch(window.g26url('cart/add.js'), {\n              method: 'POST',\n              headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },\n              body: JSON.stringify({ items: addonItems })\n            });\n            if (!addonResponse.ok) throw new Error('add-ons ' + addonResponse.status);\n            window.GoesslAddons.reset(addonsBlock);\n          } catch (addonError) {\n            console.error('Error adding add-ons:', addonError);\n            document.dispatchEvent(new CustomEvent('cart:notice', { detail: { message: addonsBlock.getAttribute('data-addons-failed') } }));\n          }\n        }\n\n        // r188: a size sold from stock never takes more units than it has - a second click moves the\n        // extra piece onto a pre-order line (assets/preorder-cart.js), the drawer says so\n        // (r190: also when only an add-on is a pre-order piece)\n        if ((this.preorderPlanId || addonItems.length) && window.g26preorder && window.g26preorder.capCart) await window.g26preorder.capCart();\n\n        await this.updateCartCount();\n\n        this.addToCartBtn.textContent = window.theme && window.theme.strings ? window.theme.strings.addedToCart : window.g26tText('products.product.added_short', 'Hinzugef\u00FCgt!');\n\n        var cartDrawer = document.querySelector('[data-cart-drawer]');\n        if (cartDrawer) {\n          document.dispatchEvent(new CustomEvent('cart:open', { detail: { opener: opener } }));\n        }\n\n        var self = this;\n        setTimeout(function() {\n          self.addToCartBtn.textContent = originalText;\n          self.addToCartBtn.disabled = false;\n        }, 2000);\n\n      } catch (error) {\n        console.error('Error adding to cart:', error);\n        this.addToCartBtn.textContent = window.theme && window.theme.strings ? window.theme.strings.error : window.g26tText('general.accessibility.error', 'Fehler');\n        var self2 = this;\n        setTimeout(function() {\n          self2.addToCartBtn.textContent = originalText;\n          self2.addToCartBtn.disabled = false;\n        }, 2000);\n      }\n    }\n\n    async updateCartCount() {\n      try {\n        var response = await fetch(window.g26url('cart.js'));\n        var cart = await response.json();\n\n        var cartCounts = document.querySelectorAll('[data-cart-count]');\n        cartCounts.forEach(function(el) {\n          el.textContent = cart.item_count;\n          el.hidden = cart.item_count === 0;\n        });\n\n        var liveRegion = document.querySelector('[data-cart-live-region]');\n        if (liveRegion) {\n          liveRegion.textContent = window.g26tText('cart.general.live_region', '{{ count }} Artikel im Warenkorb', { count: cart.item_count });\n        }\n      } catch (error) {\n        console.error('Error updating cart count:', error);\n      }\n    }\n\n    initLightboxSwiper(count) {\n      var self = this;\n      var swiperEl = this.lightbox.querySelector('[data-lightbox-swiper]');\n      if (!swiperEl) return;\n\n      this.lightboxSwiper = new Swiper(swiperEl, {\n        spaceBetween: 0,\n        slidesPerView: 1,\n        // 22.10.2026: Swiper 11 cannot loop two pictures (it warns and keeps the order it can) - loop from three\n        loop: count >= 3,\n        navigation: {\n          nextEl: swiperEl.querySelector('.swiper-button-next'),\n          prevEl: swiperEl.querySelector('.swiper-button-prev'),\n        },\n        keyboard: { enabled: true, onlyInViewport: false },\n        // Swiper's built-in Zoom: native pinch on mobile, double-tap toggle,\n        // pan when zoomed. Single-click toggle for desktop is wired below.\n        zoom: {\n          maxRatio: 2.5,\n          minRatio: 1,\n          toggle: true,\n        },\n        on: {\n          slideChange: function() {\n            // zoom.out() with no active gesture crashes inside Swiper (fires on the\n            // construction-time slideChange) and the whole open aborts \u2014 only reset\n            // when actually zoomed in, and never let it kill the open (SJ 26.08).\n            if (this.zoom && this.zoom.scale && this.zoom.scale !== 1) {\n              try { this.zoom.out(); } catch (e) { /* zoomed-out already */ }\n            }\n            self.updateLightboxCounter();\n          },\n        },\n      });\n\n      // Desktop single-click toggle. Touch devices keep Swiper's native\n      // pinch + double-tap; this only adds the click affordance for mice.\n      if (window.matchMedia('(pointer: fine)').matches) {\n        swiperEl.addEventListener('click', function(e) {\n          if (e.target.closest('.swiper-button-prev')) return;\n          if (e.target.closest('.swiper-button-next')) return;\n          if (e.target.closest('[data-lightbox-close]')) return;\n          if (!e.target.closest('.goessl-lightbox__image')) return;\n          if (!self.lightboxSwiper || !self.lightboxSwiper.zoom) return;\n          self.lightboxSwiper.zoom.toggle();\n        });\n      }\n    }\n\n    /**\n     * 22.10.2026 (SJ: \"a front may open a back, a detail a front - no rhyme or reason\"). The lightbox opens on the\n     * picture that was clicked and holds exactly the pictures the band holds, in the band's order: both are matched\n     * by data-media-id, never by position. Before, it filtered its own copy by colour (no fallback for a colour\n     * without photos, so the two sets could differ) and opened at the band's activeIndex - the leftmost picture of a\n     * filmstrip that shows two or three - through slideTo(), which in loop mode lands on a shifted slide.\n     * mediaId: the picture to open on; without one, the band's current picture.\n     */\n    openLightbox(mediaId) {\n      if (!this.lightbox) return;\n      this._lightboxOpener = document.activeElement; // r71: restore on close\n\n      var lbWrapper = this.lightbox.querySelector('[data-lightbox-swiper] .swiper-wrapper');\n\n      // Cache all lightbox slides on first call; from here the band's set decides (the server's --off was the same rule)\n      if (!this._allLightboxSlides) {\n        this._allLightboxSlides = Array.from(lbWrapper.querySelectorAll('.swiper-slide'));\n        this._allLightboxSlides.forEach(function(s) { s.classList.remove('goessl-lightbox__slide--off'); });\n      }\n      var byId = {};\n      this._allLightboxSlides.forEach(function(slide) { byId[slide.dataset.mediaId] = slide; });\n\n      // Destroy previous lightbox swiper\n      if (this.lightboxSwiper) {\n        this.lightboxSwiper.destroy(true, true);\n        this.lightboxSwiper = null;\n      }\n\n      // The band's pictures, in the band's order; without a band (Swiper not loaded) the colour rule of the gallery\n      var ids = [];\n      if (this.mainSwiper && this.mainSwiper.slides && this.mainSwiper.slides.length) {\n        ids = Array.prototype.map.call(this.mainSwiper.slides, function(s) { return s.dataset.mediaId; });\n      } else {\n        ids = this._allLightboxSlides.filter(this.slideFilter(this._allLightboxSlides, this.getSelectedColorCode()))\n          .map(function(s) { return s.dataset.mediaId; });\n      }\n      ids = ids.filter(function(id) { return byId[id]; });\n\n      while (lbWrapper.firstChild) lbWrapper.removeChild(lbWrapper.firstChild);\n      ids.forEach(function(id) { lbWrapper.appendChild(byId[id]); });\n\n      var start = mediaId ? ids.indexOf(String(mediaId)) : -1;\n      if (start < 0 && this.mainSwiper) start = Math.min(this.mainSwiper.activeIndex, ids.length - 1);\n      if (start < 0) start = 0;\n\n      // Visible first: the lightbox is display:none while aria-hidden=\"true\", and a Swiper built in there measures\n      // nothing - slideToLoop then has no grid to move on and stays on the first picture.\n      this.lightbox.classList.add('is-open');\n      this.lightbox.setAttribute('aria-hidden', 'false');\n      document.body.style.overflow = 'hidden';\n\n      if (typeof Swiper !== 'undefined') {\n        this.initLightboxSwiper(ids.length);\n      }\n\n      // In loop mode the position of a picture is looked up by its own index (data-swiper-slide-index) - the loop may\n      // have rearranged the slides. Not slideToLoop: Swiper 11 moves there only on the next animation frame, so the\n      // first picture flashed up first (and a tab without frames - a background or test browser - never moved at all).\n      if (this.lightboxSwiper) {\n        var sw = this.lightboxSwiper;\n        sw.slideTo(sw.params.loop && sw.getSlideIndexByData ? sw.getSlideIndexByData(start) : start, 0, false);\n      }\n\n      this.updateLightboxCounter();\n      // r71: move focus into the dialog (close button) \u2014 it opened without\n      // taking focus, leaving keyboard users behind the overlay\n      var lbClose = this.lightbox.querySelector('[data-lightbox-close], button');\n      if (lbClose) { try { lbClose.focus(); } catch (e) {} }\n    }\n\n    closeLightbox() {\n      if (!this.lightbox) return;\n      // the band follows to the picture the lightbox was on (22.10.2026)\n      if (this.lightboxSwiper && this.mainSwiper) {\n        var current = this.lightboxSwiper.slides[this.lightboxSwiper.activeIndex];\n        var at = current ? this.bandIndexOf(current.dataset.mediaId) : -1;\n        if (at > -1 && at !== this.mainSwiper.activeIndex) this.mainSwiper.slideTo(at, 0);\n      }\n      this.lightbox.classList.remove('is-open');\n      this.lightbox.setAttribute('aria-hidden', 'true');\n      document.body.style.overflow = '';\n      // r71: hand focus back to whatever opened the lightbox\n      if (this._lightboxOpener && this._lightboxOpener.focus) { try { this._lightboxOpener.focus(); } catch (e) {} }\n      this._lightboxOpener = null;\n      // Reset Swiper zoom so the next open starts un-zoomed (guarded \u2014 see slideChange note).\n      if (this.lightboxSwiper && this.lightboxSwiper.zoom && this.lightboxSwiper.zoom.scale !== 1) {\n        try { this.lightboxSwiper.zoom.out(); } catch (e) { /* already out */ }\n      }\n    }\n\n    updateLightboxCounter() {\n      if (!this.lightboxCounter || !this.lightboxSwiper) return;\n      var total = this.lightboxSwiper.slides.length;\n      // realIndex: the picture's own position - activeIndex shifts when the loop rearranges the slides\n      this.lightboxCounter.textContent = (this.lightboxSwiper.realIndex + 1) + ' / ' + total;\n    }\n\n    formatMoney(cents) {\n      if (typeof window.Goessl !== 'undefined' && typeof window.Goessl.formatMoney === 'function') {\n        return window.Goessl.formatMoney(cents);\n      }\n      // Fallback matching the theme's suffix format (\"1.500,00 \\u20AC\" \\u2014 Figma r9;\n      // the shop-level moneyFormat stays \\u20AC-prefixed for the live theme).\n      var parts = (cents / 100).toFixed(2).split('.');\n      var intPart = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n      return intPart + ',' + parts[1] + ' \\u20AC';\n    }\n  }\n\n  function initProductForms() {\n    var sections = document.querySelectorAll('[data-product-section]');\n    sections.forEach(function(section) {\n      new ProductForm(section);\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initProductForms);\n  } else {\n    initProductForms();\n  }\n\n  // Lightbox image zoom is now handled by Swiper's built-in Zoom module\n  // (initialized in ProductForm.initLightboxSwiper). Gives native pinch on\n  // mobile, double-tap toggle, and pan when zoomed \u2014 for free.\n})();\n\n  /* \u2500\u2500 Verf\u00FCgbarkeit im Gesch\u00E4ft (r38, SJ 23.08; r67 Reservierung) \u2500\u2500\u2500\u2500\n     L\u00E4dt die Verf\u00FCgbarkeit beim \u00D6ffnen und bei jedem Variantenwechsel - seit\n     06.10.2026 f\u00FCr alle Gr\u00F6\u00DFen der GEW\u00C4HLTEN Farbe, damit jede Zeile ihre\n     Gr\u00F6\u00DFen nennt (Frau Adler). Geladen und gezeichnet wird in store-reserve.js\n     \u2014 dort liegen Zeilen, Favorit und die Reservierung, damit die\n     Schnellansicht dieselben benutzt statt einer zweiten Fassung. */\n  (function () {\n    var ENDPOINT = 'https://gwandl-mcp.g-ssl.workers.dev/storefront/store-availability';\n\n    /* Felix 08.09: ob der Online-Shop die gewaehlte Groesse hat, entscheidet\n       mit, was Store-Zeile und Modal sagen duerfen. Erste Quelle ist das\n       variant:change-Detail (variant:null = Kombination ohne Variante =\n       nicht kaufbar); vor dem ersten Event gilt der Serverstand des\n       Benachrichtigen-Blocks (sichtbar = ausverkauft). Ohne diesen Block\n       (Vorbestellung) ist jede Groesse kaufbar. Dieser Listener steht vor\n       allen anderen in der Datei und laeuft deshalb zuerst. */\n    var onlineAvail = null;\n    function onlineAvailable() {\n      if (onlineAvail !== null) return onlineAvail;\n      var bis = document.querySelector('[data-bis]');\n      return bis ? !!bis.hidden : true;\n    }\n    document.addEventListener('variant:change', function (e) {\n      if (e.detail && ('variant' in e.detail)) onlineAvail = e.detail.variant ? e.detail.variant.available !== false : false;\n    });\n\n    document.querySelectorAll('[data-store-availability]').forEach(function (acc) {\n      var list = acc.querySelector('[data-stav-list]');\n      if (!list) return;\n      var productTitle = acc.dataset.productTitle || '';\n      var articleNo = acc.dataset.articleNo || '';\n      var handle = acc.dataset.handle || '';\n      var section = acc.closest('[data-product-section]');\n      var product = null;\n      try { product = JSON.parse(section.querySelector('[data-product-json]').textContent); } catch (e) { /* ohne Daten: Liste wie frueher, ohne Groessen */ }\n\n      // Die gewaehlten Optionswerte: die der Variante im Formular (die Liste\n      // antwortet fuer genau das, was in den Warenkorb ginge - ein ?variant=-Link\n      // auf eine Farbe ohne Bild laesst die sichtbare Auswahl davon abweichen);\n      // ohne Variante (Farbe ohne diese Groesse) die aktiven Knoepfe, gelesen\n      // wie ProductForm.getVariantFromOptions.\n      function selectedOptions() {\n        var v = currentVariant();\n        var hit = v && product.variants.find(function (x) { return String(x.id) === v; });\n        if (hit) return hit.options;\n        return product.options.map(function (name, i) {\n          var g = section.querySelector('[data-option-index=\"' + i + '\"]');\n          if (!g) return '';\n          if (g.tagName === 'SELECT') return g.value;\n          var a = g.querySelector('.active');\n          return a ? a.dataset.value : '';\n        });\n      }\n      function sizeGrid() {\n        var grid = section && section.querySelector('.goessl-product__size-grid[data-option-name=\"Gr\u00F6\u00DFe\"]');\n        return grid && !grid.hidden ? grid : null;   // die Einheitsgroesse hat ein verstecktes Raster\n      }\n      // Frau Adler 06.10.2026: alle Groessen der gewaehlten Farbe - die Liste nennt sie je Geschaeft\n      function colourSizes() {\n        var si = product ? product.options.indexOf('Gr\u00F6\u00DFe') : -1;\n        var grid = sizeGrid();\n        if (si < 0 || !grid) return null;\n        return window.GoesslReserve.colourSizes(product.variants, selectedOptions(), si,\n          Array.from(grid.querySelectorAll('.goessl-product__size-btn')).map(function (b) {\n            return { value: b.dataset.value, label: b.textContent.trim() };\n          }));\n      }\n\n      function currentVariant() {\n        var input = document.querySelector('[data-variant-id]') ||\n          document.querySelector('form[action*=\"/cart/add\"] [name=\"id\"]');\n        return input && input.value ? String(input.value) : null;\n      }\n\n      function selectedColor() {\n        var c = document.querySelector('[data-selected-color]');\n        return c ? c.textContent.trim() : '';\n      }\n      function selectedSize() {\n        var b = document.querySelector('.goessl-product__size-btn.active');\n        return b ? b.textContent.trim() : '';\n      }\n\n      // Wird bei jedem \u00D6ffnen von Seite 2 frisch gelesen, nicht eingefroren:\n      // zwischen Modal-\u00D6ffnen und Absenden kann die Gr\u00F6\u00DFe gewechselt haben.\n      function reserveCtx() {\n        return {\n          title: productTitle,\n          articleNo: articleNo,\n          handle: handle,\n          color: selectedColor(),\n          size: selectedSize(),\n          variantId: currentVariant() || '',\n          available: onlineAvailable(),\n        };\n      }\n\n      var ctrl = window.GoesslReserve && window.GoesslReserve.attach(acc, reserveCtx);\n      if (!ctrl) return;\n\n      // Laden, Zwischenspeicher und Zeichnen liegen in store-reserve.js (ctrl.load).\n      // Ohne gewaehlte Groesse bleibt es bei der Bitte, eine zu waehlen; eine\n      // gewaehlte Groesse, die es in dieser Farbe nicht gibt (Variante ''),\n      // zeigt die Geschaefte mit den anderen Groessen der Farbe.\n      function load() {\n        var v = currentVariant();\n        var grid = sizeGrid();\n        if (!v && !(grid && grid.querySelector('.goessl-product__size-btn.active'))) {\n          ctrl.message(window.g26t('products.store_availability.choose_size_first', 'Bitte w\u00E4hlen Sie zuerst eine Gr\u00F6\u00DFe.'));\n          return;\n        }\n        ctrl.load(v || '', colourSizes());\n      }\n\n      // r60: der Block ist ein Modal (data-stav-modal), ge\u00F6ffnet \u00FCber den\n      // Knopf \u201EVerf\u00FCgbarkeit pr\u00FCfen\u201C; der alte <details>-Pfad bleibt f\u00FCr\n      // etwaige Akkordeon-Instanzen bestehen.\n      var isModal = acc.hasAttribute('data-stav-modal');\n      function modalOpen() { return acc.classList.contains('is-open'); }\n      // a11y #902: das gemeinsame Overlay-Verhalten (assets/global.js) - der Fokus springt ins Modal\n      // (Schlie\u00DFen-Knopf), Tab bleibt drin, Escape schlie\u00DFt, der Fokus kehrt zum \u00F6ffnenden Knopf zur\u00FCck\n      var overlay = null;\n      function closeModal() {\n        acc.classList.remove('is-open');\n        acc.setAttribute('aria-hidden', 'true');\n        document.body.style.overflow = '';\n        ctrl.reset();   // ein erneutes \u00D6ffnen zeigt nie einen alten Erfolgsschirm\n        if (overlay) overlay.close();\n      }\n      if (isModal) {\n        document.querySelectorAll('[data-stav-open]').forEach(function (btn) {\n          btn.addEventListener('click', function () {\n            ctrl.reset();\n            acc.classList.add('is-open');\n            acc.setAttribute('aria-hidden', 'false');\n            document.body.style.overflow = 'hidden';\n            if (!overlay && window.Goessl && window.Goessl.overlayFocus) overlay = window.Goessl.overlayFocus(acc, { onEscape: closeModal });\n            if (overlay) overlay.open(btn);\n            load();\n          });\n        });\n        acc.querySelectorAll('[data-stav-close]').forEach(function (el) {\n          el.addEventListener('click', closeModal);\n        });\n      } else {\n        acc.addEventListener('toggle', function () { if (acc.open) load(); });\n      }\n      document.addEventListener('variant:change', function () {\n        if (isModal ? modalOpen() : acc.open) load();\n      });\n    });\n\n    /* r68 (SJ, per Figma): the PDP store line shows the FAVOURITE store's\n       availability for the selected variant \u2014 \u201E\u25CF Auf Lager in Bad Gastein\"\n       plus \u201EAnderen Store ausw\u00E4hlen\" (opens the modal). No favourite yet \u2192\n       just \u201EStore ausw\u00E4hlen\". Same endpoint as the modal, cached per variant. */\n    var favStockRow = document.querySelector('[data-fav-stock-row]');\n    if (favStockRow) (function () {\n      var stockSpan = favStockRow.querySelector('[data-fav-stock]');\n      var chooser = favStockRow.querySelector('[data-fav-stock-link]');\n      var cache = {};\n      /* Felix 08.09: eine Groesse, die weder online noch in einem Geschaeft\n         vorraetig ist, bekommt kein \"Store auswaehlen\" und kein \"Im Store\n         anprobieren\" - beides fuehrte in ein Modal, das nichts anbieten\n         konnte. Online kaufbar \u2192 sofort zeigen; online ausverkauft \u2192 erst\n         zeigen, wenn der Endpunkt mindestens ein Geschaeft mit Bestand nennt. */\n      var storeBlock = favStockRow.closest('.g26-pdp__store');\n      var tryOnPill = document.querySelector('.g26-pdp__pill[data-stav-open]');\n      function showStoreUi(on) {\n        [storeBlock, tryOnPill].forEach(function (el) {\n          if (!el) return;\n          if (on) el.removeAttribute('hidden'); else el.setAttribute('hidden', '');\n        });\n      }\n\n      function favSlug() {\n        try { return localStorage.getItem('goessl:favStore') || null; } catch (e) { return null; }\n      }\n      function rowVariant() {\n        var input = document.querySelector('[data-variant-id]') ||\n          document.querySelector('form[action*=\"/cart/add\"] [name=\"id\"]');\n        return input && input.value ? String(input.value) : null;\n      }\n      function escText(v) {\n        return String(v == null ? '' : v).replace(/[&<>\"']/g, function (c) {\n          return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c];\n        });\n      }\n      function inText(slug, city) {\n        // \u201Eim Gwandhaus\" reads as a sentence; every other store is \u201Ein <Stadt>\"\n        if (slug === 'goessl-im-gwandhaus') return window.g26t('products.store_availability.place_gwandhaus', 'im Gwandhaus');\n        return window.g26t('products.store_availability.place_in_city', 'in {{ city }}', { city: escText(city) });\n      }\n      function prettify(slug) {\n        return slug.replace(/^goessl-/, '').split('-').map(function (w) { return w.charAt(0).toUpperCase() + w.slice(1); }).join(' ');\n      }\n      function paintLine(stores, fav) {\n        var hit = stores.find(function (s) {\n          return String(s.page || '').replace(/[^a-z0-9-]/gi, '') === fav;\n        });\n        var place = hit ? inText(fav, hit.city || hit.name) : inText(fav, prettify(fav));\n        stockSpan.innerHTML = hit\n          ? '<span class=\"goessl-product__stock-status--in-stock\">' + window.g26t('products.store_availability.in_stock_at', 'Auf Lager {{ place }}', { place: place }) + '</span>'\n          : '<span class=\"goessl-product__stock-status--out-of-stock\">' + window.g26t('products.store_availability.out_of_stock_at', 'Zurzeit nicht vorr\u00E4tig {{ place }}', { place: place }) + '</span>';\n      }\n      function renderRow() {\n        var fav = favSlug();\n        chooser.textContent = fav ? window.g26tText('products.product.store_select_other', 'Anderen Store ausw\u00E4hlen') : window.g26tText('products.product.store_select', 'Store ausw\u00E4hlen');\n        var v = rowVariant();\n        var avail = onlineAvailable();\n        // Ohne gewaehlte Groesse (oder online kaufbar) bleibt alles sichtbar;\n        // online ausverkauft \u2192 verstecken, bis ein Geschaeft mit Bestand bekannt ist.\n        if (!v || avail) showStoreUi(true);\n        else if (cache[v]) showStoreUi(cache[v].length > 0);\n        else showStoreUi(false);\n        if (!fav) stockSpan.innerHTML = '';\n        if (!v) { stockSpan.innerHTML = ''; return; }\n        if (cache[v]) { if (fav) paintLine(cache[v], fav); return; }\n        if (!fav && avail) return;   // nichts zu malen, nichts zu entscheiden\n        fetch(ENDPOINT + '?variant=' + encodeURIComponent(v))\n          .then(function (r) { return r.json(); })\n          .then(function (j) {\n            cache[v] = j.stores || [];\n            if (rowVariant() !== v) return;\n            if (!onlineAvailable()) showStoreUi(cache[v].length > 0);\n            if (favSlug()) paintLine(cache[v], favSlug());\n          })\n          .catch(function () { stockSpan.innerHTML = ''; if (!onlineAvailable()) showStoreUi(false); });\n      }\n      document.addEventListener('variant:change', renderRow);\n      document.addEventListener('favstore:change', renderRow);\n      renderRow();\n    })();\n  })();\n\n"],
  "mappings": "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",
  "names": []
}
