{
  "version": 3,
  "sources": ["/cdn/shop/t/45/assets/ttcf-app.js?audit=1789386900"],
  "sourcesContent": ["/* Generated by scripts/build-shopify-js.mjs. Do not edit this file directly. */\nconst I18N = window.TOOLKIT_TRANSLATIONS || {};\n\nfunction tr(key, fallback = \"\") {\n  return I18N[key] || fallback;\n}\n\nfunction h(value) {\n  return String(value ?? \"\")\n    .replaceAll(\"&\", \"&amp;\")\n    .replaceAll(\"<\", \"&lt;\")\n    .replaceAll(\">\", \"&gt;\")\n    .replaceAll('\"', \"&quot;\")\n    .replaceAll(\"'\", \"&#39;\");\n}\n\nconst SHOPIFY_SHELL_HTML = `<div id=\"fabActions\" class=\"fixed bottom-6 right-6 z-50 group print:hidden\">\n    <button\n      type=\"button\"\n      class=\"relative flex h-14 w-14 items-center justify-center rounded-full bg-black text-white shadow-lg transition\"\n      aria-label=\"${h(tr(\"actions\", \"Actions\"))}\"\n      data-fab-toggle=\"true\" aria-expanded=\"false\" aria-controls=\"ttcf-action-list\"\n    >\n      <svg viewBox=\"0 0 24 24\" class=\"h-6 w-6 stroke-white opacity-100 transition duration-300 group-[.active]:opacity-0\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\">\n        <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"/>\n        <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"/>\n        <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"/>\n      </svg>\n      <span class=\"absolute left-1/2 top-1/2 h-[2px] w-[1.6rem] -translate-x-1/2 -translate-y-1/2 bg-white opacity-0 transition duration-300 group-[.active]:rotate-[135deg] group-[.active]:opacity-100\"></span>\n      <span class=\"absolute left-1/2 top-1/2 h-[2px] w-[1.6rem] -translate-x-1/2 -translate-y-1/2 bg-white opacity-0 transition duration-300 group-[.active]:rotate-[405deg] group-[.active]:opacity-100\"></span>\n    </button>\n\n    <ul id=\"ttcf-action-list\" class=\"absolute bottom-16 right-0 flex flex-col gap-3 opacity-0 pointer-events-none transition duration-300 group-[.active]:opacity-100 group-[.active]:pointer-events-auto\">\n      <li>\n        <button id=\"loadFromJson\" type=\"button\" class=\"fab-item bg-black\" aria-label=\"${h(tr(\"loadConfiguration\", \"Load configuration\"))}\">\n          <span class=\"fab-tooltip\">${h(tr(\"loadConfiguration\", \"Load configuration\"))}</span>\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-5 w-5 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <path d=\"M20 20a2 2 0 0 0 2-2V8l-6-6H6a2 2 0 0 0-2 2v4\"></path>\n            <polyline points=\"14 2 14 8 20 8\"></polyline>\n            <path d=\"M12 18H2\"></path>\n            <polyline points=\"8 14 12 18 8 22\"></polyline>\n          </svg>\n        </button>\n      </li>\n\n      <li>\n        <button id=\"saveToJson\" type=\"button\" class=\"fab-item bg-black\" aria-label=\"${h(tr(\"saveConfiguration\", \"Save configuration\"))}\">\n          <span class=\"fab-tooltip\">${h(tr(\"saveConfiguration\", \"Save configuration\"))}</span>\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-5 w-5 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <path d=\"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z\"></path>\n            <polyline points=\"17 21 17 13 7 13 7 21\"></polyline>\n            <polyline points=\"7 3 7 8 15 8\"></polyline>\n          </svg>\n        </button>\n      </li>\n\n      <li>\n        <button id=\"loadPredefinedToolKit\" type=\"button\" class=\"fab-item bg-black\" aria-label=\"${h(tr(\"loadToolkit\", \"Load toolkit\"))}\">\n          <span class=\"fab-tooltip\">${h(tr(\"loadToolkit\", \"Load toolkit\"))}</span>\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-5 w-5 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <polyline points=\"3.2 8.2 3.2 13.7 6 16.4 22 16.4 22 7.6 18.7 4.4 8 4.4\"></polyline>\n            <path d=\"M6.5 19.4a1.5 1.5 0 0 0 3 0z\"></path>\n            <path d=\"M18 19.4a1.5 1.5 0 0 0 3 0z\"></path>\n            <line x1=\"9\" y1=\"13.5\" x2=\"18.8\" y2=\"13.5\"></line>\n            <line x1=\"9\" y1=\"9.1\" x2=\"18.8\" y2=\"9.1\"></line>\n            <line x1=\"5\" y1=\"5.5\" x2=\"2\" y2=\"3.4\"></line>\n          </svg>\n        </button>\n      </li>\n\n      <li>\n        <button id=\"exportTableBtn\" type=\"button\" class=\"fab-item bg-black\" aria-label=\"${h(tr(\"exportTable\", \"Export table\"))}\">\n          <span class=\"fab-tooltip\">${h(tr(\"exportTable\", \"Export table\"))}</span>\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-5 w-5 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <path d=\"M3 3h18v18H3z\"></path>\n            <path d=\"M3 9h18\"></path>\n            <path d=\"M3 15h18\"></path>\n            <path d=\"M9 3v18\"></path>\n            <path d=\"M15 3v18\"></path>\n          </svg>\n        </button>\n      </li>\n\n      <li>\n        <button id=\"printToPdf\" type=\"button\" class=\"fab-item bg-black\" aria-label=\"${h(tr(\"printPdf\", \"Print PDF\"))}\">\n          <span class=\"fab-tooltip\">${h(tr(\"printPdf\", \"Print PDF\"))}</span>\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-5 w-5 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <polyline points=\"6 9 6 2 18 2 18 9\"></polyline>\n            <path d=\"M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2\"></path>\n            <rect x=\"6\" y=\"14\" width=\"12\" height=\"8\"></rect>\n          </svg>\n        </button>\n      </li>\n    </ul>\n  </div>\n  <div class=\"w-full bg-gray-100 print:bg-transparent\">\n    <section class=\"grid md:grid-cols-[minmax(0,1fr)_minmax(0,2fr)]\">\n\n      <section aria-labelledby=\"setup-title\" class=\"self-start p-5 px-6 flex print:hidden md:sticky md:top-sticky\">\n        <div class=\"w-full\">\n          <div data-dismissible=\"configurator-hint\" class=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-3 rounded-md border border-dashed border-yellow-900 bg-yellow-50 px-3 py-2 text-sm text-yellow-900 print:hidden\">\n            <ul class=\"space-y-2\">\n              <li class=\"flex items-start gap-2\">\n                <svg class=\"mt-0.5 h-4 w-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                  <path d=\"M9 18l6-6-6-6\"></path>\n                  <path d=\"M15 18l6-6-6-6\"></path>\n                </svg>\n                <span>${h(tr(\"selectYourStorage\", \"1. Select your storage.\"))}</span>\n              </li>\n              <li class=\"flex items-start gap-2\">\n                <svg class=\"mt-0.5 h-4 w-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                  <path d=\"M9 18l6-6-6-6\"></path>\n                  <path d=\"M15 18l6-6-6-6\"></path>\n                </svg>\n                <span>${h(tr(\"selectYourSets\", \"2. Select your sets.\"))}</span>\n              </li>\n              <li class=\"flex items-start gap-2\">\n                <svg class=\"mt-0.5 h-4 w-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                  <path d=\"M9 18l6-6-6-6\"></path>\n                  <path d=\"M15 18l6-6-6-6\"></path>\n                </svg>\n                <span>${h(tr(\"organiseStorage\", \"3. Organise your storage with drag and drop.\"))}</span>\n              </li>\n            </ul>\n\n            <button\n              type=\"button\"\n              aria-label=\"${h(tr(\"dismissHint\", \"Dismiss hint\"))}\"\n              class=\"self-end sm:self-start shrink-0 rounded p-1 text-yellow-900 transition hover:bg-yellow-300\"\n              data-action=\"dismiss-configurator-hint\"\n            >\n              <svg class=\"h-4 w-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n                <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n                <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n              </svg>\n            </button>\n          </div>\n          <form id=\"toolstorageForm\" class=\"grid gap-4\">\n            <input id=\"toolstorageInput\" type=\"hidden\" value=\"\">\n            <div class=\"grid gap-2\">\n              <div class=\"w-full max-w-2xl mx-auto\">\n                <div role=\"tablist\" aria-label=\"${h(tr(\"sampleTabs\", \"Sample tabs\"))}\" class=\"border-b border-gray-200 text-sm font-medium text-center text-gray-500\">\n                  <ul class=\"flex -mb-px\">\n                    <li class=\"w-1/2\">\n                      <button id=\"tab-btn-1\" role=\"tab\" aria-selected=\"true\" aria-controls=\"panel-1\" data-tab=\"panel-1\" class=\"tab-btn inline-block font-bold w-full rounded-t-lg border-b-2 border-red-600 p-3 text-red-600 uppercase\" type=\"button\">\n                        ${h(tr(\"toolStorage\", \"Tool storage\"))}\n                      </button>\n                    </li>\n                    <li class=\"w-1/2\">\n                      <button id=\"tab-btn-2\" role=\"tab\" aria-selected=\"false\" aria-controls=\"panel-2\" data-tab=\"panel-2\" class=\"tab-btn inline-block font-bold w-full rounded-t-lg border-b-2 border-transparent p-3 uppercase\" type=\"button\">\n                        ${h(tr(\"toolSets\", \"Tool sets\"))}\n                      </button>\n                    </li>\n                  </ul>\n                </div>\n\n                <div id=\"panel-1\" role=\"tabpanel\" aria-labelledby=\"tab-btn-1\" class=\"tab-panel pt-4 pr-2\">\n                  <div class=\"grid gap-4 pb-4\">\n                    <div class=\"grid gap-2\">\n                      <div class=\"relative flex items-center gap-2\">\n                        <input id=\"toolStorageSearch\" aria-label=\"Search tool storage\" type=\"search\" placeholder=\"${h(tr(\"searchByNameIdType\", \"Search by name, ID, or type\"))}\" class=\"h-10 w-full rounded-md border border-gray-300 px-3 text-sm focus:border-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-200\">\n                        <details class=\"z-10\">\n                            <summary class=\"inline-flex h-10 cursor-pointer items-center gap-2 rounded-md border border-gray-200 bg-black px-3 text-xs font-semibold uppercase tracking-wide text-white\" data-filter-summary=\"toolStorageTypeFilters\">\n                                <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"\n                                          class=\"h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\"\n                                          stroke-linecap=\"round\" stroke-linejoin=\"round\" data-filter-icon=\"inactive\">\n                                  <path d=\"M10 5H3\"/><path d=\"M12 19H3\"/>\n                                  <path d=\"M14 3v4\"/>\n                                  <path d=\"M16 17v4\"/>\n                                  <path d=\"M21 12h-9\"/>\n                                  <path d=\"M21 19h-5\"/>\n                                  <path d=\"M21 5h-7\"/>\n                                  <path d=\"M8 10v4\"/>\n                                  <path d=\"M8 12H3\"/>\n                                </svg>\n                                <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"\n                                          class=\"hidden h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\"\n                                          stroke-linecap=\"round\" stroke-linejoin=\"round\" data-filter-icon=\"active\">\n                                  <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\n                                  <path d=\"m8.5 12 2.5 2.5 4.5-4.5\"></path>\n                                </svg>\n    <span class=\"hidden sm:inline\">${h(tr(\"filters\", \"Filters\"))}</span>\n  </summary>\n                          <div class=\"absolute left-0 right-0 top-full z-50 mt-2 rounded-md border border-gray-200 bg-white p-3 shadow-lg\">\n                            <div class=\"grid gap-2\">\n                              <span class=\"text-xs font-semibold uppercase tracking-wide text-gray-600\">${h(tr(\"productType\", \"Product type\"))}</span>\n                              <div id=\"toolStorageTypeFilters\" class=\"flex flex-wrap gap-2\"></div>\n                            </div>\n                          </div>\n                        </details>\n                        <div class=\"relative group inline-block\">\n  <button id=\"toolStorageClearFilters\" type=\"button\" aria-label=\"${h(tr(\"clearFilters\", \"Clear filters\"))}\"\n    class=\"inline-flex h-10 items-center justify-center gap-2 rounded-md border border-gray-300 px-3 text-gray-600 transition hover:bg-gray-100\">\n    \n    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"\n      class=\"h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\"\n      stroke-linecap=\"round\" stroke-linejoin=\"round\">\n      <path d=\"m13.5 8.5-5 5\"/>\n      <path d=\"m8.5 8.5 5 5\"/>\n      <circle cx=\"11\" cy=\"11\" r=\"8\"/>\n      <path d=\"m21 21-4.3-4.3\"/>\n    </svg>\n\n    <span class=\"hidden sm:inline text-xs font-semibold uppercase tracking-wide text-gray-600\">${h(tr(\"clear\", \"Clear\"))}</span>\n  </button>\n\n  <!-- Tooltip -->\n  <div class=\"pointer-events-none absolute left-1/2 top-full z-50 mt-2 -translate-x-1/2 whitespace-nowrap rounded bg-gray-900 px-2 py-1 text-xs text-white opacity-0 transition-opacity group-hover:opacity-100\">\n    ${h(tr(\"clearFilters\", \"Clear filters\"))}\n  </div>\n</div>\n                      </div>\n                    </div>\n                  </div>\n                  <div id=\"toolStorageCatalog\" class=\"no-overscroll grid max-h-[55vh] grid-cols-2 overflow-y-auto md:max-h-[63vh] xl:grid-cols-3\"></div>\n                </div>\n\n                <div id=\"panel-2\" role=\"tabpanel\" aria-labelledby=\"tab-btn-2\" class=\"tab-panel hidden pt-4 pr-2\">\n                  <div class=\"grid gap-4 pb-4\">\n                    <div class=\"grid gap-2\">\n                      <div class=\"relative flex items-center gap-2\">\n                        <input id=\"toolSetSearch\" aria-label=\"Search tool sets\" type=\"search\" placeholder=\"${h(tr(\"searchByNameIdType\", \"Search by name, ID, or type\"))}\" class=\"h-10 w-full rounded-md border border-gray-300 px-3 text-sm focus:border-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-200\">\n                        <details class=\"z-10\">\n                          <summary class=\"inline-flex h-10 cursor-pointer items-center gap-2 rounded-md border border-gray-200 bg-black px-3 text-xs font-semibold uppercase tracking-wide text-white\" data-filter-summary=\"toolSetTypeFilters\">\n                            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" data-filter-icon=\"inactive\">\n                              <path d=\"M10 5H3\"/><path d=\"M12 19H3\"/>\n                                                          <path d=\"M14 3v4\"/>\n                                                          <path d=\"M16 17v4\"/>\n                                                          <path d=\"M21 12h-9\"/>\n                                                          <path d=\"M21 19h-5\"/>\n                                                          <path d=\"M21 5h-7\"/>\n                                                          <path d=\"M8 10v4\"/>\n                                                          <path d=\"M8 12H3\"/>\n                            </svg>\n                            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"hidden h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" data-filter-icon=\"active\">\n                              <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\n                              <path d=\"m8.5 12 2.5 2.5 4.5-4.5\"></path>\n                            </svg>\n                            <span class=\"hidden sm:inline\">${h(tr(\"filters\", \"Filters\"))}</span>\n                          </summary>\n\n  <div class=\"absolute left-0 right-0 top-full z-50 mt-2 rounded-md border border-gray-200 bg-white p-3 shadow-lg\">\n    <div class=\"grid gap-2\">\n      <span class=\"text-xs font-semibold uppercase tracking-wide text-gray-600\">${h(tr(\"type\", \"Type\"))}</span>\n      <div id=\"toolSetTypeFilters\" class=\"flex flex-wrap gap-2\"></div>\n    </div>\n\n    <div class=\"grid gap-2 pt-3\">\n      <span class=\"text-xs font-semibold uppercase tracking-wide text-gray-600\">${h(tr(\"filterByItemId\", \"Filter by Item Id\"))}</span>\n      <textarea\n        class=\"min-h-[220px] rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-gray-400 focus:outline-none focus:ring-2 focus:ring-gray-200\"\n        id=\"toolsetsInput\"\n        rows=\"7\"\n        placeholder=\"${h(tr(\"pasteOneToolSetIdPerLine\", \"Paste one tool set ID per line\"))}\"\n      ></textarea>\n\n      <div class=\"flex flex-wrap items-center gap-2 sm:ml-auto\">\n        <button id=\"recommendBtn\" type=\"button\" class=\"inline-flex items-center justify-center rounded-md border border-red-400 bg-red-700 px-3 py-2 text-xs font-semibold uppercase tracking-wide text-white transition hover:bg-red-300\">\n          ${h(tr(\"placeListItems\", \"Place list items\"))}\n        </button>\n      </div>\n    </div>\n  </div>\n</details>\n\n<div class=\"relative group inline-block\">\n  <button\n    id=\"toolSetClearFilters\"\n    type=\"button\"\n    aria-label=\"${h(tr(\"clearFilters\", \"Clear filters\"))}\"\n    class=\"inline-flex h-10 items-center justify-center gap-2 rounded-md border border-gray-300 px-3 text-gray-600 transition hover:bg-gray-100\"\n  >\n    <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n      <path d=\"m13.5 8.5-5 5\"/>\n      <path d=\"m8.5 8.5 5 5\"/>\n      <circle cx=\"11\" cy=\"11\" r=\"8\"/>\n      <path d=\"m21 21-4.3-4.3\"/>\n    </svg>\n    <span class=\"hidden sm:inline text-xs font-semibold uppercase tracking-wide text-gray-600\">${h(tr(\"clear\", \"Clear\"))}</span>\n  </button>\n\n  <!-- Tooltip -->\n  <div class=\"pointer-events-none absolute left-1/2 top-full z-50 mt-2 -translate-x-1/2 whitespace-nowrap rounded bg-gray-900 px-2 py-1 text-xs text-white opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n    ${h(tr(\"clearFilters\", \"Clear filters\"))}\n  </div>\n</div>\n                      </div>\n                    </div>\n                  </div>\n                  <div id=\"toolSetCatalog\" class=\"no-overscroll grid max-h-[55vh] grid-cols-2 overflow-y-auto md:max-h-[63vh] xl:grid-cols-3\"></div>\n                </div>\n              </div>\n            </div>\n\n          </form>\n         <div class=\"mt-6 sm:hidden flex items-center justify-center gap-2 text-xs text-gray-500 animate-bounce\">\n           <span>${h(tr(\"configureTheToolStorage\", \"Configure the tool storage\"))}</span>\n           <svg class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" viewBox=\"0 0 24 24\">\n             <path d=\"m10 15 5 5 5-5\"/>\n             <path d=\"M4 4h7a4 4 0 0 1 4 4v12\"/>\n           </svg>\n         </div>\n        </div>\n      </section>\n      <section aria-labelledby=\"recommendations-title\" class=\"min-h-screen bg-white px-6 p-6 print:bg-white\">\n        <div id=\"fromToolstorageInput\" class=\"relative grid gap-6\">\n            <!-- PRINT HEADER -->\n          <div class=\"hidden px-0 pb-0 mb-3 print:flex w-[250mm] h-[50mm] bg-[#ffffff] text-black\">\n              <!-- Left red bar -->\n              <div class=\"w-[6mm] bg-red-600\"></div>\n\n              <!-- Content -->\n              <div class=\"flex w-full items-start justify-between px-[12mm] py-[10mm]\">\n                <!-- Left side -->\n                <div class=\"flex flex-col\">\n                  <div class=\"mb-2\">\n                    <svg id=\"printLogo\" xmlns=\"http://www.w3.org/2000/svg\" width=\"85\" height=\"55\" version=\"1.1\" viewBox=\"0 0 85 55\" class=\"p-1\"><path d=\"M16.56,6.68s-3.39,5.17,1.6,8.14c0,0,3.92,2.26,6.72-1.72,0,0-1.43,3.63,3.86,6.9,0,0,4.87,3.45,9.1.42,0,0,2.53-.95,1.63-5.41,0,0,5.1,10.77-.16,13.6.24,1.52,4.92,1.88,4.69-2.29,0-3.85,1.63-6,2.02-6.81-.26-3.05.12-4.95,2.55-7.84-.56,2.06-1.07,3.12.05,5.43.87-.5,1.59-1.04,2.6-1.04-.7.7-1.27,1.63-1.66,2.62.42.45,1.54,2.46,4.04,1.47,1.99-1.04,3.09-3.7,2.82-8.16.72.65,1.99,1.72,2.69,2.41.8.89,1.39,1.39,1.99,2.61.59,1.19,1.03,3.38.49,5.49.3.59,1.55,3.12,1.1,5.47.03.56.06,1.28.83,1.25,1.72-.12,11.58-.28,13.52,6.18-1.81,0-69.67,0-69.67,0-.69-5.21.99-8.86,4.6-11.29-3.99-5.06-.88-12.17,4.59-17.43Z\"></path><path d=\"M62.01,30.28c-3.95.42-11.24,1.31-15.72,2.82-1.78.36-3.6.62-4.25-2.23-1.13.18-3.03.27-3.98-1.6-.51.15-1.52.15-2.14-.12-.98,3.83-8,6.15-15.04,2.76-6.3-3.54-6.6-9.27,2.85-10.43-2.56-.89-7.98.56-9.23,4.54-.34-.05-.62-.17-.94-.36-.34-.2-.71-.52-.82-.64-2.69,2.17-4.65,4.81-3.58,10.38h66.1c-1.1-2.76-3.6-5.71-13.26-5.11Z\" fill=\"#ed1c24\"></path><path d=\"M59.43,23.08s2.62,2.59-.18,6.12c.36-1.01,1.31-2.65.18-6.12Z\" fill=\"#ed1c24\"></path><path d=\"M26.05,22.64c-1.9-.06-4.16-.18-6.75,1.13-1.04.74-1.28.36-.89,2.35.45,1.72,1.4,3.8,5.14,5.08,2.26.68,8.62,2.29,11.15-2.65,0,0-6.12-5.14-8.65-5.92ZM28.65,31.26c-1.29,0-2.33-1.04-2.33-2.33s1.04-2.33,2.33-2.33,2.33,1.04,2.33,2.33-1.04,2.33-2.33,2.33Z\" fill=\"#ffd400\"></path><path d=\"M54.34,30.36c-.35-.37-.57-.87-.57-1.43,0-1.15.93-2.08,2.08-2.08s2.08.93,2.08,2.08c0,.15-.02.3-.05.45.52-.27,2.28-2.77.7-5.89-.51.09-3.39,1.69-7.01,5.47-.51.59-1.04,1.28-2.67,1.66-.48.09-.65,1.01.45.8,1.1-.21,4.99-1.07,4.99-1.07Z\" fill=\"#ffd400\"></path><path d=\"M55.47,28.17c0,.2-.16.36-.36.36s-.36-.16-.36-.36.16-.36.36-.36.36.16.36.36Z\" fill=\"#fff\"></path><path d=\"M28.19,28.23c0,.29-.23.52-.52.52s-.52-.23-.52-.52.23-.52.52-.52.52.23.52.52Z\" fill=\"#fff\"></path><path d=\"M70.8,35.41c.49-.45.67-1.07.41-1.54-.32-.57-1.2-.69-1.96-.26-.76.43-1.11,1.24-.78,1.81l2.33-.02Z\" fill=\"#fff\"></path><polygon points=\"12.54 39.24 11.33 49.16 8.62 49.16 9.83 39.24 6.57 39.24 6.9 37.07 37.31 37.07 36.97 39.24 12.54 39.24\"></polygon><polygon points=\"25.55 49.16 27.94 49.16 29.04 40.25 26.42 40.25 25.89 44.53 23.31 40.25 20.66 40.25 19.55 49.16 22.17 49.16 22.77 44.36 25.55 49.16\"></polygon><polygon points=\"13.3 49.16 14.4 40.25 19.6 40.25 19.31 42.57 16.74 42.57 16.63 43.47 18.92 43.47 18.65 45.69 16.36 45.69 16.22 46.79 18.79 46.8 18.5 49.16 13.3 49.16\"></polygon><path d=\"M38.26,43.87v.51c0,5.08-4.44,4.78-4.44,4.78-4.73,0-4.42-4.57-4.42-4.57,0-4.88,4.78-4.58,4.78-4.58,0,0,2.59-.1,3.91,2.45l-2.19,1.09s-.6-1.23-1.93-1.23c0,0-1.87-.08-1.87,2.28,0,0-.05,2.35,1.81,2.35,0,0,1.16-.03,1.5-1.01h-1.86l.53-2.07h4.18Z\"></path><polygon points=\"43.26 39.24 42.06 49.16 39.43 49.16 40.64 39.24 37.74 39.24 38.07 37.07 76.63 37.07 76.29 39.24 43.26 39.24\"></polygon><path d=\"M46.18,44.58c0-1.01.85-2.1,2.11-2.1s2.11,1.09,2.11,2.1-.85,2.1-2.11,2.1-2.11-1.1-2.11-2.1ZM48.28,44.58,48.28,49.25c2.58,0,4.67-2.09,4.67-4.67s-2.09-4.67-4.67-4.67-4.67,2.09-4.67,4.67,2.09,4.67,4.67,4.67ZM48.28,44.58\"></path><path d=\"M56.1,44.58c0-1.01.85-2.1,2.11-2.1s2.11,1.09,2.11,2.1-.85,2.1-2.11,2.1-2.11-1.1-2.11-2.1ZM58.2,44.58,58.2,49.25c2.58,0,4.67-2.09,4.67-4.67s-2.09-4.67-4.67-4.67-4.67,2.09-4.67,4.67,2.09,4.67,4.67,4.67ZM58.2,44.58\"></path><polygon points=\"65.93 46.79 68.5 46.79 68.2 49.16 63.01 49.16 64.11 40.25 66.8 40.25 65.93 46.79\"></polygon><path d=\"M72.73,39.96c-1.58,0-2.82,1.29-2.82,2.71,0,1,.53,1.73,1.19,2.22.26.2,1.28.73,1.28.73.23.12.34.39.34.63,0,.34-.32.7-.74.64,0,0-.58-.04-1.8-.85l-1.21,1.93c1.71,1.38,3.5,1.19,3.5,1.19,1.62,0,2.94-1.31,2.94-2.89,0-.99-.6-2.03-1.38-2.48,0,0-1.06-.62-1.24-.75-.17-.11-.24-.32-.22-.46.1-.71,1.11-.41,2.12.15l1.12-1.73s-.87-1.06-3.08-1.06Z\"></path><path d=\"M78.34,36.94c.19,0,.38.05.57.15.18.1.33.24.43.43.1.18.15.38.15.58s-.05.39-.15.57c-.1.18-.24.33-.43.43-.18.1-.37.15-.57.15s-.39-.05-.57-.15c-.18-.1-.32-.24-.43-.43-.1-.18-.15-.37-.15-.57s.05-.39.15-.58c.1-.18.25-.33.43-.43.18-.1.37-.15.57-.15ZM78.34,37.13c-.16,0-.32.04-.47.12-.15.08-.27.2-.36.36-.09.15-.13.31-.13.48s.04.32.13.48c.08.15.2.27.36.36.15.08.31.13.48.13s.33-.04.48-.13c.15-.08.27-.2.36-.36.08-.15.13-.31.13-.48s-.04-.33-.13-.48c-.09-.15-.21-.27-.36-.36-.15-.08-.31-.12-.47-.12ZM77.83,38.73v-1.24h.43c.15,0,.25.01.32.03.07.02.12.06.16.12.04.06.06.12.06.18,0,.09-.03.17-.1.24-.06.07-.15.1-.26.11.04.02.08.04.11.07.05.05.11.13.18.25l.15.24h-.24l-.11-.2c-.09-.15-.16-.25-.21-.29-.04-.03-.09-.04-.16-.04h-.12v.53h-.2ZM78.03,38.03h.24c.12,0,.2-.02.24-.05.04-.03.06-.08.06-.14,0-.04-.01-.07-.03-.1-.02-.03-.05-.05-.08-.06-.04-.01-.1-.02-.2-.02h-.23v.37Z\"></path></svg>\n                  </div>\n                  <div class=\"mx-3 leading-none\">\n                    <div class=\"text-[18px] font-bold uppercase tracking-tight text-neutral-600\">\n                      ${h(tr(\"customised\", \"CUSTOMISED\"))}\n                    </div>\n                    <div class=\"text-[36px] font-black uppercase tracking-tight\">\n                      ${h(tr(\"toolKit\", \"TOOL KIT\"))}\n                    </div>\n                  </div>\n                </div>\n\n                <!-- Right side -->\n                <div class=\"max-w-[130mm]\">\n                  <div class=\"text-[18px] font-semibold uppercase tracking-tight\">\n                    ${h(tr(\"expertSolutionsForIndustrialEfficiency\", \"EXPERT SOLUTIONS FOR INDUSTRIAL EFFICIENCY\"))}\n                  </div>\n\n                  <p class=\"mt-1 mb-5 text-[12px] leading-[1.45] text-neutral-600\">\n                    ${h(tr(\"printIntroLine1\", \"TengTools provide demanding professionals with hand tools in\"))}<br>\n                    ${h(tr(\"printIntroLine2\", \"modular storage solutions that are built to last.\"))}\n                  </p>\n\n                  <div class=\"mt-3 flex items-center gap-2 text-[18px] font-bold uppercase tracking-tight\">\n                      <div class=\"inline-flex overflow-hidden\">\n                        <svg id=\"sweflag\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" version=\"1.1\" viewBox=\"0 0 32 32\">\n                         <rect x=\"1.3\" y=\"5.88\" width=\"29.4\" height=\"20.25\" fill=\"#2e72b8\"/>\n                         <polygon points=\"30.7 14 14.68 14 14.68 5.87 10.68 5.87 10.68 14 1.3 14 1.3 18 10.68 18 10.68 26.12 14.68 26.12 14.68 18 30.7 18 30.7 14\" fill=\"#fcc00d\"/>\n                        </svg>\n                      </div>\n                    <span>${h(tr(\"designedInSweden\", \"Designed in Sweden\"))}</span>\n                  </div>\n                </div>\n              </div>\n            </div>\n           <!-- END OF PRINT HEADER -->\n          <div id=\"selectedToolstorageCard\" class=\"bg-white p-3 text-sm text-gray-500\">\n            <div class=\"text-center text-sm text-gray-500\">\n              <div class=\"mx-auto flex h-14 w-14 items-center justify-center rounded-full bg-gray-100 text-gray-400\">\n                <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-6 w-6 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                  <rect x=\"3\" y=\"7\" width=\"18\" height=\"13\" rx=\"2\"></rect>\n                  <path d=\"M8 7V5a4 4 0 0 1 8 0v2\"></path>\n                </svg>\n              </div>\n              <h3 class=\"mt-4 text-base font-semibold text-gray-900\">${h(tr(\"selectedToolStorage\", \"Selected tool storage\"))}</h3>\n              <p class=\"mx-auto mt-2 max-w-md text-sm leading-6 text-gray-500\">${h(tr(\"noToolStorageSelected\", \"No tool storage selected.\"))}</p>\n            </div>\n          </div>\n        </div>\n        <div id=\"recommendationsGrid\" class=\"mt-6 grid gap-6\">\n        </div>\n      </section>\n    </section>\n  </div>\n\n  <div id=\"exportTableModal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Export selected items\" class=\"fixed inset-0 z-50 hidden items-center justify-center bg-gray-900/40 p-4\">\n    <div class=\"w-full max-w-2xl rounded-lg bg-white p-4 shadow-lg\">\n      <div class=\"flex items-center justify-between\">\n        <h3 class=\"text-sm font-semibold uppercase tracking-wide text-gray-700\">${h(tr(\"exportSelectedItems\", \"Export Selected Items\"))}</h3>\n        <button id=\"exportTableClose\" type=\"button\" aria-label=\"${h(tr(\"close\", \"Close\"))}\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 text-gray-500 transition hover:bg-gray-100\">\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n            <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n          </svg>\n        </button>\n      </div>\n      <p class=\"mt-1 text-xs text-gray-500\">${h(tr(\"copyPasteFourColumnTable\", \"Copy and paste this four-column table into Excel or Sheets.\"))}</p>\n      <textarea id=\"exportTableText\" class=\"mt-3 h-64 w-full rounded-md border border-gray-200 px-3 py-2 text-xs text-gray-700\" readonly></textarea>\n      <div class=\"mt-3 flex items-center gap-3\">\n        <button id=\"exportTableCopy\" type=\"button\" class=\"inline-flex items-center justify-center rounded-md border border-red-400 bg-red-700 px-3 py-2 text-xs font-semibold uppercase tracking-wide text-white transition  hover:bg-red-300\">\n          ${h(tr(\"copy\", \"Copy\"))}\n        </button>\n        <span id=\"exportTableStatus\" class=\"text-xs text-gray-500\"></span>\n      </div>\n    </div>\n  </div>\n\n  <div id=\"downloadConfigModal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Download configuration\" class=\"fixed inset-0 z-50 hidden items-center justify-center bg-gray-900/40 p-4 print:hidden\">\n    <div class=\"w-full max-w-lg rounded-lg bg-white p-4 shadow-lg\">\n      <div class=\"flex items-center justify-between\">\n        <h3 class=\"text-sm font-semibold uppercase tracking-wide text-gray-700\">${h(tr(\"downloadConfiguration\", \"Download Configuration\"))}</h3>\n        <button id=\"downloadConfigClose\" type=\"button\" aria-label=\"${h(tr(\"close\", \"Close\"))}\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 text-gray-500 transition hover:bg-gray-100\">\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n            <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n          </svg>\n        </button>\n      </div>\n      <p class=\"mt-2 text-xs text-gray-600\">\n        ${h(tr(\"emptyDownloadHint\", \"If your browser creates empty downloads, use the link below (a real tap) to download the export.\"))}\n      </p>\n      <div class=\"mt-3 rounded-md border border-gray-200 bg-gray-50 px-3 py-2\">\n        <div class=\"text-[11px] font-semibold uppercase tracking-wide text-gray-500\">${h(tr(\"file\", \"File\"))}</div>\n        <div id=\"downloadConfigFileName\" class=\"mt-1 break-all text-xs text-gray-900\"></div>\n      </div>\n      <div class=\"mt-4 grid gap-3\">\n        <a\n          id=\"downloadConfigLink\"\n          href=\"#\"\n          class=\"inline-flex items-center justify-center rounded-md border border-red-400 bg-red-700 px-3 py-2 text-xs font-semibold uppercase tracking-wide text-white transition hover:bg-red-300\"\n          download\n          rel=\"noopener\"\n        >\n          ${h(tr(\"tapToDownload\", \"Tap to download\"))}\n        </a>\n        <button id=\"downloadConfigCopy\" type=\"button\" class=\"inline-flex items-center justify-center rounded-md border border-gray-300 bg-white px-3 py-2 text-xs font-semibold uppercase tracking-wide text-gray-800 transition hover:bg-gray-100\">\n          ${h(tr(\"copyJson\", \"Copy JSON\"))}\n        </button>\n        <span id=\"downloadConfigStatus\" class=\"text-xs text-gray-500\"></span>\n      </div>\n    </div>\n  </div>\n\n  <div id=\"predefinedToolKitModal\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Load predefined tool kit\" class=\"fixed inset-0 z-50 hidden items-center justify-center bg-gray-900/50 p-4 print:hidden\">\n    <div class=\"w-full max-w-5xl rounded-lg bg-white p-4 shadow-lg\">\n      <div class=\"flex items-center justify-between gap-3\">\n        <h3 class=\"text-sm font-semibold uppercase tracking-wide text-gray-700\">${h(tr(\"loadPredefinedToolKit\", \"Load predefined tool kit\"))}</h3>\n        <button id=\"predefinedToolKitClose\" type=\"button\" aria-label=\"${h(tr(\"close\", \"Close\"))}\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 text-gray-500 transition hover:bg-gray-100\">\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n            <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n          </svg>\n        </button>\n      </div>\n      <p class=\"mt-1 text-xs text-gray-500\">${h(tr(\"selectToolKitToMakeCustomLayout\", \"Select a TengTools tool kit to make a custom layout.\"))}</p>\n      <div id=\"predefinedToolKitStatus\" class=\"mt-3 text-xs text-gray-500\"></div>\n      <div id=\"predefinedToolKitList\" class=\"mt-3 grid max-h-[70vh] grid-cols-2 gap-4 overflow-y-auto md:grid-cols-3\"></div>\n    </div>\n  </div>\n\n\t  <div id=\"productDetailModal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"productDetailTitle\" class=\"fixed inset-0 z-50 hidden items-center justify-center bg-gray-900/50 p-3\">\n    <div class=\"no-overscroll max-h-[80vh] w-full max-w-2xl overflow-y-auto bg-white p-3 shadow-lg\">\n      <div class=\"flex items-center justify-end\">\n        <h3 id=\"productDetailTitle\" class=\"hidden text-sm font-semibold uppercase tracking-wide text-gray-700\">${h(tr(\"productDetails\", \"Product details\"))}</h3>\n        <button id=\"productDetailClose\" type=\"button\" aria-label=\"${h(tr(\"close\", \"Close\"))}\" class=\"inline-flex h-8 w-8 items-center justify-center rounded-md border border-gray-200 text-gray-500 transition hover:bg-gray-100\">\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-4 w-4 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n            <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n          </svg>\n        </button>\n      </div>\n      <div id=\"productDetailBody\" class=\"grid gap-4 md:grid-cols-[minmax(0,1fr)_minmax(0,1fr)]\"></div>\n    </div>\n  </div>`;\n\nconst __modules = Object.create(null);\n\nfunction __define(id, factory) {\n  __modules[id] = {\n    factory,\n    exports: {},\n    initialized: false,\n  };\n}\n\nfunction __require(id) {\n  const record = __modules[id];\n  if (!record) {\n    throw new Error(`Missing bundled module: ${id}`);\n  }\n\n  if (!record.initialized) {\n    record.initialized = true;\n    record.factory(record.exports, __require);\n  }\n\n  return record.exports;\n}\n\n__define(\"app.js\", (exports, __require) => {\nconst { createConfiguratorState, createDragState } = __require(\"features/configurator/configurator-state.js\");\nconst { initConfiguratorController } = __require(\"features/configurator/configurator-controller.js\");\nconst { fetchToolStorageRows, fetchToolSetRows } = __require(\"features/toolstorage-data/toolstorage-data-api.js\");\nconst { normalizeToolStorages, normalizeToolSets } = __require(\"features/toolstorage-data/toolstorage-normalizer.js\");\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nasync function startConfiguratorApp() {\n  const state = createConfiguratorState();\n  const dragState = createDragState();\n\n  const [toolStorageRows, toolSetRows] = await Promise.all([\n    fetchToolStorageRows(),\n    fetchToolSetRows()\n  ]);\n\n  state.toolStorages = normalizeToolStorages(toolStorageRows);\n  state.toolSets = normalizeToolSets(toolSetRows);\n  state.toolStorageMap = new Map(state.toolStorages.map(k => [k.itemId, k]));\n  state.toolSetMap = new Map(state.toolSets.map(set => [set.itemId, set]));\n\n  initConfiguratorController(state, dragState);\n  window.TengConfigurator = Object.freeze({\n    restore(payload) {\n      return __require(\"features/configurator/configurator-persistence.js\").applyImportedConfiguration(state, payload);\n    },\n    getSnapshot() {\n      const { buildConfigPayload } = __require(\"features/configurator/configurator-export-service.js\");\n      const { parseSelectedToolStorageIds } = __require(\"features/toolstorage-selection/toolstorage-selection-service.js\");\n      return {\n        payload: buildConfigPayload(state),\n        storageIds: parseSelectedToolStorageIds(document.getElementById(\"toolstorageInput\").value),\n        setIds: document.getElementById(\"toolsetsInput\").value.split(/\\r?\\n/).map(s => s.trim()).filter(Boolean),\n        drawers: state.currentDrawers.map(d => ({index:d.drawerIndex, storageId:d.storageItemId,\n          localIndex:d.storageLocalDrawerIndex || d.drawerIndex, width:d.drawerWidth, depth:d.drawerDepth,\n          height:d.drawerHeight, capacity:d.drawerCapacity})),\n        unplacedCount: state.currentUnplacedSets.length,\n        errors: [...state.currentErrors.map(String), ...window.TTCFCommerce.validateLayout(state.currentDrawers,\n          document.getElementById(\"toolsetsInput\").value.split(/\\r?\\n/).map(s => s.trim()).filter(Boolean))]\n      };\n    }\n  });\n  window.dispatchEvent(new CustomEvent(\"ttcf:ready\"));\n}\n\nif (!window.__TOOLKIT_CONFIGURATOR_DISABLE_AUTO_INIT__) {\n  startConfiguratorApp().catch(err => {\n    console.error(err);\n    alert(t(\"configuratorDataCouldNotBeLoaded\", \"The configurator data could not be loaded.\"));\n  });\n}\n\nexports.startConfiguratorApp = startConfiguratorApp;\n});\n\n__define(\"features/catalog/catalog-filters.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { cleanString, escapeHtml } = __require(\"shared/utils/string-utils.js\");\nfunction buildToolStorageFilters(toolStorages) {\n  const container = document.getElementById(\"toolStorageTypeFilters\");\n  if (!container) return;\n\n  const types = Array.from(\n    new Set((toolStorages || []).map((storage) => cleanString(storage.productType)).filter(Boolean)),\n  ).sort((a, b) => a.localeCompare(b));\n\n  if (!types.length) {\n    container.innerHTML = `\n      <span class=\"text-xs text-gray-500\">${escapeHtml(t(\"noFiltersAvailable\", \"No filters available.\"))}</span>\n    `;\n    return;\n  }\n\n  container.innerHTML = types\n    .map((type, index) => {\n      const safeType = escapeHtml(type);\n      const inputId = `toolStorageType-${index}`;\n\n      return `\n      <label class=\"inline-flex items-center gap-2 rounded-full border border-gray-200 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-gray-600\">\n        <input id=\"${inputId}\" type=\"checkbox\" value=\"${safeType}\" class=\"h-3 w-3 rounded border-gray-300 text-gray-900 focus:ring-gray-300\" />\n        <span>${safeType}</span>\n      </label>\n    `;\n    })\n    .join(\"\");\n\n  updateFilterSummaryIcon(\"toolStorageTypeFilters\");\n}\n\nfunction filterToolStorages(toolStorages) {\n  const searchInput = document.getElementById(\"toolStorageSearch\");\n  const query = cleanString(searchInput ? searchInput.value : \"\").toLowerCase();\n  const selectedTypes = getSelectedToolStorageTypeFilters();\n\n  return (toolStorages || []).filter((storage) => {\n    if (query) {\n      const includesText = Array.isArray(storage.includes) ? storage.includes.join(\" \") : \"\";\n      const haystack = `${storage.itemId} ${storage.description} ${storage.productType} ${storage.storageColour} ${includesText}`.toLowerCase();\n      if (!haystack.includes(query)) return false;\n    }\n\n    if (selectedTypes.size && !selectedTypes.has(storage.productType)) return false;\n\n    return true;\n  });\n}\n\nfunction getSelectedToolStorageTypeFilters() {\n  const container = document.getElementById(\"toolStorageTypeFilters\");\n  if (!container) return new Set();\n\n  const checked = Array.from(container.querySelectorAll(\"input[type=\\\"checkbox\\\"]:checked\"));\n  return new Set(checked.map((input) => input.value));\n}\n\nfunction buildToolSetFilters(toolSets) {\n  const container = document.getElementById(\"toolSetTypeFilters\");\n  if (!container) return;\n\n  const types = Array.from(\n    new Set((toolSets || []).map((set) => cleanString(set.typeOfSet)).filter(Boolean)),\n  ).sort((a, b) => a.localeCompare(b));\n\n  if (!types.length) {\n    container.innerHTML = `\n      <span class=\"text-xs text-gray-500\">${escapeHtml(t(\"noFiltersAvailable\", \"No filters available.\"))}</span>\n    `;\n    return;\n  }\n\n  container.innerHTML = types\n    .map((type, index) => {\n      const safeType = escapeHtml(type);\n      const inputId = `toolSetType-${index}`;\n\n      return `\n      <label class=\"inline-flex items-center gap-2 rounded-full border border-gray-200 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-gray-600\">\n        <input id=\"${inputId}\" type=\"checkbox\" value=\"${safeType}\" class=\"h-3 w-3 rounded border-gray-300 text-gray-900 focus:ring-gray-300\" />\n        <span>${safeType}</span>\n      </label>\n    `;\n    })\n    .join(\"\");\n\n  updateFilterSummaryIcon(\"toolSetTypeFilters\");\n}\n\nfunction updateFilterSummaryIcon(containerId) {\n  const container = document.getElementById(containerId);\n  if (!container) return;\n\n  const summary = document.querySelector(`summary[data-filter-summary=\"${containerId}\"]`);\n  if (!summary) return;\n\n  const hasChecked = !!container.querySelector(\"input[type=\\\"checkbox\\\"]:checked\");\n  const inactiveIcon = summary.querySelector(\"[data-filter-icon=\\\"inactive\\\"]\");\n  const activeIcon = summary.querySelector(\"[data-filter-icon=\\\"active\\\"]\");\n\n  if (inactiveIcon) {\n    inactiveIcon.classList.toggle(\"hidden\", hasChecked);\n  }\n  if (activeIcon) {\n    activeIcon.classList.toggle(\"hidden\", !hasChecked);\n  }\n  summary.setAttribute(\"data-has-filters\", hasChecked ? \"true\" : \"false\");\n}\n\nfunction filterToolSets(toolSets) {\n  const searchInput = document.getElementById(\"toolSetSearch\");\n  const query = cleanString(searchInput ? searchInput.value : \"\").toLowerCase();\n  const selectedTypes = getSelectedTypeFilters();\n\n  return (toolSets || []).filter((set) => {\n    if (query) {\n      const haystack = `${set.itemId} ${set.altId || \"\"} ${set.description} ${set.typeOfSet}`.toLowerCase();\n      if (!haystack.includes(query)) return false;\n    }\n\n    if (selectedTypes.size && !selectedTypes.has(set.typeOfSet)) return false;\n\n    return true;\n  });\n}\n\nfunction getSelectedTypeFilters() {\n  const container = document.getElementById(\"toolSetTypeFilters\");\n  if (!container) return new Set();\n\n  const checked = Array.from(container.querySelectorAll(\"input[type=\\\"checkbox\\\"]:checked\"));\n  return new Set(checked.map((input) => input.value));\n}\n\nexports.buildToolStorageFilters = buildToolStorageFilters;\nexports.filterToolStorages = filterToolStorages;\nexports.getSelectedToolStorageTypeFilters = getSelectedToolStorageTypeFilters;\nexports.buildToolSetFilters = buildToolSetFilters;\nexports.updateFilterSummaryIcon = updateFilterSummaryIcon;\nexports.filterToolSets = filterToolSets;\nexports.getSelectedTypeFilters = getSelectedTypeFilters;\n});\n\n__define(\"features/catalog/catalog-selection.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nconst { parseSelectedToolStorageIds, resolveSelectedToolStorages, serializeSelectedToolStorageIds, validateToolStorageSelection } = __require(\"features/toolstorage-selection/toolstorage-selection-service.js\");\nfunction parseMultilineIds(value) {\n  return cleanString(value)\n    .split(/\\r?\\n/)\n    .map(cleanString)\n    .filter(Boolean);\n}\n\nfunction updateToolstorageCatalogButtons(state) {\n  const container = document.getElementById(\"toolStorageCatalog\");\n  const input = document.getElementById(\"toolstorageInput\");\n  const toolStorageMap = state?.toolStorageMap;\n  if (!container || !input || !toolStorageMap) return;\n\n  const selectedIds = parseSelectedToolStorageIds(input.value);\n  const selectedIdSet = new Set(selectedIds);\n  const selectedStorages = resolveSelectedToolStorages(selectedIds, toolStorageMap);\n  const buttons = container.querySelectorAll(\"[data-action=\\\"select-toolstorage\\\"]\");\n  const validCards = [];\n  const invalidCards = [];\n\n  buttons.forEach((button) => {\n    const itemId = button.getAttribute(\"data-item-id\");\n    const storage = itemId ? toolStorageMap.get(itemId) : null;\n    const isSelected = itemId ? selectedIdSet.has(itemId) : false;\n    const validation = !storage || isSelected\n      ? { valid: true, message: \"\" }\n      : validateToolStorageSelection(selectedStorages.concat(storage));\n\n    setToolStorageButtonState(button, {\n      isSelected,\n      isDisabled: !validation.valid,\n      disabledMessage: validation.message,\n    });\n\n    const card = button.closest(\"[data-toolstorage-card]\");\n    if (!card) return;\n\n    card.classList.add(\"border\", \"bg-white\");\n    card.classList.remove(\"bg-red-200\");\n\n    if (!validation.valid && !isSelected) {\n      card.classList.add(\"bg-red-200\");\n      card.classList.remove(\"bg-white\");\n      invalidCards.push(card);\n    } else {\n      validCards.push(card);\n    }\n  });\n\n  if (validCards.length || invalidCards.length) {\n    const fragment = document.createDocumentFragment();\n    validCards.forEach((card) => fragment.appendChild(card));\n    invalidCards.forEach((card) => fragment.appendChild(card));\n    container.appendChild(fragment);\n  }\n}\n\nfunction updateCatalogButtons() {\n  const container = document.getElementById(\"toolSetCatalog\");\n  const textarea = document.getElementById(\"toolsetsInput\");\n  if (!container || !textarea) return;\n\n  const selected = new Set(parseMultilineIds(textarea.value));\n  const buttons = container.querySelectorAll(\"[data-action=\\\"add-toolset\\\"]\");\n  buttons.forEach((button) => {\n    const itemId = button.getAttribute(\"data-item-id\");\n    const isSelected = itemId ? selected.has(itemId) : false;\n    setToolSetButtonState(button, isSelected);\n  });\n}\n\nfunction updateToolstoragePreviewFromInput(state, value, { onPreviewChanged } = {}) {\n  const toolstorageIds = parseSelectedToolStorageIds(value);\n  if (!toolstorageIds.length) {\n    onPreviewChanged?.([]);\n    updateToolstorageCatalogButtons(state);\n    return;\n  }\n\n  const toolstorages = resolveSelectedToolStorages(toolstorageIds, state.toolStorageMap);\n  const validation = validateToolStorageSelection(toolstorages);\n  if (!validation.valid) {\n    onPreviewChanged?.([]);\n    updateToolstorageCatalogButtons(state);\n    return;\n  }\n\n  onPreviewChanged?.(toolstorages);\n  updateToolstorageCatalogButtons(state);\n}\n\nfunction wireToolstorageCatalogButtons(\n  state,\n  { onPreviewChanged, onToolstorageCleared, onToolstorageReady } = {},\n) {\n  const container = document.getElementById(\"toolStorageCatalog\");\n  const input = document.getElementById(\"toolstorageInput\");\n  if (!container || !input) return;\n\n  container.addEventListener(\"click\", (event) => {\n    const button = event.target.closest(\"[data-action=\\\"select-toolstorage\\\"]\");\n    if (!button) return;\n    if (button.disabled) return;\n\n    const itemId = button.getAttribute(\"data-item-id\");\n    if (!itemId) return;\n\n    const currentIds = parseSelectedToolStorageIds(input.value);\n    const isSelected = currentIds.includes(itemId);\n    const nextIds = isSelected\n      ? currentIds.filter((currentId) => currentId !== itemId)\n      : currentIds.concat(itemId);\n    const nextStorages = resolveSelectedToolStorages(nextIds, state.toolStorageMap);\n    const validation = validateToolStorageSelection(nextStorages);\n    if (!validation.valid) return;\n\n    input.value = serializeSelectedToolStorageIds(nextStorages.map((storage) => storage.itemId));\n    updateToolstoragePreviewFromInput(state, input.value, { onPreviewChanged });\n\n    if (!nextStorages.length) {\n      onToolstorageCleared?.();\n      return;\n    }\n\n    onToolstorageReady?.();\n  });\n}\n\nfunction wireCatalogButtons(state, { onSelectionChanged } = {}) {\n  void state;\n\n  const container = document.getElementById(\"toolSetCatalog\");\n  const textarea = document.getElementById(\"toolsetsInput\");\n  if (!container || !textarea) return;\n\n  container.addEventListener(\"click\", (event) => {\n    const button = event.target.closest(\"[data-action=\\\"add-toolset\\\"]\");\n    if (!button) return;\n    if (button.disabled) return;\n\n    const itemId = button.getAttribute(\"data-item-id\");\n    if (!itemId) return;\n\n    container.style.overflowAnchor=\"none\";\n    const pageX=window.scrollX, pageY=window.scrollY, listTop=container.scrollTop, listLeft=container.scrollLeft;\n    const ids = parseMultilineIds(textarea.value);\n    // Allow duplicates: each click adds another instance of the same ItemId.\n    const nextIds = ids.concat(itemId);\n\n    textarea.value = nextIds.join(\"\\n\");\n    textarea.dispatchEvent(new Event(\"input\", {bubbles:true}));\n    button.focus({preventScroll:true});\n    updateCatalogButtons();\n    onSelectionChanged?.();\n    requestAnimationFrame(()=>requestAnimationFrame(()=>{\n      container.scrollTop=listTop;container.scrollLeft=listLeft;\n      window.scrollTo({left:pageX,top:pageY,behavior:\"instant\"});\n    }));\n  });\n}\n\nfunction setToolSetButtonState(button, isSelected) {\n  const iconPath = button.querySelector(\"path\");\n  const addClasses = [\"border-gray-200\", \"bg-gray-100\", \"text-gray-700\", \"hover:bg-gray-300\"];\n  const selectedClasses = [\"border-amber-500\", \"bg-amber-500\", \"text-white\", \"hover:bg-amber-600\"];\n\n  if (isSelected) {\n    button.classList.remove(...addClasses);\n    button.classList.add(...selectedClasses);\n    button.setAttribute(\"aria-label\", t(\"addAnother\", \"Add\"));\n    button.dataset.state = \"added\";\n    if (iconPath) {\n      iconPath.setAttribute(\"d\", \"M9 4a1 1 0 0 1 2 0v5h5a1 1 0 0 1 0 2h-5v5a1 1 0 1 1-2 0v-5H4a1 1 0 1 1 0-2h5V4z\");\n    }\n    return;\n  }\n\n  button.classList.remove(...selectedClasses);\n  button.classList.add(...addClasses);\n  button.setAttribute(\"aria-label\", t(\"addToList\", \"Add to list\"));\n  button.dataset.state = \"add\";\n  if (iconPath) {\n    iconPath.setAttribute(\"d\", \"M9 4a1 1 0 0 1 2 0v5h5a1 1 0 0 1 0 2h-5v5a1 1 0 1 1-2 0v-5H4a1 1 0 1 1 0-2h5V4z\");\n  }\n}\n\nfunction setToolStorageButtonState(button, { isSelected, isDisabled, disabledMessage }) {\n  const iconPath = button.querySelector(\"path\");\n  const addClasses = [\"border-gray-200\", \"bg-gray-100\", \"text-gray-700\", \"hover:bg-gray-300\"];\n  const selectedClasses = [\"border-amber-500\", \"bg-amber-500\", \"text-white\", \"hover:bg-amber-600\"];\n\n  button.disabled = false;\n  button.removeAttribute(\"aria-disabled\");\n  button.removeAttribute(\"title\");\n  button.classList.remove(\"opacity-40\", \"cursor-not-allowed\");\n\n  if (isSelected) {\n    button.classList.remove(...addClasses);\n    button.classList.add(...selectedClasses);\n    button.setAttribute(\"aria-label\", t(\"selected\", \"Selected\"));\n    button.dataset.state = \"selected\";\n    if (iconPath) {\n      iconPath.setAttribute(\"d\", \"M7.5 13.5 3.5 9.5 4.9 8.1 7.5 10.7 15.1 3.1 16.5 4.5z\");\n    }\n    return;\n  }\n\n  button.classList.remove(...selectedClasses);\n  button.classList.add(...addClasses);\n  button.setAttribute(\"aria-label\", t(\"selectToolStorage\", \"Select tool storage\"));\n  button.dataset.state = \"select\";\n  if (iconPath) {\n    iconPath.setAttribute(\"d\", \"M9 4a1 1 0 0 1 2 0v5h5a1 1 0 0 1 0 2h-5v5a1 1 0 1 1-2 0v-5H4a1 1 0 1 1 0-2h5V4z\");\n  }\n\n  if (!isDisabled) return;\n\n  button.disabled = true;\n  button.setAttribute(\"aria-disabled\", \"true\");\n  button.setAttribute(\"title\", disabledMessage || t(\"invalidToolStorageSelection\", \"This storage selection is not allowed.\"));\n  button.classList.add(\"opacity-40\", \"cursor-not-allowed\");\n  button.classList.remove(\"hover:bg-gray-300\", \"hover:bg-amber-600\");\n}\n\nexports.updateToolstorageCatalogButtons = updateToolstorageCatalogButtons;\nexports.updateCatalogButtons = updateCatalogButtons;\nexports.updateToolstoragePreviewFromInput = updateToolstoragePreviewFromInput;\nexports.wireToolstorageCatalogButtons = wireToolstorageCatalogButtons;\nexports.wireCatalogButtons = wireCatalogButtons;\n});\n\n__define(\"features/catalog/toolset-catalog-view.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { cleanString, escapeHtml } = __require(\"shared/utils/string-utils.js\");\nconst { buildDrawersForStorages } = __require(\"features/drawer-layout/drawer-layout-service.js\");\nconst { buildMaxRectsState } = __require(\"features/drawer-layout/maxrects-service.js\");\nconst { canDrawerAcceptSetWeight } = __require(\"features/drawer-layout/drawer-weight-service.js\");\nconst { buildToolStorageSelectionKey, parseSelectedToolStorageIds, resolveSelectedToolStorages } = __require(\"features/toolstorage-selection/toolstorage-selection-service.js\");\nfunction doesSetFitAnyDrawer(set, drawerStates) {\n  const width = set?.setWidth;\n  const depth = set?.setDepth;\n  const height = set?.setHeight;\n\n  // Only flag as \"cannot fit\" when dimensions are known and positive.\n  if (!Number.isFinite(width) || !Number.isFinite(depth) || !Number.isFinite(height)) return true;\n  if (width <= 0 || depth <= 0 || height <= 0) return true;\n\n  return (drawerStates || []).some(({ drawer, freeRects }) => {\n    if (drawer?.locked) return false;\n\n    const drawerHeight = drawer?.drawerHeight ?? 0;\n    if (height > drawerHeight) return false;\n    if (!canDrawerAcceptSetWeight(drawer, set)) return false;\n\n    return (freeRects || []).some((rect) => width <= rect.width && depth <= rect.height);\n  });\n}\n\nfunction setAddButtonDisabled(button, isDisabled) {\n  if (!button) return;\n\n  const disabled = Boolean(isDisabled);\n  button.disabled = disabled;\n\n  if (disabled) {\n    button.setAttribute(\"aria-disabled\", \"true\");\n    button.setAttribute(\"title\", t(\"doesNotFitCurrentDrawerLayout\", \"Does not fit in the current drawer layout.\"));\n    button.classList.add(\"opacity-40\", \"cursor-not-allowed\");\n    button.classList.remove(\"hover:bg-gray-100\", \"hover:bg-amber-600\");\n    return;\n  }\n\n  button.removeAttribute(\"aria-disabled\");\n  button.removeAttribute(\"title\");\n  button.classList.remove(\"opacity-40\", \"cursor-not-allowed\");\n  if (button.classList.contains(\"bg-amber-500\")) {\n    button.classList.add(\"hover:bg-amber-600\");\n  } else {\n    button.classList.add(\"hover:bg-gray-100\");\n  }\n}\n\nfunction updateToolSetCatalogFitBorders(state) {\n  const container = document.getElementById(\"toolSetCatalog\");\n  if (!container) return;\n\n  const toolstorageInput = document.getElementById(\"toolstorageInput\");\n  const toolstorageIds = parseSelectedToolStorageIds(toolstorageInput?.value);\n  const toolstorages = resolveSelectedToolStorages(toolstorageIds, state?.toolStorageMap || new Map());\n\n  const setMap = state?.toolSetMap;\n  const hasCurrentLayout =\n    toolstorages.length &&\n    state?.currentToolstorageSelectionKey === buildToolStorageSelectionKey(toolstorages) &&\n    Array.isArray(state?.currentDrawers) &&\n    state.currentDrawers.length > 0;\n  const drawers = toolstorages.length ? (hasCurrentLayout ? state.currentDrawers : buildDrawersForStorages(toolstorages)) : null;\n  const drawerStates = (drawers || []).map((drawer) => ({ drawer, freeRects: buildMaxRectsState(drawer) }));\n\n  const okCards = [];\n  const warnCards = [];\n\n  container.querySelectorAll(\"[data-toolset-card]\").forEach((card) => {\n    const itemId = card.getAttribute(\"data-item-id\") || \"\";\n\n    const shouldWarn = Boolean(\n      toolstorages.length &&\n      setMap &&\n      itemId &&\n      !doesSetFitAnyDrawer(setMap.get(itemId), drawerStates),\n    );\n\n    const addButton = card.querySelector(\"[data-action=\\\"add-toolset\\\"]\");\n    setAddButtonDisabled(addButton, shouldWarn);\n\n    card.classList.add(\"border\", \"bg-white\");\n    card.classList.remove(\"bg-red-200\");\n    if (shouldWarn) {\n      card.classList.add(\"bg-red-200\");\n      card.classList.remove(\"bg-white\");\n      warnCards.push(card);\n    } else {\n      card.classList.add(\"bg-white\");\n      card.classList.remove(\"bg-red-200\");\n      okCards.push(card);\n    }\n  });\n\n  // Keep existing order within each group, but ensure \"cannot fit\" cards render last.\n  if (okCards.length || warnCards.length) {\n    const fragment = document.createDocumentFragment();\n    okCards.forEach((card) => fragment.appendChild(card));\n    warnCards.forEach((card) => fragment.appendChild(card));\n    container.appendChild(fragment);\n  }\n}\n\nfunction renderToolSetCatalog(toolSets) {\n  const container = document.getElementById(\"toolSetCatalog\");\n  if (!container) return;\n\n  if (!toolSets.length) {\n    container.innerHTML = `\n      <div class=\"rounded-lg border border-gray-200 bg-white p-6 text-center text-sm text-gray-500\">\n        ${escapeHtml(t(\"noToolSetsMatchFilters\", \"No tool sets match your filters.\"))}\n      </div>\n    `;\n    return;\n  }\n\n  const cards = toolSets\n    .map((set) => {\n      const description = escapeHtml(set.description || t(\"toolSet\", \"Tool set\"));\n      const itemId = escapeHtml(set.itemId || \"\");\n      const imageUrl = escapeHtml(set.itemImageUrl || \"data/imgsource.png\");\n      const imageAlt = escapeHtml(`${set.description || t(\"toolSet\", \"Tool set\")} ${set.itemId || \"\"}`.trim());\n\n      return `\n      <div class=\"relative flex w-full flex-col overflow-hidden border border-gray-100 bg-white\" data-toolset-card=\"1\" data-item-id=\"${itemId}\">\n        <a class=\"relative mx-auto mt-3 flex w-full max-w-[140px] aspect-[8/7] items-center justify-center overflow-hidden sm:max-w-[160px]\" href=\"#\" data-action=\"open-product-modal\" data-item-type=\"toolset\" data-item-id=\"${itemId}\">\n          <img class=\"h-full w-full object-contain\" src=\"${imageUrl}\" alt=\"${imageAlt}\" loading=\"lazy\" />\n        </a>\n\n        <div class=\"mt-3 px-3 pb-3\">\n          <a href=\"#\">\n            <h5 class=\"text-xs font-semibold uppercase tracking-wide text-gray-900 leading-tight\">\n              ${description}\n            </h5>\n          </a>\n\n          <div class=\"flex items-center justify-between gap-3 pt-2\">\n            <div class=\"min-w-0 print:break-inside-avoid\">\n              <ul class=\"grid gap-1\">\n                <li class=\"grid gap-x-3 text-xs leading-tight\">\n                  <span class=\"text-gray-600\">${itemId}</span>\n                </li>\n              </ul>\n            </div>\n            <button\n              class=\"inline-flex h-8 w-8 items-center justify-center rounded-full border border-gray-200 bg-gray-100 text-gray-700 transition hover:bg-gray-300\"\n              type=\"button\"\n              aria-label=\"${escapeHtml(t(\"addToList\", \"Add to list\"))}\"\n              data-action=\"add-toolset\"\n              data-item-id=\"${itemId}\"\n            >\n              <svg viewBox=\"0 0 20 20\" aria-hidden=\"true\" class=\"h-4 w-4 fill-current\">\n                <path d=\"M9 4a1 1 0 0 1 2 0v5h5a1 1 0 0 1 0 2h-5v5a1 1 0 1 1-2 0v-5H4a1 1 0 1 1 0-2h5V4z\"></path>\n              </svg>\n            </button>\n          </div>\n        </div>\n      </div>\n    `;\n    })\n    .join(\"\");\n\n  container.innerHTML = cards;\n}\n\nexports.updateToolSetCatalogFitBorders = updateToolSetCatalogFitBorders;\nexports.renderToolSetCatalog = renderToolSetCatalog;\n});\n\n__define(\"features/catalog/toolstorage-catalog-view.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { escapeHtml } = __require(\"shared/utils/string-utils.js\");\nfunction renderToolStorageCatalog(toolStorages) {\n  const container = document.getElementById(\"toolStorageCatalog\");\n  if (!container) return;\n\n  if (!toolStorages.length) {\n    container.innerHTML = `\n      <div class=\"rounded-lg border border-gray-200 bg-white p-6 text-center text-sm text-gray-500\">\n        ${escapeHtml(t(\"noToolStoragesMatchFilters\", \"No tool storages match your filters.\"))}\n      </div>\n    `;\n    return;\n  }\n\n  const cards = toolStorages\n    .map((storage) => {\n      const description = escapeHtml(storage.description || t(\"toolStorage\", \"Tool storage\"));\n      const itemId = escapeHtml(storage.itemId || \"\");\n      const productType = escapeHtml(storage.productType || t(\"toolStorage\", \"Tool storage\"));\n      const imageUrl = escapeHtml(storage.itemImageUrl || \"data/imgsource.png\");\n      const imageAlt = escapeHtml(`${storage.description || t(\"toolStorage\", \"Tool storage\")} ${storage.itemId || \"\"}`.trim());\n\n      return `\n      <div class=\"relative flex w-full flex-col overflow-hidden border border-gray-100 bg-white\" data-toolstorage-card=\"1\" data-item-id=\"${itemId}\">\n        <a class=\"relative mx-auto mt-3 flex w-full max-w-[140px] aspect-[8/7] items-center justify-center overflow-hidden sm:max-w-[160px]\" href=\"#\" data-action=\"open-product-modal\" data-item-type=\"toolstorage\" data-item-id=\"${itemId}\">\n          <img class=\"h-full w-full object-contain\" src=\"${imageUrl}\" alt=\"${imageAlt}\" loading=\"lazy\" />\n        </a>\n\n        <div class=\"mt-3 px-3 pb-3\">\n          <a href=\"#\">\n            <h5 class=\"text-xs font-semibold uppercase tracking-wide text-gray-900 leading-tight\">\n              ${description}\n            </h5>\n          </a>\n\n          <div class=\"flex items-center justify-between gap-3 pt-2\">\n            <div class=\"min-w-0 print:break-inside-avoid\">\n              <ul class=\"grid gap-1\">\n                <li class=\"grid gap-x-3 text-[10px] font-semibold uppercase tracking-wide leading-tight\">\n                  <span class=\"text-gray-600\">${productType}</span>\n                </li>\n                <li class=\"grid gap-x-3 text-xs leading-tight\">\n                  <span class=\"text-gray-600\">${itemId}</span>\n                </li>\n              </ul>\n            </div>\n            <button\n              class=\"inline-flex h-8 w-8 items-center justify-center rounded-full border border-gray-200 bg-gray-100 text-gray-700 transition hover:bg-gray-300\"\n              type=\"button\"\n              aria-label=\"${escapeHtml(t(\"selectToolStorage\", \"Select tool storage\"))}\"\n              data-action=\"select-toolstorage\"\n              data-item-id=\"${itemId}\"\n            >\n              <svg viewBox=\"0 0 20 20\" aria-hidden=\"true\" class=\"h-4 w-4 fill-current\">\n                <path d=\"M9 4a1 1 0 0 1 2 0v5h5a1 1 0 0 1 0 2h-5v5a1 1 0 1 1-2 0v-5H4a1 1 0 1 1 0-2h5V4z\"></path>\n              </svg>\n            </button>\n          </div>\n        </div>\n      </div>\n    `;\n    })\n    .join(\"\");\n\n  container.innerHTML = cards;\n}\n\nexports.renderToolStorageCatalog = renderToolStorageCatalog;\n});\n\n__define(\"features/configurator/configurator-controller.js\", (exports, __require) => {\nconst { byId, getTrimmedValue } = __require(\"shared/dom/dom-helpers.js\");\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nconst { closeExportTableModal, copyExportTable, handleLoadFromJson, handlePrintToPdf, handleSaveToJson, openExportTableModal, wireExportTableModal } = __require(\"features/configurator/configurator-persistence.js\");\nconst { fitSetsIntoDrawers, fitSetsIntoExistingLayout } = __require(\"features/drawer-layout/drawer-fit-service.js\");\nconst { wireDrawerHoverHighlight } = __require(\"features/drawer-layout/drawer-hover-highlight.js\");\nconst { buildDrawersForStorage, buildDrawersForStorages, resolveSelectedSets } = __require(\"features/drawer-layout/drawer-layout-service.js\");\nconst { wireDragAndDrop } = __require(\"features/drawer-layout/drawer-drag-drop.js\");\nconst { renderConfiguration, renderEmptyState, renderSelectedToolstorage } = __require(\"features/drawer-layout/drawer-renderer.js\");\nconst { buildToolStorageFilters, buildToolSetFilters, filterToolStorages, filterToolSets, updateFilterSummaryIcon } = __require(\"features/catalog/catalog-filters.js\");\nconst { updateCatalogButtons, updateToolstorageCatalogButtons, wireCatalogButtons, wireToolstorageCatalogButtons } = __require(\"features/catalog/catalog-selection.js\");\nconst { renderToolStorageCatalog } = __require(\"features/catalog/toolstorage-catalog-view.js\");\nconst { renderToolSetCatalog, updateToolSetCatalogFitBorders } = __require(\"features/catalog/toolset-catalog-view.js\");\nconst { wireFabActions } = __require(\"features/fab-actions/fab-actions.js\");\nconst { wireProductModal } = __require(\"features/product-details/product-detail-modal.js\");\nconst { wirePredefinedToolKitModal } = __require(\"features/tool-kits/predefined-tool-kit-modal.js\");\nconst { buildToolStorageSelectionKey, parseSelectedToolStorageIds, resolveSelectedToolStorages, validateToolStorageSelection } = __require(\"features/toolstorage-selection/toolstorage-selection-service.js\");\nconst { initTabsUI } = __require(\"features/tabs/tabs-ui.js\");\nconst { canReconcileStoragesWithExistingLayout, reconcileDrawersWithSelectedStorages } = __require(\"features/configurator/configurator-layout-reconcile.js\");\nconst { wireDismissibleHint, wireOutsideDetailsClose, wirePrintDetailsOpen } = __require(\"features/configurator/configurator-ui-wiring.js\");\nfunction parseMultilineIds(value) {\n  return cleanString(value)\n    .split(/\\r?\\n/)\n    .map(cleanString)\n    .filter(Boolean);\n}\n\nfunction initConfiguratorController(state, dragState) {\n  wireEvents(state, dragState);\n\n  renderEmptyState();\n  buildToolStorageFilters(state.toolStorages);\n  renderFilteredToolStorages(state);\n  buildToolSetFilters(state.toolSets);\n  renderFilteredToolSets(state);\n}\n\nfunction wireEvents(state, dragState) {\n  initTabsUI();\n  wireFabActions();\n  wirePrintDetailsOpen();\n  wireDismissibleHint();\n\n  const form = byId(\"toolstorageForm\");\n  if (form) {\n    form.addEventListener(\"submit\", (event) => event.preventDefault());\n  }\n\n  byId(\"recommendBtn\").addEventListener(\"click\", () => handleRenderConfiguration(state));\n  byId(\"printToPdf\").addEventListener(\"click\", handlePrintToPdf);\n  byId(\"saveToJson\").addEventListener(\"click\", () => handleSaveToJson(state));\n  byId(\"loadFromJson\").addEventListener(\"click\", () => handleLoadFromJson(state));\n  wirePredefinedToolKitModal(state);\n\n  const exportBtn = byId(\"exportTableBtn\");\n  if (exportBtn) {\n    exportBtn.addEventListener(\"click\", () => openExportTableModal(state));\n  }\n\n  wireProductModal(state);\n  wireToolstorageCatalogButtons(state, {\n    onPreviewChanged: (toolstorage) => renderSelectedToolstorage(toolstorage),\n    onToolstorageCleared: () => {\n      state.currentDrawers = [];\n      state.currentUnplacedSets = [];\n      state.currentErrors = [];\n      state.currentToolstorageSelectionKey = \"\";\n      renderEmptyState();\n      updateToolSetCatalogFitBorders(state);\n    },\n    onToolstorageReady: () => renderIfToolstorageReady(state),\n  });\n  wireCatalogButtons(state, { onSelectionChanged: () => renderIfToolstorageReady(state) });\n\n  wireDragAndDrop(state, dragState, {\n    onSelectionChanged: () => {\n      updateCatalogButtons(state);\n      renderIfToolstorageReady(state);\n    },\n  });\n  wireDrawerHoverHighlight();\n\n  wireOutsideDetailsClose();\n\n  const toolsetInput = byId(\"toolsetsInput\");\n  if (toolsetInput) {\n    toolsetInput.addEventListener(\"input\", () => updateCatalogButtons(state));\n  }\n\n  const toolStorageSearch = byId(\"toolStorageSearch\");\n  if (toolStorageSearch) {\n    toolStorageSearch.addEventListener(\"input\", () => renderFilteredToolStorages(state));\n  }\n\n  const toolStorageTypeFilters = byId(\"toolStorageTypeFilters\");\n  if (toolStorageTypeFilters) {\n    toolStorageTypeFilters.addEventListener(\"change\", () => {\n      renderFilteredToolStorages(state);\n      updateFilterSummaryIcon(\"toolStorageTypeFilters\");\n    });\n  }\n\n  const toolStorageClearFilters = byId(\"toolStorageClearFilters\");\n  if (toolStorageClearFilters) {\n    toolStorageClearFilters.addEventListener(\"click\", () => {\n      if (toolStorageSearch) toolStorageSearch.value = \"\";\n      if (toolStorageTypeFilters) {\n        toolStorageTypeFilters.querySelectorAll(\"input[type=\\\"checkbox\\\"]\").forEach((input) => {\n          input.checked = false;\n        });\n      }\n      renderFilteredToolStorages(state);\n      updateFilterSummaryIcon(\"toolStorageTypeFilters\");\n    });\n  }\n\n  const toolSetSearch = byId(\"toolSetSearch\");\n  if (toolSetSearch) {\n    toolSetSearch.addEventListener(\"input\", () => renderFilteredToolSets(state));\n  }\n\n  const toolSetTypeFilters = byId(\"toolSetTypeFilters\");\n  if (toolSetTypeFilters) {\n    toolSetTypeFilters.addEventListener(\"change\", () => {\n      renderFilteredToolSets(state);\n      updateFilterSummaryIcon(\"toolSetTypeFilters\");\n    });\n  }\n\n  const clearFilters = byId(\"toolSetClearFilters\");\n  if (clearFilters) {\n    clearFilters.addEventListener(\"click\", () => {\n      if (toolSetSearch) toolSetSearch.value = \"\";\n      if (toolSetTypeFilters) {\n        toolSetTypeFilters.querySelectorAll(\"input[type=\\\"checkbox\\\"]\").forEach((input) => {\n          input.checked = false;\n        });\n      }\n      renderFilteredToolSets(state);\n      updateFilterSummaryIcon(\"toolSetTypeFilters\");\n    });\n  }\n\n  const exportClose = byId(\"exportTableClose\");\n  if (exportClose) {\n    exportClose.addEventListener(\"click\", closeExportTableModal);\n  }\n\n  const exportCopy = byId(\"exportTableCopy\");\n  if (exportCopy) {\n    exportCopy.addEventListener(\"click\", copyExportTable);\n  }\n\n  wireExportTableModal();\n}\n\nfunction handleRenderConfiguration(state) {\n  const toolstorageIds = parseSelectedToolStorageIds(getTrimmedValue(\"toolstorageInput\"));\n  const toolstorages = resolveSelectedToolStorages(toolstorageIds, state.toolStorageMap);\n\n  if (!toolstorages.length) {\n    alert(t(\"pleaseEnterValidToolStorageId\", \"Please enter a valid tool storage ID.\"));\n    return;\n  }\n\n  const selectionValidation = validateToolStorageSelection(toolstorages);\n  if (!selectionValidation.valid) {\n    alert(selectionValidation.message || t(\"invalidToolStorageSelection\", \"This storage selection is not allowed.\"));\n    updateToolstorageCatalogButtons(state);\n    return;\n  }\n\n  renderSelectedToolstorage(toolstorages);\n\n  const manualSetIds = parseMultilineIds(byId(\"toolsetsInput\")?.value);\n  const selectedSets = resolveSelectedSets(manualSetIds, state.toolSets);\n  const drawers = buildDrawersForStorages(toolstorages);\n  const selectionKey = buildToolStorageSelectionKey(toolstorages);\n\n  if (!drawers.length) {\n    state.currentDrawers = [];\n    state.currentUnplacedSets = selectedSets;\n    state.currentErrors = [];\n    state.currentToolstorageSelectionKey = selectionKey;\n    renderConfiguration(state.currentDrawers, state.currentUnplacedSets, state.currentErrors);\n    updateToolSetCatalogFitBorders(state);\n    return;\n  }\n\n  const canPreserveOrder = state.currentToolstorageSelectionKey === selectionKey && state.currentDrawers.length;\n  const canReconcileExistingLayout = !canPreserveOrder && canReconcileStoragesWithExistingLayout(state.currentDrawers, toolstorages);\n\n  if (!canPreserveOrder) {\n    if (canReconcileExistingLayout) {\n      const reconciledDrawers = reconcileDrawersWithSelectedStorages(state.currentDrawers, toolstorages);\n      const reconciledResult = fitSetsIntoExistingLayout(reconciledDrawers, selectedSets);\n      state.currentDrawers = reconciledResult.drawers;\n      state.currentUnplacedSets = reconciledResult.unplacedSets;\n      state.currentErrors = reconciledResult.errors;\n      state.currentToolstorageSelectionKey = selectionKey;\n      renderConfiguration(state.currentDrawers, state.currentUnplacedSets, state.currentErrors);\n      updateToolSetCatalogFitBorders(state);\n      return;\n    }\n\n    const result = fitSetsIntoDrawers(drawers, selectedSets);\n    state.currentDrawers = result.drawers;\n    state.currentUnplacedSets = result.unplacedSets;\n    state.currentErrors = result.errors;\n    state.currentToolstorageSelectionKey = selectionKey;\n    renderConfiguration(state.currentDrawers, state.currentUnplacedSets, state.currentErrors);\n    updateToolSetCatalogFitBorders(state);\n    return;\n  }\n\n  const preservedResult = fitSetsIntoExistingLayout(state.currentDrawers, selectedSets);\n  state.currentDrawers = preservedResult.drawers;\n  state.currentUnplacedSets = preservedResult.unplacedSets;\n  state.currentErrors = preservedResult.errors;\n  state.currentToolstorageSelectionKey = selectionKey;\n  renderConfiguration(state.currentDrawers, state.currentUnplacedSets, state.currentErrors);\n  updateToolSetCatalogFitBorders(state);\n}\n\nfunction renderIfToolstorageReady(state) {\n  const toolstorageIds = parseSelectedToolStorageIds(getTrimmedValue(\"toolstorageInput\"));\n  if (!toolstorageIds.length) return;\n  const toolstorages = resolveSelectedToolStorages(toolstorageIds, state.toolStorageMap);\n  if (!toolstorages.length) return;\n  handleRenderConfiguration(state);\n}\n\nfunction renderFilteredToolStorages(state) {\n  const filtered = filterToolStorages(state.toolStorages);\n  renderToolStorageCatalog(filtered);\n  updateToolstorageCatalogButtons(state);\n}\n\nfunction renderFilteredToolSets(state) {\n  const filtered = filterToolSets(state.toolSets);\n  renderToolSetCatalog(filtered);\n  updateCatalogButtons(state);\n  updateToolSetCatalogFitBorders(state);\n}\n\nexports.initConfiguratorController = initConfiguratorController;\n});\n\n__define(\"features/configurator/configurator-download-modal.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nlet downloadModalWired = false;\nlet activeDownload = null;\nlet activeDownloadCleanupTimer = null;\n\nfunction tryCopyToClipboard(text) {\n  if (!navigator.clipboard?.writeText) return false;\n  navigator.clipboard.writeText(text).catch(() => {});\n  return true;\n}\n\nfunction scheduleUrlRevoke(url, delayMs = 60_000) {\n  if (!url) return;\n  setTimeout(() => {\n    try {\n      URL.revokeObjectURL(url);\n    } catch {\n      // ignore\n    }\n  }, delayMs);\n}\n\nfunction closeDownloadConfigModal({ revokeUrl = true } = {}) {\n  const modal = document.getElementById(\"downloadConfigModal\");\n  if (!modal) return;\n  modal.classList.add(\"hidden\");\n  modal.classList.remove(\"flex\");\n\n  const status = document.getElementById(\"downloadConfigStatus\");\n  if (status) status.textContent = \"\";\n\n  if (activeDownloadCleanupTimer) {\n    clearTimeout(activeDownloadCleanupTimer);\n    activeDownloadCleanupTimer = null;\n  }\n\n  if (!activeDownload) return;\n  const url = activeDownload.url;\n  activeDownload = null;\n\n  if (!revokeUrl || !url) return;\n  scheduleUrlRevoke(url, 1_000);\n}\n\nfunction openDownloadConfigModal({ url, fileName, json }) {\n  const modal = document.getElementById(\"downloadConfigModal\");\n  if (!modal) return;\n\n  if (!downloadModalWired) {\n    downloadModalWired = true;\n\n    const closeBtn = document.getElementById(\"downloadConfigClose\");\n    if (closeBtn) closeBtn.addEventListener(\"click\", () => closeDownloadConfigModal());\n\n    modal.addEventListener(\"click\", (event) => {\n      if (event.target === modal) closeDownloadConfigModal();\n    });\n\n    const copyBtn = document.getElementById(\"downloadConfigCopy\");\n    if (copyBtn) {\n      copyBtn.addEventListener(\"click\", async () => {\n        const status = document.getElementById(\"downloadConfigStatus\");\n        const text = activeDownload?.json || \"\";\n        if (!text) return;\n\n        try {\n          if (navigator.clipboard?.writeText) {\n            await navigator.clipboard.writeText(text);\n            if (status) status.textContent = t(\"copied\", \"Copied.\");\n          } else {\n            if (status) status.textContent = t(\"clipboardUnavailable\", \"Clipboard unavailable in this browser.\");\n          }\n        } catch {\n          if (status) status.textContent = t(\"copyFailed\", \"Copy failed.\");\n        }\n      });\n    }\n  }\n\n  if (activeDownload?.url && activeDownload.url !== url) {\n    try {\n      URL.revokeObjectURL(activeDownload.url);\n    } catch {\n      // ignore\n    }\n  }\n\n  activeDownload = { url, fileName, json };\n\n  const link = document.getElementById(\"downloadConfigLink\");\n  if (link) {\n    link.href = url;\n    link.setAttribute(\"download\", fileName || \"configuration.txt\");\n  }\n\n  const nameEl = document.getElementById(\"downloadConfigFileName\");\n  if (nameEl) nameEl.textContent = fileName || \"\";\n\n  modal.classList.remove(\"hidden\");\n  modal.classList.add(\"flex\");\n\n  if (activeDownloadCleanupTimer) clearTimeout(activeDownloadCleanupTimer);\n  activeDownloadCleanupTimer = setTimeout(() => closeDownloadConfigModal({ revokeUrl: true }), 10 * 60_000);\n}\n\nfunction openReadableExportFallback({ fileName, json }) {\n  const html = `<!doctype html>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>${fileName.replace(/</g, \"&lt;\")}</title>\n<style>\n  body{margin:0;font:14px/1.4 ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,\"Liberation Mono\",\"Courier New\",monospace}\n  header{padding:12px 14px;border-bottom:1px solid #e5e7eb}\n  pre{margin:0;padding:14px;white-space:pre-wrap;word-break:break-word}\n  .hint{color:#6b7280;font:12px/1.4 system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif}\n  code{font:inherit}\n</style>\n<header>\n  <div><strong>${t(\"exportGenerated\", \"Export generated\")}</strong></div>\n  <div class=\"hint\">${t(\"downloadMobileHint\", \"If downloading fails on mobile, use browser Share/Save from this page, or copy the JSON below.\")}</div>\n</header>\n<pre><code>${json.replace(/</g, \"&lt;\")}</code></pre>`;\n  const blob = new Blob([html], { type: \"text/html;charset=utf-8\" });\n  const url = URL.createObjectURL(blob);\n  window.open(url, \"_blank\", \"noopener,noreferrer\");\n  scheduleUrlRevoke(url);\n  tryCopyToClipboard(json);\n}\n\nfunction openManualDownloadModal({ blob, fileName, json }) {\n  const url = URL.createObjectURL(blob);\n  openDownloadConfigModal({ url, fileName, json });\n}\n\nfunction triggerProgrammaticDownload({ blob, fileName }) {\n  const url = URL.createObjectURL(blob);\n  const link = document.createElement(\"a\");\n\n  link.href = url;\n  link.download = fileName;\n  link.rel = \"noopener\";\n  document.body.appendChild(link);\n  link.click();\n\n  setTimeout(() => link.remove(), 2_000);\n  scheduleUrlRevoke(url);\n}\n\nexports.closeDownloadConfigModal = closeDownloadConfigModal;\nexports.openDownloadConfigModal = openDownloadConfigModal;\nexports.openReadableExportFallback = openReadableExportFallback;\nexports.openManualDownloadModal = openManualDownloadModal;\nexports.triggerProgrammaticDownload = triggerProgrammaticDownload;\n});\n\n__define(\"features/configurator/configurator-export-debug.js\", (exports, __require) => {\nfunction isDebugExportEnabled() {\n  try {\n    return (\n      new URLSearchParams(window.location.search).has(\"debugExport\") ||\n      window.localStorage?.getItem(\"debugExport\") === \"1\"\n    );\n  } catch {\n    return false;\n  }\n}\n\nfunction logExportDebug(...args) {\n  if (!isDebugExportEnabled()) return;\n  console.info(\"[configurator:export]\", ...args);\n}\n\nfunction logImportDebug(...args) {\n  if (!isDebugExportEnabled()) return;\n  console.info(\"[configurator:import]\", ...args);\n}\n\nexports.isDebugExportEnabled = isDebugExportEnabled;\nexports.logExportDebug = logExportDebug;\nexports.logImportDebug = logImportDebug;\n});\n\n__define(\"features/configurator/configurator-export-service.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { getTrimmedValue } = __require(\"shared/dom/dom-helpers.js\");\nconst { serializeSelectedToolStorageIds, parseSelectedToolStorageIds } = __require(\"features/toolstorage-selection/toolstorage-selection-service.js\");\nconst { logExportDebug } = __require(\"features/configurator/configurator-export-debug.js\");\nconst { openManualDownloadModal, openReadableExportFallback, triggerProgrammaticDownload } = __require(\"features/configurator/configurator-download-modal.js\");\nconst EXPORT_STRATEGY = Object.freeze({\n  FILE_PICKER: \"file-picker\",\n  PROGRAMMATIC_DOWNLOAD: \"programmatic-download\",\n  MANUAL_DOWNLOAD_MODAL: \"manual-download-modal\",\n  READABLE_PAGE_FALLBACK: \"readable-page-fallback\",\n});\n\nfunction supportsDownloadAttribute() {\n  try {\n    return typeof HTMLAnchorElement !== \"undefined\" && \"download\" in HTMLAnchorElement.prototype;\n  } catch {\n    return false;\n  }\n}\n\nfunction isProbablyIOS() {\n  try {\n    const ua = navigator.userAgent || \"\";\n    return /iPad|iPhone|iPod/i.test(ua);\n  } catch {\n    return false;\n  }\n}\n\nfunction isProbablyAndroid() {\n  try {\n    const ua = navigator.userAgent || \"\";\n    return /Android/i.test(ua);\n  } catch {\n    return false;\n  }\n}\n\nfunction isLikelyMobile() {\n  if (isProbablyIOS() || isProbablyAndroid()) return true;\n  try {\n    if (window.matchMedia?.(\"(pointer: coarse)\").matches) return true;\n  } catch {\n    // ignore\n  }\n  return false;\n}\n\nfunction buildExportArtifacts(state) {\n  const payload = buildConfigPayload(state);\n  const json = JSON.stringify(payload, null, 2);\n  const fileName = `tengtools-tool-storage-configuration-${getTimestampForFilename()}.txt`;\n  const blob = new Blob([json], { type: \"text/plain;charset=utf-8\" });\n\n  return { blob, fileName, json };\n}\n\nfunction getExportEnvironment() {\n  const isIOS = isProbablyIOS();\n  const supportsDownload = supportsDownloadAttribute();\n\n  return {\n    isIOS,\n    isLikelyMobile: isLikelyMobile(),\n    showSaveFilePicker: \"showSaveFilePicker\" in window,\n    supportsDownloadAttribute: supportsDownload,\n    userActivation:\n      typeof navigator !== \"undefined\" && navigator.userActivation\n        ? { isActive: navigator.userActivation.isActive, hasBeenActive: navigator.userActivation.hasBeenActive }\n        : \"n/a\",\n  };\n}\n\nfunction chooseExportStrategy(environment) {\n  if (environment.showSaveFilePicker) return EXPORT_STRATEGY.FILE_PICKER;\n  if (environment.isIOS || !environment.supportsDownloadAttribute) {\n    return EXPORT_STRATEGY.READABLE_PAGE_FALLBACK;\n  }\n  if (environment.isLikelyMobile) return EXPORT_STRATEGY.MANUAL_DOWNLOAD_MODAL;\n  return EXPORT_STRATEGY.PROGRAMMATIC_DOWNLOAD;\n}\n\nasync function saveWithFilePicker({ blob, fileName }) {\n  try {\n    const handle = await window.showSaveFilePicker({\n      suggestedName: fileName,\n      excludeAcceptAllOption: true,\n      types: [\n        {\n          description: t(\"configurationExportTxt\", \"Configuration export (.txt)\"),\n          accept: {\n            \"text/plain\": [\".txt\"],\n          },\n        },\n      ],\n    });\n\n    const writable = await handle.createWritable();\n    await writable.write(blob);\n    await writable.close();\n\n    if (typeof handle.getFile === \"function\") {\n      try {\n        const saved = await handle.getFile();\n        logExportDebug(\"saved.size\", saved?.size);\n      } catch (err) {\n        logExportDebug(\"handle.getFile failed\", err);\n      }\n    }\n\n    return true;\n  } catch (err) {\n    if (err.name !== \"AbortError\") {\n      console.error(t(\"failedToSaveFile\", \"Failed to save file:\"), err);\n    }\n    return true;\n  }\n}\n\nfunction buildConfigPayload(state) {\n  const selectedToolStorageIds = parseSelectedToolStorageIds(getTrimmedValue(\"toolstorageInput\"));\n  const serializedToolStorageIds = serializeSelectedToolStorageIds(selectedToolStorageIds);\n\n  const drawers = (state.currentDrawers || []).map((drawer) => {\n    const orderedPlacements = (drawer.placements || [])\n      .slice()\n      .sort((a, b) => (a.y - b.y) || (a.x - b.x));\n\n    return {\n      drawerIndex: drawer.drawerIndex,\n      locked: Boolean(drawer.locked),\n      sets: orderedPlacements.map((placement) => ({\n        itemId: placement.set?.itemId || \"\",\n        x: placement.x,\n        y: placement.y,\n        width: placement.width,\n        depth: placement.depth,\n      })),\n    };\n  });\n\n  return {\n    toolstorageIds: serializedToolStorageIds,\n    toolstorageId: selectedToolStorageIds[0] || \"\",\n    toolsetIds: document.getElementById(\"toolsetsInput\").value,\n    version: 3,\n    savedAt: new Date().toISOString(),\n    drawers,\n  };\n}\n\nfunction getTimestampForFilename() {\n  const pad = (value) => String(value).padStart(2, \"0\");\n  const now = new Date();\n  const yyyy = now.getFullYear();\n  const mm = pad(now.getMonth() + 1);\n  const dd = pad(now.getDate());\n  const hh = pad(now.getHours());\n  const min = pad(now.getMinutes());\n  const ss = pad(now.getSeconds());\n  return `${yyyy}${mm}${dd}-${hh}${min}${ss}`;\n}\n\nfunction handlePrintToPdf() {\n  window.print();\n}\n\nasync function handleSaveToJson(state) {\n  const exportArtifacts = buildExportArtifacts(state);\n  const environment = getExportEnvironment();\n  const strategy = EXPORT_STRATEGY.MANUAL_DOWNLOAD_MODAL;\n\n  logExportDebug(\n    \"strategy\",\n    strategy,\n    \"json.length\",\n    exportArtifacts.json.length,\n    \"blob.size\",\n    exportArtifacts.blob.size,\n    \"fileName\",\n    exportArtifacts.fileName,\n  );\n  logExportDebug(\n    \"downloadAttr\",\n    environment.supportsDownloadAttribute,\n    \"isIOS\",\n    environment.isIOS,\n    \"userActivation\",\n    environment.userActivation,\n  );\n\n  switch (strategy) {\n    case EXPORT_STRATEGY.FILE_PICKER:\n      await saveWithFilePicker(exportArtifacts);\n      return;\n    case EXPORT_STRATEGY.MANUAL_DOWNLOAD_MODAL:\n      openManualDownloadModal(exportArtifacts);\n      return;\n    case EXPORT_STRATEGY.READABLE_PAGE_FALLBACK:\n      openReadableExportFallback(exportArtifacts);\n      return;\n    case EXPORT_STRATEGY.PROGRAMMATIC_DOWNLOAD:\n      triggerProgrammaticDownload(exportArtifacts);\n      return;\n    default:\n      openReadableExportFallback(exportArtifacts);\n  }\n}\n\nexports.handleSaveToJson = handleSaveToJson;\nexports.buildConfigPayload = buildConfigPayload;\nexports.handlePrintToPdf = handlePrintToPdf;\n});\n\n__define(\"features/configurator/configurator-export-table-modal.js\", (exports, __require) => {\nconst { getTrimmedValue } = __require(\"shared/dom/dom-helpers.js\");\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { cleanString, uniquePreserveOrder } = __require(\"shared/utils/string-utils.js\");\nconst { parseSelectedToolStorageIds, resolveSelectedToolStorages } = __require(\"features/toolstorage-selection/toolstorage-selection-service.js\");\nfunction parseMultilineIds(value) {\n  return cleanString(value)\n    .split(/\\r?\\n/)\n    .map(cleanString)\n    .filter(Boolean);\n}\n\nfunction openExportTableModal(state) {\n  const modal = document.getElementById(\"exportTableModal\");\n  const textarea = document.getElementById(\"exportTableText\");\n  const status = document.getElementById(\"exportTableStatus\");\n  if (!modal || !textarea) return;\n\n  textarea.value = buildExportTableText(state);\n  if (status) status.textContent = \"\";\n\n  modal.classList.remove(\"hidden\");\n  modal.classList.add(\"flex\");\n  textarea.focus();\n  textarea.select();\n}\n\nfunction closeExportTableModal() {\n  const modal = document.getElementById(\"exportTableModal\");\n  if (!modal) return;\n  modal.classList.add(\"hidden\");\n  modal.classList.remove(\"flex\");\n}\n\nfunction wireExportTableModal() {\n  const modal = document.getElementById(\"exportTableModal\");\n  if (!modal) return;\n\n  modal.addEventListener(\"click\", (event) => {\n    if (event.target === modal) closeExportTableModal();\n  });\n}\n\nasync function copyExportTable() {\n  const textarea = document.getElementById(\"exportTableText\");\n  const status = document.getElementById(\"exportTableStatus\");\n  if (!textarea) return;\n\n  const text = textarea.value;\n  try {\n    if (navigator.clipboard?.writeText) {\n      await navigator.clipboard.writeText(text);\n    } else {\n      textarea.focus();\n      textarea.select();\n      document.execCommand(\"copy\");\n    }\n    if (status) status.textContent = t(\"copied\", \"Copied.\");\n  } catch {\n    if (status) status.textContent = t(\"copyFailedSelectManually\", \"Copy failed. Select and copy manually.\");\n  }\n}\n\nfunction buildExportTableText(state) {\n  const rows = [[\n    t(\"exportHeadingItemId\", \"ItemId\"),\n    t(\"exportHeadingDescription\", \"Description\"),\n    t(\"exportHeadingDrawerIndex\", \"DrawerIndex\"),\n    t(\"exportHeadingCount\", \"Count\"),\n  ]];\n\n  const drawerIndicesByItemId = new Map();\n  (state.currentDrawers || []).forEach((drawer) => {\n    (drawer.placements || []).forEach((placement) => {\n      const itemId = placement && placement.set ? placement.set.itemId : \"\";\n      if (!itemId) return;\n\n      const indices = drawerIndicesByItemId.get(itemId);\n      if (indices) {\n        if (!indices.includes(drawer.drawerIndex)) indices.push(drawer.drawerIndex);\n      } else {\n        drawerIndicesByItemId.set(itemId, [drawer.drawerIndex]);\n      }\n    });\n  });\n\n  const selectedToolStorages = resolveSelectedToolStorages(\n    parseSelectedToolStorageIds(getTrimmedValue(\"toolstorageInput\")),\n    state.toolStorageMap,\n  );\n  selectedToolStorages.forEach((toolstorage) => {\n    rows.push([toolstorage.itemId, toolstorage.description || \"\", \"\", 1]);\n  });\n\n  const textarea = document.getElementById(\"toolsetsInput\");\n  const rawSetIds = parseMultilineIds(textarea ? textarea.value : \"\");\n  const countsById = rawSetIds.reduce((map, id) => {\n    map.set(id, (map.get(id) || 0) + 1);\n    return map;\n  }, new Map());\n\n  const uniqueSetIds = uniquePreserveOrder(rawSetIds);\n  uniqueSetIds.forEach((setId) => {\n    const set = state.toolSetMap.get(setId);\n    const count = countsById.get(setId) || 0;\n    if (set) {\n      const drawerIndices = (drawerIndicesByItemId.get(set.itemId) || []).slice().sort((a, b) => a - b);\n      const drawerText = drawerIndices.length ? drawerIndices.join(\",\") : t(\"unplaced\", \"Unplaced\");\n      rows.push([set.itemId, set.description || \"\", drawerText, count]);\n    } else {\n      rows.push([setId, t(\"notFound\", \"Not found\"), \"\", count]);\n    }\n  });\n\n  return rows.map((row) => row.map(sanitizeSpreadsheetCell).join(\"\\t\")).join(\"\\n\");\n}\n\nfunction sanitizeSpreadsheetCell(value) {\n  return String(value ?? \"\").replace(/[\\t\\r\\n]+/g, \" \").trim();\n}\n\nexports.copyExportTable = copyExportTable;\nexports.openExportTableModal = openExportTableModal;\nexports.closeExportTableModal = closeExportTableModal;\nexports.wireExportTableModal = wireExportTableModal;\n});\n\n__define(\"features/configurator/configurator-import-service.js\", (exports, __require) => {\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { updateCatalogButtons, updateToolstoragePreviewFromInput } = __require(\"features/catalog/catalog-selection.js\");\nconst { updateToolSetCatalogFitBorders } = __require(\"features/catalog/toolset-catalog-view.js\");\nconst { fitSetsIntoDrawers } = __require(\"features/drawer-layout/drawer-fit-service.js\");\nconst { buildDrawersForStorages, resolveSelectedSets } = __require(\"features/drawer-layout/drawer-layout-service.js\");\nconst { renderConfiguration, renderSelectedToolstorage } = __require(\"features/drawer-layout/drawer-renderer.js\");\nconst { buildToolStorageSelectionKey, parseSelectedToolStorageIds, resolveSelectedToolStorages, validateToolStorageSelection } = __require(\"features/toolstorage-selection/toolstorage-selection-service.js\");\nconst { logImportDebug } = __require(\"features/configurator/configurator-export-debug.js\");\nconst { restoreSavedLayout } = __require(\"features/configurator/configurator-saved-layout-restore-service.js\");\nfunction parseMultilineIds(value) {\n  return cleanString(value)\n    .split(/\\r?\\n/)\n    .map(cleanString)\n    .filter(Boolean);\n}\n\nfunction handleLoadFromJson(state) {\n  const input = getJsonFileInput(state);\n  if (!input) return;\n  input.value = \"\";\n  input.click();\n}\n\nfunction applyImportedConfiguration(state, parsed) {\n  const validationError = validateImportedConfiguration(parsed);\n  if (validationError) {\n    alert(validationError);\n    return false;\n  }\n\n  const toolstorageIds = typeof parsed.toolstorageIds === \"string\"\n    ? parsed.toolstorageIds\n    : typeof parsed.toolstorageId === \"string\"\n      ? parsed.toolstorageId\n      : \"\";\n  const toolsetIds = typeof parsed.toolsetIds === \"string\" ? parsed.toolsetIds : \"\";\n\n  const toolstorageInput = document.getElementById(\"toolstorageInput\");\n  const toolsetsInput = document.getElementById(\"toolsetsInput\");\n  if (toolstorageInput) {\n    toolstorageInput.value = toolstorageIds;\n    toolstorageInput.setAttribute(\"value\", toolstorageIds);\n  }\n  if (toolsetsInput) toolsetsInput.value = toolsetIds;\n\n  updateToolstoragePreviewFromInput(state, toolstorageIds, { onPreviewChanged: renderSelectedToolstorage });\n  updateCatalogButtons();\n\n  const selectedStorages = resolveSelectedToolStorages(\n    parseSelectedToolStorageIds(toolstorageIds),\n    state.toolStorageMap,\n  );\n  const selectionValidation = validateToolStorageSelection(selectedStorages);\n  if (!selectionValidation.valid) {\n    alert(selectionValidation.message || t(\"invalidToolStorageSelection\", \"This storage selection is not allowed.\"));\n    return false;\n  }\n\n  let restored = false;\n  if (Array.isArray(parsed.drawers) && parsed.drawers.length) {\n    restored = restoreSavedLayout(state, parsed, toolstorageIds, toolsetIds, selectedStorages);\n    if (restored) {\n      renderConfiguration(state.currentDrawers, state.currentUnplacedSets, state.currentErrors);\n      updateToolSetCatalogFitBorders(state);\n    }\n  }\n\n  if (!restored) {\n    if (!selectedStorages.length) return false;\n\n    const manualSetIds = parseMultilineIds(toolsetIds);\n    const selectedSets = resolveSelectedSets(manualSetIds, state.toolSets);\n    const drawers = buildDrawersForStorages(selectedStorages);\n    const selectionKey = buildToolStorageSelectionKey(selectedStorages);\n\n    if (!drawers.length) {\n      state.currentDrawers = [];\n      state.currentUnplacedSets = selectedSets;\n      state.currentErrors = [];\n      state.currentToolstorageSelectionKey = selectionKey;\n      renderConfiguration(state.currentDrawers, state.currentUnplacedSets, state.currentErrors);\n      updateToolSetCatalogFitBorders(state);\n      return true;\n    }\n\n    const result = fitSetsIntoDrawers(drawers, selectedSets);\n    state.currentDrawers = result.drawers;\n    state.currentUnplacedSets = result.unplacedSets;\n    state.currentErrors = result.errors;\n    state.currentToolstorageSelectionKey = selectionKey;\n    renderConfiguration(state.currentDrawers, state.currentUnplacedSets, state.currentErrors);\n    updateToolSetCatalogFitBorders(state);\n  }\n\n  return true;\n}\n\nfunction getJsonFileInput(state) {\n  let input = document.getElementById(\"configJsonFileInput\");\n  if (input) return input;\n\n  input = document.createElement(\"input\");\n  input.type = \"file\";\n  input.id = \"configJsonFileInput\";\n  input.accept = \".txt,text/plain,.json,application/json\";\n  input.style.display = \"none\";\n\n  input.addEventListener(\"change\", () => {\n    const file = input.files && input.files[0];\n    if (!file) return;\n\n    logImportDebug(\"selected file\", { name: file.name, type: file.type, size: file.size });\n\n    const reader = new FileReader();\n    reader.onload = () => {\n      try {\n        const raw = String(reader.result || \"\");\n        logImportDebug(\"reader.result.length\", raw.length);\n        const parsed = JSON.parse(raw);\n        applyImportedConfiguration(state, parsed);\n      } catch (err) {\n        console.error(err);\n        const detailPrefix = t(\"detailsPrefix\", \" Details:\");\n        const detail = err instanceof Error && err.message ? `${detailPrefix} ${err.message}` : \"\";\n        alert(\n          `${t(\"invalidConfigurationExportSelectTxt\", \"Invalid configuration export. Please select a .txt file containing JSON exported from this configurator.\")}${detail}`,\n        );\n      }\n    };\n    reader.onerror = () => {\n      alert(t(\"failedToReadSelectedFile\", \"Failed to read the selected file.\"));\n    };\n    reader.readAsText(file);\n  });\n\n  document.body.appendChild(input);\n  return input;\n}\n\nfunction validateImportedConfiguration(parsed) {\n  if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n    return t(\"invalidExportExpectedJsonObject\", \"Invalid configuration export: expected a JSON object.\");\n  }\n\n  const hasToolstorageIds = typeof parsed.toolstorageIds === \"string\";\n  const hasLegacyToolstorageId = typeof parsed.toolstorageId === \"string\";\n\n  if (!hasToolstorageIds && !hasLegacyToolstorageId) {\n    return t(\"invalidExportToolstorageIds\", \"Invalid configuration export: missing or invalid 'toolstorageIds' (expected a string).\");\n  }\n\n  if (typeof parsed.toolsetIds !== \"string\") {\n    return t(\"invalidExportToolsetIds\", \"Invalid configuration export: missing or invalid 'toolsetIds' (expected a string).\");\n  }\n\n  if (\"version\" in parsed && typeof parsed.version !== \"number\") {\n    return t(\"invalidExportVersion\", \"Invalid configuration export: invalid 'version' (expected a number).\");\n  }\n\n  if (\"savedAt\" in parsed && typeof parsed.savedAt !== \"string\") {\n    return t(\"invalidExportSavedAt\", \"Invalid configuration export: invalid 'savedAt' (expected an ISO timestamp string).\");\n  }\n\n  if (\"drawers\" in parsed && !Array.isArray(parsed.drawers)) {\n    return t(\"invalidExportDrawers\", \"Invalid configuration export: invalid 'drawers' (expected an array).\");\n  }\n\n  if (Array.isArray(parsed.drawers)) {\n    for (const drawer of parsed.drawers) {\n      if (!drawer || typeof drawer !== \"object\" || Array.isArray(drawer)) {\n        return t(\"invalidExportDrawerObject\", \"Invalid configuration export: each drawer must be an object.\");\n      }\n\n      if (!(\"drawerIndex\" in drawer)) {\n        return t(\"invalidExportDrawerIndex\", \"Invalid configuration export: a drawer is missing 'drawerIndex'.\");\n      }\n\n      if (\"locked\" in drawer && typeof drawer.locked !== \"boolean\") {\n        return t(\"invalidExportDrawerLocked\", \"Invalid configuration export: a drawer has invalid 'locked' (expected a boolean).\");\n      }\n\n      if (\"sets\" in drawer && !Array.isArray(drawer.sets)) {\n        return t(\"invalidExportDrawerSets\", \"Invalid configuration export: a drawer has invalid 'sets' (expected an array).\");\n      }\n    }\n  }\n\n  return null;\n}\n\nexports.handleLoadFromJson = handleLoadFromJson;\nexports.applyImportedConfiguration = applyImportedConfiguration;\n});\n\n__define(\"features/configurator/configurator-layout-reconcile.js\", (exports, __require) => {\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nconst { buildDrawersForStorage } = __require(\"features/drawer-layout/drawer-layout-service.js\");\nfunction getSelectedStorageIdsFromDrawers(drawers) {\n  const seen = new Set();\n  const ids = [];\n\n  (drawers || []).forEach((drawer) => {\n    const itemId = cleanString(drawer?.storageItemId);\n    if (!itemId || seen.has(itemId)) return;\n    seen.add(itemId);\n    ids.push(itemId);\n  });\n\n  return ids;\n}\n\nfunction canReconcileStoragesWithExistingLayout(currentDrawers, nextStorages) {\n  if (!Array.isArray(currentDrawers) || !currentDrawers.length) return false;\n\n  const currentStorageIds = getSelectedStorageIdsFromDrawers(currentDrawers);\n  const nextStorageIds = nextStorages.map((storage) => storage.itemId);\n\n  if (currentStorageIds.length >= nextStorageIds.length) return false;\n\n  return currentStorageIds.every((itemId) => nextStorageIds.includes(itemId));\n}\n\nfunction reconcileDrawersWithSelectedStorages(currentDrawers, nextStorages) {\n  const totalSelectionCount = nextStorages.length;\n  const existingDrawersByKey = new Map(\n    (currentDrawers || []).map((drawer) => [\n      `${cleanString(drawer.storageItemId)}::${Number(drawer.storageLocalDrawerIndex) || 0}`,\n      drawer,\n    ]),\n  );\n\n  let nextDrawerIndex = 1;\n\n  return nextStorages.flatMap((storage) =>\n    buildDrawersForStorage(storage).map((baseDrawer, localIndex) => {\n      const storageLocalDrawerIndex = localIndex + 1;\n      const existingDrawer = existingDrawersByKey.get(\n        `${cleanString(storage.itemId)}::${storageLocalDrawerIndex}`,\n      );\n\n      if (existingDrawer) {\n        return {\n          ...existingDrawer,\n          drawerIndex: nextDrawerIndex++,\n          storageItemId: storage.itemId,\n          storageDescription: storage.description || \"\",\n          storageProductType: storage.productType || \"\",\n          storageLocalDrawerIndex,\n          storageSelectionCount: totalSelectionCount,\n        };\n      }\n\n      return {\n        ...baseDrawer,\n        drawerIndex: nextDrawerIndex++,\n        storageItemId: storage.itemId,\n        storageDescription: storage.description || \"\",\n        storageProductType: storage.productType || \"\",\n        storageLocalDrawerIndex,\n        storageSelectionCount: totalSelectionCount,\n      };\n    }),\n  );\n}\n\nexports.canReconcileStoragesWithExistingLayout = canReconcileStoragesWithExistingLayout;\nexports.reconcileDrawersWithSelectedStorages = reconcileDrawersWithSelectedStorages;\n});\n\n__define(\"features/configurator/configurator-persistence.js\", (exports, __require) => {\nconst __reexported_module_0 = __require(\"features/configurator/configurator-export-service.js\");\nexports.handlePrintToPdf = __reexported_module_0.handlePrintToPdf;\nexports.handleSaveToJson = __reexported_module_0.handleSaveToJson;\nconst __reexported_module_1 = __require(\"features/configurator/configurator-import-service.js\");\nexports.handleLoadFromJson = __reexported_module_1.handleLoadFromJson;\nexports.applyImportedConfiguration = __reexported_module_1.applyImportedConfiguration;\nconst __reexported_module_2 = __require(\"features/configurator/configurator-export-table-modal.js\");\nexports.openExportTableModal = __reexported_module_2.openExportTableModal;\nexports.closeExportTableModal = __reexported_module_2.closeExportTableModal;\nexports.wireExportTableModal = __reexported_module_2.wireExportTableModal;\nexports.copyExportTable = __reexported_module_2.copyExportTable;\n});\n\n__define(\"features/configurator/configurator-saved-layout-restore-service.js\", (exports, __require) => {\nconst { toInt, toNumber } = __require(\"shared/utils/number-utils.js\");\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nconst { buildToolStorageSelectionKey } = __require(\"features/toolstorage-selection/toolstorage-selection-service.js\");\nconst { buildDrawersForStorages, resolveSelectedSets } = __require(\"features/drawer-layout/drawer-layout-service.js\");\nfunction parseMultilineIds(value) {\n  return cleanString(value)\n    .split(/\\r?\\n/)\n    .map(cleanString)\n    .filter(Boolean);\n}\n\nfunction restoreSavedLayout(state, parsed, toolstorageIds, toolsetIds, selectedStorages) {\n  if (!selectedStorages.length) return false;\n\n  const drawers = buildDrawersForStorages(selectedStorages);\n  const setMap = state.toolSetMap;\n  const placedCounts = new Map();\n\n  parsed.drawers.forEach((savedDrawer) => {\n    const drawerIndex = toInt(savedDrawer.drawerIndex);\n    const drawer = drawers.find((d) => d.drawerIndex === drawerIndex);\n    if (!drawer) return;\n    drawer.locked = Boolean(savedDrawer.locked);\n\n    const savedSets = Array.isArray(savedDrawer.sets) ? savedDrawer.sets : [];\n    savedSets.forEach((entry) => {\n      const setId = cleanString(entry.itemId);\n      const set = setMap.get(setId);\n      if (!set) return;\n\n      drawer.sets.push(set);\n      drawer.placements.push({\n        set,\n        x: toNumber(entry.x),\n        y: toNumber(entry.y),\n        width: toNumber(entry.width) || set.setWidth || 0,\n        depth: toNumber(entry.depth) || set.setDepth || 0,\n      });\n      placedCounts.set(setId, (placedCounts.get(setId) || 0) + 1);\n    });\n  });\n\n  const selectedIds = parseMultilineIds(toolsetIds);\n  const selectedSets = resolveSelectedSets(selectedIds, state.toolSets);\n  const desiredCounts = selectedSets.reduce((map, set) => {\n    const itemId = set?.itemId || \"\";\n    if (!itemId) return map;\n    map.set(itemId, (map.get(itemId) || 0) + 1);\n    return map;\n  }, new Map());\n\n  const remainingCounts = new Map(desiredCounts);\n  placedCounts.forEach((placed, itemId) => {\n    const want = remainingCounts.get(itemId) || 0;\n    remainingCounts.set(itemId, Math.max(0, want - placed));\n  });\n\n  const unplacedSets = [];\n  selectedSets.forEach((set) => {\n    const itemId = set?.itemId || \"\";\n    const remaining = remainingCounts.get(itemId) || 0;\n    if (remaining <= 0) return;\n    unplacedSets.push(set);\n    remainingCounts.set(itemId, remaining - 1);\n  });\n\n  state.currentDrawers = drawers;\n  state.currentUnplacedSets = unplacedSets;\n  state.currentErrors = [];\n  state.currentToolstorageSelectionKey = buildToolStorageSelectionKey(selectedStorages);\n\n  return true;\n}\n\nexports.restoreSavedLayout = restoreSavedLayout;\n});\n\n__define(\"features/configurator/configurator-state.js\", (exports, __require) => {\nfunction createConfiguratorState() {\n  return {\n    toolStorages: [],\n    toolSets: [],\n    toolStorageMap: new Map(),\n    toolSetMap: new Map(),\n    currentDrawers: [],\n    currentUnplacedSets: [],\n    currentErrors: [],\n    currentToolstorageSelectionKey: \"\",\n  };\n}\n\nfunction createDragState() {\n  return {\n    active: false,\n    setId: \"\",\n    sourceDrawerIndex: null,\n    sourceRect: null,\n    offsetX: 0,\n    offsetY: 0,\n    pointerId: null,\n  };\n}\n\nexports.createConfiguratorState = createConfiguratorState;\nexports.createDragState = createDragState;\n});\n\n__define(\"features/configurator/configurator-ui-wiring.js\", (exports, __require) => {\nfunction wirePrintDetailsOpen() {\n  let previouslyClosed = null;\n\n  const openAll = () => {\n    if (previouslyClosed) return;\n\n    previouslyClosed = [];\n    document.querySelectorAll(\"details\").forEach((detail) => {\n      if (detail.hasAttribute(\"open\")) return;\n      previouslyClosed.push(detail);\n      detail.setAttribute(\"open\", \"\");\n    });\n  };\n\n  const restore = () => {\n    if (!previouslyClosed) return;\n\n    previouslyClosed.forEach((detail) => {\n      if (!document.contains(detail)) return;\n      detail.removeAttribute(\"open\");\n    });\n    previouslyClosed = null;\n  };\n\n  window.addEventListener(\"beforeprint\", openAll);\n  window.addEventListener(\"afterprint\", restore);\n\n  if (window.matchMedia) {\n    const media = window.matchMedia(\"print\");\n    const handler = (event) => {\n      if (event.matches) openAll();\n      else restore();\n    };\n\n    if (typeof media.addEventListener === \"function\") {\n      media.addEventListener(\"change\", handler);\n    } else if (typeof media.addListener === \"function\") {\n      media.addListener(handler);\n    }\n  }\n}\n\nfunction wireOutsideDetailsClose() {\n  document.addEventListener(\"click\", (event) => {\n    const productModal = document.getElementById(\"productDetailModal\");\n    if (productModal && productModal.contains(event.target)) return;\n    if (event.target.closest(\"details\")) return;\n    document.querySelectorAll(\"details.z-10[open]\").forEach((detail) => {\n      detail.removeAttribute(\"open\");\n    });\n  });\n}\n\nfunction wireDismissibleHint() {\n  document.addEventListener(\"click\", (event) => {\n    const dismissButton = event.target.closest(\"[data-action=\\\"dismiss-configurator-hint\\\"]\");\n    if (!dismissButton) return;\n\n    const container = dismissButton.closest(\"[data-dismissible=\\\"configurator-hint\\\"]\");\n    container?.remove();\n  });\n}\n\nexports.wirePrintDetailsOpen = wirePrintDetailsOpen;\nexports.wireOutsideDetailsClose = wireOutsideDetailsClose;\nexports.wireDismissibleHint = wireDismissibleHint;\n});\n\n__define(\"features/drawer-layout/drawer-drag-drop-mutations.js\", (exports, __require) => {\nconst { toInt } = __require(\"shared/utils/number-utils.js\");\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nfunction parseMultilineIds(value) {\n  return cleanString(value)\n    .split(/\\r?\\n/)\n    .map(cleanString)\n    .filter(Boolean);\n}\n\nfunction startDragFromTile(state, dragState, tile, clientX, clientY) {\n  const setId = cleanString(tile.dataset.setId);\n  const drawerIndex = toInt(tile.dataset.drawerIndex);\n  if (!setId || !drawerIndex) return false;\n\n  const drawer = findDrawerByIndex(state, drawerIndex);\n  if (drawer?.locked) return false;\n  const placement = drawer ? findPlacement(drawer, setId, tile) : null;\n  if (!placement) return false;\n\n  dragState.active = true;\n  dragState.setId = setId;\n  dragState.sourceDrawerIndex = drawerIndex;\n  dragState.sourceRect = {\n    x: placement.x,\n    y: placement.y,\n    width: placement.width,\n    height: placement.depth,\n  };\n\n  const rect = tile.getBoundingClientRect();\n  dragState.offsetX = clientX - rect.left;\n  dragState.offsetY = clientY - rect.top;\n  return true;\n}\n\nfunction resetDragState(dragState) {\n  dragState.active = false;\n  dragState.setId = \"\";\n  dragState.sourceDrawerIndex = null;\n  dragState.sourceRect = null;\n  dragState.offsetX = 0;\n  dragState.offsetY = 0;\n  dragState.pointerId = null;\n}\n\nfunction findDrawerByIndex(state, drawerIndex) {\n  return state.currentDrawers.find((drawer) => drawer.drawerIndex === drawerIndex) || null;\n}\n\nfunction getSetById(state, setId) {\n  return state.toolSetMap.get(setId) || null;\n}\n\nfunction getPointerInDrawer(event, dropzone, drawer) {\n  const rect = dropzone.getBoundingClientRect();\n  const usableWidth = drawer.drawerUsableWidth || 0;\n  const usableDepth = drawer.drawerUsableDepth || 0;\n  const rawX = rect.width > 0 ? (event.clientX - rect.left) / rect.width : 0;\n  const rawY = rect.height > 0 ? (event.clientY - rect.top) / rect.height : 0;\n\n  return {\n    x: clamp(rawX * usableWidth, 0, usableWidth),\n    y: clamp(rawY * usableDepth, 0, usableDepth),\n  };\n}\n\nfunction placeSetAtRect(state, dragState, set, targetDrawerIndex, freeRect) {\n  const targetDrawer = findDrawerByIndex(state, targetDrawerIndex);\n  if (!targetDrawer) return;\n\n  const placement = {\n    set,\n    x: freeRect.x,\n    y: freeRect.y,\n    width: set.setWidth || 0,\n    depth: set.setDepth || 0,\n  };\n\n  const sourceDrawer = dragState.sourceDrawerIndex ? findDrawerByIndex(state, dragState.sourceDrawerIndex) : null;\n\n  if (sourceDrawer) {\n    removeOnePlacement(sourceDrawer, set.itemId, dragState.sourceRect);\n    removeOneSetInstance(sourceDrawer, set.itemId);\n  }\n\n  targetDrawer.sets = (targetDrawer.sets || []).concat(set);\n  targetDrawer.placements = (targetDrawer.placements || []).concat(placement);\n}\n\nfunction removeTileFromLayout(state, tile) {\n  if (!tile) return;\n\n  const setId = cleanString(tile.getAttribute(\"data-set-id\"));\n  const drawerIndex = toInt(tile.getAttribute(\"data-drawer-index\") || tile.dataset.drawerIndex);\n  if (!setId || !drawerIndex) return;\n\n  const drawer = findDrawerByIndex(state, drawerIndex);\n  if (!drawer) return;\n\n  const sourceRect = getTileRect(tile);\n  removeOnePlacement(drawer, setId, sourceRect);\n  removeOneSetInstance(drawer, setId);\n}\n\nfunction removeSetFromSelectionInput(setId) {\n  const textarea = document.getElementById(\"toolsetsInput\");\n  if (!textarea) return;\n\n  const ids = parseMultilineIds(textarea.value);\n  const index = ids.indexOf(setId);\n  if (index === -1) return;\n\n  ids.splice(index, 1);\n  textarea.value = ids.join(\"\\n\");\n}\n\nfunction toggleDrawerLock(state, drawerIndex) {\n  const drawer = findDrawerByIndex(state, drawerIndex);\n  if (!drawer) return false;\n  drawer.locked = !drawer.locked;\n  return true;\n}\n\nfunction findPlacement(drawer, setId, tile) {\n  const placements = (drawer.placements || []).filter((placement) => placement.set && placement.set.itemId === setId);\n  if (!placements.length) return null;\n\n  const rect = getTileRect(tile);\n  if (!rect) return placements[0];\n\n  return placements.find((placement) => rectMatchesPlacement(placement, rect)) || placements[0];\n}\n\nfunction getTileRect(tile) {\n  if (!tile) return null;\n  const x = Number(tile.getAttribute(\"data-x\") || tile.dataset.x);\n  const y = Number(tile.getAttribute(\"data-y\") || tile.dataset.y);\n  const width = Number(tile.getAttribute(\"data-width\") || tile.dataset.width);\n  const height = Number(tile.getAttribute(\"data-depth\") || tile.dataset.depth);\n  if (!Number.isFinite(x) || !Number.isFinite(y) || !Number.isFinite(width) || !Number.isFinite(height)) return null;\n  return { x, y, width, height };\n}\n\nfunction nearlyEqual(a, b, epsilon = 0.001) {\n  return Math.abs((a || 0) - (b || 0)) <= epsilon;\n}\n\nfunction rectMatchesPlacement(placement, rect) {\n  return (\n    nearlyEqual(placement.x, rect.x) &&\n    nearlyEqual(placement.y, rect.y) &&\n    nearlyEqual(placement.width, rect.width) &&\n    nearlyEqual(placement.depth, rect.height)\n  );\n}\n\nfunction removeOnePlacement(drawer, setId, rect) {\n  const placements = (drawer.placements || []).slice();\n  let index = -1;\n\n  if (rect) {\n    index = placements.findIndex((placement) => placement?.set?.itemId === setId && rectMatchesPlacement(placement, rect));\n  }\n  if (index === -1) {\n    index = placements.findIndex((placement) => placement?.set?.itemId === setId);\n  }\n  if (index === -1) return;\n\n  placements.splice(index, 1);\n  drawer.placements = placements;\n}\n\nfunction removeOneSetInstance(drawer, setId) {\n  const sets = (drawer.sets || []).slice();\n  const index = sets.findIndex((set) => set && set.itemId === setId);\n  if (index === -1) return;\n\n  sets.splice(index, 1);\n  drawer.sets = sets;\n}\n\nfunction clamp(value, min, max) {\n  return Math.min(max, Math.max(min, value));\n}\n\nexports.startDragFromTile = startDragFromTile;\nexports.resetDragState = resetDragState;\nexports.findDrawerByIndex = findDrawerByIndex;\nexports.getSetById = getSetById;\nexports.getPointerInDrawer = getPointerInDrawer;\nexports.placeSetAtRect = placeSetAtRect;\nexports.removeTileFromLayout = removeTileFromLayout;\nexports.removeSetFromSelectionInput = removeSetFromSelectionInput;\nexports.toggleDrawerLock = toggleDrawerLock;\n});\n\n__define(\"features/drawer-layout/drawer-drag-drop.js\", (exports, __require) => {\nconst { toInt } = __require(\"shared/utils/number-utils.js\");\nconst { getValidFreeRectangles, pickTargetRect } = __require(\"features/drawer-layout/maxrects-service.js\");\nconst { renderConfiguration } = __require(\"features/drawer-layout/drawer-renderer.js\");\nconst { updateToolSetCatalogFitBorders } = __require(\"features/catalog/toolset-catalog-view.js\");\nconst { canDrawerAcceptSetWeight } = __require(\"features/drawer-layout/drawer-weight-service.js\");\nconst { findDrawerByIndex, getPointerInDrawer, getSetById, placeSetAtRect, removeSetFromSelectionInput, removeTileFromLayout, resetDragState, startDragFromTile, toggleDrawerLock } = __require(\"features/drawer-layout/drawer-drag-drop-mutations.js\");\nconst { clearAllDropOverlays, clearDropOverlay, renderDropOverlays, renderHeightMismatchOverlay } = __require(\"features/drawer-layout/drawer-drop-overlay-renderer.js\");\nfunction wireDragAndDrop(state, dragState, { onSelectionChanged } = {}) {\n  const container = document.getElementById(\"recommendationsGrid\");\n  if (!container) return;\n\n  container.addEventListener(\"click\", (event) => {\n    if (handleToggleDrawerLock(event, state)) return;\n    handleRemoveFromTile(event, state, onSelectionChanged);\n  });\n  container.addEventListener(\"dragstart\", (event) => handleDragStart(event, state, dragState));\n  container.addEventListener(\"dragend\", () => handleDragEnd(dragState));\n  container.addEventListener(\"dragover\", (event) => handleDragOver(event, state, dragState));\n  container.addEventListener(\"dragleave\", handleDragLeave);\n  container.addEventListener(\"drop\", (event) => handleDrop(event, state, dragState));\n  container.addEventListener(\"pointerdown\", (event) => handlePointerDown(event, state, dragState));\n}\n\nfunction handleDragStart(event, state, dragState) {\n  if (dragState.pointerId !== null) { event.preventDefault(); return; }\n  if (event.target.closest(\"[data-action=\\\"remove-set\\\"]\")) return;\n  const tile = event.target.closest(\"[data-set-id][draggable=\\\"true\\\"]\");\n  if (!tile) return;\n\n  if (!startDragFromTile(state, dragState, tile, event.clientX, event.clientY)) return;\n\n  if (event.dataTransfer) {\n    event.dataTransfer.effectAllowed = \"move\";\n    event.dataTransfer.setData(\"text/plain\", dragState.setId);\n  }\n}\n\nfunction handleDragEnd(dragState) {\n  clearAllDropOverlays();\n  resetDragState(dragState);\n}\n\nfunction handleDragOver(event, state, dragState) {\n  if (!dragState.active) return;\n\n  const dropzone = event.target.closest(\"[data-dropzone=\\\"true\\\"]\");\n  if (!dropzone) {\n    clearAllDropOverlays();\n    return;\n  }\n\n  event.preventDefault();\n  handleDragOverAt(state, dragState, dropzone, event.clientX, event.clientY);\n}\n\nfunction handleDragLeave(event) {\n  const dropzone = event.target.closest(\"[data-dropzone=\\\"true\\\"]\");\n  if (!dropzone) return;\n  if (event.relatedTarget && dropzone.contains(event.relatedTarget)) return;\n  clearDropOverlay(dropzone);\n}\n\nfunction handleDrop(event, state, dragState) {\n  if (!dragState.active) return;\n\n  const dropzone = event.target.closest(\"[data-dropzone=\\\"true\\\"]\");\n  if (!dropzone) return;\n\n  event.preventDefault();\n  handleDropAt(state, dragState, dropzone, event.clientX, event.clientY);\n}\n\nfunction handlePointerDown(event, state, dragState) {\n  if (event.target.closest(\"[data-action=\\\"remove-set\\\"]\")) return;\n  const tile = event.target.closest(\"[data-set-id][draggable=\\\"true\\\"]\");\n  if (!tile) return;\n\n  event.preventDefault();\n\n  if (!startDragFromTile(state, dragState, tile, event.clientX, event.clientY)) return;\n  dragState.pointerId = event.pointerId;\n\n  tile.setPointerCapture?.(event.pointerId);\n  const onPointerMove = (moveEvent) => {\n    if (!dragState.active) return;\n    if (dragState.pointerId !== null && moveEvent.pointerId !== dragState.pointerId) return;\n\n    moveEvent.preventDefault();\n\n    const target = document.elementFromPoint(moveEvent.clientX, moveEvent.clientY);\n    const dropzone = target ? target.closest(\"[data-dropzone=\\\"true\\\"]\") : null;\n    if (!dropzone) {\n      clearAllDropOverlays();\n      return;\n    }\n\n    handleDragOverAt(state, dragState, dropzone, moveEvent.clientX, moveEvent.clientY);\n  };\n\n  const onPointerUp = (upEvent) => {\n    if (!dragState.active) return;\n    if (dragState.pointerId !== null && upEvent.pointerId !== dragState.pointerId) return;\n\n    const target = document.elementFromPoint(upEvent.clientX, upEvent.clientY);\n    const dropzone = target ? target.closest(\"[data-dropzone=\\\"true\\\"]\") : null;\n\n    const tapped = Math.hypot(upEvent.clientX-event.clientX,upEvent.clientY-event.clientY)<8;\n    if (upEvent.type === \"pointercancel\") { clearAllDropOverlays(); resetDragState(dragState); }\n    else if (tapped && window.matchMedia(\"(max-width:1099px), (pointer:coarse)\").matches) {\n      clearAllDropOverlays(); resetDragState(dragState);\n      document.dispatchEvent(new CustomEvent(\"ttcf:tile-tap\", {detail:{...tile.dataset}}));\n    } else if (dropzone) {\n      handleDropAt(state, dragState, dropzone, upEvent.clientX, upEvent.clientY);\n    } else {\n      clearAllDropOverlays();\n      resetDragState(dragState);\n    }\n\n    window.removeEventListener(\"pointermove\", onPointerMove);\n    window.removeEventListener(\"pointerup\", onPointerUp);\n    window.removeEventListener(\"pointercancel\", onPointerUp);\n  };\n\n  window.addEventListener(\"pointermove\", onPointerMove, { passive: false });\n  window.addEventListener(\"pointerup\", onPointerUp);\n  window.addEventListener(\"pointercancel\", onPointerUp);\n\n  onPointerMove(event);\n}\n\nfunction handleRemoveFromTile(event, state, onSelectionChanged) {\n  const button = event.target.closest(\"[data-action=\\\"remove-set\\\"]\");\n  if (!button) return;\n\n  event.preventDefault();\n  event.stopPropagation();\n\n  const tile = button.closest(\"[data-set-id]\");\n  const setId = tile ? tile.getAttribute(\"data-set-id\") : \"\";\n  if (!setId) return;\n\n  const drawerIndex = toInt(tile?.getAttribute(\"data-drawer-index\") || tile?.dataset.drawerIndex);\n  const drawer = findDrawerByIndex(state, drawerIndex);\n  if (drawer?.locked) return;\n\n  removeTileFromLayout(state, tile);\n  removeSetFromSelectionInput(setId);\n  onSelectionChanged?.();\n}\n\nfunction handleToggleDrawerLock(event, state) {\n  const button = event.target.closest(\"[data-action=\\\"locked-drawer\\\"], [data-action=\\\"unlocked-drawer\\\"]\");\n  if (!button) return false;\n\n  event.preventDefault();\n  event.stopPropagation();\n\n  const drawerIndex = toInt(button.getAttribute(\"data-drawer-index\") || button.dataset.drawerIndex);\n  if (!toggleDrawerLock(state, drawerIndex)) return true;\n\n  clearAllDropOverlays();\n  renderConfiguration(state.currentDrawers, state.currentUnplacedSets, state.currentErrors);\n  updateToolSetCatalogFitBorders(state);\n  return true;\n}\n\nfunction handleDragOverAt(state, dragState, dropzone, clientX, clientY) {\n  const drawerIndex = toInt(dropzone.dataset.drawerIndex);\n  const drawer = findDrawerByIndex(state, drawerIndex);\n  const set = getSetById(state, dragState.setId);\n\n  if (!drawer || !set) {\n    clearDropOverlay(dropzone);\n    return;\n  }\n\n  if (drawer.locked) {\n    clearDropOverlay(dropzone);\n    return;\n  }\n\n  if ((set.setHeight || 0) > (drawer.drawerHeight || 0)) {\n    renderHeightMismatchOverlay(dropzone, drawer, set);\n    return;\n  }\n\n  const excludePlacement = drawerIndex === dragState.sourceDrawerIndex\n    ? { ...dragState.sourceRect, itemId: dragState.setId }\n    : null;\n  if (!canDrawerAcceptSetWeight(drawer, set, { excludePlacement })) {\n    clearDropOverlay(dropzone);\n    return;\n  }\n\n  const validRects = getValidFreeRectangles(drawer, set, excludePlacement);\n  const pointer = getPointerInDrawer({ clientX, clientY }, dropzone, drawer);\n  const activeRect = pickTargetRect(validRects, pointer.x, pointer.y);\n\n  renderDropOverlays(dropzone, drawer, set, validRects, activeRect);\n}\n\nfunction handleDropAt(state, dragState, dropzone, clientX, clientY) {\n  const drawerIndex = toInt(dropzone.dataset.drawerIndex);\n  const drawer = findDrawerByIndex(state, drawerIndex);\n  const set = getSetById(state, dragState.setId);\n\n  if (!drawer || !set) {\n    clearDropOverlay(dropzone);\n    resetDragState(dragState);\n    return;\n  }\n\n  if (drawer.locked) {\n    clearDropOverlay(dropzone);\n    resetDragState(dragState);\n    return;\n  }\n\n  if ((set.setHeight || 0) > (drawer.drawerHeight || 0)) {\n    renderHeightMismatchOverlay(dropzone, drawer, set);\n    resetDragState(dragState);\n    return;\n  }\n\n  const excludePlacement = drawerIndex === dragState.sourceDrawerIndex\n    ? { ...dragState.sourceRect, itemId: dragState.setId }\n    : null;\n  if (!canDrawerAcceptSetWeight(drawer, set, { excludePlacement })) {\n    clearDropOverlay(dropzone);\n    resetDragState(dragState);\n    return;\n  }\n  const validRects = getValidFreeRectangles(drawer, set, excludePlacement);\n  const pointer = getPointerInDrawer({ clientX, clientY }, dropzone, drawer);\n  const targetRect = pickTargetRect(validRects, pointer.x, pointer.y);\n\n  if (!targetRect) {\n    clearDropOverlay(dropzone);\n    resetDragState(dragState);\n    return;\n  }\n\n  placeSetAtRect(state, dragState, set, drawerIndex, targetRect);\n  clearAllDropOverlays();\n  resetDragState(dragState);\n  renderConfiguration(state.currentDrawers, state.currentUnplacedSets, state.currentErrors);\n  updateToolSetCatalogFitBorders(state);\n}\n\nexports.wireDragAndDrop = wireDragAndDrop;\n});\n\n__define(\"features/drawer-layout/drawer-drop-overlay-renderer.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { escapeHtml } = __require(\"shared/utils/string-utils.js\");\nfunction renderDropOverlays(dropzone, drawer, set, validRects, activeRect) {\n  const overlay = ensureDropOverlay(dropzone);\n  if (!validRects.length) {\n    overlay.innerHTML = \"\";\n    return;\n  }\n\n  const usableWidth = drawer.drawerUsableWidth || 0;\n  const usableDepth = drawer.drawerUsableDepth || 0;\n  const setWidth = set.setWidth || 0;\n  const setHeight = set.setDepth || 0;\n\n  overlay.innerHTML = validRects\n    .map((rect) => {\n      const leftPct = toPercent(rect.x, usableWidth);\n      const topPct = toPercent(rect.y, usableDepth);\n      const widthPct = toPercent(setWidth, usableWidth);\n      const heightPct = toPercent(setHeight, usableDepth);\n      const isActive = activeRect && rect === activeRect;\n      const classes = isActive\n        ? \"absolute border-2 border-emerald-500/80 bg-emerald-500/20 shadow-[0_0_0_1px_rgba(16,185,129,0.4)]\"\n        : \"absolute border border-amber-400/70 bg-amber-500/20\";\n\n      return `\n      <div class=\"${classes}\" style=\"left:${leftPct}%; top:${topPct}%; width:${widthPct}%; height:${heightPct}%; box-sizing:border-box;\"></div>\n    `;\n    })\n    .join(\"\");\n}\n\nfunction renderHeightMismatchOverlay(dropzone, drawer, set) {\n  const overlay = ensureDropOverlay(dropzone);\n  const message = escapeHtml(\n    t(\"setHeightGreaterThanDrawerHeight\", \"Set height is greater than drawer height.\"),\n  );\n\n  void drawer;\n  void set;\n\n  overlay.innerHTML = `\n    <div class=\"absolute inset-0 grid place-items-center border-2 border-red-100 bg-red-600-50 px-3 text-center text-xs font-semibold leading-tight text-white\" style=\"box-sizing:border-box;\">\n      <div class=\"grid gap-1\">\n        <span>${message}</span>\n      </div>\n    </div>\n  `;\n}\n\nfunction clearDropOverlay(dropzone) {\n  const overlay = dropzone.querySelector(\"[data-drop-overlay=\\\"true\\\"]\");\n  if (overlay) overlay.innerHTML = \"\";\n}\n\nfunction clearAllDropOverlays() {\n  document.querySelectorAll(\"[data-drop-overlay=\\\"true\\\"]\").forEach((overlay) => {\n    overlay.innerHTML = \"\";\n  });\n}\n\nfunction ensureDropOverlay(dropzone) {\n  let overlay = dropzone.querySelector(\"[data-drop-overlay=\\\"true\\\"]\");\n  if (overlay) return overlay;\n\n  overlay = document.createElement(\"div\");\n  overlay.dataset.dropOverlay = \"true\";\n  overlay.className = \"absolute inset-0 pointer-events-none\";\n  dropzone.appendChild(overlay);\n  return overlay;\n}\n\nfunction toPercent(value, total) {\n  if (total <= 0) return 0;\n  return Math.max(0, Math.min(100, (value / total) * 100));\n}\n\nexports.renderDropOverlays = renderDropOverlays;\nexports.renderHeightMismatchOverlay = renderHeightMismatchOverlay;\nexports.clearDropOverlay = clearDropOverlay;\nexports.clearAllDropOverlays = clearAllDropOverlays;\n});\n\n__define(\"features/drawer-layout/drawer-fit-service.js\", (exports, __require) => {\nconst { findBestMaxRectsPlacementForPacking, maxRectsPruneFreeList, maxRectsSplitFreeRectangles } = __require(\"features/drawer-layout/maxrects-service.js\");\nconst { sortSetsForPacking } = __require(\"features/drawer-layout/drawer-layout-service.js\");\nconst { canDrawerAcceptSetWeight, getDrawerCapacityGrams, getSetWeightGrams } = __require(\"features/drawer-layout/drawer-weight-service.js\");\nfunction packSetsWithMaxRects(drawer, sets) {\n  const usableWidth = drawer.drawerUsableWidth || 0;\n  const usableDepth = drawer.drawerUsableDepth || 0;\n  const drawerHeight = drawer.drawerHeight || 0;\n\n  if (drawer.locked) {\n    return {\n      placements: (drawer.placements || []).slice(),\n      unplaced: (sets || []).slice(),\n    };\n  }\n\n  if (usableWidth <= 0 || usableDepth <= 0) {\n    return {\n      placements: [],\n      unplaced: (sets || []).slice(),\n    };\n  }\n\n  const eligible = [];\n  const unplaced = [];\n  const drawerCapacityGrams = getDrawerCapacityGrams(drawer);\n  let accumulatedWeightGrams = 0;\n\n  (sets || []).forEach((set) => {\n    if ((set.setHeight || 0) > drawerHeight) {\n      unplaced.push(set);\n    } else {\n      eligible.push(set);\n    }\n  });\n\n  const ordered = sortSetsForPacking(eligible);\n  let freeRects = [\n    {\n      x: 0,\n      y: 0,\n      width: usableWidth,\n      height: usableDepth,\n    },\n  ];\n  const placements = [];\n\n  ordered.forEach((set) => {\n    const setWeightGrams = getSetWeightGrams(set);\n    if (drawerCapacityGrams > 0 && accumulatedWeightGrams + setWeightGrams > drawerCapacityGrams) {\n      unplaced.push(set);\n      return;\n    }\n\n    const bestPlacement = findBestMaxRectsPlacementForPacking(freeRects, set, usableDepth);\n    if (!bestPlacement) {\n      unplaced.push(set);\n      return;\n    }\n\n    const placement = {\n      set,\n      x: bestPlacement.x,\n      y: bestPlacement.y,\n      width: bestPlacement.width,\n      depth: bestPlacement.height,\n    };\n\n    placements.push(placement);\n    accumulatedWeightGrams += setWeightGrams;\n\n    freeRects = maxRectsSplitFreeRectangles(freeRects, {\n      x: placement.x,\n      y: placement.y,\n      width: placement.width,\n      height: placement.depth,\n    });\n    freeRects = maxRectsPruneFreeList(freeRects);\n  });\n\n  return { placements, unplaced };\n}\n\nfunction applyPlacementsToDrawer(drawer) {\n  const result = packSetsWithMaxRects(drawer, drawer.sets || []);\n  drawer.placements = result.placements;\n  return result;\n}\n\nfunction fitSetsIntoDrawers(drawers, selectedSets) {\n  const errors = [];\n  const unplacedSets = [];\n\n  const candidateSets = selectedSets.filter((set) => {\n    const fitsAnyDrawerHeight = drawers.some((drawer) => set.setHeight <= drawer.drawerHeight);\n    const fitsAnyDrawerWeight = drawers.some((drawer) => canDrawerAcceptSetWeight(drawer, set));\n\n    if (!fitsAnyDrawerHeight) {\n      errors.push(\n        `${set.itemId} was not inserted. The set height is greater than the height of any drawer.`,\n      );\n      return false;\n    }\n\n    if (!fitsAnyDrawerWeight) {\n      errors.push(\n        `${set.itemId} was not inserted. The set weight is greater than the capacity of any drawer.`,\n      );\n      return false;\n    }\n\n    return true;\n  });\n\n  const orderedCandidates = sortSetsForPacking(candidateSets);\n\n  // Place sets in size order so larger trays claim space first.\n  for (const set of orderedCandidates) {\n    let placed = false;\n\n    for (const drawer of drawers) {\n      if (drawer.locked) continue;\n      if (set.setHeight > drawer.drawerHeight) continue;\n      if (!canDrawerAcceptSetWeight(drawer, set)) continue;\n      const nextSets = drawer.sets.concat(set);\n      const packResult = packSetsWithMaxRects(drawer, nextSets);\n      if (packResult.unplaced.length) continue;\n\n      drawer.sets = nextSets;\n      drawer.placements = packResult.placements;\n      placed = true;\n\n      if (placed) break;\n    }\n\n    if (!placed) {\n      unplacedSets.push(set);\n    }\n  }\n\n  drawers.forEach(applyPlacementsToDrawer);\n\n  return {\n    drawers,\n    unplacedSets,\n    errors,\n  };\n}\n\nfunction fitSetsIntoExistingLayout(existingDrawers, selectedSets) {\n  const desiredCounts = countSetsById(selectedSets);\n  const keptCounts = new Map();\n\n  const drawers = existingDrawers.map((drawer) => {\n    const keptPlacements = [];\n\n    (drawer.placements || []).forEach((placement) => {\n      const itemId = placement?.set?.itemId || \"\";\n      if (!itemId) return;\n\n      const want = desiredCounts.get(itemId) || 0;\n      const have = keptCounts.get(itemId) || 0;\n      if (have >= want) return;\n\n      keptPlacements.push(placement);\n      keptCounts.set(itemId, have + 1);\n    });\n\n    return {\n      ...drawer,\n      sets: keptPlacements.map((placement) => placement.set),\n      placements: keptPlacements,\n    };\n  });\n\n  // Add exactly as many new instances as are still needed after keeping existing placements.\n  const remainingCounts = new Map();\n  desiredCounts.forEach((want, itemId) => {\n    const have = keptCounts.get(itemId) || 0;\n    const remaining = want - have;\n    if (remaining > 0) remainingCounts.set(itemId, remaining);\n  });\n\n  const newSets = [];\n  (selectedSets || []).forEach((set) => {\n    const itemId = set?.itemId || \"\";\n    if (!itemId) return;\n\n    const remaining = remainingCounts.get(itemId) || 0;\n    if (remaining <= 0) return;\n\n    newSets.push(set);\n    if (remaining === 1) remainingCounts.delete(itemId);\n    else remainingCounts.set(itemId, remaining - 1);\n  });\n\n  const result = placeSetsWithoutRepacking(drawers, newSets);\n\n  return {\n    drawers,\n    unplacedSets: result.unplacedSets,\n    errors: result.errors,\n  };\n}\n\nfunction countSetsById(sets) {\n  const counts = new Map();\n  (sets || []).forEach((set) => {\n    const itemId = set?.itemId || \"\";\n    if (!itemId) return;\n    counts.set(itemId, (counts.get(itemId) || 0) + 1);\n  });\n  return counts;\n}\n\nfunction placeSetsWithoutRepacking(drawers, sets) {\n  const errors = [];\n  const unplacedSets = [];\n\n  const candidateSets = sets.filter((set) => {\n    const fitsAnyDrawerHeight = drawers.some((drawer) => set.setHeight <= drawer.drawerHeight);\n    const fitsAnyDrawerWeight = drawers.some((drawer) => canDrawerAcceptSetWeight(drawer, set));\n\n    if (!fitsAnyDrawerHeight) {\n      errors.push(\n        `${set.itemId} was not inserted. The set height is greater than the height of any drawer.`,\n      );\n      return false;\n    }\n\n    if (!fitsAnyDrawerWeight) {\n      errors.push(\n        `${set.itemId} was not inserted. The set weight is greater than the capacity of any drawer.`,\n      );\n      return false;\n    }\n\n    return true;\n  });\n\n  const orderedCandidates = sortSetsForPacking(candidateSets);\n\n  for (const set of orderedCandidates) {\n    let placed = false;\n\n    for (const drawer of [...drawers].sort((a,b)=>Number(String(b.drawerIndex)===document.getElementById(\"toolkit-configurator-app\")?.dataset.activeDrawer)-Number(String(a.drawerIndex)===document.getElementById(\"toolkit-configurator-app\")?.dataset.activeDrawer))) {\n      if (drawer.locked) continue;\n      if (set.setHeight > drawer.drawerHeight) continue;\n      if (tryPlaceSetWithoutRepacking(drawer, set)) {\n        placed = true;\n        break;\n      }\n    }\n\n    if (!placed) {\n      unplacedSets.push(set);\n    }\n  }\n\n  return { unplacedSets, errors };\n}\n\nfunction tryPlaceSetWithoutRepacking(drawer, set) {\n  if (drawer.locked) return false;\n  if (!canDrawerAcceptSetWeight(drawer, set)) return false;\n\n  const usableWidth = drawer.drawerUsableWidth || 0;\n  const usableDepth = drawer.drawerUsableDepth || 0;\n  if (usableWidth <= 0 || usableDepth <= 0) return false;\n\n  let freeRects = [\n    {\n      x: 0,\n      y: 0,\n      width: usableWidth,\n      height: usableDepth,\n    },\n  ];\n\n  (drawer.placements || []).forEach((placement) => {\n    freeRects = maxRectsSplitFreeRectangles(freeRects, {\n      x: placement.x,\n      y: placement.y,\n      width: placement.width,\n      height: placement.depth,\n    });\n    freeRects = maxRectsPruneFreeList(freeRects);\n  });\n\n  const bestPlacement = findBestMaxRectsPlacementForPacking(freeRects, set, usableDepth);\n  if (!bestPlacement) return false;\n\n  const placement = {\n    set,\n    x: bestPlacement.x,\n    y: bestPlacement.y,\n    width: bestPlacement.width,\n    depth: bestPlacement.height,\n  };\n\n  drawer.placements = (drawer.placements || []).concat(placement);\n  drawer.sets = (drawer.sets || []).concat(set);\n  return true;\n}\n\nexports.fitSetsIntoDrawers = fitSetsIntoDrawers;\nexports.fitSetsIntoExistingLayout = fitSetsIntoExistingLayout;\n});\n\n__define(\"features/drawer-layout/drawer-hover-highlight.js\", (exports, __require) => {\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nfunction getHighlightKey(setId, drawerIndex, x, y) {\n  return JSON.stringify([cleanString(setId), cleanString(drawerIndex), x, y]);\n}\n\nfunction findListTrigger(target) {\n  return target.closest(\"[data-drawer-set-list-item=\\\"true\\\"]\");\n}\n\nfunction findTileTrigger(target) {\n  return target.closest(\"[data-placed-set-tile=\\\"true\\\"]\");\n}\n\nfunction getTileTargets(container, setId, drawerIndex, x, y) {\n  return container.querySelectorAll(\n    `[data-placed-set-tile=\"true\"][data-set-id=\"${CSS.escape(cleanString(setId))}\"][data-drawer-index=\"${CSS.escape(cleanString(drawerIndex))}\"][data-x=\"${CSS.escape(x)}\"][data-y=\"${CSS.escape(y)}\"]`,\n  );\n}\n\nfunction getListTargets(container, setId, drawerIndex, x, y) {\n  return container.querySelectorAll(\n    `[data-drawer-set-list-item=\"true\"][data-set-id=\"${CSS.escape(cleanString(setId))}\"][data-drawer-index=\"${CSS.escape(cleanString(drawerIndex))}\"][data-x=\"${CSS.escape(x)}\"][data-y=\"${CSS.escape(y)}\"]`,\n  );\n}\n\nfunction clearHighlights(container) {\n  container.querySelectorAll(\".drawer-set-hover-highlight\").forEach((element) => {\n    element.classList.remove(\"drawer-set-hover-highlight\");\n  });\n  container.querySelectorAll(\".drawer-set-list-hover-highlight\").forEach((element) => {\n    element.classList.remove(\"drawer-set-list-hover-highlight\");\n  });\n}\n\nfunction applyHighlight(container, setId, drawerIndex, x, y) {\n  clearHighlights(container);\n\n  getTileTargets(container, setId, drawerIndex, x, y).forEach((tile) => {\n    tile.classList.add(\"drawer-set-hover-highlight\");\n  });\n\n  getListTargets(container, setId, drawerIndex, x, y).forEach((listItem) => {\n    listItem.classList.add(\"drawer-set-list-hover-highlight\");\n  });\n}\n\nfunction getTriggerData(trigger) {\n  if (!trigger) return null;\n\n  const setId = trigger.getAttribute(\"data-set-id\");\n  const drawerIndex = trigger.getAttribute(\"data-drawer-index\");\n  if (!setId || !drawerIndex) return null;\n\n  const x = trigger.getAttribute(\"data-x\"), y = trigger.getAttribute(\"data-y\");\n  if (x === null || y === null) return null;\n  return { setId, drawerIndex, x, y };\n}\n\nfunction wireDrawerHoverHighlight() {\n  const container = document.getElementById(\"recommendationsGrid\");\n  if (!container) return;\n\n  let activeKey = \"\";\n\n  container.addEventListener(\"mouseover\", (event) => {\n    const trigger = findListTrigger(event.target) || findTileTrigger(event.target);\n    if (!trigger) return;\n    if (trigger.contains(event.relatedTarget)) return;\n\n    const data = getTriggerData(trigger);\n    if (!data) return;\n\n    const nextKey = getHighlightKey(data.setId, data.drawerIndex, data.x, data.y);\n    if (nextKey === activeKey) return;\n\n    activeKey = nextKey;\n    applyHighlight(container, data.setId, data.drawerIndex, data.x, data.y);\n  });\n\n  container.addEventListener(\"mouseout\", (event) => {\n    const trigger = findListTrigger(event.target) || findTileTrigger(event.target);\n    if (!trigger) return;\n    if (trigger.contains(event.relatedTarget)) return;\n\n    activeKey = \"\";\n    clearHighlights(container);\n  });\n\n  container.addEventListener(\"mouseleave\", () => {\n    activeKey = \"\";\n    clearHighlights(container);\n  });\n}\n\nexports.wireDrawerHoverHighlight = wireDrawerHoverHighlight;\n});\n\n__define(\"features/drawer-layout/drawer-layout-service.js\", (exports, __require) => {\nfunction buildDrawersForStorage(toolstorage) {\n  const capacities = toolstorage.storagePerDrawerCapacity || [];\n  const widths = toolstorage.storagePerDrawerWidth || [];\n  const heights = toolstorage.storagePerDrawerHeight || [];\n  const depths = toolstorage.storagePerDrawerDepth || [];\n\n  return heights.map((height, index) => {\n    const width = widths[index] ?? 0;\n    const depth = depths[index] ?? 0;\n    const drawerWidth = width || 0;\n    const drawerDepth = depth || 0;\n    const drawerUsableWidth = width || 0;\n    const drawerUsableDepth = depth || 0;\n\n    return {\n      drawerIndex: index + 1,\n      drawerCapacity: capacities[index] ?? 0,\n      drawerWidth,\n      drawerHeight: height ?? 0,\n      drawerDepth,\n      drawerUsableWidth,\n      drawerUsableDepth,\n      colour: toolstorage.storageColour || \"\",\n      locked: false,\n\n      sets: [],\n      placements: [],\n    };\n  });\n}\n\nfunction buildDrawersForStorages(toolstorages) {\n  const storageSelectionCount = (toolstorages || []).length;\n  let nextDrawerIndex = 1;\n\n  return (toolstorages || []).flatMap((toolstorage) =>\n    buildDrawersForStorage(toolstorage).map((drawer, localIndex) => ({\n      ...drawer,\n      drawerIndex: nextDrawerIndex++,\n      storageItemId: toolstorage.itemId,\n      storageDescription: toolstorage.description || \"\",\n      storageProductType: toolstorage.productType || \"\",\n      storageLocalDrawerIndex: localIndex + 1,\n      storageSelectionCount,\n    })),\n  );\n}\n\nfunction resolveSelectedSets(selectedIds, allSets) {\n  const setMap = new Map(allSets.map((set) => [set.itemId, set]));\n  const resolved = [];\n\n  // Preserve duplicates: each occurrence in the input represents one set instance.\n  for (const id of selectedIds || []) {\n    const set = setMap.get(id);\n    if (set) {\n      resolved.push(set);\n    }\n  }\n\n  return resolved;\n}\n\nfunction compareSetsForPacking(a, b) {\n  const areaA = (a.setWidth || 0) * (a.setDepth || 0);\n  const areaB = (b.setWidth || 0) * (b.setDepth || 0);\n  if (areaA !== areaB) return areaB - areaA;\n\n  const depthA = a.setDepth || 0;\n  const depthB = b.setDepth || 0;\n  if (depthA !== depthB) return depthB - depthA;\n\n  const widthA = a.setWidth || 0;\n  const widthB = b.setWidth || 0;\n  if (widthA !== widthB) return widthB - widthA;\n\n  return String(a.itemId || \"\").localeCompare(String(b.itemId || \"\"));\n}\n\nfunction sortSetsForPacking(sets) {\n  return (sets || []).slice().sort(compareSetsForPacking);\n}\n\nexports.buildDrawersForStorage = buildDrawersForStorage;\nexports.buildDrawersForStorages = buildDrawersForStorages;\nexports.resolveSelectedSets = resolveSelectedSets;\nexports.compareSetsForPacking = compareSetsForPacking;\nexports.sortSetsForPacking = sortSetsForPacking;\n});\n\n__define(\"features/drawer-layout/drawer-renderer.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { escapeHtml } = __require(\"shared/utils/string-utils.js\");\nconst { getDrawerWeightUsage } = __require(\"features/drawer-layout/drawer-weight-service.js\");\nfunction renderEmptyState() {\n  const container = document.getElementById(\"recommendationsGrid\");\n  if (!container) return;\n\n  container.innerHTML = `\n    <div class=\"border-t border-gray-200 bg-white p-10 text-center\">\n      <div class=\"mx-auto flex h-14 w-14 items-center justify-center rounded-full bg-gray-100 text-gray-400\">\n        <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-6 w-6 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n          <path d=\"M3 6h18\"></path>\n          <path d=\"M7 12h10\"></path>\n          <path d=\"M10 18h4\"></path>\n        </svg>\n      </div>\n      <h3 class=\"mt-4 text-base font-semibold text-gray-900\">${escapeHtml(t(\"noConfigurationRendered\", \"No configuration rendered\"))}</h3>\n      <p class=\"mx-auto mt-2 max-w-md text-sm leading-6 text-gray-500\">${escapeHtml(t(\"selectToolStorageAndConfigure\", \"Select a tool storage and configure its contents.\"))}</p>\n    </div>\n  `;\n}\n\nfunction renderSelectedToolstorage(toolstorage) {\n  const container = document.getElementById(\"selectedToolstorageCard\");\n  if (!container) return;\n\n  const selectedStorages = Array.isArray(toolstorage)\n    ? toolstorage.filter(Boolean)\n    : toolstorage\n      ? [toolstorage]\n      : [];\n\n  if (!selectedStorages.length) {\n    container.innerHTML = `\n      <div class=\"text-center text-sm text-gray-500\">\n        <div class=\"mx-auto flex h-14 w-14 items-center justify-center rounded-full bg-gray-100 text-gray-400\">\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-6 w-6 stroke-current\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <rect x=\"3\" y=\"7\" width=\"18\" height=\"13\" rx=\"2\"></rect>\n            <path d=\"M8 7V5a4 4 0 0 1 8 0v2\"></path>\n          </svg>\n        </div>\n        <h3 class=\"mt-4 text-base font-semibold text-gray-900\">${escapeHtml(t(\"selectedToolStorage\", \"Selected tool storage\"))}</h3>\n        <p class=\"mx-auto mt-2 max-w-md text-sm leading-6 text-gray-500\">${escapeHtml(t(\"noToolStorageSelected\", \"No tool storage selected.\"))}</p>\n      </div>\n    `;\n    return;\n  }\n\n  const cardsHtml = selectedStorages\n    .map((storage) => {\n      const description = escapeHtml(storage.description || t(\"toolStorage\", \"Tool storage\"));\n      const itemId = escapeHtml(storage.itemId || \"\");\n      const productType = escapeHtml(storage.productType || t(\"toolStorage\", \"Tool storage\"));\n      const imageUrl = escapeHtml(storage.itemImageUrl || \"data/imgsource.png\");\n      const imageAlt = escapeHtml(`${storage.description || t(\"toolStorage\", \"Tool storage\")} ${storage.itemId || \"\"}`.trim());\n\n      return `\n        <div class=\"flex w-full max-w-[260px] flex-col items-center gap-4 print:max-w-[42mm] print:gap-2\">\n          <a class=\"relative flex h-[220px] w-[220px] max-w-[160px] shrink-0 items-center justify-center overflow-hidden rounded-xl bg-white print:h-[160px] print:w-[160px]\" href=\"#\" data-action=\"open-product-modal\" data-item-type=\"toolstorage\" data-item-id=\"${itemId}\">\n            <img class=\"h-full w-full object-contain\" src=\"${imageUrl}\" alt=\"${imageAlt}\" loading=\"lazy\">\n          </a>\n          <div class=\"min-w-0 text-center\">\n            <div class=\"flex items-start justify-center gap-4\">\n              <div>\n                <span class=\"py-0.5 text-[10px] font-semibold uppercase tracking-wide text-gray-600\">${productType}</span>\n                <h5 class=\"text-sm font-semibold uppercase tracking-wide text-gray-900\">${description}</h5>\n                <p class=\"text-xs text-gray-500\">${itemId}</p>\n              </div>\n            </div>\n          </div>\n        </div>\n      `;\n    })\n    .join(\"\");\n\n  container.innerHTML = `\n  <h5 class=\"pb-4 text-lg font-semibold uppercase tracking-wide text-gray-900\">${escapeHtml(t(\"selectedToolStorageColon\", \"Selected tool storage:\"))}</h5>\n  <div class=\"flex flex-wrap gap-6 print:items-start\">\n      ${cardsHtml}\n    </div>\n  `;\n}\n\nfunction renderConfiguration(drawers, unplacedSets, errors) {\n  const container = document.getElementById(\"recommendationsGrid\");\n  if (!container) return;\n\n  container.innerHTML = \"\";\n\n  if (!drawers.length) {\n    container.innerHTML = `\n      <div class=\"rounded-lg border border-gray-200 bg-white p-6 text-center text-sm text-gray-500\">\n        ${escapeHtml(t(\"noConfigurationRendered\", \"No configuration rendered.\"))}\n      </div>\n    `;\n    return;\n  }\n\n  if (unplacedSets.length || errors.length) {\n    container.appendChild(createUnplacedSection(unplacedSets, errors));\n  }\n\n  drawers.forEach((drawer) => {\n    container.appendChild(createDrawerSection(drawer));\n  });\n}\n\nfunction createDrawerSection(drawer) {\n  const section = document.createElement(\"section\");\n\n  const canvasStyle =\n    drawer.drawerWidth && drawer.drawerDepth\n      ? ` style=\"width:min(100%, ${drawer.drawerWidth}px); aspect-ratio:${drawer.drawerWidth} / ${drawer.drawerDepth};\"`\n      : \"\";\n\n  const listEntries = (drawer.placements || [])\n    .slice()\n    .sort((a, b) => (a.y - b.y) || (a.x - b.x));\n\n  const drawerLabel = drawer.storageLocalDrawerIndex || drawer.drawerIndex;\n  const storageLabel = drawer.storageSelectionCount > 1\n    ? `${escapeHtml(drawer.storageProductType || t(\"toolStorage\", \"Tool storage\"))} ${escapeHtml(drawer.storageItemId || \"\")}`.trim()\n    : \"\";\n  const {\n    currentWeightGrams,\n    capacityGrams,\n    percent: drawerWeightPercent,\n    level: drawerWeightLevel,\n  } = getDrawerWeightUsage(drawer);\n  const drawerLockLabel = drawer.locked\n    ? escapeHtml(t(\"lockedDrawer\", \"Locked drawer\"))\n    : escapeHtml(t(\"unlockedDrawer\", \"Unlocked drawer\"));\n  const drawerLockAction = drawer.locked ? \"locked-drawer\" : \"unlocked-drawer\";\n  const drawerLockIcon = drawer.locked\n    ? `\n      <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" fill=\"none\" class=\"print:hidden h-6 w-6 pb-1 text-red-600 stroke-current\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <circle cx=\"12\" cy=\"16\" r=\"1\"></circle>\n        <rect x=\"3\" y=\"10\" width=\"18\" height=\"12\" rx=\"2\"></rect>\n        <path d=\"M7 10V7a5 5 0 0 1 10 0v3\"></path>\n      </svg>\n    `\n    : `\n      <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" fill=\"none\" class=\"print:hidden h-6 w-6 pb-1 text-emerald-500 stroke-current\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <circle cx=\"12\" cy=\"16\" r=\"1\"></circle>\n        <rect width=\"18\" height=\"12\" x=\"3\" y=\"10\" rx=\"2\"></rect>\n        <path d=\"M7 10V7a5 5 0 0 1 9.33-2.5\"></path>\n      </svg>\n    `;\n  const lockedOverlay = drawer.locked\n    ? `<div class=\"absolute inset-0 z-20 cursor-not-allowed bg-gray-900/40 print:hidden\" data-drawer-locked-overlay=\"true\"></div>`\n    : \"\";\n\n  const hasNoSets = listEntries.length === 0;\n  const setListHtml = listEntries.length\n    ? listEntries\n        .map((placement) => {\n          const set = placement.set;\n          const escapedSetId = escapeHtml(set.itemId);\n          const escapedDescription = escapeHtml(set.description);\n\n          return `\n          <li data-drawer-set-list-item=\"true\" data-set-id=\"${escapedSetId}\" data-drawer-index=\"${drawer.drawerIndex}\" data-x=\"${placement.x}\" data-y=\"${placement.y}\">\n            <button\n              type=\"button\"\n              class=\"drawer-set-list-button flex w-full items-start gap-2 bg-white px-3 py-2 text-left text-sm leading-snug transition hover:bg-gray-50\"\n              data-action=\"open-product-modal\"\n              data-item-type=\"toolset\"\n              data-item-id=\"${escapedSetId}\"\n              aria-label=\"${escapeHtml(t(\"openProductDetailsFor\", \"Open product details for\"))} ${escapedSetId}\"\n            >\n               <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" stroke=\"rgba(200, 200, 200, 1)\" fill=\"none\" class=\"print:hidden h-6 w-6 pb-1\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 7v14\"></path><path d=\"M16 12h2\"></path><path d=\"M16 8h2\"></path><path d=\"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z\"></path><path d=\"M6 12h2\"></path><path d=\"M6 8h2\"></path></svg>\n              <strong class=\"shrink-0\">${escapedSetId}</strong><span class=\"text-gray-600\">${escapedDescription}</span>\n            </button>\n          </li>\n        `;\n        })\n        .join(\"\")\n    : `<li class=\"p-3 text-sm text-gray-500 print:hidden\">${escapeHtml(t(\"noSetsPlacedInDrawer\", \"No sets placed in this drawer.\"))}</li>`;\n  const progressBarColorClass = drawerWeightLevel === \"danger\"\n    ? \"bg-red-600\"\n    : drawerWeightLevel === \"warning\"\n      ? \"bg-orange-500\"\n      : \"bg-emerald-500\";\n  const drawerWeightTitle = `${formatWeightKg(currentWeightGrams)} / ${formatWeightKg(capacityGrams)}`;\n  const progressBarHtml = `\n    <div class=\"flex items-center gap-3 px-3 pb-3 print:hidden\" title=\"${escapeHtml(drawerWeightTitle)}\" aria-label=\"${escapeHtml(drawerWeightTitle)}\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"h-6 w-6 shrink-0 pb-1 text-gray-500\"><circle cx=\"12\" cy=\"5\" r=\"3\"></circle><path d=\"M6.5 8a2 2 0 0 0-1.905 1.46L2.1 18.5A2 2 0 0 0 4 21h16a2 2 0 0 0 1.925-2.54L19.4 9.5A2 2 0 0 0 17.48 8Z\"></path></svg>\n      <div class=\"h-2 flex-1 overflow-hidden rounded-full bg-gray-200\">\n        <div class=\"h-full rounded-full transition-[width] ${progressBarColorClass}\" style=\"width:${drawerWeightPercent}%;\"></div>\n      </div>\n    </div>\n  `;\n\n  section.className = `grid items-center gap-8 border-t border-gray-200 pt-8 grid-cols-1 md:grid-cols-2 print:break-inside-avoid print:grid-cols-[100mm_1fr] print:gap-[6mm] print:pb-[9mm] print:px-[9mm] ${hasNoSets ? \" print:hidden\" : \"\"}`;\n\n  const visualItems = buildDrawerVisualItems(drawer);\n  const isDesktop = typeof window !== \"undefined\" && window.matchMedia\n    ? window.matchMedia(\"(min-width: 768px)\").matches\n    : true;\n  const openAttr = isDesktop ? \" open\" : \"\";\n\n  section.innerHTML = `\n    <div class=\"min-w-0 print:break-inside-avoid\">\n      <details class=\"group relative bg-white\"${openAttr}>\n        <button\n          type=\"button\"\n          class=\"absolute right-8 top-1 z-10 inline-flex items-center justify-center rounded p-1 text-gray-600 hover:text-gray-900 print:hidden\"\n          data-action=\"${drawerLockAction}\"\n          data-drawer-index=\"${drawer.drawerIndex}\"\n          aria-label=\"${drawerLockLabel}\"\n          draggable=\"false\"\n        >\n          ${drawerLockIcon}\n        </button>\n        <summary class=\"flex cursor-pointer items-center justify-between gap-3 px-3 py-2 pr-16 border-b border-gray-200 text-sm font-semibold text-gray-900\">\n          <div class=\"flex min-w-0 flex-1 items-center gap-3\">\n            <span>${escapeHtml(t(\"drawer\", \"Drawer\"))} ${drawerLabel}</span>\n            ${storageLabel ? `<span class=\"text-xs font-medium text-gray-600\">${storageLabel}</span>` : \"\"}\n          </div>\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" class=\"h-4 w-4 text-gray-500 transition-transform group-open:rotate-180 print:hidden\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <polyline points=\"6 9 12 15 18 9\"></polyline>\n          </svg>\n        </summary>\n        <div class=\"\">\n          <ul class=\"grid gap-1 p-3\">${setListHtml}</ul>\n          ${progressBarHtml}\n        </div>\n      </details>\n    </div>\n    <div class=\"min-w-0 print:break-inside-avoid\">\n      <div class=\"relative w-full overflow-hidden border border-gray-200 bg-gray-200 shadow-sm print:shadow-none print:bg-none print:border-0\" data-dropzone=\"true\" data-drawer-index=\"${drawer.drawerIndex}\"${canvasStyle}>\n        <div class=\"absolute inset-0\">\n          ${visualItems\n            .map((item) =>\n              createPlacedSetTile(\n                item.set,\n                item.leftPct,\n                item.topPct,\n                item.widthPct,\n                item.heightPct,\n                drawer.drawerIndex,\n                item.x,\n                item.y,\n                item.width,\n                item.depth,\n              ),\n            )\n            .join(\"\")}\n        </div>\n        <div class=\"absolute inset-0 pointer-events-none\" data-drop-overlay=\"true\"></div>\n        ${lockedOverlay}\n      </div>\n    </div>\n  `;\n\n  return section;\n}\n\nfunction formatWeightKg(weightGrams) {\n  return `${((Number(weightGrams) || 0) / 1000).toFixed(1)} kg`;\n}\n\nfunction buildDrawerVisualItems(drawer) {\n  const items = [];\n  const usableWidth = drawer.drawerUsableWidth || 0;\n  const usableDepth = drawer.drawerUsableDepth || 0;\n  if (usableWidth <= 0 || usableDepth <= 0) {\n    return items;\n  }\n\n  const toPercent = (value, total) => {\n    if (total <= 0) return 0;\n    return Math.max(0, Math.min(100, (value / total) * 100));\n  };\n\n  (drawer.placements || []).forEach((placement) => {\n    items.push({\n      set: placement.set,\n      x: placement.x,\n      y: placement.y,\n      width: placement.width,\n      depth: placement.depth,\n      leftPct: toPercent(placement.x, usableWidth),\n      topPct: toPercent(placement.y, usableDepth),\n      widthPct: toPercent(placement.width, usableWidth),\n      heightPct: toPercent(placement.depth, usableDepth),\n    });\n  });\n\n  return items;\n}\n\nfunction createPlacedSetTile(\n  set,\n  leftPct = 0,\n  topPct = 0,\n  widthPct = 0,\n  heightPct = 0,\n  drawerIndex,\n  x,\n  y,\n  width,\n  depth,\n) {\n  const imageUrl = set.itemImageUrl || \"\";\n  const safeLeft = Math.max(leftPct || 0, 0);\n  const safeTop = Math.max(topPct || 0, 0);\n  const safeWidth = Math.max(widthPct || 0, 0);\n  const safeHeight = Math.max(heightPct || 0, 0);\n\n  return `\n    <div\n      class=\"absolute grid min-w-0 place-items-stretch select-none touch-none\"\n      draggable=\"true\"\n      data-placed-set-tile=\"true\"\n      data-set-id=\"${escapeHtml(set.itemId)}\"\n      data-drawer-index=\"${drawerIndex}\"\n      data-x=\"${x ?? 0}\"\n      data-y=\"${y ?? 0}\"\n      data-width=\"${width ?? 0}\"\n      data-depth=\"${depth ?? 0}\"\n      style=\"left:${safeLeft}%; top:${safeTop}%; width:${safeWidth}%; height:${safeHeight}%;\">\n      <div class=\"relative h-full w-full\">\n        <div class=\"drawer-set-hover-overlay pointer-events-none absolute inset-0 z-10 rounded bg-white opacity-0 transition-opacity duration-150\"></div>\n        <button\n          type=\"button\"\n          class=\"absolute right-1 top-1 z-20 inline-flex items-center justify-center rounded p-1 text-gray-600 hover:text-gray-900 print:hidden\"\n          data-action=\"remove-set\"\n          aria-label=\"${escapeHtml(t(\"removeSet\", \"Remove set\"))}\"\n          draggable=\"false\"\n        >\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" stroke=\"#fcc20e\" class=\"h-4 w-4\" stroke-width=\"2\" fill=\"#000000\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n            <circle cx=\"12\" cy=\"12\" r=\"10\"></circle><path d=\"m15 9-6 6\"></path><path d=\"m9 9 6 6\"></path>\n          </svg>\n        </button>\n        <div class=\"h-full w-full overflow-hidden rounded bg-white\">\n          ${\n            imageUrl\n              ? `\n            <img\n              class=\"block h-full w-full object-contain\"\n              src=\"${escapeHtml(imageUrl)}\"\n              alt=\"${escapeHtml(set.description || set.itemId)}\"\n              onerror=\"this.style.display='none'; this.parentElement.innerHTML='<div class=&quot;grid h-full w-full place-items-center px-1 text-center text-xs text-gray-600&quot;>${escapeHtml(set.itemId)}</div>';\">\n          `\n              : `\n            <div class=\"grid h-full w-full place-items-center px-1 text-center text-xs text-gray-600\">${escapeHtml(set.itemId)}</div>\n          `\n          }\n        </div>\n      </div>\n    </div>\n  `;\n}\n\nfunction createUnplacedSection(unplacedSets, errors) {\n  const section = document.createElement(\"section\");\n  section.className =\n    \"mt-5 border border-red-300 bg-red-200 px-4 py-4 text-gray-900 shadow-sm print:hidden\";\n\n  const errorHtml = errors.length\n    ? `<ul class=\"list-disc space-y-1 pl-5 text-sm\">${errors.map((e) => `<li>${escapeHtml(e)}</li>`).join(\"\")}</ul>`\n    : \"\";\n\n  const unplacedHtml = unplacedSets.length\n    ? `\n      <div class=\"\">\n        <h3 class=\"text-sm font-semibold uppercase tracking-wide\">${escapeHtml(t(\"upgradeStorageToFitSets\", \"Upgrade your storage to fit these sets:\"))}</h3>\n        <ul class=\"mt-2 list-disc space-y-1 pl-5 text-sm\">\n          ${unplacedSets\n            .map(\n              (set) => `\n            <li data-set-id=\"${escapeHtml(set.itemId)}\">\n              <strong>${escapeHtml(set.itemId)}</strong> ${escapeHtml(set.description)}\n              <button\n                type=\"button\"\n                class=\"relative top-[0.3rem] right-1 inline-flex items-center justify-center rounded p-1 text-gray-600 hover:text-gray-900 print:hidden\"\n                data-action=\"remove-set\"\n                aria-label=\"${escapeHtml(t(\"removeSet\", \"Remove set\"))}\"\n                draggable=\"false\"\n              >\n                <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\" stroke=\"#fcc20e\" class=\"h-4 w-4\" stroke-width=\"2\" fill=\"#000000\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                  <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n                  <path d=\"m15 9-6 6\"></path>\n                  <path d=\"m9 9 6 6\"></path>\n                </svg>\n              </button>\n            </li>\n          `,\n            )\n            .join(\"\")}\n        </ul>\n      </div>\n    `\n    : \"\";\n\n  section.innerHTML = `\n    <div class=\"grid gap-3\">\n      ${errorHtml}\n      ${unplacedHtml}\n    </div>\n  `;\n\n  return section;\n}\n\nexports.renderEmptyState = renderEmptyState;\nexports.renderSelectedToolstorage = renderSelectedToolstorage;\nexports.renderConfiguration = renderConfiguration;\n});\n\n__define(\"features/drawer-layout/drawer-weight-service.js\", (exports, __require) => {\nfunction nearlyEqual(a, b, epsilon = 0.001) {\n  return Math.abs((a || 0) - (b || 0)) <= epsilon;\n}\n\nfunction matchesExcludedPlacement(placement, excludedPlacement) {\n  if (!excludedPlacement) return false;\n  if (placement?.set?.itemId !== excludedPlacement.itemId) return false;\n\n  return (\n    nearlyEqual(placement.x, excludedPlacement.x) &&\n    nearlyEqual(placement.y, excludedPlacement.y) &&\n    nearlyEqual(placement.width, excludedPlacement.width) &&\n    nearlyEqual(placement.depth, excludedPlacement.depth)\n  );\n}\n\nfunction getSetWeightGrams(set) {\n  return Number(set?.itemWeight) || 0;\n}\n\nfunction getDrawerCapacityGrams(drawer) {\n  const capacityKg = Number(drawer?.drawerCapacity) || 0;\n  return capacityKg > 0 ? capacityKg * 1000 : 0;\n}\n\nfunction getDrawerCurrentWeightGrams(drawer, { excludePlacement = null } = {}) {\n  const placements = Array.isArray(drawer?.placements) ? drawer.placements : [];\n\n  return placements.reduce((totalWeight, placement) => {\n    if (!placement?.set) return totalWeight;\n    if (matchesExcludedPlacement(placement, excludePlacement)) return totalWeight;\n    return totalWeight + getSetWeightGrams(placement.set);\n  }, 0);\n}\n\nfunction canDrawerAcceptSetWeight(drawer, set, { excludePlacement = null } = {}) {\n  const capacityGrams = getDrawerCapacityGrams(drawer);\n  if (capacityGrams <= 0) return true;\n\n  const currentWeightGrams = getDrawerCurrentWeightGrams(drawer, { excludePlacement });\n  const setWeightGrams = getSetWeightGrams(set);\n\n  return currentWeightGrams + setWeightGrams <= capacityGrams;\n}\n\nfunction getDrawerWeightUsage(drawer) {\n  const currentWeightGrams = getDrawerCurrentWeightGrams(drawer);\n  const capacityGrams = getDrawerCapacityGrams(drawer);\n  const ratio = capacityGrams > 0 ? currentWeightGrams / capacityGrams : 0;\n  const percent = Math.max(0, Math.min(100, ratio * 100));\n\n  let level = \"safe\";\n  if (ratio >= 0.9) {\n    level = \"danger\";\n  } else if (ratio >= 0.75) {\n    level = \"warning\";\n  }\n\n  return {\n    currentWeightGrams,\n    capacityGrams,\n    ratio,\n    percent,\n    level,\n  };\n}\n\nexports.getSetWeightGrams = getSetWeightGrams;\nexports.getDrawerCapacityGrams = getDrawerCapacityGrams;\nexports.getDrawerCurrentWeightGrams = getDrawerCurrentWeightGrams;\nexports.canDrawerAcceptSetWeight = canDrawerAcceptSetWeight;\nexports.getDrawerWeightUsage = getDrawerWeightUsage;\n});\n\n__define(\"features/drawer-layout/maxrects-service.js\", (exports, __require) => {\nfunction roundRect(value) {\n  return Math.round(value * 1000) / 1000;\n}\n\nfunction rectsOverlap(a, b) {\n  return (\n    a.x < b.x + b.width &&\n    a.x + a.width > b.x &&\n    a.y < b.y + b.height &&\n    a.y + a.height > b.y\n  );\n}\n\nfunction rectContainedIn(rect, container) {\n  return (\n    rect.x >= container.x &&\n    rect.y >= container.y &&\n    rect.x + rect.width <= container.x + container.width &&\n    rect.y + rect.height <= container.y + container.height\n  );\n}\n\nfunction dedupeRects(rects) {\n  const seen = new Set();\n  const result = [];\n\n  rects.forEach((rect) => {\n    const key = `${roundRect(rect.x)}:${roundRect(rect.y)}:${roundRect(rect.width)}:${roundRect(rect.height)}`;\n    if (!seen.has(key)) {\n      seen.add(key);\n      result.push(rect);\n    }\n  });\n\n  return result;\n}\n\nfunction dedupePlacements(rects) {\n  const seen = new Set();\n  const result = [];\n\n  rects.forEach((rect) => {\n    const key = `${roundRect(rect.x)}:${roundRect(rect.y)}:${roundRect(rect.width)}:${roundRect(rect.height)}`;\n    if (!seen.has(key)) {\n      seen.add(key);\n      result.push(rect);\n    }\n  });\n\n  return result;\n}\n\nfunction maxRectsSplitFreeRectangles(freeRects, usedRect) {\n  const result = [];\n\n  freeRects.forEach((freeRect) => {\n    if (!rectsOverlap(freeRect, usedRect)) {\n      result.push(freeRect);\n      return;\n    }\n\n    if (usedRect.x > freeRect.x) {\n      result.push({\n        x: freeRect.x,\n        y: freeRect.y,\n        width: usedRect.x - freeRect.x,\n        height: freeRect.height,\n      });\n    }\n\n    if (usedRect.x + usedRect.width < freeRect.x + freeRect.width) {\n      result.push({\n        x: usedRect.x + usedRect.width,\n        y: freeRect.y,\n        width: freeRect.x + freeRect.width - (usedRect.x + usedRect.width),\n        height: freeRect.height,\n      });\n    }\n\n    if (usedRect.y > freeRect.y) {\n      result.push({\n        x: freeRect.x,\n        y: freeRect.y,\n        width: freeRect.width,\n        height: usedRect.y - freeRect.y,\n      });\n    }\n\n    if (usedRect.y + usedRect.height < freeRect.y + freeRect.height) {\n      result.push({\n        x: freeRect.x,\n        y: usedRect.y + usedRect.height,\n        width: freeRect.width,\n        height: freeRect.y + freeRect.height - (usedRect.y + usedRect.height),\n      });\n    }\n  });\n\n  return result.filter((rect) => rect.width > 0 && rect.height > 0);\n}\n\nfunction maxRectsPruneFreeList(rects) {\n  const filtered = rects.filter((rect) => rect.width > 0 && rect.height > 0);\n  const pruned = [];\n\n  for (let i = 0; i < filtered.length; i += 1) {\n    let contained = false;\n\n    for (let j = 0; j < filtered.length; j += 1) {\n      if (i === j) continue;\n      if (rectContainedIn(filtered[i], filtered[j])) {\n        contained = true;\n        break;\n      }\n    }\n\n    if (!contained) {\n      pruned.push(filtered[i]);\n    }\n  }\n\n  return dedupeRects(pruned);\n}\n\nfunction computeDepthPreferenceBias(y, depth, drawerDepth) {\n  if (drawerDepth <= 0) return 0;\n  const depthRatio = depth / drawerDepth;\n  if (depthRatio <= 0.5) {\n    return y;\n  }\n  const bottomGap = drawerDepth - (y + depth);\n  return Math.max(bottomGap, 0);\n}\n\nfunction scoreMaxRectsPackingPlacement(freeRect, width, height, drawerDepth) {\n  const leftoverHoriz = freeRect.width - width;\n  const leftoverVert = freeRect.height - height;\n\n  return {\n    shortSideFit: Math.min(leftoverHoriz, leftoverVert),\n    areaFit: freeRect.width * freeRect.height - width * height,\n    depthPreference: computeDepthPreferenceBias(freeRect.y, height, drawerDepth),\n    y: freeRect.y,\n    x: freeRect.x,\n  };\n}\n\nfunction compareMaxRectsPackingScores(a, b) {\n  if (a.shortSideFit !== b.shortSideFit) return a.shortSideFit - b.shortSideFit;\n  if (a.areaFit !== b.areaFit) return a.areaFit - b.areaFit;\n  if (a.depthPreference !== b.depthPreference) return a.depthPreference - b.depthPreference;\n  if (a.y !== b.y) return a.y - b.y;\n  if (a.x !== b.x) return a.x - b.x;\n  return 0;\n}\n\nfunction findBestMaxRectsPlacementForPacking(freeRects, set, drawerDepth) {\n  const width = set.setWidth || 0;\n  const height = set.setDepth || 0;\n  if (width <= 0 || height <= 0) return null;\n\n  let best = null;\n  let bestScore = null;\n\n  freeRects.forEach((freeRect) => {\n    if (width > freeRect.width || height > freeRect.height) return;\n\n    const score = scoreMaxRectsPackingPlacement(freeRect, width, height, drawerDepth);\n\n    if (!bestScore || compareMaxRectsPackingScores(score, bestScore) < 0) {\n      bestScore = score;\n      best = {\n        x: freeRect.x,\n        y: freeRect.y,\n        width,\n        height,\n      };\n    }\n  });\n\n  return best;\n}\n\nfunction getPlacementAnchors(freeRect, width, height) {\n  const anchors = [\n    { x: freeRect.x, y: freeRect.y }, // top-left\n    { x: freeRect.x + freeRect.width - width, y: freeRect.y }, // top-right\n    { x: freeRect.x, y: freeRect.y + freeRect.height - height }, // bottom-left\n    { x: freeRect.x + freeRect.width - width, y: freeRect.y + freeRect.height - height }, // bottom-right\n  ];\n\n  return dedupeRects(\n    anchors.map((anchor) => ({\n      x: roundRect(anchor.x),\n      y: roundRect(anchor.y),\n      width,\n      height,\n    })),\n  ).map(({ x, y }) => ({ x, y }));\n}\n\nfunction scorePlacementCandidate(freeRect, anchor, width, height) {\n  const leftoverLeft = anchor.x - freeRect.x;\n  const leftoverRight = freeRect.x + freeRect.width - (anchor.x + width);\n  const leftoverTop = anchor.y - freeRect.y;\n  const leftoverBottom = freeRect.y + freeRect.height - (anchor.y + height);\n\n  return {\n    shortSideFit: Math.min(leftoverLeft, leftoverRight, leftoverTop, leftoverBottom),\n    longSideFit: Math.max(leftoverLeft, leftoverRight, leftoverTop, leftoverBottom),\n  };\n}\n\nfunction buildMaxRectsState(drawer, excludePlacement) {\n  const usableWidth = drawer.drawerUsableWidth || 0;\n  const usableDepth = drawer.drawerUsableDepth || 0;\n\n  if (usableWidth <= 0 || usableDepth <= 0) {\n    return [];\n  }\n\n  let freeRects = [\n    {\n      x: 0,\n      y: 0,\n      width: usableWidth,\n      height: usableDepth,\n    },\n  ];\n\n  const occupied = (drawer.placements || [])\n    .filter((p) => p.set && !isExcludedPlacement(p, excludePlacement))\n    .map((p) => ({\n      x: p.x,\n      y: p.y,\n      width: p.width,\n      height: p.depth,\n    }));\n\n  occupied.forEach((rect) => {\n    freeRects = maxRectsSplitFreeRectangles(freeRects, rect);\n    freeRects = maxRectsPruneFreeList(freeRects);\n  });\n\n  return freeRects;\n}\n\nfunction findMaxRectsPlacements(freeRects, set) {\n  const width = set.setWidth || 0;\n  const height = set.setDepth || 0;\n  if (width <= 0 || height <= 0) return [];\n\n  const candidates = [];\n\n  freeRects.forEach((freeRect) => {\n    if (width > freeRect.width || height > freeRect.height) return;\n\n    const anchors = getPlacementAnchors(freeRect, width, height);\n\n    anchors.forEach((anchor) => {\n      const score = scorePlacementCandidate(freeRect, anchor, width, height);\n\n      candidates.push({\n        x: anchor.x,\n        y: anchor.y,\n        width,\n        height,\n        _scoreShort: score.shortSideFit,\n        _scoreLong: score.longSideFit,\n        _sourceArea: freeRect.width * freeRect.height,\n      });\n    });\n  });\n\n  candidates.sort((a, b) => {\n    if (a._scoreShort !== b._scoreShort) return a._scoreShort - b._scoreShort;\n    if (a._scoreLong !== b._scoreLong) return a._scoreLong - b._scoreLong;\n    if (a.y !== b.y) return a.y - b.y;\n    if (a.x !== b.x) return a.x - b.x;\n    return a._sourceArea - b._sourceArea;\n  });\n\n  return dedupePlacements(candidates).map(({ _scoreShort, _scoreLong, _sourceArea, ...rect }) => rect);\n}\n\nfunction getValidFreeRectangles(drawer, set, excludePlacement) {\n  if (!drawer || !set) return [];\n  if ((set.setHeight || 0) > (drawer.drawerHeight || 0)) return [];\n\n  const freeRects = buildMaxRectsState(drawer, excludePlacement);\n  return findMaxRectsPlacements(freeRects, set);\n}\n\nfunction nearlyEqual(a, b, epsilon = 0.001) {\n  return Math.abs((a || 0) - (b || 0)) <= epsilon;\n}\n\nfunction isExcludedPlacement(placement, excludePlacement) {\n  if (!excludePlacement) return false;\n\n  const excludeId = excludePlacement.itemId || \"\";\n  const placementId = placement?.set?.itemId || \"\";\n  if (excludeId && placementId && excludeId !== placementId) return false;\n\n  return (\n    nearlyEqual(placement.x, excludePlacement.x) &&\n    nearlyEqual(placement.y, excludePlacement.y) &&\n    nearlyEqual(placement.width, excludePlacement.width) &&\n    nearlyEqual(placement.depth, excludePlacement.height)\n  );\n}\n\nfunction pickTargetRect(rects, x, y) {\n  if (!rects.length) return null;\n\n  let best = rects[0];\n  let bestDistance = distanceToRect(rects[0], x, y);\n\n  for (let i = 1; i < rects.length; i += 1) {\n    const dist = distanceToRect(rects[i], x, y);\n    if (dist < bestDistance) {\n      best = rects[i];\n      bestDistance = dist;\n    }\n  }\n\n  return best;\n}\n\nfunction distanceToRect(rect, x, y) {\n  const dx =\n    x < rect.x ? rect.x - x : x > rect.x + rect.width ? x - (rect.x + rect.width) : 0;\n\n  const dy =\n    y < rect.y ? rect.y - y : y > rect.y + rect.height ? y - (rect.y + rect.height) : 0;\n\n  return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction distanceToRectCenter(rect, x, y) {\n  const centerX = rect.x + rect.width / 2;\n  const centerY = rect.y + rect.height / 2;\n  const dx = centerX - x;\n  const dy = centerY - y;\n  return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction pointInRect(rect, x, y) {\n  return x >= rect.x && y >= rect.y && x <= rect.x + rect.width && y <= rect.y + rect.height;\n}\n\nexports.maxRectsSplitFreeRectangles = maxRectsSplitFreeRectangles;\nexports.maxRectsPruneFreeList = maxRectsPruneFreeList;\nexports.findBestMaxRectsPlacementForPacking = findBestMaxRectsPlacementForPacking;\nexports.buildMaxRectsState = buildMaxRectsState;\nexports.findMaxRectsPlacements = findMaxRectsPlacements;\nexports.getValidFreeRectangles = getValidFreeRectangles;\nexports.pickTargetRect = pickTargetRect;\nexports.distanceToRect = distanceToRect;\nexports.distanceToRectCenter = distanceToRectCenter;\nexports.pointInRect = pointInRect;\n});\n\n__define(\"features/fab-actions/fab-actions.js\", (exports, __require) => {\nconst { byId } = __require(\"shared/dom/dom-helpers.js\");\nfunction closeFab(fab) {\n  fab.classList.remove(\"active\");\n  fab.querySelector(\"[data-fab-toggle]\")?.setAttribute(\"aria-expanded\", \"false\");\n}\n\nfunction wireFabActions() {\n  const fab = byId(\"fabActions\");\n  if (!fab) return;\n\n  const toggleButton =\n    fab.querySelector(\"[data-fab-toggle=\\\"true\\\"]\") || fab.querySelector(\"button\");\n  if (!toggleButton) return;\n\n  toggleButton.addEventListener(\"click\", (event) => {\n    event.preventDefault();\n    event.stopPropagation();\n    fab.classList.toggle(\"active\");\n    toggleButton.setAttribute(\"aria-expanded\", String(fab.classList.contains(\"active\")));\n  });\n\n  document.addEventListener(\"click\", () => closeFab(fab));\n\n  document.addEventListener(\"keydown\", (event) => {\n    if (event.key !== \"Escape\") return;\n    closeFab(fab);\n  });\n\n  const actions = fab.querySelector(\"ul\");\n  if (actions) {\n    actions.addEventListener(\"click\", () => closeFab(fab));\n  }\n}\n\n\nexports.wireFabActions = wireFabActions;\n});\n\n__define(\"features/product-details/product-detail-modal.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { escapeHtml } = __require(\"shared/utils/string-utils.js\");\nfunction wireProductModal(state) {\n  const modal = document.getElementById(\"productDetailModal\");\n  if (!modal) return;\n\n  const closeBtn = document.getElementById(\"productDetailClose\");\n  if (closeBtn) {\n    closeBtn.addEventListener(\"click\", closeProductModal);\n  }\n\n  modal.addEventListener(\"click\", (event) => {\n    if (event.target === modal) closeProductModal();\n  });\n\n  document.addEventListener(\"keydown\", (event) => {\n    if (event.key === \"Escape\") closeProductModal();\n  });\n\n  document.addEventListener(\"click\", (event) => handleProductModalClick(event, state));\n}\n\nfunction lockPageScroll() {\n  const body = document.body;\n  const html = document.documentElement;\n  if (!body || !html) return;\n\n  const currentLocks = Number.parseInt(body.dataset.scrollLockCount || \"0\", 10) || 0;\n  body.dataset.scrollLockCount = String(currentLocks + 1);\n  if (currentLocks > 0) return;\n\n  const state = {\n    body: {\n      overflow: body.style.overflow,\n      paddingRight: body.style.paddingRight,\n    },\n    html: {\n      overflow: html.style.overflow,\n    },\n  };\n\n  body.dataset.scrollLockState = JSON.stringify(state);\n\n  const scrollbarWidth = window.innerWidth - html.clientWidth;\n  if (scrollbarWidth > 0) body.style.paddingRight = `${scrollbarWidth}px`;\n\n  html.style.overflow = \"hidden\";\n  body.style.overflow = \"hidden\";\n}\n\nfunction unlockPageScroll() {\n  const body = document.body;\n  const html = document.documentElement;\n  if (!body || !html) return;\n\n  const currentLocks = Number.parseInt(body.dataset.scrollLockCount || \"0\", 10) || 0;\n  if (currentLocks <= 1) {\n    body.dataset.scrollLockCount = \"0\";\n\n    let state = null;\n    try {\n      state = JSON.parse(body.dataset.scrollLockState || \"null\");\n    } catch {\n      state = null;\n    }\n\n    body.style.position = state?.body?.position ?? \"\";\n    body.style.top = state?.body?.top ?? \"\";\n    body.style.left = state?.body?.left ?? \"\";\n    body.style.right = state?.body?.right ?? \"\";\n    body.style.width = state?.body?.width ?? \"\";\n    body.style.overflow = state?.body?.overflow ?? \"\";\n    body.style.paddingRight = state?.body?.paddingRight ?? \"\";\n    html.style.overflow = state?.html?.overflow ?? \"\";\n\n    delete body.dataset.scrollLockState;\n    return;\n  }\n\n  body.dataset.scrollLockCount = String(currentLocks - 1);\n}\n\nfunction handleProductModalClick(event, state) {\n  const trigger = event.target.closest(\"[data-action=\\\"open-product-modal\\\"]\");\n  if (!trigger) return;\n\n  event.preventDefault();\n\n  const type = trigger.getAttribute(\"data-item-type\");\n  const itemId = trigger.getAttribute(\"data-item-id\");\n  if (!type || !itemId) return;\n\n  const item = type === \"toolstorage\" ? state.toolStorageMap.get(itemId) : state.toolSetMap.get(itemId);\n  if (!item) return;\n\n  openProductModal(item, type);\n}\n\nfunction openProductModal(item, type) {\n  const modal = document.getElementById(\"productDetailModal\");\n  const body = document.getElementById(\"productDetailBody\");\n  const title = document.getElementById(\"productDetailTitle\");\n  if (!modal || !body || !title) return;\n\n  const wasHidden = modal.classList.contains(\"hidden\");\n\n  const description = escapeHtml(item.description || item.itemId || t(\"product\", \"Product\"));\n  const itemId = escapeHtml(item.itemId || \"\");\n  const imageUrl = escapeHtml(item.itemImageUrl || \"data/imgsource.png\");\n  const imageAlt = escapeHtml(`${item.description || t(\"product\", \"Product\")} ${item.itemId || \"\"}`.trim());\n\n  const typeLabel =\n    type === \"toolstorage\"\n      ? escapeHtml(item.productType || t(\"toolStorage\", \"Tool storage\"))\n      : escapeHtml(item.typeOfSet || t(\"toolSet\", \"Tool set\"));\n\n  const rows = type === \"toolstorage\" ? buildToolstorageDetailRows(item) : buildToolSetDetailRows(item);\n  const storageFeatures = type === \"toolstorage\" ? buildStorageFeaturesList(item) : \"\";\n\n  body.dataset.productSku = item.itemId;\n  title.textContent = item.description || item.itemId || t(\"productDetails\", \"Product details\");\n\n  body.innerHTML = `\n    <div class=\"flex aspect-square items-center justify-center p-3\">\n      <img class=\"max-h-full max-w-full object-contain\" src=\"${imageUrl}\" alt=\"${imageAlt}\" loading=\"lazy\" />\n    </div>\n    <div class=\"grid gap-3\">\n      <div>\n        <span class=\"text-xs font-semibold uppercase tracking-wide text-gray-500\">${typeLabel}</span>\n        <h4 class=\"my-3 text-base font-semibold uppercase leading-snug text-gray-900\">${description}</h4>\n        <p class=\"text-xs text-gray-500\">${itemId}</p>\n        ${storageFeatures}\n      </div>\n      <dl class=\"grid pb-3 pr-3 text-sm text-gray-600\">${rows}</dl>\n    </div>\n  `;\n\n  modal.classList.remove(\"hidden\");\n  modal.classList.add(\"flex\");\n  if (wasHidden) lockPageScroll();\n}\n\nfunction closeProductModal() {\n  const modal = document.getElementById(\"productDetailModal\");\n  if (!modal || modal.classList.contains(\"hidden\")) return;\n  modal.classList.add(\"hidden\");\n  modal.classList.remove(\"flex\");\n  unlockPageScroll();\n}\n\nfunction buildToolstorageDetailRows(item) {\n  const colour = escapeHtml(item.storageColour || t(\"notAvailable\", \"N/A\"));\n  const drawerCount =\n    Number.isFinite(item.numberOfDrawerInStorage) && item.numberOfDrawerInStorage > 0\n      ? `${item.numberOfDrawerInStorage} ${t(\"drawersLowercase\", \"drawers\")}`\n      : t(\"drawerCountNotAvailable\", \"Drawer count N/A\");\n\n  return `\n    ${buildDetailRow(t(\"colour\", \"Colour\"), colour)}\n    ${buildDetailRow(t(\"drawers\", \"Drawers\"), drawerCount)}\n  `;\n}\n\nfunction buildToolSetDetailRows(item) {\n  const typeOfSet = escapeHtml(item.typeOfSet || t(\"notAvailable\", \"N/A\"));\n  const width = formatNumber(item.setWidth);\n  const depth = formatNumber(item.setDepth);\n  const height = formatNumber(item.setHeight);\n  const weight = formatNumber(item.itemWeight);\n\n  return `\n    ${buildDetailRow(t(\"type\", \"Type\"), typeOfSet)}\n    ${buildDetailRow(t(\"width\", \"Width\"), width)}\n    ${buildDetailRow(t(\"depth\", \"Depth\"), depth)}\n    ${buildDetailRow(t(\"height\", \"Height\"), height)}\n    ${buildDetailRow(t(\"weight\", \"Weight\"), weight)}\n  `;\n}\n\nfunction buildDetailRow(label, value, ddExtra = \"\") {\n  return `\n    <div class=\"flex items-center justify-between gap-3 px-3 py-2  odd:bg-gray-100 even:bg-white\">\n      <dt class=\"text-gray-600\">${label}</dt>\n      <dd class=\"${ddExtra} text-right\">${value}</dd>\n    </div>\n  `;\n}\n\nfunction formatNumber(value) {\n  return Number.isFinite(value) && value !== 0 ? String(value) : t(\"notAvailable\", \"N/A\");\n}\n\nfunction buildStorageFeaturesList(item) {\n  const raw = typeof item?.storageFeatures === \"string\" ? item.storageFeatures : \"\";\n  const points = raw\n    .split(\";\")\n    .map((value) => escapeHtml(value.trim()))\n    .filter(Boolean)\n    .slice(0, 12);\n\n  if (!points.length) return \"\";\n\n  return `\n    <ul class=\"mt-3 list-disc space-y-1 pl-5 text-sm\">\n      ${points.map((point) => `<li>${point}</li>`).join(\"\")}\n    </ul>\n  `;\n}\n\nexports.wireProductModal = wireProductModal;\n});\n\n__define(\"features/tabs/tabs-ui.js\", (exports, __require) => {\nfunction initTabsUI() {\n  const tabButtons = document.querySelectorAll(\".tab-btn\");\n  const tabPanels = document.querySelectorAll(\".tab-panel\");\n\n  tabButtons.forEach((button) => {\n    button.addEventListener(\"click\", () => {\n      const targetPanel = button.dataset.tab;\n\n      tabButtons.forEach((btn) => {\n        btn.setAttribute(\"aria-selected\", \"false\");\n        btn.classList.remove(\"text-red-600\", \"border-red-600\");\n        btn.classList.add(\"text-gray-500\", \"border-transparent\");\n      });\n\n      tabPanels.forEach((panel) => {\n        panel.classList.add(\"hidden\");\n      });\n\n      button.setAttribute(\"aria-selected\", \"true\");\n      button.classList.remove(\"text-gray-500\", \"border-transparent\");\n      button.classList.add(\"text-red-600\", \"border-red-600\");\n\n      if (targetPanel) {\n        document.getElementById(targetPanel)?.classList.remove(\"hidden\");\n      }\n    });\n  });\n}\n\n\nexports.initTabsUI = initTabsUI;\n});\n\n__define(\"features/tool-kits/predefined-tool-kit-modal.js\", (exports, __require) => {\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst { getDataUrls, resolveImagePath } = __require(\"shared/runtime/app-config.js\");\nconst { escapeHtml } = __require(\"shared/utils/string-utils.js\");\nconst { applyImportedConfiguration } = __require(\"features/configurator/configurator-persistence.js\");\nlet modalWired = false;\nlet toolKits = null;\nlet toolKitsById = new Map();\nlet toolKitsLoadPromise = null;\n\nfunction lockPageScroll() {\n  const body = document.body;\n  const html = document.documentElement;\n  if (!body || !html) return;\n\n  const currentLocks = Number.parseInt(body.dataset.scrollLockCount || \"0\", 10) || 0;\n  body.dataset.scrollLockCount = String(currentLocks + 1);\n  if (currentLocks > 0) return;\n\n  const scrollY = window.scrollY || 0;\n  const state = {\n    scrollY,\n    body: {\n      position: body.style.position,\n      top: body.style.top,\n      left: body.style.left,\n      right: body.style.right,\n      width: body.style.width,\n      overflow: body.style.overflow,\n      paddingRight: body.style.paddingRight,\n    },\n    html: {\n      overflow: html.style.overflow,\n    },\n  };\n\n  body.dataset.scrollLockState = JSON.stringify(state);\n\n  const scrollbarWidth = window.innerWidth - html.clientWidth;\n  if (scrollbarWidth > 0) body.style.paddingRight = `${scrollbarWidth}px`;\n\n  html.style.overflow = \"hidden\";\n  body.style.overflow = \"hidden\";\n  body.style.position = \"fixed\";\n  body.style.top = `-${scrollY}px`;\n  body.style.left = \"0\";\n  body.style.right = \"0\";\n  body.style.width = \"100%\";\n}\n\nfunction unlockPageScroll() {\n  const body = document.body;\n  const html = document.documentElement;\n  if (!body || !html) return;\n\n  const currentLocks = Number.parseInt(body.dataset.scrollLockCount || \"0\", 10) || 0;\n  if (currentLocks <= 1) {\n    body.dataset.scrollLockCount = \"0\";\n\n    let state = null;\n    try {\n      state = JSON.parse(body.dataset.scrollLockState || \"null\");\n    } catch {\n      state = null;\n    }\n\n    body.style.position = state?.body?.position ?? \"\";\n    body.style.top = state?.body?.top ?? \"\";\n    body.style.left = state?.body?.left ?? \"\";\n    body.style.right = state?.body?.right ?? \"\";\n    body.style.width = state?.body?.width ?? \"\";\n    body.style.overflow = state?.body?.overflow ?? \"\";\n    body.style.paddingRight = state?.body?.paddingRight ?? \"\";\n    html.style.overflow = state?.html?.overflow ?? \"\";\n\n    delete body.dataset.scrollLockState;\n\n    const scrollY = Number.isFinite(state?.scrollY) ? state.scrollY : 0;\n    window.scrollTo(0, scrollY);\n    return;\n  }\n\n  body.dataset.scrollLockCount = String(currentLocks - 1);\n}\n\nfunction closePredefinedToolKitModal() {\n  const modal = document.getElementById(\"predefinedToolKitModal\");\n  if (!modal || modal.classList.contains(\"hidden\")) return;\n  modal.classList.add(\"hidden\");\n  modal.classList.remove(\"flex\");\n  unlockPageScroll();\n}\n\nasync function loadToolKits() {\n  if (toolKits) return toolKits;\n  if (toolKitsLoadPromise) return toolKitsLoadPromise;\n\n  toolKitsLoadPromise = (async () => {\n    let lastError = null;\n\n    for (const url of getDataUrls(\"toolKits\")) {\n      try {\n        const response = await fetch(url);\n        if (!response.ok) throw new Error(`Failed to load tool kits (${response.status})`);\n\n        const parsed = await response.json();\n        if (!Array.isArray(parsed)) throw new Error(\"Invalid tool-kits.json: expected an array.\");\n\n        toolKits = parsed.filter(Boolean);\n        toolKitsById = new Map(toolKits.map((kit) => [String(kit.itemId || \"\"), kit]).filter(([id]) => id));\n        return toolKits;\n      } catch (error) {\n        lastError = error;\n      }\n    }\n\n    throw lastError || new Error(\"Missing tool-kits data URL.\");\n  })();\n\n  try {\n    return await toolKitsLoadPromise;\n  } finally {\n    toolKitsLoadPromise = null;\n  }\n}\n\nfunction renderToolKits(kits) {\n  const container = document.getElementById(\"predefinedToolKitList\");\n  if (!container) return;\n\n  container.innerHTML = kits\n    .map((kit) => {\n      const itemId = escapeHtml(kit.itemId || \"\");\n      const description = escapeHtml(kit.description || kit.itemId || t(\"toolKit\", \"Tool kit\"));\n      const imageUrl = escapeHtml(resolveImagePath(kit.itemImageUrl || \"\") || \"data/imgsource.png\");\n      const imageAlt = escapeHtml(`${kit.description || t(\"toolKit\", \"Tool kit\")} ${kit.itemId || \"\"}`.trim());\n\n      return `\n        <div class=\"relative flex w-full flex-col overflow-hidden border border-gray-100 bg-white\">\n          <a class=\"relative mx-auto mt-3 flex w-full max-w-[140px] aspect-[8/7] items-center justify-center overflow-hidden sm:max-w-[160px]\" href=\"#\" data-action=\"select-predefined-tool-kit\" data-kit-id=\"${itemId}\">\n            <img class=\"h-full w-full object-contain\" src=\"${imageUrl}\" alt=\"${imageAlt}\" loading=\"lazy\" />\n          </a>\n\n          <div class=\"mt-3 px-3 pb-3\">\n            <a href=\"#\" data-action=\"select-predefined-tool-kit\" data-kit-id=\"${itemId}\">\n              <h5 class=\"text-xs font-semibold uppercase tracking-wide text-gray-900 leading-tight\">\n                ${description}\n              </h5>\n            </a>\n\n            <div class=\"flex items-center justify-between gap-3 pt-2\">\n              <div class=\"min-w-0 print:break-inside-avoid\">\n                <ul class=\"grid gap-1\">\n                  <li class=\"grid gap-x-3 bg-white text-xs leading-tight\">\n                    <span class=\"text-gray-600\">${itemId}</span>\n                  </li>\n                </ul>\n              </div>\n              <button class=\"inline-flex h-8 w-8 items-center justify-center rounded-full border border-gray-200 bg-gray-100 text-gray-700 transition hover:bg-gray-300\" type=\"button\" aria-label=\"${escapeHtml(t(\"loadToolKit\", \"Load tool kit\"))}\" data-action=\"select-predefined-tool-kit\" data-kit-id=\"${itemId}\">\n                <svg viewBox=\"0 0 20 20\" aria-hidden=\"true\" class=\"h-4 w-4 fill-current\">\n                  <path d=\"M9 4a1 1 0 0 1 2 0v5h5a1 1 0 0 1 0 2h-5v5a1 1 0 1 1-2 0v-5H4a1 1 0 1 1 0-2h5V4z\"></path>\n                </svg>\n              </button>\n            </div>\n          </div>\n        </div>\n      `;\n    })\n    .join(\"\");\n}\n\nfunction showStatus(message) {\n  const status = document.getElementById(\"predefinedToolKitStatus\");\n  if (!status) return;\n  status.textContent = message || \"\";\n}\n\nfunction openPredefinedToolKitModal(state) {\n  const modal = document.getElementById(\"predefinedToolKitModal\");\n  const container = document.getElementById(\"predefinedToolKitList\");\n  if (!modal || !container) return;\n\n  if (!modalWired) {\n    modalWired = true;\n\n    const closeBtn = document.getElementById(\"predefinedToolKitClose\");\n    if (closeBtn) closeBtn.addEventListener(\"click\", closePredefinedToolKitModal);\n\n    modal.addEventListener(\"click\", (event) => {\n      if (event.target === modal) closePredefinedToolKitModal();\n    });\n\n    document.addEventListener(\"keydown\", (event) => {\n      if (event.key === \"Escape\") closePredefinedToolKitModal();\n    });\n\n    modal.addEventListener(\"click\", (event) => {\n      const trigger = event.target.closest(\"[data-action=\\\"select-predefined-tool-kit\\\"]\");\n      if (!trigger) return;\n      event.preventDefault();\n\n      const kitId = trigger.getAttribute(\"data-kit-id\");\n      if (!kitId) return;\n\n      const kit = toolKitsById.get(kitId);\n      if (!kit) return;\n\n      const applied = applyImportedConfiguration(state, kit);\n      if (applied) closePredefinedToolKitModal();\n    });\n  }\n\n  showStatus(t(\"loadingToolKits\", \"Loading tool kits\u2026\"));\n  container.innerHTML = \"\";\n\n  modal.classList.remove(\"hidden\");\n  modal.classList.add(\"flex\");\n  lockPageScroll();\n\n  void loadToolKits()\n    .then((kits) => {\n      if (!modal.classList.contains(\"hidden\")) {\n        renderToolKits(kits);\n        showStatus(kits.length ? \"\" : t(\"noToolKitsFound\", \"No tool kits found.\"));\n      }\n    })\n    .catch((err) => {\n      console.error(err);\n      if (!modal.classList.contains(\"hidden\")) {\n        showStatus(t(\"configuratorDataCouldNotBeLoaded\", \"The configurator data could not be loaded.\"));\n      }\n    });\n}\n\nfunction wirePredefinedToolKitModal(state) {\n  const openBtn = document.getElementById(\"loadPredefinedToolKit\");\n  const modal = document.getElementById(\"predefinedToolKitModal\");\n  if (!openBtn || !modal) return;\n\n  openBtn.addEventListener(\"click\", (event) => {\n    event.preventDefault();\n    openBtn.closest(\"details\")?.removeAttribute(\"open\");\n    openPredefinedToolKitModal(state);\n  });\n}\n\nexports.openPredefinedToolKitModal = openPredefinedToolKitModal;\nexports.wirePredefinedToolKitModal = wirePredefinedToolKitModal;\n});\n\n__define(\"features/toolstorage-data/toolstorage-data-api.js\", (exports, __require) => {\nconst { getDataUrls } = __require(\"shared/runtime/app-config.js\");\nfunction checkResponse(response) {\n  if (!response.ok) {\n    throw new Error(`Failed to load ${response.url}: ${response.status}`);\n  }\n  return response;\n}\n\nasync function fetchJson(url) {\n  const response = await fetch(url).then(checkResponse);\n  return response.json();\n}\n\nasync function fetchFirstAvailableJson(urls, resourceName) {\n  let lastError = null;\n\n  for (const url of urls) {\n    try {\n      return await fetchJson(url);\n    } catch (error) {\n      lastError = error;\n    }\n  }\n\n  if (lastError) throw lastError;\n  throw new Error(`Missing data URL for ${resourceName}.`);\n}\n\nfunction fetchToolStorageRows() {\n  return fetchFirstAvailableJson(getDataUrls(\"toolStorages\"), \"toolStorages\");\n}\n\nfunction fetchToolSetRows() {\n  return fetchFirstAvailableJson(getDataUrls(\"toolSets\"), \"toolSets\");\n}\n\nexports.fetchToolStorageRows = fetchToolStorageRows;\nexports.fetchToolSetRows = fetchToolSetRows;\n});\n\n__define(\"features/toolstorage-data/toolstorage-normalizer.js\", (exports, __require) => {\nconst { toInt, toNumber } = __require(\"shared/utils/number-utils.js\");\nconst { resolveImagePath } = __require(\"shared/runtime/app-config.js\");\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nconst { getStorageBrand, getStorageSelectionDepth, getStorageSelectionWidth, getStorageTypeKey } = __require(\"features/toolstorage-selection/toolstorage-selection-service.js\");\nfunction parseNumberList(value) {\n  return cleanString(value)\n    .split(\";\")\n    .map((v) => toNumber(v))\n    .filter((v) => Number.isFinite(v));\n}\n\nfunction normalizeToolStorages(rows) {\n  return rows.map((row) => {\n    const storage = {\n      itemId: cleanString(row.itemId),\n      altId: cleanString(row.altId),\n      description: cleanString(row.description),\n      productType: cleanString(row.productType),\n      itemTypeOfStorage: cleanString(row.ItemTypeOfStorage),\n      productArtistBrand: cleanString(row.ProductArtistBrand),\n      itemWidthMm: toNumber(row.ItemWidthMm),\n      itemDepthMm: toNumber(row.ItemDepthMm),\n      itemImageUrl: resolveImagePath(row.itemImageUrl || \"\"),\n      storageFeatures: cleanString(row.storageFeatures),\n      numberOfDrawerInStorage: toInt(row.numberOfDrawerInStorage),\n      storagePerDrawerCapacity: parseNumberList(row.storagePerDrawerCapacity),\n      storagePerDrawerDepth: parseNumberList(row.storagePerDrawerDepth),\n      storagePerDrawerHeight: parseNumberList(row.storagePerDrawerHeight),\n      storagePerDrawerWidth: parseNumberList(row.storagePerDrawerWidth),\n      storageColour: cleanString(row.storageColour),\n      includes: Array.isArray(row.includes) ? row.includes.map(cleanString).filter(Boolean) : [],\n    };\n\n    return {\n      ...storage,\n      storageTypeKey: getStorageTypeKey(storage),\n      storageBrand: getStorageBrand(storage),\n      storageSelectionWidth: getStorageSelectionWidth(storage),\n      storageSelectionDepth: getStorageSelectionDepth(storage),\n    };\n  });\n}\n\nfunction normalizeToolSets(rows) {\n  return rows.map((row) => ({\n    itemId: cleanString(row.itemId),\n    altId: cleanString(row.altId),\n    description: cleanString(row.description),\n    typeOfSet: cleanString(row.typeOfSet),\n    itemImageUrl: resolveImagePath(row.itemImageUrl || \"\"),\n    itemWeight: toNumber(row.itemWeight),\n    setWidth: toNumber(row.setWidth),\n    setDepth: toNumber(row.setDepth),\n    setHeight: toNumber(row.setHeight),\n    raw: row,\n  }));\n}\n\nexports.normalizeToolStorages = normalizeToolStorages;\nexports.normalizeToolSets = normalizeToolSets;\n});\n\n__define(\"features/toolstorage-selection/toolstorage-selection-service.js\", (exports, __require) => {\nconst { cleanString, uniquePreserveOrder } = __require(\"shared/utils/string-utils.js\");\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\nconst STORAGE_TYPE_ROLLER_CABINET = \"roller-cabinet\";\nconst STORAGE_TYPE_TOOL_CHEST = \"tool-chest\";\nconst STORAGE_TYPE_STACK_SYSTEM = \"stack-system\";\nconst STORAGE_TYPE_PORTABLE = \"portable\";\n\nfunction normalizeStorageType(itemTypeOfStorage, productType) {\n  const value = cleanString(itemTypeOfStorage || productType).toLowerCase();\n\n  if (value === \"roller cabinet\") return STORAGE_TYPE_ROLLER_CABINET;\n  if (value === \"tool chest\") return STORAGE_TYPE_TOOL_CHEST;\n  if (value === \"stack system\") return STORAGE_TYPE_STACK_SYSTEM;\n  if (value === \"portable\") return STORAGE_TYPE_PORTABLE;\n\n  return value;\n}\n\nfunction getStorageTypeKey(storage) {\n  return normalizeStorageType(storage?.itemTypeOfStorage, storage?.productType);\n}\n\nfunction getStorageBrand(storage) {\n  return cleanString(storage?.productArtistBrand);\n}\n\nfunction getStorageSelectionWidth(storage) {\n  return Number(storage?.itemWidthMm) || 0;\n}\n\nfunction getStorageSelectionDepth(storage) {\n  return Number(storage?.itemDepthMm) || 0;\n}\n\nfunction getStorageNominalWidthInches(storage) {\n  const description = cleanString(storage?.description);\n  const match = description.match(/(\\d+(?:\\.\\d+)?)\\s*[\"\u201D]/);\n  return match ? Number(match[1]) || 0 : 0;\n}\n\nfunction parseSelectedToolStorageIds(value) {\n  return cleanString(value)\n    .split(/\\r?\\n/)\n    .map(cleanString)\n    .filter(Boolean);\n}\n\nfunction serializeSelectedToolStorageIds(ids) {\n  return uniquePreserveOrder(ids || []).join(\"\\n\");\n}\n\nfunction compareSelectedToolStorages(left, right) {\n  const leftType = getStorageTypeKey(left);\n  const rightType = getStorageTypeKey(right);\n  const leftIsToolChest = leftType === STORAGE_TYPE_TOOL_CHEST;\n  const rightIsToolChest = rightType === STORAGE_TYPE_TOOL_CHEST;\n  const leftIsRoller = leftType === STORAGE_TYPE_ROLLER_CABINET;\n  const rightIsRoller = rightType === STORAGE_TYPE_ROLLER_CABINET;\n\n  if (leftIsToolChest !== rightIsToolChest) {\n    return leftIsToolChest ? -1 : 1;\n  }\n\n  if (leftIsRoller !== rightIsRoller) {\n    return leftIsRoller ? 1 : -1;\n  }\n\n  if (leftIsToolChest && rightIsToolChest) {\n    const drawerDifference = (Number(right?.numberOfDrawerInStorage) || 0) - (Number(left?.numberOfDrawerInStorage) || 0);\n    if (drawerDifference !== 0) return drawerDifference;\n  }\n\n  const widthDifference = getStorageSelectionWidth(right) - getStorageSelectionWidth(left);\n  if (widthDifference !== 0) return widthDifference;\n\n  return String(left?.itemId || \"\").localeCompare(String(right?.itemId || \"\"));\n}\n\nfunction sortSelectedToolStorages(storages) {\n  return (storages || []).slice().sort(compareSelectedToolStorages);\n}\n\nfunction resolveSelectedToolStorages(ids, toolStorageMap) {\n  const selected = uniquePreserveOrder(ids || [])\n    .map((itemId) => toolStorageMap.get(itemId))\n    .filter(Boolean);\n\n  return sortSelectedToolStorages(selected);\n}\n\nfunction buildToolStorageSelectionKey(storages) {\n  return sortSelectedToolStorages(storages)\n    .map((storage) => storage.itemId)\n    .join(\"|\");\n}\n\nfunction validateToolStorageSelection(storages) {\n  return {valid:true,message:\"\"};\n}\n\nexports.getStorageTypeKey = getStorageTypeKey;\nexports.getStorageBrand = getStorageBrand;\nexports.getStorageSelectionWidth = getStorageSelectionWidth;\nexports.getStorageSelectionDepth = getStorageSelectionDepth;\nexports.getStorageNominalWidthInches = getStorageNominalWidthInches;\nexports.parseSelectedToolStorageIds = parseSelectedToolStorageIds;\nexports.serializeSelectedToolStorageIds = serializeSelectedToolStorageIds;\nexports.sortSelectedToolStorages = sortSelectedToolStorages;\nexports.resolveSelectedToolStorages = resolveSelectedToolStorages;\nexports.buildToolStorageSelectionKey = buildToolStorageSelectionKey;\nexports.validateToolStorageSelection = validateToolStorageSelection;\n});\n\n__define(\"shared/dom/dom-helpers.js\", (exports, __require) => {\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nfunction byId(id) {\n  return document.getElementById(id);\n}\n\nfunction getTrimmedValue(id) {\n  const el = byId(id);\n  return cleanString(el?.value);\n}\n\nexports.byId = byId;\nexports.getTrimmedValue = getTrimmedValue;\n});\n\n__define(\"shared/i18n/toolkit-i18n.js\", (exports, __require) => {\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nconst DEFAULT_TOOLKIT_TRANSLATIONS = {\n  actions: \"Actions\",\n  addAnother: \"Add\",\n  addToList: \"Add to list\",\n  clear: \"Clear\",\n  clearFilters: \"Clear filters\",\n  clipboardUnavailable: \"Clipboard unavailable in this browser.\",\n  close: \"Close\",\n  colour: \"Colour\",\n  configurationExport: \"Configuration export\",\n  configurationExportTxt: \"Configuration export (.txt)\",\n  configuratorDataCouldNotBeLoaded: \"The configurator data could not be loaded.\",\n  configureTheToolStorage: \"Configure the tool storage\",\n  copied: \"Copied.\",\n  copy: \"Copy\",\n  copyFailed: \"Copy failed.\",\n  copyFailedSelectManually: \"Copy failed. Select and copy manually.\",\n  copyJson: \"Copy JSON\",\n  copyPasteFourColumnTable: \"Copy and paste this four-column table into Excel or Sheets.\",\n  customised: \"CUSTOMISED\",\n  depth: \"Depth\",\n  designedInSweden: \"Designed in Sweden\",\n  detailsPrefix: \" Details:\",\n  dismissHint: \"Dismiss hint\",\n  doesNotFitCurrentDrawerLayout: \"Does not fit in the current drawer layout.\",\n  downloadConfiguration: \"Download Configuration\",\n  downloadMobileHint: \"If downloading fails on mobile, use browser Share/Save from this page, or copy the JSON below.\",\n  drawer: \"Drawer\",\n  drawerCountNotAvailable: \"Drawer count N/A\",\n  drawers: \"Drawers\",\n  drawersLowercase: \"drawers\",\n  emptyDownloadHint: \"If your browser creates empty downloads, use the link below (a real tap) to download the export.\",\n  expertSolutionsForIndustrialEfficiency: \"EXPERT SOLUTIONS FOR INDUSTRIAL EFFICIENCY\",\n  exportGenerated: \"Export generated\",\n  exportHeadingCount: \"Count\",\n  exportHeadingDescription: \"Description\",\n  exportHeadingDrawerIndex: \"DrawerIndex\",\n  exportHeadingItemId: \"ItemId\",\n  exportSelectedItems: \"Export Selected Items\",\n  exportTable: \"Export table\",\n  failedToReadSelectedFile: \"Failed to read the selected file.\",\n  failedToSaveFile: \"Failed to save file:\",\n  file: \"File\",\n  filterByItemId: \"Filter by Item Id\",\n  filters: \"Filters\",\n  height: \"Height\",\n  invalidConfigurationExportSelectTxt: \"Invalid configuration export. Please select a .txt file containing JSON exported from this configurator.\",\n  invalidExportDrawerIndex: \"Invalid configuration export: a drawer is missing 'drawerIndex'.\",\n  invalidExportDrawerLocked: \"Invalid configuration export: a drawer has invalid 'locked' (expected a boolean).\",\n  invalidExportDrawerObject: \"Invalid configuration export: each drawer must be an object.\",\n  invalidExportDrawerSets: \"Invalid configuration export: a drawer has invalid 'sets' (expected an array).\",\n  invalidExportDrawers: \"Invalid configuration export: invalid 'drawers' (expected an array).\",\n  invalidExportExpectedJsonObject: \"Invalid configuration export: expected a JSON object.\",\n  invalidExportSavedAt: \"Invalid configuration export: invalid 'savedAt' (expected an ISO timestamp string).\",\n  invalidExportToolstorageIds: \"Invalid configuration export: missing or invalid 'toolstorageIds' (expected a string).\",\n  invalidExportToolsetIds: \"Invalid configuration export: missing or invalid 'toolsetIds' (expected a string).\",\n  invalidExportToolstorageId: \"Invalid configuration export: missing or invalid 'toolstorageId' (expected a string).\",\n  invalidToolStorageSelection: \"This storage selection is not allowed.\",\n  invalidExportVersion: \"Invalid configuration export: invalid 'version' (expected a number).\",\n  loadConfiguration: \"Load configuration\",\n  loadPredefinedToolKit: \"Load predefined tool kit\",\n  loadToolKit: \"Load tool kit\",\n  loadToolkit: \"Load toolkit\",\n  loadingToolKits: \"Loading tool kits\u2026\",\n  lockedDrawer: \"Locked drawer\",\n  missingAppConfigData: \"Missing APP_CONFIG.data configuration.\",\n  missingToolkitConfiguratorAppMount: \"Missing #toolkit-configurator-app mount.\",\n  missingToolkitMountElement: \"Missing toolkit configurator mount element.\",\n  noConfigurationRendered: \"No configuration rendered\",\n  noFiltersAvailable: \"No filters available.\",\n  noSetsPlacedInDrawer: \"No sets placed in this drawer.\",\n  noToolKitsFound: \"No tool kits found.\",\n  noToolSetsMatchFilters: \"No tool sets match your filters.\",\n  noToolStorageSelected: \"No tool storage selected.\",\n  noToolStoragesMatchFilters: \"No tool storages match your filters.\",\n  notAvailable: \"N/A\",\n  notFound: \"Not found\",\n  openProductDetailsFor: \"Open product details for\",\n  organiseStorage: \"3. Organise your storage with drag and drop.\",\n  pasteOneToolSetIdPerLine: \"Paste one tool set ID per line\",\n  placeListItems: \"Place list items\",\n  pleaseEnterValidToolStorageId: \"Please enter a valid tool storage ID.\",\n  printIntroLine1: \"TengTools provide demanding professionals with hand tools in\",\n  printIntroLine2: \"modular storage solutions that are built to last.\",\n  printPdf: \"Print PDF\",\n  product: \"Product\",\n  productDetails: \"Product details\",\n  productType: \"Product type\",\n  removeSet: \"Remove set\",\n  sampleTabs: \"Product catalogue\",\n  saveConfiguration: \"Save configuration\",\n  searchByNameIdType: \"Search by name, ID, or type\",\n  selectToolKitToMakeCustomLayout: \"Select a TengTools tool kit to make a custom layout.\",\n  setHeightGreaterThanDrawerHeight: \"Set height is greater than drawer height.\",\n  stackSystemCannotBeCombined: \"A stack system cannot be combined with other storage units.\",\n  selectToolStorage: \"Select tool storage\",\n  selectToolStorageAndConfigure: \"Select a tool storage and configure its contents.\",\n  selectYourSets: \"2. Select your sets.\",\n  selectYourStorage: \"1. Select your storage.\",\n  selected: \"Selected\",\n  selectedToolStorage: \"Selected tool storage\",\n  selectedToolStorageColon: \"Selected tool storage:\",\n  portableCannotBeCombined: \"A portable storage unit cannot be combined with other storage units.\",\n  toolStorageSelectionSameBrandOnly: \"You can only combine storage units from the same product range.\",\n  toolChestCannotBeWiderThanRollerCabinet: \"A tool chest cannot be wider than the selected roller cabinet.\",\n  toolChestCannotBeDeeperThanRollerCabinet: \"A tool chest cannot be deeper than the selected roller cabinet.\",\n  toolChestDimensionsMustMatch: \"Selected tool chests must have matching width and depth.\",\n  toolChestDrawerCountsMustDiffer: \"Selected tool chests must have different drawer counts.\",\n  toolChestIdsMustBeDifferent: \"You cannot combine two identical tool chests.\",\n  toolChestMustMatchRollerCabinetNominalWidth: \"A tool chest must match the selected roller cabinet size family.\",\n  tapToDownload: \"Tap to download\",\n  toolKit: \"TOOL KIT\",\n  toolSet: \"Tool set\",\n  toolSets: \"Tool sets\",\n  toolStorageSelectionMaxThree: \"You can select up to three storage units.\",\n  toolStorage: \"Tool storage\",\n  upToTwoToolChests: \"You can select up to two tool chests.\",\n  unlockedDrawer: \"Unlocked drawer\",\n  type: \"Type\",\n  unplaced: \"Unplaced\",\n  onlyOnePortableStorage: \"You can only select one portable storage unit.\",\n  onlyOneRollerCabinet: \"You can only select one roller cabinet.\",\n  onlyOneStackSystem: \"You can only select one stack system.\",\n  upgradeStorageToFitSets: \"Upgrade your storage to fit these sets:\",\n  wasNotInsertedSetHeightGreater: \"was not inserted. The set height is greater than the height of any drawer.\",\n  weight: \"Weight\",\n  width: \"Width\",\n};\n\nfunction getWindowTranslations() {\n  if (typeof window === \"undefined\") return null;\n  if (!window.TOOLKIT_TRANSLATIONS || typeof window.TOOLKIT_TRANSLATIONS !== \"object\") return null;\n  return window.TOOLKIT_TRANSLATIONS;\n}\n\nfunction getToolkitTranslations() {\n  return {\n    ...DEFAULT_TOOLKIT_TRANSLATIONS,\n    ...getWindowTranslations(),\n  };\n}\n\nfunction t(key, fallback = \"\") {\n  const dynamicTranslations = getWindowTranslations();\n  const dynamicValue = cleanString(dynamicTranslations?.[key]);\n  if (dynamicValue) return dynamicValue;\n\n  const defaultValue = cleanString(DEFAULT_TOOLKIT_TRANSLATIONS[key]);\n  if (defaultValue) return defaultValue;\n\n  return cleanString(fallback) || key;\n}\n\nexports.getToolkitTranslations = getToolkitTranslations;\nexports.t = t;\nexports.DEFAULT_TOOLKIT_TRANSLATIONS = DEFAULT_TOOLKIT_TRANSLATIONS;\n});\n\n__define(\"shared/runtime/app-config.js\", (exports, __require) => {\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nconst DEFAULT_DATA_URLS = {\n  toolKits: \"./data/tool-kits.json\",\n  toolSets: \"./data/tool-sets.json\",\n  toolStorages: \"./data/tool-storages.json\",\n};\n\nfunction getWindowAppConfig() {\n  if (typeof window === \"undefined\") return null;\n  if (!window.APP_CONFIG || typeof window.APP_CONFIG !== \"object\") return null;\n  return window.APP_CONFIG;\n}\n\nfunction getAppConfig() {\n  const runtimeConfig = getWindowAppConfig();\n\n  return {\n    baseUrl: cleanString(runtimeConfig?.baseUrl),\n    locale: cleanString(runtimeConfig?.locale) || \"en\",\n    data: {\n      ...DEFAULT_DATA_URLS,\n      ...(runtimeConfig?.data || {}),\n    },\n    fallbackData: {\n      ...(runtimeConfig?.fallbackData || {}),\n    },\n    imageMap: runtimeConfig?.imageMap && typeof runtimeConfig.imageMap === \"object\"\n      ? runtimeConfig.imageMap\n      : {},\n  };\n}\n\nfunction getDataUrls(key) {\n  const config = getAppConfig();\n  const primary = cleanString(config.data?.[key]);\n  const fallback = cleanString(config.fallbackData?.[key]);\n\n  if (!primary && !fallback) return [];\n  if (primary && fallback && primary !== fallback) return [primary, fallback];\n  return [primary || fallback].filter(Boolean);\n}\n\nfunction getAppLocale() {\n  return getAppConfig().locale || \"en\";\n}\n\nfunction resolveImagePath(url) {\n  const value = cleanString(url);\n  if (!value) return \"\";\n  if (value.startsWith(\"http://\") || value.startsWith(\"https://\") || value.startsWith(\"/\")) {\n    return value;\n  }\n\n  const config = getAppConfig();\n  const mappedUrl = cleanString(config.imageMap?.[value]);\n  if (mappedUrl) return mappedUrl;\n\n  return `/configurator/data/${value}`;\n}\n\nexports.getAppConfig = getAppConfig;\nexports.getDataUrls = getDataUrls;\nexports.getAppLocale = getAppLocale;\nexports.resolveImagePath = resolveImagePath;\n});\n\n__define(\"shared/utils/number-utils.js\", (exports, __require) => {\nconst { cleanString } = __require(\"shared/utils/string-utils.js\");\nfunction toNumber(value) {\n  const normalized = cleanString(value).replace(\",\", \".\");\n  const num = Number(normalized);\n  return Number.isFinite(num) ? num : 0;\n}\n\nfunction toInt(value) {\n  return parseInt(cleanString(value), 10) || 0;\n}\n\n\nexports.toNumber = toNumber;\nexports.toInt = toInt;\n});\n\n__define(\"shared/utils/string-utils.js\", (exports, __require) => {\nfunction cleanString(value) {\n  return String(value ?? \"\").trim();\n}\n\nfunction escapeHtml(value) {\n  return String(value ?? \"\")\n    .replaceAll(\"&\", \"&amp;\")\n    .replaceAll(\"<\", \"&lt;\")\n    .replaceAll(\">\", \"&gt;\")\n    .replaceAll('\"', \"&quot;\")\n    .replaceAll(\"'\", \"&#39;\");\n}\n\nfunction uniquePreserveOrder(values) {\n  const seen = new Set();\n  const result = [];\n\n  for (const value of values) {\n    if (!seen.has(value)) {\n      seen.add(value);\n      result.push(value);\n    }\n  }\n\n  return result;\n}\n\n\nexports.cleanString = cleanString;\nexports.escapeHtml = escapeHtml;\nexports.uniquePreserveOrder = uniquePreserveOrder;\n});\n\nwindow.__TOOLKIT_CONFIGURATOR_DISABLE_AUTO_INIT__ = true;\n\nconst { startConfiguratorApp } = __require(\"app.js\");\nconst { t } = __require(\"shared/i18n/toolkit-i18n.js\");\n\nfunction renderStartupError(mount) {\n  if (!mount) return;\n  mount.innerHTML = `\n    <p class=\"toolkit-configurator-app__error\">${t(\"configuratorDataCouldNotBeLoaded\", \"The configurator data could not be loaded.\")}</p>\n  `;\n}\n\nasync function bootstrapShopifyConfigurator() {\n  const mount = document.getElementById(\"toolkit-configurator-app\");\n\n  if (!mount) {\n    throw new Error(t(\"missingToolkitConfiguratorAppMount\", \"Missing #toolkit-configurator-app mount.\"));\n  }\n\n  mount.inert = true;\n  mount.setAttribute(\"aria-busy\", \"true\");\n  mount.innerHTML = SHOPIFY_SHELL_HTML;\n  try { await startConfiguratorApp(); } finally { mount.inert = false; mount.removeAttribute(\"aria-busy\"); }\n}\n\nbootstrapShopifyConfigurator().catch((error) => {\n  console.error(error);\n  const mount = document.getElementById(\"toolkit-configurator-app\");\n  renderStartupError(mount);\n});\n"],
  "mappings": "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",
  "names": ["__require", "t", "startConfiguratorApp", "placement"]
}
