{"product_id":"plattenarmband-faltschliesse-gravur-edelstahl","title":"Handgemachte Platten-Armbänder  | Personalisierte 3D Edelstahl-Armband  + kostenlose Gravur","description":"\u003cp\u003e \u003c\/p\u003e\n\u003c!-- SEO --\u003e\n\u003cp\u003e  \u003cmeta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"\u003e\u003c\/p\u003e\n\u003c!-- Fonts --\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:wght@600;700\u0026amp;family=Inter:wght@300;400;500;600\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\n\u003c!-- Bootstrap Icons --\u003e\n\u003clink href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap-icons@1.11.1\/font\/bootstrap-icons.css\" rel=\"stylesheet\"\u003e\n\n\u003cstyle\u003e\n\/* ==============================\n   SCOPED PRODUCT STYLES\n   ============================== *\/\n.engraving-product {\n  font-family: 'Inter', sans-serif;\n  color: #111;\n}\n.engraving-product .container {\n  max-width: 1200px;\n  margin: 0 auto;\n  padding: 0 20px;\n}\n.engraving-product .container2 {\n  max-width: 1200px;\n  width: 110%;\n  margin: 0 auto;\n  padding: 0 20px;\n}\n\n\/* HERO *\/\n.engraving-hero {\n  padding: 80px 20px;\n  background: #f9f9f9;\n}\n.engraving-hero-grid-wrapper {\n  max-width: 1200px;\n  margin: 0 auto;\n  padding: 0 15px;\n}\n.engraving-hero-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 80px;\n  align-items: start;\n}\n.engraving-hero-text {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n.engraving-badge {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  font-weight: 600;\n  color: #bfac79;\n  margin-bottom: 15px;\n}\n.engraving-badge i { font-size: 1.2rem; }\n.engraving-hero-text h1 {\n  font-size: 3.8rem;\n  line-height: 1.2;\n  margin-bottom: 20px;\n  color: #222;\n  font-weight: 600;\n  font-family: 'Playfair Display', serif;\n}\n.engraving-hero-text p {\n  font-size: 1.4rem;\n  color: #555;\n  margin-bottom: 25px;\n}\n.engraving-cta {\n  display: inline-flex;\n  align-items: center;\n  gap: 10px;\n  padding: 16px 40px;\n  background: #111;\n  color: #fff;\n  border-radius: 40px;\n  font-weight: 500;\n  transition: all .3s ease;\n}\n.engraving-cta:hover {\n  transform: translateY(-2px);\n  box-shadow: 0 20px 40px rgba(0,0,0,.2);\n}\n.engraving-trust {\n  margin-top: 25px;\n  display: flex;\n  flex-wrap: wrap;\n  gap: 20px;\n  color: #777;\n}\n.engraving-trust span {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n.engraving-image {\n  display: flex;\n  align-items: flex-start;\n  justify-content: center;\n}\n.engraving-image img {\n  width: 140%;\n  max-width: 550px;\n  object-fit: contain;\n  border-radius: 30px;\n  box-shadow: 0 2px 28px rgb(0 0 0 \/ 47%);\n}\n\n\/* HERO BILD MIT HOVER-WECHSEL (watch-image) *\/\n.engraving-product .watch-image {\n  position: relative;\n  display: flex;\n  justify-content: center;\n  align-items: flex-start;\n}\n.engraving-product .watch-image img {\n  width: 100%;\n  max-width: 550px;\n  object-fit: contain;\n  border-radius: 30px;\n  box-shadow: 0 2px 28px rgb(0 0 0 \/ 47%);\n  transition: opacity 0.4s ease;\n}\n.engraving-product .watch-image .watch-img-hover {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  transform: translateX(-50%);\n  opacity: 0;\n}\n.engraving-product .watch-image:hover .watch-img-hover { opacity: 1; }\n.engraving-product .watch-image:hover .watch-img-primary { opacity: 0; }\n\n@media (max-width: 992px) {\n  .engraving-hero-grid {\n    grid-template-columns: 1fr;\n    gap: 50px;\n  }\n  .engraving-image { justify-content: center; }\n  .engraving-hero-text h1 {\n    font-size: 2.9rem;\n    margin-top: 0px;\n    line-height: 1.2;\n    margin-bottom: 20px;\n    color: #222;\n    font-weight: 600;\n  }\n}\n\n\/* SECTIONS *\/\n.engraving-section { padding: 40px 0; }\n.engraving-section h2 {\n  font-family: 'Playfair Display', serif;\n  font-size: 38px;\n  margin-bottom: 20px;\n}\n.engraving-section-desc {\n  max-width: 720px;\n  color: #666;\n  margin-bottom: 60px;\n}\n\n\/* FEATURES *\/\n.engraving-features {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n  gap: 40px;\n}\n\n\/* SPECS *\/\n.engraving-specs {\n  background: #fff;\n  border-radius: 30px;\n  padding: 50px;\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 40px;\n  box-shadow: 0 20px 50px rgba(0,0,0,.05);\n}\n.engraving-specs ul { list-style: none; padding: 0; }\n.engraving-specs li {\n  padding: 12px 0;\n  border-bottom: 1px solid #eee;\n  font-size: 15px;\n  display: flex;\n  gap: 10px;\n  align-items: center;\n}\n.engraving-specs i { color: #b6a573; }\n\n\/* CTA STRIP *\/\n.engraving-cta-strip {\n  background: linear-gradient(135deg, #111, #1c1c1c);\n  color: #fff;\n  padding: 80px 20px;\n  text-align: center;\n}\n.engraving-cta-strip h2 { color: #fff; margin-bottom: 20px; }\n.engraving-cta-strip p { color: #ccc; margin-bottom: 30px; }\n\n\/* ANIMATION *\/\n.engraving-fade {\n  opacity: 0;\n  transform: translateY(30px);\n  transition: 1s ease;\n}\n.engraving-fade.show {\n  opacity: 1;\n  transform: none;\n}\n\n@media (max-width: 900px) {\n  .engraving-hero-grid {\n    grid-template-columns: 1fr;\n    gap: 50px;\n  }\n}\n\n.engraving-collection-btn {\n  position: relative;\n  padding: 14px 28px;\n  background: linear-gradient(135deg, #c7aaaa, #1a1a1a);\n  color: rgb(255, 255, 255);\n  font-weight: 400;\n  font-size: 13px;\n  border-radius: 999px;\n  letter-spacing: .5px;\n  border: 1px solid rgba(220, 184, 75, 0.6);\n  cursor: pointer;\n  overflow: hidden;\n  box-shadow: 0 0 0 rgba(220, 184, 75, 0), inset 0 0 0 rgba(220, 184, 75, 0);\n  transition: all .35s ease;\n}\n.engraving-collection-btn:hover {\n  transform: translateY(-1px);\n  box-shadow: 0 0 25px rgba(220, 184, 75, .45), inset 0 0 20px rgba(220, 184, 75, .15);\n  color: #ffdd7a;\n}\n.engraving-collection-btn::before {\n  content: '';\n  position: absolute;\n  inset: -1px;\n  border-radius: inherit;\n  background: radial-gradient(circle at 50% 120%, rgba(220, 184, 75, .35), transparent 65%);\n  opacity: .45;\n  pointer-events: none;\n  animation: idleGlow 4.5s ease-in-out infinite;\n}\n.engraving-collection-btn::after {\n  content: '';\n  position: absolute;\n  inset: -120%;\n  background: radial-gradient(circle, rgba(220, 184, 75, .55), transparent 60%);\n  opacity: 0;\n  transform: scale(.2);\n  pointer-events: none;\n}\n.engraving-collection-btn:hover::after {\n  animation: pulseGlow 1.1s ease-out forwards;\n}\n.engraving-collection-btn i { margin-left: 8px; }\n\n.micro-trust-valentine {\n  margin-top: 1.5rem;\n  font-size: 1.3rem;\n  color: #746742;\n  font-weight: 600;\n}\n\n\/* SPECS (Flex-Layout) *\/\n.engraving-specs {\n  display: flex;\n  justify-content: center;\n  gap: 60px;\n  flex-wrap: wrap;\n  margin-top: 30px;\n}\n.engraving-specs ul {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n.engraving-specs ul li {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  color: #555;\n  margin-bottom: 12px;\n}\n.engraving-specs ul li i {\n  color: #bfac79;\n  transition: transform 0.3s ease, color 0.3s ease;\n}\n.engraving-specs ul li:hover i {\n  transform: scale(1.3);\n  color: #9f8650;\n}\n@media (max-width: 768px) {\n  .engraving-specs {\n    flex-direction: column;\n    align-items: center;\n    gap: 25px;\n    padding: 31px;\n  }\n  .engraving-specs ul { text-align: center; }\n}\n\n\/* SHIPPING \u0026 TRUST BLOCK *\/\n.engraving-shipping {\n  padding: 20px 0;\n  background: linear-gradient(180deg, #faf9f7 0%, #ffffff 100%);\n}\n.engraving-shipping-grid {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  gap: 40px;\n}\n.engraving-shipping h2 {\n  font-size: 2.2rem;\n  font-weight: 700;\n  margin-bottom: 40px;\n  color: #1f2a2a;\n  text-align: center;\n}\n.shipping-item {\n  text-align: center;\n  padding: 40px 28px;\n  background: #fff;\n  border-radius: 20px;\n  box-shadow: 0 18px 45px rgba(0, 0, 0, 0.06);\n  transition: transform 0.4s ease, box-shadow 0.4s ease;\n}\n.shipping-item:hover {\n  transform: translateY(-6px);\n  box-shadow: 0 28px 65px rgba(0, 0, 0, 0.1);\n}\n.shipping-item i {\n  font-size: 2.8rem;\n  color: #bfac79;\n  margin-bottom: 18px;\n}\n.shipping-item h3 {\n  font-size: 1.6rem;\n  margin-bottom: 10px;\n  font-weight: 600;\n  color: #1f2a2a;\n  margin-top: 10px;\n}\n.shipping-item p {\n  font-size: 1.3rem;\n  color: #555;\n  line-height: 1.6;\n}\n@media (max-width: 900px) {\n  .engraving-shipping-grid {\n    grid-template-columns: 1fr;\n    gap: 28px;\n  }\n  .shipping-item { padding: 32px 22px; }\n}\n\n\/* WHY HEART STORY BLOCK *\/\n.engraving-why-heart {\n  padding: 80px 0;\n  background: #faf9f7;\n  text-align: center;\n}\n.engraving-why-heart h2 {\n  font-size: 2.2rem;\n  font-weight: 700;\n  margin-bottom: 16px;\n  color: #1f2a2a;\n}\n.engraving-why-heart p {\n  max-width: 650px;\n  margin: 0 auto 50px auto;\n  font-size: 1.3rem;\n  line-height: 1.7;\n  color: #555;\n}\n.engraving-why-grid {\n  display: grid;\n  grid-template-columns: repeat(4, 1fr);\n  gap: 40px;\n}\n.engraving-feature {\n  background: #fff;\n  padding: 30px 20px;\n  border-radius: 20px;\n  box-shadow: 0 18px 45px rgba(0,0,0,0.06);\n  transition: transform 0.4s ease, box-shadow 0.4s ease;\n}\n.engraving-feature:hover {\n  transform: translateY(-6px);\n  box-shadow: 0 28px 65px rgba(0,0,0,0.1);\n}\n.engraving-feature i {\n  font-size: 2.5rem;\n  color: #bfac79;\n  margin-bottom: 16px;\n  display: inline-block;\n}\n.engraving-feature h3 {\n  font-size: 1.6rem;\n  margin-bottom: 10px;\n  font-weight: 600;\n  color: #1f2a2a;\n  margin-top: 10px;\n}\n.engraving-feature p {\n  font-size: 1.3rem;\n  line-height: 1.6;\n  color: #555;\n}\n@media (max-width: 1200px) {\n  .engraving-why-grid {\n    grid-template-columns: repeat(2, 1fr);\n    gap: 30px;\n  }\n}\n@media (max-width: 700px) {\n  .engraving-why-grid {\n    grid-template-columns: 1fr;\n    gap: 25px;\n  }\n  .engraving-why-heart p { margin-bottom: 40px; }\n}\n\n\/* GRAVUR LIVE PREVIEW *\/\n.engraving-preview-section {\n  padding: 40px 0;\n  background: #ffffff;\n}\n.engraving-preview-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 80px;\n  align-items: center;\n}\n.engraving-preview-image {\n  position: relative;\n  max-width: 460px;\n}\n\/* Gravur-Studio: Vorderseite \/ Rückseite *\/\n    .jm-gk-sides {\n        display: grid;\n        grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n        gap: 8px;\n        margin: 0 0 16px;\n        max-width: 420px;\n    }\n.jm-gk-side { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 10px 8px; border: 1.5px solid #e8e0d0; border-radius: 12px; background: #faf9f7; cursor: pointer; font: 600 13px Inter, sans-serif; color: #1a1410; transition: all .25s ease; }\n.jm-gk-side em { font-style: normal; font-weight: 500; font-size: 10px; letter-spacing: 1px; text-transform: uppercase; color: #a89060; }\n.jm-gk-side small { font-size: 13px; font-weight: 600; color: #9a8a6a; min-height: 18px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n    .jm-gk-side {\n        min-width: 0;\n    }\n\n    .jm-gk-sum + .jm-gk-sum::before {\n        content: \" \/ \";\n    }\n\n    @media (max-width: 768px) {\n        \/* Mobile: Zeilen untereinander statt nebeneinander → nichts wird seitlich geschoben *\/\n        .jm-gk-side small {\n            white-space: normal;\n            text-overflow: clip;\n        }\n\n        .jm-gk-sum {\n            display: block;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n            line-height: 1.35;\n        }\n\n            .jm-gk-sum + .jm-gk-sum::before {\n                content: none;\n            }\n    }\n.jm-gk-side:hover { border-color: #c9a84c; background: #fdf8f0; }\n.jm-gk-side.active { border-color: #c9a84c; background: #fdf8f0; box-shadow: 0 0 0 3px rgba(201,168,76,0.12); }\n.jm-gk-side.filled small { color: #1a1410; }\n.jm-gk-side-label { position: absolute; top: 12px; left: 12px; z-index: 3; padding: 4px 10px; border-radius: 999px; background: rgba(26,20,16,0.82); color: #e6d3a3; font: 700 9px Inter, sans-serif; letter-spacing: 1.5px; text-transform: uppercase; line-height: 1.4; pointer-events: none; }\n@media (max-width: 900px) { .jm-gk-sides { margin-left: auto; margin-right: auto; } }\n\/* 3 Zeilen je Seite *\/\n.jm-gk-line { display: grid; grid-template-columns: 78px 1fr; align-items: center; gap: 10px; max-width: 420px; margin-bottom: 8px; }\n.jm-gk-line-nr { font: 700 10px Inter, sans-serif; letter-spacing: 1px; text-transform: uppercase; color: #a89060; text-align: left; }\n.engraving-input-wrap .jm-gk-line input { width: 100%; }\n@media (max-width: 900px) { .jm-gk-line { margin-left: auto; margin-right: auto; } }\n\/* Zeile 2 + 3 unter Zeile 1 – Zeile 1 bleibt an ihrer Position *\/\n#engravingPreviewText { position: relative; display: inline-block; }\n#engravingPreviewText::after, .popup-preview-text::after {\n  content: attr(data-rest); position: absolute; left: 50%; top: calc(100% - 8px); transform: translateX(-50%);\n  white-space: pre; text-align: center; line-height: 1.15; font: inherit; color: inherit; letter-spacing: inherit; text-shadow: inherit;\n}\n\/* ── GRAVUR-STUDIO: Position je Farbe + Seite (mit ?jmtweak=1 → Bereich „Gravur-Studio“ ermitteln) ──\n   Greift nur, wenn für die aktuelle Farbe\/Seite Werte gesetzt sind – sonst bleibt das bisherige Layout.\n   Beispiel:\n   .engraving-preview-image[data-variant=\"vergoldet\"][data-side=\"front\"] { --st-x: 50%; --st-y: 55%; --st-rot: 0deg; --st-size: 8; }\n   Mobile-Popup:\n   @media (max-width: 768px) { #engraving-mobile-popup .popup-preview[data-variant=\"vergoldet\"][data-side=\"front\"] { … } } *\/\n.engraving-preview-image.jm-st-pos, #engraving-mobile-popup .popup-preview.jm-st-pos { container-type: inline-size; }\n.engraving-preview-image.jm-st-pos { width: 100%; }\n    \/* Häkchen aus dem Textfluss nehmen → Zeile 1 springt nicht, wenn es erscheint *\/\n    .engraving-preview-text-wrap .preview-check {\n        position: absolute;\n        left: 100%;\n        top: 50%;\n        margin: 0 0 0 6px;\n        transform: translateY(-50%) scale(0.6);\n        transform-origin: left center;\n    }\n\n        .engraving-preview-text-wrap .preview-check.show {\n            transform: translateY(-50%) scale(1);\n        }\n.jm-st-pos .engraving-overlay { display: block; padding: 0; }\n.engraving-preview-image.jm-st-pos .engraving-preview-text-wrap,\n#engraving-mobile-popup .popup-preview.jm-st-pos .popup-preview-text-wrap {\n  position: absolute; left: var(--st-x, 50%); top: var(--st-y, 50%); right: auto; bottom: auto; margin: 0;\n  transform: translate(-50%, -50%) rotate(var(--st-rot, 0deg)); display: block; white-space: nowrap;\n}\n.jm-st-pos #engravingPreviewText, .jm-st-pos .popup-preview-text {\n  position: relative; top: auto; left: auto; transform: none; padding: 0 !important;\n  font-size: calc(var(--st-size, 8) * 1cqw) !important; letter-spacing: var(--st-ls, 0.08em); opacity: var(--st-op, 1);\n}\n.jm-st-pos #engravingPreviewText::after, .jm-st-pos .popup-preview-text::after {\n  top: calc(100% + var(--st-gap, 0em)); line-height: var(--st-lh, 1.15); transform: translateX(calc(-50% + var(--st-rdx, 0em)));\n}\n.engraving-preview-image img {\n  width: 100%;\n  border-radius: 28px;\n}\n.engraving-overlay {\n  position: absolute;\n  inset: 0;\n  display: flex;\n  align-items: flex-end;\n  justify-content: center;\n  padding-bottom: 35%;\n  pointer-events: none;\n  opacity: 0;\n  transform: translateY(6px);\n  transition: opacity 0.35s ease, transform 0.35s ease;\n}\n.engraving-overlay.active {\n  opacity: 1;\n  transform: translateY(0);\n}\n.engraving-overlay span {\n  font-family: \"Playfair Display\", serif;\n  font-size: 3rem;\n  letter-spacing: 0.08em;\n  color: rgb(186 186 186 \/ 94%);\n  text-shadow: 0 1px 1px rgba(0,0,0,0.6), 0 -1px 0 rgba(255,255,255,0.15);\n  padding: 6px 16px;\n  border-radius: 10px;\n  backdrop-filter: blur(1px);\n}\n.engraving-preview-content h2 {\n  font-size: 2.1rem;\n  margin-bottom: 12px;\n  color: #4b2f2f;\n  font-weight: 600;\n  margin-top: 25px;\n}\n.engraving-preview-content p {\n  max-width: 480px;\n  margin-bottom: 28px;\n  color: #555;\n  line-height: 1.6;\n}\n.engraving-badge {\n  display: inline-block;\n  margin-bottom: 16px;\n  font-size: 1.2rem;\n  padding: 6px 14px;\n  border-radius: 999px;\n  background: #f4f1e8;\n  color: #7a6a3a;\n  font-weight: 600;\n}\n\n\/* INPUT *\/\n.engraving-input-wrap,\n.engraving-font-select { margin-bottom: 18px; }\n.engraving-input-wrap label,\n.engraving-font-select label {\n  display: block;\n  font-weight: 600;\n  margin-bottom: 6px;\n}\n.engraving-input-wrap input {\n  width: 50%;\n  padding: 14px 16px;\n  border-radius: 12px;\n  border: 1px solid #ddd;\n  font-size: 1.5rem;\n}\n.engraving-input-wrap input:focus {\n  outline: none;\n  border-color: #bfac79;\n}\n.engraving-input-wrap small {\n  display: block;\n  margin-top: 6px;\n  font-size: 0.85rem;\n  color: #777;\n}\n.engraving-micro-trust {\n  margin-top: 16px;\n  font-size: 1.2rem;\n  color: #4b8484;\n}\n@media (max-width: 900px) {\n  .engraving-preview-grid {\n    grid-template-columns: 1fr;\n    gap: 50px;\n    text-align: center;\n  }\n  .engraving-preview-image { margin: 0 auto; }\n}\n\n\/* SYMBOL PICKER *\/\n.engraving-symbol-picker { margin-bottom: 22px; }\n.symbol-title {\n  display: block;\n  font-size: 1.1rem;\n  font-weight: 600;\n  margin-bottom: 8px;\n  color: #444;\n}\n.symbol-list {\n  display: flex;\n  gap: 10px;\n  flex-wrap: wrap;\n}\n.symbol-btn {\n  width: 44px;\n  height: 44px;\n  border-radius: 12px;\n  border: 1px solid #ddd;\n  background: #fff;\n  font-size: 2rem;\n  cursor: pointer;\n  transition: all 0.25s ease;\n}\n.symbol-btn:hover {\n  border-color: #bfac79;\n  background: #f6f3ea;\n  transform: translateY(-2px);\n}\n.symbol-btn:active {\n  transform: scale(1.05);\n  background: #d7bf78;\n}\n.symbol-btn.active {\n  transform: scale(1.15);\n  background: #bfac79;\n  color: #fff;\n}\n\n\/* FONT PICKER *\/\n.engraving-font-select { margin-bottom: 22px; }\n.engraving-font-picker { margin-bottom: 28px; }\n.font-picker-label {\n  display: block;\n  margin-bottom: 12px;\n}\n.font-group { margin-bottom: 16px; }\n.font-group-title {\n  display: block;\n  font-size: 0.85rem;\n  text-transform: uppercase;\n  letter-spacing: 1px;\n  color: #777;\n  margin-bottom: 8px;\n}\n.font-btn {\n  display: inline-block;\n  margin: 6px 6px 0 0;\n  padding: 12px 16px;\n  border-radius: 14px;\n  border: 1px solid #ddd;\n  background: #fff;\n  cursor: pointer;\n  font-size: 1.05rem;\n  transition: all 0.25s ease;\n}\n.font-btn.script { font-size: 1.2rem; }\n.font-btn:hover {\n  border-color: #bfac79;\n  transform: translateY(-1px);\n}\n.font-btn.active {\n  border-color: #bfac79;\n  background: rgba(191,172,121,0.15);\n  box-shadow: 0 6px 18px rgba(0,0,0,0.08);\n}\n\n@media (max-width: 640px) {\n  .font-group {\n    display: grid;\n    grid-template-columns: auto 1fr;\n    column-gap: 50px;\n    align-items: start;\n    margin-bottom: 16px;\n    border-bottom: 1px solid rgba(0,0,0,0.06);\n    padding-bottom: 12px;\n  }\n  .font-group-buttons {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    gap: 8px;\n  }\n  .font-btn {\n    height: 42px;\n    padding: 0 6px;\n    font-size: 0.9rem;\n    border-radius: 10px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    white-space: nowrap;\n    line-height: 1;\n  }\n  .font-btn.script { font-size: 1rem; }\n  .symbol-list {\n    display: grid;\n    grid-template-columns: repeat(5, 1fr);\n    gap: 10px;\n  }\n  .symbol-btn {\n    height: 44px;\n    font-size: 1.25rem;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 10px;\n  }\n  .font-group-title,\n  .symbol-title {\n    font-size: 1.15rem;\n    margin-bottom: 15px;\n    opacity: 0.65;\n  }\n  .font-group-title {\n    font-size: 0.75rem;\n    font-weight: 600;\n    opacity: 0.6;\n    white-space: nowrap;\n    padding-top: 12px;\n  }\n}\n\n\/* LIVE PREVIEW LINK *\/\n.live-preview-link {\n  margin-left: 6px;\n  font-weight: 600;\n  color: #4b8484;\n  text-decoration: none;\n  cursor: pointer;\n  transition: opacity 0.2s ease;\n}\n@keyframes pulseGlow {\n  0% { text-shadow: 0 0 0 rgba(75,132,132,0); }\n  50% { text-shadow: 0 0 8px rgba(75,132,132,0.45); }\n  100% { text-shadow: 0 0 0 rgba(75,132,132,0); }\n}\n\n\/* LUXURY SHINE BUTTON *\/\n.luxury-shine-btn {\n  position: relative;\n  font-size: 1.2rem;\n  margin-bottom: 16px;\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  padding: 5px 12px;\n  border-radius: 999px;\n  font-weight: 600;\n  letter-spacing: 0.03em;\n  text-decoration: none;\n  color: #e6d3a3;\n  background: linear-gradient(180deg, #141414, #0d0d0d);\n  border: 1px solid rgba(201,168,92,0.45);\n  overflow: hidden;\n  isolation: isolate;\n  transition: transform 0.25s ease, box-shadow 0.25s ease;\n}\n.luxury-shine-btn:hover {\n  transform: translateY(-1px);\n  box-shadow: 0 8px 20px rgba(0,0,0,0.35), 0 0 0 1px rgba(201,168,92,0.35);\n}\n.luxury-shine-btn::before {\n  content: \"\";\n  position: absolute;\n  top: -60%;\n  left: -120%;\n  width: 60%;\n  height: 220%;\n  background: linear-gradient(120deg, transparent 0%, rgba(255,255,255,0.0) 35%, rgba(255,214,130,0.65) 50%, rgba(255,255,255,0.0) 65%, transparent 100%);\n  transform: skewX(-20deg);\n  opacity: 0.9;\n  animation: goldLaser 3s ease-in-out infinite;\n}\n@keyframes goldLaser {\n  0% { left: -120%; }\n  55% { left: 140%; }\n  100% { left: 140%; }\n}\n.luxury-shine-btn i {\n  color: #c9a85c;\n  font-size: 1.1em;\n}\n.luxury-shine-btn::after {\n  content: \"\";\n  position: absolute;\n  inset: 0;\n  border-radius: inherit;\n  background: radial-gradient(circle at center, rgba(255,215,160,0.35), transparent 70%);\n  opacity: 0;\n  transform: scale(0.85);\n  transition: opacity 0.25s ease, transform 0.25s ease;\n  pointer-events: none;\n}\n.luxury-shine-btn:active::after {\n  opacity: 1;\n  transform: scale(1.05);\n}\n.luxury-rose {\n  color: #f1c7b6;\n  border-color: rgba(224,168,140,0.5);\n}\n.luxury-rose::before {\n  background: linear-gradient(120deg, transparent 0%, rgba(255,220,210,0.0) 35%, rgba(255,190,170,0.7) 50%, rgba(255,220,210,0.0) 65%, transparent 100%);\n}\n.luxury-rose i {\n  color: #e0a88c;\n  font-size: 1.1em;\n}\n@media (max-width: 768px) {\n  .luxury-shine-btn::before { animation-duration: 2.4s; }\n}\n\n\/* PREVIEW EFFEKTE *\/\n@keyframes engravingPulse {\n  0%   { transform: scale(1); box-shadow: 0 0 0 rgba(191,172,121,0.0); }\n  40%  { transform: scale(1.02); box-shadow: 0 0 0 6px rgba(191,172,121,0.25); }\n  100% { transform: scale(1); box-shadow: 0 0 0 rgba(191,172,121,0.0); }\n}\n.engraving-preview-image.pulse { animation: engravingPulse 0.6s ease-out; }\n\n.engraving-preview-text-wrap {\n  position: relative;\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  bottom: 64px;\n  left: 27px;\n \n}\n.preview-check {\n  font-size: 14px;\n  opacity: 0;\n  transform: scale(0.6);\n  transition: opacity 0.25s ease, transform 0.25s ease;\n}\n.preview-check.show {\n  opacity: 1;\n  transform: scale(1);\n}\n.engrave-fade { animation: engraveFade 0.9s ease-out; }\n@keyframes engraveFade {\n  0% { text-shadow: 0 0 0 rgba(191, 172, 121, 0); }\n  40% { text-shadow: 0 0 6px rgba(191, 172, 121, 0.45), 0 0 14px rgba(191, 172, 121, 0.25); }\n  100% { text-shadow: 0 0 0 rgba(191, 172, 121, 0); }\n}\n.engraving-preview-note {\n  margin-top: 10px;\n  font-size: 12.5px;\n  line-height: 1.45;\n  color: rgba(60, 60, 60, 0.75);\n  text-align: center;\n  letter-spacing: 0.02em;\n  font-style: normal;\n  animation: fadeInSoft 0.6s ease-out both;\n}\n@keyframes fadeInSoft {\n  from { opacity: 0; transform: translateY(-2px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n@media (max-width: 640px) {\n  .engraving-preview-note {\n    font-size: 12px;\n    padding: 0 12px;\n  }\n}\n\n\/* MOBILE POPUP *\/\n#engraving-mobile-popup {\n  display: block;\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 285px;\n  z-index: 9999;\n  background: #6e644533;\n  padding: 20px;\n  box-shadow: 0 -10px 30px rgba(0,0,0,.18);\n  opacity: 0;\n  transform: translateY(18px);\n  pointer-events: none;\n  transition: opacity 0.35s ease, transform 0.35s ease;\n}\n#engraving-mobile-popup.show {\n  opacity: 1;\n  transform: translateY(0);\n  pointer-events: auto;\n}\n.popup-preview-text {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  font-size: 2rem;\n  letter-spacing: 0.08em;\n  color: rgb(217 217 217 \/ 84%);\n  text-shadow: 0 1px 1px rgba(0,0,0,0.6), 0 -1px 0 rgba(255,255,255,0.15);\n  padding: 6px 16px;\n  border-radius: 10px;\n  backdrop-filter: blur(2px);\n  text-align: center;\n  transition: all 0.25s ease;\n}\n.popup-preview-check {\n  position: absolute;\n  top: -15px;\n  left: 65px;\n  font-size: 2.5rem;\n  opacity: 0;\n  transition: opacity 0.5s ease;\n}\n.popup-preview-check.show { opacity: 1; }\n@media (min-width: 769px) {\n  #engraving-mobile-popup { display: none !important; }\n}\n@media (max-width: 769px) {\n  .engraving-overlay {\n    position: absolute;\n    inset: 0;\n    pointer-events: none;\n  }\n  .engraving-overlay span {\n    font-family: \"Playfair Display\", serif;\n    font-size: 1.8rem;\n    letter-spacing: 0.08em;\n    color: rgb(217 217 217 \/ 71%);\n    text-shadow: 0 1px 1px rgb(0 0 0 \/ 86%), 0 -1px 0 rgba(255, 255, 255, 0.15);\n    padding: 6px 16px;\n    border-radius: 10px;\n    backdrop-filter: blur(1px);\n  }\n  .engraving-preview-text-wrap {\n    position: relative;\n    display: inline-flex;\n    align-items: center;\n    gap: 8px;\n    bottom: 80px;\n    right: 24px;\n  }\n  .popup-preview-text-wrap {\n    position: absolute;\n    top: 42%;\n    left: 50%;\n    white-space: nowrap;\n    display: block;\n    \n  }\n}\n\n\/* HERO SUBLINE *\/\n.hero-subline {\n  display: flex;\n  align-items: center;\n  gap: 14px;\n  margin-top: 12px;\n  flex-wrap: wrap;\n}\n.hero-subline .engraving-badge {\n  font-size: 1.1rem;\n  opacity: 0.85;\n}\n@media (max-width: 768px) {\n  .hero-subline { justify-content: center; }\n  .luxury-shine-btn { margin-top: 6px; }\n}\n\n\/* MASSE JE VARIANTE *\/\n.ring-size-visual {\n  display: flex;\n  gap: 16px;\n  justify-content: center;\n  flex-wrap: wrap;\n  margin: 24px 0;\n}\n.ring-size {\n  width: 150px;\n  height: 72px;\n  border: 2px solid #2c2c2c;\n  border-radius: 10px;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  font-family: Helvetica, Arial, sans-serif;\n  background: #fff;\n  text-align: center;\n  box-shadow: 0 6px 14px rgba(0,0,0,0.08);\n}\n.ring-size .size {\n  font-size: 14px;\n  font-weight: 700;\n  margin-bottom: 2px;\n}\n.ring-size .diameter {\n  font-size: 13px;\n  font-weight: 500;\n  line-height: 1.1;\n}\n.ring-size .circumference {\n  font-size: 11px;\n  color: #666;\n  margin-top: 3px;\n}\n@media (max-width: 768px) {\n  .ring-size-visual {\n    gap: 10px;\n    margin: 5px 0;\n  }\n  .ring-size {\n    width: 130px;\n    height: 68px;\n    border-width: 1.5px;\n    box-shadow: 0 4px 10px rgba(0,0,0,0.07);\n  }\n  .ring-size .size { font-size: 13px; margin-bottom: 1px; }\n  .ring-size .diameter { font-size: 11.5px; line-height: 1.1; }\n  .ring-size .circumference { font-size: 10px; margin-top: 2px; margin-bottom: 7px; }\n}\n\n\/* VORHER \/ NACHHER SLIDER *\/\n.before-after-image--container {\n  display: block;\n  position: relative;\n  width: 80%;\n  max-width: 450px;\n  margin: 20px auto;\n  border-radius: 10px;\n  overflow: hidden;\n  box-shadow: 0 8px 20px rgb(0 0 0 \/ 72%);\n  transition: transform 0.3s ease;\n}\n.before-after-image--container:hover { transform: scale(1.02); }\n@media screen and (max-width: 767px) {\n  .before-after-image--image { height: auto !important; }\n}\n.slider-hint {\n  position: absolute;\n  top: 75px;\n  left: 50%;\n  transform: translateX(-50%);\n  background: rgba(255,255,255,0.95);\n  padding: 6px 14px;\n  border-radius: 20px;\n  font-size: 1.2rem;\n  font-weight: 500;\n  color: #111;\n  letter-spacing: 0.02em;\n  pointer-events: none;\n  z-index: 10;\n  animation: pulse 1.5s infinite;\n  transition: opacity 0.3s ease;\n}\n@keyframes pulse {\n  0% { transform: translate(-50%, -150%) scale(1); opacity: 1; }\n  50% { transform: translate(-50%, -150%) scale(1.1); opacity: 0.6; }\n  100% { transform: translate(-50%, -150%) scale(1); opacity: 1; }\n}\n.before-after-image--media {\n  display: block;\n  position: relative;\n  overflow: hidden;\n}\n.before-after-image--image img {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n.before-after-image--2 {\n  clip-path: inset(0px 0px 0px var(--percent));\n  position: absolute;\n  z-index: 3;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n}\n.before-after-image--slider {\n  position: absolute;\n  top: 50%;\n  width: 100%;\n  left: 0;\n  z-index: 40;\n  transform: translateY(-50%);\n  opacity: 0;\n  height: 54px;\n  cursor: pointer;\n  margin-top: 10px;\n}\n.before-after-image--divider {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 10;\n  width: 2px;\n  left: calc(var(--percent) - 1px);\n  background: var(--color-line, --bg-body);\n  box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25);\n}\n.before-after-image--divider svg {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate3d(-50%, -50%, 0);\n  z-index: 20;\n  border-radius: 20px;\n  box-shadow: 0px 1px 6px rgba(0, 0, 0, 0.1);\n  cursor: pointer;\n}\n  .trust-bar {\n  position: relative;\n  background: #ffffff;\n  border-top: 1px solid rgba(191,172,121,0.25);\n  border-bottom: 1px solid rgba(191,172,121,0.25);\n  padding: 28px 40px;\n  overflow: hidden;\n  margin-bottom: 20px;\n}\n\n\/* ✨ subtiler Gold-Shimmer *\/\n.trust-bar::before {\n  content: '';\n  position: absolute;\n  top: 0;\n  left: -50%;\n  width: 200%; \/* wichtig für sichtbare Bewegung *\/\n  height: 100%;\n  background: linear-gradient(\n    120deg,\n    transparent 30%,\n    rgba(191,172,121,0.18) 45%,  \/* stärker sichtbar *\/\n    rgba(191,172,121,0.28) 50%,  \/* Highlight *\/\n    rgba(191,172,121,0.18) 55%,\n    transparent 70%\n  );\n  animation: trustShimmer 5s ease-in-out infinite;\n  pointer-events: none;\n}\n\n@keyframes trustShimmer {\n  0% {\n    transform: translateX(-50%);\n  }\n  100% {\n    transform: translateX(50%);\n  }\n}\n\n.trust-bar-inner {\n  max-width: 1200px;\n  margin: 0 auto;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  gap: 32px;\n  flex-wrap: wrap;\n}\n\n\/* 🔥 Text jetzt dunkler \u0026 edler *\/\n.trust-item-3d {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  font-size: 14px;\n  font-weight: 500;\n  color: #746742;\n}\n\n.trust-item-3d i {\n  font-size: 18px;\n  color: #bfac79; \/* dein Gold *\/\n}\n\n\/* Divider dezenter *\/\n.trust-divider-v {\n  width: 1px;\n  height: 32px;\n  background: rgba(0,0,0,0.08);\n}\n\n\/* 🟢 Live Dot bleibt sichtbar auf weiß *\/\n.live-dot-3d {\n  width: 8px;\n  height: 8px;\n  border-radius: 50%;\n  background: #4caf7d;\n  box-shadow: 0 0 0 0 rgba(76,175,125,.4);\n  animation: livePulse 2s infinite;\n  flex-shrink: 0;\n}\n\n@keyframes livePulse {\n  0% { box-shadow: 0 0 0 0 rgba(76,175,125,.5); }\n  70% { box-shadow: 0 0 0 8px transparent; }\n  100% { box-shadow: 0 0 0 0 transparent; }\n}\n\/* ─── KONFIGURATOR jm-cfg-* ─────────────────────────────────────── *\/\n.jm-cfg-wrap * { box-sizing: border-box; }\n.jm-cfg-wrap { font-family: 'Inter', sans-serif; background: #f5f2ed; padding: 0 0 60px; }\n.jm-cfg-header { text-align: center; padding: 40px 20px 28px; background: #f5f2ed; }\n.jm-cfg-eyebrow { display: inline-flex; align-items: center; gap: 8px; font-size: 11px; letter-spacing: 3.5px; text-transform: uppercase; color: #9a8050; font-weight: 600; margin-bottom: 12px; }\n.jm-cfg-eyebrow::before, .jm-cfg-eyebrow::after { content: ''; display: inline-block; width: 28px; height: 1px; background: linear-gradient(90deg, transparent, #bfac79); }\n.jm-cfg-headline { display: block; font-family: 'Playfair Display', serif; font-size: 40px; color: #1a1410; line-height: 1.15; margin-bottom: 14px; margin-top: 30px !important; text-transform: initial; letter-spacing: 0.2px; }\n@media (max-width: 680px) { .jm-cfg-headline { font-size: 20px; } }\n.jm-cfg-subline { font-size: 14px; color: #7a6a4a; max-width: 420px; margin: 0 auto 28px; line-height: 1.6; }\n.jm-cfg-steps { display: flex; align-items: center; justify-content: center; gap: 0; margin-bottom: 8px; }\n.jm-cfg-step-item { display: flex; flex-direction: column; align-items: center; gap: 6px; position: relative; }\n.jm-cfg-step-circle { width: 36px; height: 36px; border-radius: 50%; border: 2px solid #d4c5a0; background: #f5f2ed; color: #a89060; font-family: 'Playfair Display', serif; font-size: 14px; font-weight: 700; display: flex; align-items: center; justify-content: center; transition: all 0.35s ease; position: relative; z-index: 1; }\n.jm-cfg-step-item.active .jm-cfg-step-circle { background: #fff; border-color: #c9a84c; color: #c9a84c; box-shadow: 0 0 0 4px rgba(201,168,76,0.15); }\n.jm-cfg-step-item.done .jm-cfg-step-circle { background: #c9a84c; border-color: #c9a84c; color: #fff; }\n.jm-cfg-step-label { font-size: 9px; letter-spacing: 1.5px; text-transform: uppercase; color: #a89060; font-weight: 600; transition: color 0.3s; }\n.jm-cfg-step-item.active .jm-cfg-step-label, .jm-cfg-step-item.done .jm-cfg-step-label { color: #c9a84c; }\n.jm-cfg-step-line { width: 80px; height: 2px; background: #d4c5a0; margin: 0 6px; margin-bottom: 22px; transition: background 0.4s ease; }\n.jm-cfg-step-line.done { background: #c9a84c; }\n@media (max-width: 480px) { .jm-cfg-step-line { width: 40px; } }\n.jm-cfg-progress-bar { height: 2px; background: #e0d8cc; margin: 0 auto; max-width: 680px; border-radius: 2px; overflow: hidden; }\n.jm-cfg-progress-fill { height: 100%; background: linear-gradient(90deg, #c9a84c, #e8c96a); border-radius: 2px; transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1); width: 0%; }\n.jm-cfg-card { background: #fff; border-radius: 20px; box-shadow: 0 8px 40px rgba(0,0,0,0.08); max-width: 820px; margin: 24px auto 0; overflow: hidden; display: none; animation: jmCfgFadeIn 0.4s ease; }\n  @media (max-width: 768px) { .jm-cfg-wrap { max-width: 1020px;  } }\n.jm-cfg-card.active { display: block; }\n@keyframes jmCfgFadeIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } }\n.jm-cfg-card-body { padding: 32px 32px 24px; }\n@media (max-width: 600px) { .jm-cfg-card-body { padding: 22px 4px 18px; } }\n#jm-cfg-card-2 { max-width: 980px; }\n.jm-cfg-s1-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; align-items: start; }\n@media (max-width: 640px) { .jm-cfg-s1-grid { grid-template-columns: 1fr; gap: 20px; } }\n.jm-cfg-s1-left h3 { font-family: 'Playfair Display', serif; font-size: 1.3rem; color: #1a1410; margin: 0 0 6px; }\n.jm-cfg-s1-left p { font-size: 13px; color: #7a6a4a; margin: 0 0 20px; line-height: 1.55; }\n\/* Schritt 1: Produkt-Fakten (Mini-Herz) *\/\n.jm-mh-facts { display: flex; flex-direction: column; gap: 10px; }\n.jm-mh-fact { display: flex; align-items: center; gap: 14px; padding: 14px 16px; border: 1.5px solid #e8e0d0; border-radius: 12px; background: #faf9f7; }\n.jm-mh-fact \u003e i { width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; flex-shrink: 0; background: rgba(201,168,76,0.12); color: #b39548; font-size: 16px; }\n.jm-mh-fact-info { flex: 1; }\n.jm-mh-fact-name { display: block; font-weight: 700; font-size: 14px; color: #1a1410; margin-bottom: 2px; }\n.jm-mh-fact-desc { display: block; font-size: 12px; color: #9a8a6a; }\n\/* Schritt 1: Farbwahl Silber \/ Vergoldet *\/\n.jm-mh-color-title { display: block; margin: 0 0 10px; font-family: 'Playfair Display', serif; font-size: 1.1rem; color: #1a1410; }\n.jm-mh-colors { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 10px; margin-bottom: 18px; }\n.jm-mh-color { display: flex; align-items: center; gap: 10px; padding: 12px 12px; border: 1.5px solid #e8e0d0; border-radius: 12px; background: #faf9f7; cursor: pointer; font-family: inherit; text-align: left; transition: all .25s ease; min-width: 0; }\n.jm-mh-color:hover { border-color: #c9a84c; background: #fdf8f0; }\n.jm-mh-color.active { border-color: #c9a84c; background: #fdf8f0; box-shadow: 0 0 0 3px rgba(201,168,76,0.12); }\n.jm-mh-color.unavailable { opacity: .45; cursor: not-allowed; }\n.jm-mh-color-dot { width: 22px; height: 22px; border-radius: 50%; flex-shrink: 0; border: 1px solid rgba(0,0,0,.15); }\n.jm-mh-color-dot.silber    { background: radial-gradient(circle at 35% 30%, #f6f6f6, #a9a9ad); }\n.jm-mh-color-dot.vergoldet { background: radial-gradient(circle at 35% 30%, #f6e3a1, #b8902f); }\n.jm-mh-color-info { flex: 1; min-width: 0; }\n.jm-mh-color-name { display: block; font-weight: 700; font-size: 14px; color: #1a1410; }\n.jm-mh-color-desc { display: block; font-size: 11.5px; color: #9a8a6a; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.jm-cfg-size-strip { margin-top: 16px; padding: 10px 14px; background: #f5f2ed; border-radius: 8px; font-size: 12px; color: #7a6a4a; border-left: 3px solid #c9a84c; }\n.jm-cfg-size-strip strong { color: #1a1410; }\n\/* Hinweis: max. 2 Zeichen *\/\n.jm-mh-limit { display: flex; gap: 10px; align-items: flex-start; margin: 0 0 18px; padding: 10px 14px; border-radius: 10px; background: #f7f4ef; border: 1px dashed #c9a84c; font-size: 12.5px; color: #6a5a3a; line-height: 1.5; text-align: left; }\n.jm-mh-limit i { color: #c9a84c; font-size: 16px; margin-top: 1px; }\n.jm-mh-limit strong { color: #1a1410; }\n.jm-mh-shake { animation: jmMhShake 0.35s ease; }\n@keyframes jmMhShake { 0%,100% { transform: translateX(0); } 25%,75% { transform: translateX(-5px); } 50% { transform: translateX(5px); } }\n\/* Kettenlänge: Tabelle anklickbar *\/\n.jm-rsz-tr[data-len] { cursor: pointer; }\n\/* Vorderseite \/ Rückseite *\/\n.jm-mh-sides { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 0 0 16px; }\n.jm-mh-side { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 10px 8px; border: 1.5px solid #e8e0d0; border-radius: 12px; background: #faf9f7; cursor: pointer; font: 600 13px Inter, sans-serif; color: #1a1410; transition: all .25s ease; }\n.jm-mh-side em { font-style: normal; font-weight: 500; font-size: 10px; letter-spacing: 1px; text-transform: uppercase; color: #a89060; }\n.jm-mh-side small { font-size: 15px; font-weight: 600; color: #9a8a6a; min-height: 18px; }\n.jm-mh-side:hover { border-color: #c9a84c; background: #fdf8f0; }\n.jm-mh-side.active { border-color: #c9a84c; background: #fdf8f0; box-shadow: 0 0 0 3px rgba(201,168,76,0.12); }\n.jm-mh-side.filled small { color: #1a1410; }\n.jm-mh-side-label { position: absolute; top: 12px; left: 12px; z-index: 2; padding: 4px 10px; border-radius: 999px; background: rgba(26,20,16,0.82); color: #e6d3a3; font: 700 9px Inter, sans-serif; letter-spacing: 1.5px; text-transform: uppercase; line-height: 1.4; }\n\/* Ohne eigenes Rückseiten-Foto wird das Vorschaubild gespiegelt *\/\n.jm-mh-stage img.jm-mh-flip { transform: scaleX(-1); }\n.jm-cfg-s3-gravur-line { display: flex; align-items: baseline; gap: 12px; }\n.jm-cfg-s3-gravur-line + .jm-cfg-s3-gravur-line { margin-top: 6px; }\n.jm-cfg-s3-gravur-side { font: 700 9px Inter, sans-serif; letter-spacing: 1.5px; text-transform: uppercase; color: #8a7055; min-width: 82px; }\n.jm-cfg-ring-img-wrap { position: relative; border-radius: 16px; overflow: hidden; background: #f0ece4; aspect-ratio: 1; display: flex; align-items: center; justify-content: center; }\n.jm-cfg-ring-img-wrap img { width: 100%; height: 100%; object-fit: cover; border-radius: 16px; transition: opacity 0.4s ease; display: block; }\n.jm-cfg-ring-img-hover { position: absolute; inset: 0; opacity: 0; }\n.jm-cfg-ring-img-label { position: absolute; top: 12px; left: 12px; background: rgba(201,168,76,0.9); color: #1a1410; font-size: 9px; font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase; padding: 4px 10px; border-radius: 999px; }\n.jm-cfg-ring-img-caption { text-align: center; font-size: 12px; color: #9a8a6a; margin-top: 10px; font-style: italic; }\n.jm-cfg-s2-wrap .engraving-preview-section { padding: 0 !important; background: transparent !important; }\n.jm-cfg-s2-wrap .engraving-preview-grid { gap: 40px; }\n.jm-cfg-s3-title { font-family: 'Playfair Display', serif; font-size: 1.5rem; color: #1a1410; text-align: center; margin: 0 0 6px; }\n.jm-cfg-s3-subtitle { text-align: center; font-size: 13px; color: #7a6a4a; margin: 0 0 28px; }\n.jm-cfg-s3-grid { display: grid; grid-template-columns: 120px 1fr; gap: 24px; align-items: start; margin-bottom: 24px; }\n@media (max-width: 540px) { .jm-cfg-s3-grid { grid-template-columns: 1fr; } }\n.jm-cfg-s3-thumb { width: 120px; height: 120px; border-radius: 12px; object-fit: cover; border: 2px solid #e8e0d0; }\n.jm-cfg-s3-product-name { font-family: 'Playfair Display', serif; font-size: 1.2rem; color: #1a1410; margin: 0 0 16px; }\n.jm-cfg-s3-rows { display: flex; flex-direction: column; gap: 0; }\n.jm-cfg-s3-row { display: flex; justify-content: space-between; align-items: center; padding: 10px 0; border-bottom: 1px solid #f0ece4; font-size: 13px; }\n.jm-cfg-s3-row:last-child { border-bottom: none; }\n.jm-cfg-s3-row-label { font-size: 9px; letter-spacing: 1.5px; text-transform: uppercase; color: #a89060; font-weight: 700; }\n.jm-cfg-s3-row-value { color: #1a1410; font-weight: 600; font-size: 13px; text-align: right; }\n.jm-cfg-s3-gravur-box { background: linear-gradient(135deg, #1a1410, #2a1f10); border: 1px solid rgba(201,168,76,0.3); border-radius: 12px; padding: 18px 20px; margin-bottom: 24px; }\n.jm-cfg-s3-gravur-eyebrow { display: block; font-size: 9px; letter-spacing: 2px; text-transform: uppercase; color: #c9a84c; font-weight: 700; margin-bottom: 10px; }\n.jm-cfg-s3-gravur-text { display: block; font-size: 1.5rem; color: #f7f0e3; margin-bottom: 6px; min-height: 2rem; }\n.jm-cfg-s3-gravur-meta { display: block; font-size: 11px; color: #8a7055; }\n.jm-cfg-s3-price-wrap { margin-bottom: 20px; }\n.jm-cfg-s3-price-wrap .price-item--regular:not(s) { font-family: 'Playfair Display', serif; font-size: 2rem; color: #1a1410; font-weight: 700; }\n.jm-cfg-s3-price-wrap s.price-item--regular { font-size: 1.1rem; color: #a89060; margin-left: 8px; text-decoration: line-through; }\n.jm-cfg-s3-price-wrap .price__badge--sale span { background: #c9a84c; color: #1a1410; font-size: 11px; font-weight: 700; padding: 3px 10px; border-radius: 999px; margin-left: 10px; vertical-align: middle; }\n.jm-cfg-s3-trust { display: flex; justify-content: center; gap: 24px; margin-top: 14px; flex-wrap: wrap; }\n.jm-cfg-s3-trust span { font-size: 11px; color: #9a8a6a; display: flex; align-items: center; gap: 5px; }\n.jm-cfg-s3-trust i { color: #c9a84c; }\n.jm-cfg-s3-note { margin-top: 16px; font-size: 11px; color: #a89060; text-align: right; line-height: 1.5; }\n.jm-cfg-card-footer { display: flex; justify-content: space-between; align-items: center; padding: 16px 32px 24px; border-top: 1px solid #f0ece4; }\n@media (max-width: 600px) { .jm-cfg-card-footer { padding: 14px 18px 20px; } }\n.jm-cfg-btn-back { display: flex; align-items: center; gap: 8px; padding: 10px 20px; background: transparent; border: 1.5px solid #d4c5a0; border-radius: 10px; color: #7a6a4a; font-size: 13px; font-weight: 600; cursor: pointer; transition: all 0.2s; }\n.jm-cfg-btn-back:hover { border-color: #c9a84c; color: #c9a84c; }\n.jm-cfg-btn-back[hidden] { visibility: hidden; pointer-events: none; }\n.jm-cfg-btn-next { display: flex; align-items: center; gap: 10px; padding: 10px 17px; background: #1a1410; color: #fff; border: none; border-radius: 10px; font-size: 14px; font-weight: 600; cursor: pointer; transition: all 0.3s ease; letter-spacing: 0.2px; }\n.jm-cfg-btn-next:hover { background: #c9a84c; color: #1a1410; transform: translateX(2px); }\n.jm-cfg-btn-next i { transition: transform 0.2s; }\n.jm-cfg-btn-next:hover i { transform: translateX(3px); }\n#jm-cfg-card-3 .jm-cfg-card-footer { border-top: none; padding-top: 0; }\n\n\n\/* ── LESBARKEIT + WÖLBUNG (Tweak-Panel „Wölbung \u0026amp; Lesbarkeit“) ──\n   --lv-l \/ --st-l  = Helligkeit der Schrift (0 % schwarz … 100 % weiß) – auf heller Edelstahl-Platte dunkel = gut lesbar\n   --lv-sh \/ --st-sh = Stärke des Gravur-Schattens\n   --lv-arc \/ --st-arc = Wölbung der Zeile in em (+ Enden tiefer ∩, − Enden höher ∪) – passend zur gebogenen Platte *\/\n.jm-lv-stage .jm-lv-text {\n  color: hsl(40 6% var(--lv-l, 80%));\n  text-shadow: 0 1px 1px rgba(0,0,0,var(--lv-sh, 0.6)), 0 -1px 0 rgba(255,255,255,0.25);\n}\n.jm-st-pos #engravingPreviewText, .jm-st-pos .popup-preview-text {\n  color: hsl(40 6% var(--st-l, 73%)) !important;\n  text-shadow: 0 1px 1px rgba(0,0,0,var(--st-sh, 0.6)), 0 -1px 0 rgba(255,255,255,0.25) !important;\n  backdrop-filter: none !important; background: none !important;\n}\n\/* Buchstaben der gewölbten Zeile (werden per Script erzeugt) – erben alles vom Text *\/\n.jm-arc-ch {\n  display: inline-block !important; white-space: pre; padding: 0 !important; margin: 0 !important;\n  font: inherit !important; letter-spacing: inherit !important; color: inherit !important; text-shadow: inherit !important;\n  border-radius: 0 !important; backdrop-filter: none !important; background: none !important; transition: none !important;\n  transform-origin: 50% 50%;\n}\n\/* Armband: Farbpunkte (Hero + Schritt 1) *\/\n.jm-arm-dot { width: 12px; height: 12px; border-radius: 50%; display: inline-block; border: 1px solid rgba(0,0,0,.15); }\n.jm-arm-dot.rot, .jm-mh-color-dot.rot { background: radial-gradient(circle at 35% 30%, #e0626a, #9e1f2a); }\n.jm-arm-dot.schwarz, .jm-mh-color-dot.schwarz { background: radial-gradient(circle at 35% 30%, #555, #111); }\n.jm-arm-dot.gruen, .jm-mh-color-dot.gruen { background: radial-gradient(circle at 35% 30%, #6fae7c, #23592f); }\n.jm-arm-font-hint { margin: 6px 0 0; font-size: 12.5px; color: #8a7448; }\n.jm-arm-font-hint i { color: #c9a84c; margin-right: 4px; }\n\/* Mobile: Hero-Bild nicht breiter als der Bildschirm (Basis-CSS: width 140 %) *\/\n@media (max-width: 768px) { .engraving-image img { width: 100%; max-width: 100%; } }\n\/* Hero: Größen kompakt *\/\n.jm-hz-hero-sizes { display: flex; flex-wrap: wrap; gap: 10px; margin: -8px 0 22px; }\n.jm-hz-hero-size { display: inline-flex; align-items: center; gap: 6px; padding: 7px 14px; border: 1.5px solid #e2d8c4; border-radius: 999px; background: #fff; font: 500 13px Inter, sans-serif; color: #7a6a4a; }\n.jm-hz-hero-size strong { color: #1a1410; font-weight: 700; }\n.jm-hz-hero-size--new { border-color: #c9a84c; background: #fdf8f0; }\n.jm-hz-hero-size em { font-style: normal; font-size: 10px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: #fff; background: #c9a84c; padding: 2px 7px; border-radius: 999px; }\n@media (max-width: 900px) { .jm-hz-hero-sizes { justify-content: center; } }\n\/* Hero: Link „Zu den Produktdetails“ *\/\n.jm-hz-details-link { display: inline-flex; align-items: center; gap: 8px; align-self: flex-start; margin-top: 14px; font: 600 14px Inter, sans-serif; color: #8a7448; text-decoration: none; border-bottom: 1px solid rgba(201,168,76,0.5); padding-bottom: 2px; transition: color .2s ease, border-color .2s ease; }\n.jm-hz-details-link:hover { color: #1a1410; border-color: #c9a84c; }\n.jm-hz-details-link .bi-arrow-down { transition: transform .2s ease; }\n.jm-hz-details-link:hover .bi-arrow-down { transform: translateY(2px); }\n#jm-produktdetails { scroll-margin-top: 90px; }\n@media (max-width: 900px) { .jm-hz-details-link { align-self: center; } }\n\/* ── HERZANHÄNGER-KONFIGURATOR: Ergänzungen ── *\/\n\/* Mobile: Produktdetails (container2 = 110 %) machten die Seite breiter als den Bildschirm → alles wirkte verrutscht *\/\n@media (max-width: 768px) {\n  .engraving-product .container2 { width: 100%; max-width: 100%; box-sizing: border-box; }\n  .jm-cfg-wrap, .jm-cfg-card { max-width: 100%; }\n  #jm-cfg-card-2 .jm-cfg-card-body { padding-left: 14px; padding-right: 14px; }\n  \/* Schritt 2 mobil: eine Spalte, nichts breiter als die Karte *\/\n  #jm-cfg-card-2, #jm-cfg-card-2 .jm-cfg-card-body { overflow: hidden; }\n  .jm-cfg-s2-wrap .engraving-preview-grid { grid-template-columns: minmax(0, 1fr); }\n  .jm-cfg-s2-wrap .engraving-preview-image, .jm-cfg-s2-wrap .engraving-preview-content { min-width: 0; max-width: 100%; }\n  .jm-cfg-s2-wrap .engraving-badge { white-space: normal; }\n  .jm-cfg-s2-wrap .font-group { min-width: 0; }\n  .jm-cfg-s2-wrap .font-group-buttons { display: flex; flex-wrap: wrap; gap: 8px; min-width: 0; }\n  .jm-cfg-s2-wrap .font-btn { white-space: nowrap; }\n}\n\/* Desktop: Produktdetails als 2 gleich breite Spalten (Flex mit Umbruch hat die 2. Liste unter die 1. geschoben) *\/\n@media (min-width: 769px) {\n  .engraving-product .container2 { width: 100%; box-sizing: border-box; }\n  .engraving-product .engraving-specs { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 0 48px; align-items: start; }\n  .engraving-product .engraving-specs ul { min-width: 0; }\n  .engraving-product .engraving-specs ul li { flex-wrap: wrap; }\n  .engraving-product .engraving-specs ul li .ring-size-visual { flex: 1 0 100%; justify-content: flex-start; margin: 10px 0 4px; }\n  .engraving-product .engraving-specs ul li .ring-size-visual .engraving-preview-note { flex-basis: 100%; text-align: left; font-size: 12px; margin: 0; }\n}\n\/* Mobile: Produktdetails – Theme gibt .engraving-product bereits 30 px Rand → hier keinen zweiten Innenabstand,\n   Liste linksbündig, Größen-Kacheln nebeneinander über die volle Breite *\/\n@media (max-width: 768px) {\n  .engraving-product .container2 { padding-left: 0; padding-right: 0; }\n  .engraving-product .engraving-specs { width: 100%; box-sizing: border-box; padding: 20px 16px; gap: 0; align-items: stretch; margin-left: 0; margin-right: 0; }\n  .engraving-product .engraving-specs ul { width: 100%; text-align: left; }\n  .engraving-product .engraving-specs ul li { flex-wrap: wrap; justify-content: flex-start; text-align: left; min-width: 0; padding: 10px 0; margin-bottom: 0; }\n  .engraving-product .engraving-specs ul li .ring-size-visual { flex: 1 0 100%; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; margin: 8px 0 0; }\n  .engraving-product .engraving-specs ul li .ring-size { width: auto; min-width: 0; height: auto; padding: 8px 4px; }\n  .engraving-product .engraving-specs ul li .ring-size-visual .engraving-preview-note { grid-column: 1 \/ -1; text-align: left; margin: 2px 0 0; font-size: 11px !important; line-height: 1.4; }\n}\n\/* Schritt 1: Spalten dürfen nicht über die Karte hinauswachsen, Bild bleibt beim Scrollen sichtbar *\/\n#jm-cfg-card-1 { max-width: 920px; }\n#jm-cfg-card-1 .jm-cfg-s1-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 36px; align-items: start; }\n@media (max-width: 640px) { #jm-cfg-card-1 .jm-cfg-s1-grid { grid-template-columns: minmax(0, 1fr); gap: 18px; } }\n#jm-cfg-card-1 .jm-cfg-s1-left, #jm-cfg-card-1 .jm-cfg-s1-right { min-width: 0; }\n#jm-cfg-card-1 .jm-cfg-s1-left p { margin-bottom: 16px; }\n@media (min-width: 641px) { #jm-cfg-card-1 .jm-cfg-s1-right { position: sticky; top: 20px; } }\n\/* Mobile: Bild zuerst, dann Auswahl *\/\n@media (max-width: 640px) { #jm-cfg-card-1 .jm-cfg-s1-right { order: -1; } #jm-cfg-card-1 .jm-cfg-ring-img-wrap { max-width: 320px; margin: 0 auto; } }\n\/* Farbkarten: Punkt oben, Name + Zusatz darunter – lange Namen brechen sauber um *\/\n.jm-hz-colors .jm-mh-color { flex-direction: column; justify-content: flex-start; text-align: center; gap: 6px; padding: 12px 6px 10px; }\n.jm-hz-colors .jm-mh-color-info { width: 100%; }\n.jm-hz-colors .jm-mh-color-name { font-size: 13.5px; line-height: 1.25; overflow-wrap: anywhere; }\n.jm-hz-colors .jm-mh-color-desc { white-space: normal; overflow: visible; font-size: 11px; line-height: 1.3; margin-top: 2px; }\n\/* Kurzübersicht *\/\n.jm-hz-facts { list-style: none; margin: 4px 0 0; padding: 0; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px; }\n.jm-hz-facts li { display: flex; align-items: center; gap: 10px; padding: 10px 12px; border: 1px solid #ece4d6; border-radius: 10px; background: #faf9f7; min-width: 0; }\n.jm-hz-facts i { width: 28px; height: 28px; flex-shrink: 0; border-radius: 50%; display: flex; align-items: center; justify-content: center; background: rgba(201,168,76,0.12); color: #b39548; font-size: 13px; }\n.jm-hz-facts strong { display: block; font-size: 13px; color: #1a1410; line-height: 1.25; }\n.jm-hz-facts small { display: block; font-size: 11px; color: #9a8a6a; line-height: 1.3; }\n@media (max-width: 380px) { .jm-hz-facts { grid-template-columns: 1fr; } }\n.jm-hz-colors { grid-template-columns: repeat(3, minmax(0, 1fr)); }\n.jm-mh-color-dot.edelstahl { background: radial-gradient(circle at 35% 30%, #f6f6f6, #a9a9ad); }\n.jm-mh-color-dot.rosegold  { background: radial-gradient(circle at 35% 30%, #f7d6c8, #b9786a); }\n@media (max-width: 480px) {\n  .jm-hz-colors .jm-mh-color { flex-direction: column; text-align: center; gap: 6px; padding: 10px 6px; }\n  .jm-hz-colors .jm-mh-color-desc { display: none; }\n}\n#jm-cfg-card-1 .jm-hz-size-wrap { max-width: none; margin: 0 0 18px; }\n#jm-cfg-card-1 .jm-hz-size-title, .jm-hz-color-title { display: block; margin: 0 0 10px; font: 600 1.1rem 'Playfair Display', serif; letter-spacing: 0; text-transform: none; color: #1a1410; }\n.jm-cfg-s3-gravur-side-block + .jm-cfg-s3-gravur-side-block { margin-top: 12px; padding-top: 12px; border-top: 1px dashed rgba(201,168,76,0.25); }\n.jm-cfg-s3-gravur-lines { display: block; line-height: 1.35; }\n.jm-cfg-s3-gravur-lines span { display: block; }\n.jm-cfg-s3-price-fallback { font-family: 'Playfair Display', serif; font-size: 2rem; color: #1a1410; font-weight: 700; }\n.jm-cfg-btn-next:disabled { opacity: .4; cursor: not-allowed; }\n.jm-cfg-s2-wrap .engraving-preview-content .engraving-micro-trust { margin-top: 18px; }\n\/* Schritt 2 (Desktop): großes Bild links, beim Scrollen durch die Optionen rechts mittig im Blick\n   – Karte darf nicht „overflow: hidden“ haben, sonst funktioniert sticky nicht *\/\n#jm-cfg-card-2 { overflow: visible; }\n#jm-cfg-card-2 .jm-cfg-card-body { overflow: visible; }\n@media (min-width: 901px) {\n  #jm-cfg-card-2 { max-width: 1180px; }\n  .jm-cfg-s2-wrap .engraving-preview-grid { grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 48px; align-items: start; }\n  .jm-cfg-s2-wrap .engraving-preview-image { max-width: none; width: 100%; position: sticky; top: calc(50vh - min(26vw, 300px)); }\n  .jm-cfg-s2-wrap .engraving-preview-image \u003e img, .jm-cfg-s2-wrap .engraving-preview-image \u003e .jm-st-zoom \u003e img { width: 100%; }\n  \/* Fallback, wenn ein Theme-Container sticky verhindert: Bild wird per JS mitgeführt *\/\n  .jm-cfg-s2-wrap.jm-no-sticky .engraving-preview-image { position: relative; top: auto; will-change: transform; }\n}\n\n\/* =========================\n   KONFIGURATOR: Auswahl-Karten (Größe\/Farbe) im Gravur-Studio\n========================= *\/\n.jm-hz-size-wrap { margin: 0 0 14px; max-width: 420px; }\n.jm-hz-size-title { display: block; margin: 0 0 8px; font: 700 10px Inter, sans-serif; letter-spacing: 1.5px; text-transform: uppercase; color: #a89060; }\n.jm-hz-sizes { display: grid; grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); gap: 8px; }\n.jm-hz-size { display: flex; flex-direction: column; align-items: center; gap: 2px; min-width: 0; padding: 10px 8px; border: 1.5px solid #e8e0d0; border-radius: 12px; background: #faf9f7; cursor: pointer; font: 700 14px Inter, sans-serif; color: #1a1410; transition: all .25s ease; }\n.jm-hz-size small { font-size: 10.5px; font-weight: 500; color: #9a8a6a; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.jm-hz-size em { font-style: normal; font-size: 9px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; color: #c9a84c; }\n.jm-hz-size:hover { border-color: #c9a84c; background: #fdf8f0; }\n.jm-hz-size.active { border-color: #c9a84c; background: #fdf8f0; box-shadow: 0 0 0 3px rgba(201,168,76,0.12); }\n.jm-hz-size.unavailable { opacity: .45; }\n@media (max-width: 900px) { .jm-hz-size-wrap { margin-left: auto; margin-right: auto; } }\n\/* Nur 1 Zeile je Seite (Formular ohne Zeile 2\/3): Zeilennummer ausblenden *\/\n.jm-gk-lines-1 .jm-gk-line { grid-template-columns: 1fr; }\n.jm-gk-lines-1 .jm-gk-line-nr { display: none; }\n\n\/* ── BILD-ZOOM (Tweak-Panel „Bild-Zoom“): Bild im Rahmen vergrößern\/verkleinern + Ausschnitt verschieben ──\n   --st-zoom (1 = Originalgröße), --st-px \/ --st-py (Verschiebung in % der Bildgröße) *\/\n.jm-st-zoom { position: relative; overflow: hidden; line-height: 0; background: #000; }\n.jm-st-zoom \u003e img { display: block; transform: translate(var(--st-px, 0%), var(--st-py, 0%)) scale(var(--st-zoom, 1)); transform-origin: center center; }\n\/* ── GRAVUR-STUDIO: Startposition für alle Bandfarben (Platte mittig) ──\n   Mit ?jmtweak=1 → Bereich „Gravur-Studio“ je Farbe\/Seite einstellen und die ausgegebene Regel hier ergänzen. *\/\n.engraving-preview-image[data-side] {\n  --st-x: 50%;\n  --st-y: 50%;\n  --st-rot: 0deg;\n  --st-size: 5;\n  --st-l: 28%;\n  --st-sh: 0.15;\n}\n@media (max-width: 768px) {\n  #engraving-mobile-popup .popup-preview[data-side] {\n    --st-x: 50%;\n    --st-y: 50%;\n    --st-rot: 0deg;\n    --st-size: 5;\n    --st-l: 28%;\n    --st-sh: 0.15;\n  }\n}\n\u003c\/style\u003e\n\n\u003cdiv class=\"engraving-product\"\u003e\n\u003c!-- =========================\n     HERO: Plattenarmband mit Faltschließe\n========================== --\u003e\n\u003csection class=\"engraving-hero engraving-fade show\"\u003e\n\u003cdiv class=\"engraving-hero-grid-wrapper\"\u003e\n\u003cdiv class=\"engraving-hero-grid\"\u003e\n\u003c!-- Textbereich --\u003e\n\u003cdiv class=\"engraving-hero-text\"\u003e\n\u003ch1\u003eHandgemachtes Plattenarmband mit Gravur\u003c\/h1\u003e\n\u003cdiv class=\"hero-subline\"\u003e\n\u003cspan class=\"engraving-badge\"\u003e \u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e Kostenlose Gravur \u003c\/span\u003e \u003ca href=\"#jm-cfg-wrap\" class=\"luxury-shine-btn luxury-rose live-preview-link\"\u003e \u003ci class=\"bi bi-eye\"\u003e\u003c\/i\u003e Live-Vorschau ansehen \u003c\/a\u003e\n\u003c\/div\u003e\n\u003cp\u003eModern. Elegant. Persönlich. Edelstahl-Platte an einem Cotton-Seil mit sicherer Faltschließe – für Frauen und Männer, mit deiner persönlichen Botschaft graviert.\u003c\/p\u003e\n\u003c!-- Bandfarben kompakt (Auswahl erfolgt im Produktformular \/ Gravur-Studio) --\u003e\n\u003cdiv class=\"jm-hz-hero-sizes\"\u003e\n\u003cspan class=\"jm-hz-hero-size\"\u003e\u003cspan class=\"jm-arm-dot rot\"\u003e\u003c\/span\u003e\u003cstrong\u003eRot\u003c\/strong\u003e\u003c\/span\u003e\n\u003cspan class=\"jm-hz-hero-size\"\u003e\u003cspan class=\"jm-arm-dot schwarz\"\u003e\u003c\/span\u003e\u003cstrong\u003eSchwarz\u003c\/strong\u003e\u003c\/span\u003e\n\u003cspan class=\"jm-hz-hero-size\"\u003eca. \u003cstrong\u003e21 cm\u003c\/strong\u003e · Faltschließe\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c!-- CTA Button scrollt nach oben zum Produktformular --\u003e \u003cbutton type=\"button\" class=\"engraving-collection-btn js-scroll-to-form\" data-target=\"#product-form\"\u003e Jetzt personalisieren \u003ci class=\"bi bi-arrow-up\"\u003e\u003c\/i\u003e \u003c\/button\u003e\n\u003cdiv class=\"micro-trust-valentine\"\u003eSicher · Persönlich · Handgefertigt\u003c\/div\u003e\n\u003c!-- Trust Icons (max. 4) --\u003e\n\u003cdiv class=\"engraving-trust\"\u003e\n\u003cspan\u003e\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e Edelstahl-Platte\u003c\/span\u003e \u003cspan\u003e\u003ci class=\"bi bi-lock\"\u003e\u003c\/i\u003e Sichere Faltschließe\u003c\/span\u003e \u003cspan\u003e\u003ci class=\"bi bi-droplet\"\u003e\u003c\/i\u003e Rostfrei \u0026amp; formstabil\u003c\/span\u003e \u003cspan\u003e\u003ci class=\"bi bi-people\"\u003e\u003c\/i\u003e Für Sie \u0026amp; Ihn\u003c\/span\u003e\n\u003c\/div\u003e\n\u003ca href=\"#jm-produktdetails\" class=\"jm-hz-details-link\"\u003e\u003ci class=\"bi bi-list-check\"\u003e\u003c\/i\u003e Zu den Produktdetails \u003ci class=\"bi bi-arrow-down\"\u003e\u003c\/i\u003e\u003c\/a\u003e\n\u003c\/div\u003e\n\u003c!-- Bildbereich: Bild kommt automatisch aus dem Hauptbild des Produkts --\u003e\n\u003cdiv class=\"engraving-image\"\u003e\n\u003cimg id=\"jmArmHeroImg\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Plattenarmband mit Faltschließe und Gravur aus Edelstahl\"\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n  \u003c!-- TRUST BAR --\u003e\n  \u003cdiv class=\"trust-bar \"\u003e\n        \u003cdiv class=\"trust-bar-inner\"\u003e\n            \u003cdiv class=\"trust-item-3d\"\u003e\n                \u003ci class=\"bi bi-geo-alt\"\u003e\u003c\/i\u003e\n                \u003cspan\u003eGravur in Deutschland\u003c\/span\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"trust-divider-v\"\u003e\u003c\/div\u003e\n            \u003cdiv class=\"trust-item-3d\"\u003e\n                \u003ci class=\"bi bi bi-award\"\u003e\u003c\/i\u003e\n                \u003cspan\u003eFamilienunternehmen seit 1991\u003c\/span\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"trust-divider-v\"\u003e\u003c\/div\u003e\n            \u003cdiv class=\"trust-item-3d\"\u003e\n                \u003cdiv class=\"live-dot-3d\"\u003e\u003c\/div\u003e\n                \u003cspan\u003eLive Vorschau\u003c\/span\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"trust-divider-v\"\u003e\u003c\/div\u003e\n            \u003cdiv class=\"trust-item-3d\"\u003e\n                \u003ci class=\"bi bi-box-seam\"\u003e\u003c\/i\u003e\n                \u003cspan\u003eVersand in 1–3 Werktagen\u003c\/span\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"trust-divider-v\"\u003e\u003c\/div\u003e\n            \u003cdiv class=\"trust-item-3d\"\u003e\n                \u003ci class=\"bi bi-stars\"\u003e\u003c\/i\u003e\n                \u003cspan\u003eZufriedenheitsgarantie\u003c\/span\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n    \u003c\/div\u003e\n\u003c!-- =========================\n     WHY STORY BLOCK\n========================== --\u003e\n\u003csection class=\"engraving-why-heart engraving-fade\"\u003e\n\u003cdiv class=\"container\"\u003e\n\u003ch2\u003eThe Message. Für den Schatz. Von Herzen.\u003c\/h2\u003e\n\u003cp\u003eEin Schmuckstück, das Geschichten erzählt: Verewige Namen, Initialen oder ein bedeutungsvolles Datum auf der eleganten Platte – und trage deine persönliche Geschichte immer bei dir.\u003c\/p\u003e\n\u003cdiv class=\"engraving-why-grid\"\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-gem\"\u003e\u003c\/i\u003e\n\u003ch3\u003eHochwertiger Edelstahl\u003c\/h3\u003e\n\u003cp\u003eLanglebig, hautfreundlich \u0026amp; pflegeleicht – die Platte rostet nicht, verfärbt sich nicht und bleibt formstabil.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e\n\u003ch3\u003eIndividuelle Gravur\u003c\/h3\u003e\n\u003cp\u003eName, Initialen, Koordinaten, Datum oder Symbol – kostenlos auf der Platte graviert.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-arrows-expand\"\u003e\u003c\/i\u003e\n\u003ch3\u003eSicher getragen\u003c\/h3\u003e\n\u003cp\u003eDie Faltschließe aus Edelstahl hält zuverlässig und lässt sich mit einem Handgriff einhaken und öffnen.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-heart-fill\"\u003e\u003c\/i\u003e\n\u003ch3\u003eEin Statement der Moderne\u003c\/h3\u003e\n\u003cp\u003eAllein oder kombiniert mit anderen Armbändern – modern, vielseitig und für Frauen wie Männer. Ein Geschenk, das bleibt.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c!-- =========================\n     SHIPPING \u0026 TRUST BLOCK\n========================== --\u003e\n\u003csection class=\"engraving-shipping engraving-fade\"\u003e\n\u003cdiv class=\"container\"\u003e\n\u003ch2\u003eSorgfältig gefertigt \u0026amp; sicher geliefert\u003c\/h2\u003e\n\u003cdiv class=\"engraving-shipping-grid\"\u003e\n\u003cdiv class=\"shipping-item\"\u003e\n\u003ci class=\"bi bi-truck\"\u003e\u003c\/i\u003e\n\u003ch3\u003eSchneller Versand\u003c\/h3\u003e\n\u003cp\u003eVersand innerhalb von \u003cstrong\u003e1–3 Werktagen\u003c\/strong\u003e nach Gravur – sorgfältig \u0026amp; sicher verpackt.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"shipping-item\"\u003e\n\u003ci class=\"bi bi-geo-alt\"\u003e\u003c\/i\u003e\n\u003ch3\u003eHandarbeit in Deutschland\u003c\/h3\u003e\n\u003cp\u003eJede Gravur entsteht in unserem Familienbetrieb – \u003cstrong\u003ekeine Externe Arbeit\u003c\/strong\u003e, kein Dropshipping.\u003c\/p\u003e\n\u003cp\u003eJede Gravur wird vor dem Versand manuell kontrolliert, damit dein Schmuckstück genau so ankommt, wie du es dir wünschst.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"shipping-item\"\u003e\n\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e\n\u003ch3\u003eSicher \u0026amp; Vertrauensvoll\u003c\/h3\u003e\n\u003cp\u003eSichere Zahlung, persönlicher Support und höchste Qualitätskontrolle vor dem Versand.\u003c\/p\u003e\n\u003cp\u003eSollte etwas nicht passen, findest du mit uns unkompliziert eine Lösung.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c!-- FEATURES --\u003e\n\u003csection class=\"engraving-section engraving-fade\"\u003e\n\u003cdiv class=\"container engraving-hero-text\"\u003e\n\u003ch1\u003eMit Liebe zum Detail gefertigt\u003c\/h1\u003e\n\u003cp class=\"engraving-section-desc\"\u003eUnser geometrisches Plattenarmband mit Cotton-Seil vereint modernes Design und Tragekomfort. Hochwertiger Edelstahl, eine sichere Faltschließe und deine persönliche Gravur machen es zu einem einzigartigen Ausdruck deiner Persönlichkeit.\u003c\/p\u003e\n\u003cdiv class=\"engraving-features\"\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-type\"\u003e\u003c\/i\u003e\n\u003ch3\u003ePersönliche Gravur\u003c\/h3\u003e\n\u003cp\u003eKoordinaten, Namen, Initialen oder Symbole – die Platte bietet Platz für deine Idee.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-palette\"\u003e\u003c\/i\u003e\n\u003ch3\u003eZwei Bandfarben\u003c\/h3\u003e\n\u003cp\u003eRot oder Schwarz – Cotton-Seil, passend zu deinem Stil.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-arrows-expand\"\u003e\u003c\/i\u003e\n\u003ch3\u003eFaltschließe\u003c\/h3\u003e\n\u003cp\u003eCa. 21 cm Armbandlänge – einfach einhaken, sicher tragen.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-gift\"\u003e\u003c\/i\u003e\n\u003ch3\u003eBereit zu schenken\u003c\/h3\u003e\n\u003cp\u003ePerfekt als persönliches Geschenk – zum Geburtstag, Jahrestag oder einfach so.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c!-- =========================\n     SPECS SECTION\n========================== --\u003e\n\u003csection class=\"engraving-section engraving-fade\" id=\"jm-produktdetails\"\u003e\n\u003cdiv class=\"container2 engraving-hero-text\"\u003e\n\u003ch1\u003eProduktdetails\u003c\/h1\u003e\n\u003cdiv class=\"engraving-specs\"\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-bookmark\"\u003e\u003c\/i\u003e \u003cstrong\u003eTyp:\u003c\/strong\u003e Geometrisches Plattenarmband mit Cotton-Seil und Faltschließe\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-box\"\u003e\u003c\/i\u003e \u003cstrong\u003eMaterial:\u003c\/strong\u003e Edelstahl-Platte \u0026amp; Faltschließe · Seil aus Cotton\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-palette\"\u003e\u003c\/i\u003e \u003cstrong\u003eBandfarben:\u003c\/strong\u003e Rot · Schwarz\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e \u003cstrong\u003ePlatte:\u003c\/strong\u003e\n\u003cdiv class=\"ring-size-visual\"\u003e\n\u003cdiv class=\"ring-size\"\u003e\n\u003cspan class=\"size\"\u003eLänge\u003c\/span\u003e \u003cspan class=\"diameter\"\u003e3,5 cm\u003c\/span\u003e \u003cspan class=\"circumference\"\u003eEdelstahl-Platte\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"ring-size\"\u003e\n\u003cspan class=\"size\"\u003eBreite\u003c\/span\u003e \u003cspan class=\"diameter\"\u003e0,5 cm\u003c\/span\u003e \u003cspan class=\"circumference\"\u003egravierbar\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cp class=\"engraving-preview-note\"\u003e\u003ci class=\"bi bi-info-circle\"\u003e\u003c\/i\u003e Hinweis: Maße können leicht abweichen.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-arrows-expand\"\u003e\u003c\/i\u003e \u003cstrong\u003eArmbandlänge:\u003c\/strong\u003e ca. 21 cm (nicht verstellbar)\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-database\"\u003e\u003c\/i\u003e \u003cstrong\u003eGewicht:\u003c\/strong\u003e ca. 7,2 g\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-gender-ambiguous\"\u003e\u003c\/i\u003e \u003cstrong\u003eGeschlecht:\u003c\/strong\u003e Damen \u0026amp; Herren\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-stars\"\u003e\u003c\/i\u003e \u003cstrong\u003eStil:\u003c\/strong\u003e Mode \u0026amp; Casual\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e \u003cstrong\u003eGravur:\u003c\/strong\u003e Kostenlos · Vorderseite · 1 Zeile, max. 11 Zeichen\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e \u003cstrong\u003ePlatte:\u003c\/strong\u003e rostet nicht · verfärbt sich nicht · formstabil · säure- \u0026amp; laugenbeständig\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-droplet\"\u003e\u003c\/i\u003e \u003cstrong\u003ePflege:\u003c\/strong\u003e Das Cotton-Seil möglichst nicht nass werden lassen\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-heart\"\u003e\u003c\/i\u003e \u003cstrong\u003eBedeutung:\u003c\/strong\u003e Persönlich \u0026amp; von Herzen\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c!-- =========================\n========================== --\u003e\n\u003c!-- =========================\n     3-SCHRITT KONFIGURATOR: Schmuckstück → Gravur → Bestätigung\n========================== --\u003e\n\u003cdiv class=\"jm-cfg-wrap\" id=\"jm-cfg-wrap\"\u003e\n\u003cdiv class=\"jm-cfg-header\"\u003e\n\u003cspan class=\"jm-cfg-eyebrow\"\u003eJuwelier Milano · Gravur-Studio\u003c\/span\u003e\n\u003ch2 class=\"jm-cfg-headline\"\u003eDein Armband. Deine Botschaft.\u003c\/h2\u003e\n\u003cp class=\"jm-cfg-subline\"\u003eGestalte in 3 Schritten dein persönliches Armband – Bandfarbe wählen, Platte gravieren, alles prüfen. Kostenlos, präzise und mit Liebe gefertigt.\u003c\/p\u003e\n\u003cdiv class=\"jm-cfg-steps\"\u003e\n\u003cdiv class=\"jm-cfg-step-item active\" id=\"jm-cfg-si-1\"\u003e\n\u003cdiv class=\"jm-cfg-step-circle\" id=\"jm-cfg-sc-1\"\u003e1\u003c\/div\u003e\n\u003cspan class=\"jm-cfg-step-label\"\u003eSchmuckstück\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-step-line\" id=\"jm-cfg-line-1\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-step-item\" id=\"jm-cfg-si-2\"\u003e\n\u003cdiv class=\"jm-cfg-step-circle\" id=\"jm-cfg-sc-2\"\u003e2\u003c\/div\u003e\n\u003cspan class=\"jm-cfg-step-label\"\u003eGravur\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-step-line\" id=\"jm-cfg-line-2\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-step-item\" id=\"jm-cfg-si-3\"\u003e\n\u003cdiv class=\"jm-cfg-step-circle\" id=\"jm-cfg-sc-3\"\u003e3\u003c\/div\u003e\n\u003cspan class=\"jm-cfg-step-label\"\u003eBestätigung\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-progress-bar\"\u003e\u003cdiv class=\"jm-cfg-progress-fill\" id=\"jm-cfg-progress\"\u003e\u003c\/div\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SCHRITT 1: Bandfarbe --\u003e\n\u003cdiv class=\"jm-cfg-card active\" id=\"jm-cfg-card-1\"\u003e\n\u003cdiv class=\"jm-cfg-card-body\"\u003e\n\u003cdiv class=\"jm-cfg-s1-grid\"\u003e\n\u003cdiv class=\"jm-cfg-s1-left\"\u003e\n\u003ch3\u003eDein Plattenarmband\u003c\/h3\u003e\n\u003cp\u003eEdelstahl-Platte an einem Cotton-Seil mit Faltschließe – wähle deine Bandfarbe. Die Auswahl wird direkt ins Produktformular übernommen.\u003c\/p\u003e\n\u003c!-- FARBE (wird aus den Varianten erzeugt, synchron zum Produktformular) --\u003e\n\u003cdiv id=\"jm-hz-color-wrap\" hidden\u003e\n\u003cspan class=\"jm-hz-color-title\"\u003eWähle deine Bandfarbe\u003c\/span\u003e\n\u003cdiv class=\"jm-mh-colors jm-hz-colors\" id=\"jm-hz-colors\" role=\"radiogroup\" aria-label=\"Bandfarbe wählen\"\u003e\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- KURZÜBERSICHT (kompakt, 2 Spalten) --\u003e\n\u003cul class=\"jm-hz-facts\"\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003ePlatte 3,5 × 0,5 cm\u003c\/strong\u003e\u003csmall\u003eEdelstahl · ca. 7,2 g\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-lock\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eFaltschließe\u003c\/strong\u003e\u003csmall\u003eca. 21 cm Länge\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eGravur gratis\u003c\/strong\u003e\u003csmall\u003e1 Zeile · max. 11 Zeichen\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eRostfrei\u003c\/strong\u003e\u003csmall\u003everfärbt sich nicht\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-s1-right\"\u003e\n\u003cdiv class=\"jm-cfg-ring-img-wrap\"\u003e\n\u003cimg class=\"jm-cfg-ring-img-primary\" id=\"hzCfgImg\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Plattenarmband Vorderseite\"\u003e\n\u003cspan class=\"jm-cfg-ring-img-label\" id=\"hzCfgLabel\"\u003eRot\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cp class=\"jm-cfg-ring-img-caption\"\u003eBand \u003cspan class=\"js-hz-color\"\u003eRot\u003c\/span\u003e · Platte 3,5 × 0,5 cm\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-card-footer\"\u003e\n\u003cbutton type=\"button\" class=\"jm-cfg-btn-back\" hidden\u003e\u003ci class=\"bi bi-arrow-left\"\u003e\u003c\/i\u003e Zurück\u003c\/button\u003e\n\u003cbutton type=\"button\" class=\"jm-cfg-btn-next\" id=\"jm-cfg-next-1\"\u003eWeiter zur Gravur \u003ci class=\"bi bi-arrow-right\"\u003e\u003c\/i\u003e\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SCHRITT 2: Gravur-Studio (Vorder-\/Rückseite, je 1 Zeile) --\u003e\n\u003cdiv class=\"jm-cfg-card\" id=\"jm-cfg-card-2\"\u003e\n\u003cdiv class=\"jm-cfg-card-body jm-cfg-s2-wrap\"\u003e\n\u003csection class=\"engraving-preview-section\"\u003e\u003cspan class=\"engraving-badge visible-xs\"\u003e \u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e Kostenlose Personalisierung – Live Vorschau \u003c\/span\u003e\n\u003cdiv class=\"engraving-preview-grid\"\u003e\n\u003c!-- IMAGE --\u003e\n\u003cdiv class=\"engraving-preview-image\"\u003e\n\u003cspan class=\"jm-gk-side-label\" id=\"jmGkSideLabel\"\u003eVorderseite\u003c\/span\u003e\n\u003cimg id=\"engravingProductImage\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Plattenarmband ohne Gravur\"\u003e\n\u003cdiv class=\"engraving-overlay\" id=\"engravingOverlay\"\u003e\n\u003cdiv class=\"engraving-preview-text-wrap\"\u003e\n\u003cspan id=\"engravingPreviewText\"\u003eDein Text\u003c\/span\u003e \u003cspan class=\"preview-check\"\u003e\u003ci class=\"bi bi-check\" style=\"color: #34aa8b;\"\u003e\u003c\/i\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cp class=\"engraving-preview-note\"\u003e✦ Diese Darstellung dient als Vorschau. Jede Gravur ist ein handwerkliches Unikat – minimale Abweichungen in Höhe oder Tiefe sind möglich. Wir passen die Schriftgröße optimal an.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c!-- CONTENT --\u003e\n\u003cdiv class=\"engraving-preview-content\" id=\"engraving-preview\"\u003e\n\u003cspan class=\"engraving-badge hidden-xs\"\u003e \u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e Kostenlose Personalisierung – Live Vorschau \u003c\/span\u003e\n\u003ch2\u003eMach dein Armband einzigartig\u003c\/h2\u003e\n\u003cp\u003eGib deine gewünschte Gravur ein und sieh sofort, wie sie auf der Platte wirkt – Name, Initialen, Datum oder Koordinaten.\u003c\/p\u003e\n\u003c!-- VORDERSEITE \/ RÜCKSEITE --\u003e\n\u003cdiv class=\"jm-gk-sides\" role=\"tablist\" aria-label=\"Gravurseite wählen\"\u003e\n\u003cbutton type=\"button\" class=\"jm-gk-side active\" data-side=\"front\" role=\"tab\" aria-selected=\"true\"\u003eVorderseite\u003csmall id=\"jm-gk-side-front\"\u003e–\u003c\/small\u003e\u003c\/button\u003e\n\u003cbutton type=\"button\" class=\"jm-gk-side\" data-side=\"back\" role=\"tab\" aria-selected=\"false\"\u003eRückseite \u003cem\u003eoptional\u003c\/em\u003e\u003csmall id=\"jm-gk-side-back\"\u003e–\u003c\/small\u003e\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c!-- INPUT --\u003e\n\u003cdiv class=\"engraving-input-wrap\" id=\"jmGkInputWrap\"\u003e\n\u003clabel for=\"engravingInput\" id=\"jmGkInputLabel\"\u003eGravur Vorderseite\u003c\/label\u003e\n\u003cdiv class=\"jm-gk-line\"\u003e\n\u003cspan class=\"jm-gk-line-nr\"\u003e1 · oben\u003c\/span\u003e\u003cinput type=\"text\" id=\"engravingInput\" maxlength=\"11\" placeholder=\"z. B. Für immer ♥\" autocomplete=\"off\"\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-gk-line\"\u003e\n\u003cspan class=\"jm-gk-line-nr\"\u003e2 · Mitte\u003c\/span\u003e\u003cinput type=\"text\" id=\"engravingInput2\" maxlength=\"11\" placeholder=\"z. B. Für immer\" autocomplete=\"off\"\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-gk-line\"\u003e\n\u003cspan class=\"jm-gk-line-nr\"\u003e3 · unten\u003c\/span\u003e\u003cinput type=\"text\" id=\"engravingInput3\" maxlength=\"11\" placeholder=\"z. B. 12.06.24\" autocomplete=\"off\"\u003e\n\u003c\/div\u003e\n\u003csmall id=\"jmGkHint\"\u003eMax. 11 Zeichen · Zahlen \u0026amp; Symbole möglich · Zeilen 2 + 3 optional\u003c\/small\u003e\n\u003c\/div\u003e\n\u003c!-- SYMBOL PICKER --\u003e\n\u003cdiv class=\"engraving-symbol-picker\"\u003e\n\u003cspan class=\"symbol-title\"\u003eSymbole hinzufügen\u003c\/span\u003e\n\u003cdiv class=\"symbol-list\"\u003e\n\u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"♥\"\u003e♥\u003c\/button\u003e \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"∞\"\u003e∞\u003c\/button\u003e \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"★\"\u003e★\u003c\/button\u003e \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"✝\"\u003e✝\u003c\/button\u003e \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"❥\"\u003e❥\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- FONT SELECT --\u003e\n\u003cdiv class=\"engraving-font-select\"\u003e\n\u003c!-- =========================\n     FONT PICKER (BUTTONS)\n========================== --\u003e\n\u003cdiv class=\"engraving-font-picker\"\u003e\n\u003clabel class=\"font-picker-label\"\u003e\u003cstrong\u003eSchriftart wählen\u003c\/strong\u003e\u003c\/label\u003e \u003c!-- SERIF --\u003e\n\u003cdiv class=\"font-group\"\u003e\n\u003cspan class=\"font-group-title\"\u003eSerif\u003c\/span\u003e\n\u003cdiv class=\"font-group-buttons\"\u003e\n\u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Times New Roman\" style=\"font-family: 'Times New Roman';\"\u003e Times New Roman \u003c\/button\u003e \u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Georgia\" style=\"font-family: Georgia;\"\u003e Georgia \u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- SANS --\u003e\n\u003cdiv class=\"font-group\"\u003e\n\u003cspan class=\"font-group-title\"\u003eSans-serif\u003c\/span\u003e\n\u003cdiv class=\"font-group-buttons\"\u003e\n\u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Arial\" style=\"font-family: Arial;\"\u003e Arial \u003c\/button\u003e \u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Helvetica\" style=\"font-family: Helvetica;\"\u003e Helvetica \u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- MONOSPACE --\u003e\n\u003cdiv class=\"font-group\"\u003e\n\u003cspan class=\"font-group-title\"\u003eMonospace\u003c\/span\u003e\n\u003cdiv class=\"font-group-buttons\"\u003e\n\u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Courier New\" style=\"font-family: 'Courier New';\"\u003e Courier New \u003c\/button\u003e \u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Lucida Console\" style=\"font-family: 'Lucida Console';\"\u003e Lucida Console \u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- SCRIPT --\u003e\n\u003cdiv class=\"font-group\"\u003e\n\u003cspan class=\"font-group-title\"\u003eSchreibschrift\u003c\/span\u003e\n\u003cdiv class=\"font-group-buttons\"\u003e\n\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Allura\" style=\"font-family: 'Allura';\"\u003e Allura \u003c\/button\u003e \u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Alex Brush\" style=\"font-family: 'Alex Brush';\"\u003e Alex Brush \u003c\/button\u003e \u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Kaushan Script\" style=\"font-family: 'Kaushan Script';\"\u003e Kaushan Script \u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- HANDWRITING --\u003e\n\u003cdiv class=\"font-group\"\u003e\n\u003cspan class=\"font-group-title\"\u003eHandschrift\u003c\/span\u003e\n\u003cdiv class=\"font-group-buttons\"\u003e\n\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Pacifico\" style=\"font-family: 'Pacifico';\"\u003e Pacifico \u003c\/button\u003e \u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Indie Flower\" style=\"font-family: 'Indie Flower';\"\u003e Indie Flower \u003c\/button\u003e \u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Dancing Script\" style=\"font-family: 'Dancing Script';\"\u003e Dancing Script \u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- HIDDEN INPUT FÜR SHOPIFY --\u003e \u003cinput type=\"hidden\" name=\"properties[Schriftart]\" id=\"selectedFont\"\u003e\n\u003cp class=\"jm-arm-font-hint\"\u003e\u003ci class=\"bi bi-chat-heart\"\u003e\u003c\/i\u003e Deine Wunsch-Schriftart oder ein Symbol fehlt? Schreib uns – wir machen es möglich.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- MICRO TRUST --\u003e\n\u003cdiv class=\"engraving-micro-trust\"\u003e\n\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e Jede Gravur wird individuell geprüft \u0026amp; präzise gefertigt\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-card-footer\"\u003e\n\u003cbutton type=\"button\" class=\"jm-cfg-btn-back\" id=\"jm-cfg-back-2\"\u003e\u003ci class=\"bi bi-arrow-left\"\u003e\u003c\/i\u003e Zurück\u003c\/button\u003e\n\u003cbutton type=\"button\" class=\"jm-cfg-btn-next\" id=\"jm-cfg-next-2\" disabled\u003eZur Bestätigung \u003ci class=\"bi bi-arrow-right\"\u003e\u003c\/i\u003e\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- SCHRITT 3: Bestätigung --\u003e\n\u003cdiv class=\"jm-cfg-card\" id=\"jm-cfg-card-3\"\u003e\n\u003cdiv class=\"jm-cfg-card-body\"\u003e\n\u003ch3 class=\"jm-cfg-s3-title\"\u003eDeine Konfiguration im Überblick\u003c\/h3\u003e\n\u003cp class=\"jm-cfg-s3-subtitle\"\u003ePrüfe alle Angaben, bevor du sie in den Warenkorb legst.\u003c\/p\u003e\n\u003cdiv class=\"jm-cfg-s3-grid\"\u003e\n\u003cimg class=\"jm-cfg-s3-thumb\" id=\"jm-cfg-s3-thumb\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Plattenarmband mit Gravur\"\u003e\n\u003cdiv\u003e\n\u003cp class=\"jm-cfg-s3-product-name\"\u003ePlattenarmband mit Faltschließe \u0026amp; Gravur\u003c\/p\u003e\n\u003cdiv class=\"jm-cfg-s3-rows\"\u003e\n\u003cdiv class=\"jm-cfg-s3-row\"\u003e\n\u003cspan class=\"jm-cfg-s3-row-label\"\u003eBandfarbe\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-color\"\u003eRot\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-s3-row\"\u003e\n\u003cspan class=\"jm-cfg-s3-row-label\"\u003ePlatte\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-size\"\u003eEdelstahl · 3,5 × 0,5 cm\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-s3-row\"\u003e\n\u003cspan class=\"jm-cfg-s3-row-label\"\u003eLänge · Gewicht\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-weight\"\u003eca. 21 cm · Faltschließe · ca. 7,2 g\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-s3-row\"\u003e\n\u003cspan class=\"jm-cfg-s3-row-label\"\u003eGravur\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-sides\"\u003eVorderseite · kostenlos\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-s3-gravur-box\"\u003e\n\u003cspan class=\"jm-cfg-s3-gravur-eyebrow\"\u003eDeine Gravur\u003c\/span\u003e\n\u003cdiv class=\"jm-cfg-s3-gravur-text\" id=\"jm-cfg-s3-gravur-text\"\u003e–\u003c\/div\u003e\n\u003cspan class=\"jm-cfg-s3-gravur-meta\" id=\"jm-cfg-s3-gravur-meta\"\u003eSchriftart: Playfair Display\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-s3-price-wrap\" id=\"jm-cfg-s3-price\"\u003e\u003c\/div\u003e\n\u003cbutton type=\"button\" class=\"engraving-collection-btn js-scroll-to-form jm-cfg-s3-cta\" id=\"jm-cfg-s3-cta-btn\" data-target=\"#product-form\" style=\"width:100%;justify-content:center;font-size:15px;padding:18px 32px;\"\u003e\u003ci class=\"bi bi-bag-check\"\u003e\u003c\/i\u003e Gravur übernehmen \u0026amp; zum Warenkorb \u003ci class=\"bi bi-arrow-up\"\u003e\u003c\/i\u003e\u003c\/button\u003e\n\u003cdiv class=\"jm-cfg-s3-trust\"\u003e\n\u003cspan\u003e\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e Gravur in Deutschland\u003c\/span\u003e\n\u003cspan\u003e\u003ci class=\"bi bi-truck\"\u003e\u003c\/i\u003e Versand 1–3 Werktage\u003c\/span\u003e\n\u003cspan\u003e\u003ci class=\"bi bi-lock\"\u003e\u003c\/i\u003e Sichere Zahlung\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cp class=\"jm-cfg-s3-note\"\u003e✦ Personalisierte Produkte sind vom Umtausch ausgeschlossen.\u003cbr\u003eBitte prüfe deine Angaben sorgfältig.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-card-footer\"\u003e\n\u003cbutton type=\"button\" class=\"jm-cfg-btn-back\" id=\"jm-cfg-back-3\"\u003e\u003ci class=\"bi bi-arrow-left\"\u003e\u003c\/i\u003e Gravur ändern\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c!-- \/jm-cfg-wrap --\u003e\n\u003c!-- End Block --\u003e\n\u003csection class=\"engraving-cta-strip engraving-fade\" id=\"gravur\"\u003e\u003ci class=\"bi bi-stars\" style=\"font-size: 6rem; color: #c0a860;\"\u003e\u003c\/i\u003e\n\u003ch2 style=\"margin-top: 15px;\"\u003eDeine Gravur. Deine Geschichte.\u003c\/h2\u003e\n\u003cp\u003eEin Schmuckstück, das mehr sagt als Worte.\u003c\/p\u003e\n\u003cp\u003eHandarbeit mit Herz. Wir verewigen Emotionen – präzise, hochwertig und mit Respekt.\u003c\/p\u003e\n\u003cp style=\"color: #fff; font-weight: 400;\"\u003eExcellence seit 1991.\u003c\/p\u003e\n\u003c\/section\u003e\n\u003c!-- Mobile Popup Vorschau --\u003e\n\u003cdiv id=\"engraving-mobile-popup\"\u003e\n\u003cdiv class=\"popup-preview\" style=\"position: relative; margin-bottom: 10px;\"\u003e\n\u003cspan class=\"jm-gk-side-label\" id=\"jmGkPopupSideLabel\"\u003eVorderseite\u003c\/span\u003e\n\u003cimg src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Gravur Vorschau Mobile\" class=\"popup-preview-image\" style=\"width: 100%;\"\u003e\n\u003cdiv class=\"engraving-overlay active\" id=\"engravingOverlay\"\u003e\n\u003cdiv class=\"popup-preview-text-wrap\"\u003e\n\u003cspan class=\"popup-preview-text\"\u003e\u003c\/span\u003e \u003cspan class=\"popup-preview-check\"\u003e\u003ci class=\"bi bi-check\" style=\"color: #34aa8b;\"\u003e\u003c\/i\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n\u003cbutton type=\"button\" class=\"engraving-collection-btn\" id=\"jm-cfg-popup-next\"\u003e Zur Bestätigung \u003ci class=\"bi bi-arrow-right\"\u003e\u003c\/i\u003e \u003c\/button\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n\/* =========================\n   GRAVURFELDER IM PRODUKTFORMULAR finden\n   Zeile n einer Seite: #gravur_\u003cSeite\u003e_\u003cn\u003e · [data-gravur-seite][data-gravur-zeile]\n   Zeile 1 zusätzlich: #gravurtext_vorderseite \/ #gravurtext_rueckseite (Standard-IDs)\n========================= *\/\nwindow.jmGravurFeld = function (seite, n) {\n  var back = seite === \"Rückseite\";\n  var sels = [\"#gravur_\" + seite + \"_\" + n,\n              '[data-gravur-seite=\"' + seite + '\"][data-gravur-zeile=\"' + n + '\"]'];\n  if (n === 1) sels = sels.concat(back\n    ? [\"#gravurtext_rueckseite\", \"#gravurtext_rückseite\", 'input[data-gravur-seite=\"Rückseite\"]', \"#gravurtext_2\"]\n    : [\"#gravurtext_vorderseite\", \"#gravurtext_oberfläche\", 'input[data-gravur-seite=\"Vorderseite\"]', \"#gravurtext\"]);\n  for (var i = 0; i \u003c sels.length; i++) {\n    try { var el = document.querySelector(sels[i]); if (el \u0026\u0026 !el.closest(\"#engraving-preview\")) return el; } catch (e) {}\n  }\n  return null;\n};\n\/* Herzanhänger: 3 Zeilen je Seite (wie Geldklammer: #gravur_Vorderseite_1..3 \/ #gravur_Rückseite_1..3) *\/\nwindow.jmGravurZeilen = function () { return 1; };   \/* Platte 0,5 cm hoch → 1 Zeile je Seite *\/\n\u003c\/script\u003e\n\u003cscript\u003e\n\/* =========================\n   Intersection Animations\n========================= *\/\nconst engravingObserver = new IntersectionObserver(entries =\u003e {\n  entries.forEach(entry =\u003e {\n    if (entry.isIntersecting) entry.target.classList.add('show');\n  });\n}, { threshold: 0.2 });\n\ndocument.querySelectorAll('.engraving-fade').forEach(el =\u003e\n  engravingObserver.observe(el)\n);\n\n\/* =========================\n   CTA Scroll + Übergabe\n========================= *\/\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  const ctaButtons = document.querySelectorAll(\".js-scroll-to-form\");\n\n  ctaButtons.forEach(btn =\u003e {\n    btn.addEventListener(\"click\", function (e) {\n      e.preventDefault();\n\n      const gravurInput = window.jmGravurFeld(\"Vorderseite\", 1);\n      const previewText = document.getElementById(\"engravingPreviewText\");\n\n      \/* Gravur-Studio: Vorder- und Rückseite je 3 Zeilen übernehmen (nur Seiten mit Inhalt) *\/\n      const gkSides = window.jmGkSides;\n      if (gkSides) {\n        gkSides.save \u0026\u0026 gkSides.save();\n        const studioFont = previewText ? window.getComputedStyle(previewText).fontFamily : \"\";\n        [[\"front\", \"Vorderseite\"], [\"back\", \"Rückseite\"]].forEach(([k, seite]) =\u003e {\n          if (!gkSides.has(k)) return;\n          \/* Zeile ohne eigenes Formularfeld → an Zeile 1 anhängen („A + M | Ewig | 2024“), damit nichts verloren geht *\/\n          const extra = [];\n          gkSides[k].forEach((val, n) =\u003e {\n            const f = window.jmGravurFeld(seite, n + 1);\n            if (!f) { if (n \u003e 0 \u0026\u0026 val.trim()) extra.push(val.trim()); return; }\n            f.value = val.trim();\n            if (studioFont) f.style.fontFamily = studioFont;\n            f.dispatchEvent(new Event(\"input\", { bubbles: true }));\n          });\n          const f1 = window.jmGravurFeld(seite, 1);\n          if (f1 \u0026\u0026 extra.length) {\n            f1.value = [f1.value.trim()].concat(extra).filter(Boolean).join(\" | \");\n            f1.dispatchEvent(new Event(\"input\", { bubbles: true }));\n          }\n        });\n      }\n      if (gravurInput \u0026\u0026 previewText \u0026\u0026 !gkSides) {\n        gravurInput.value = previewText.textContent.trim();\n        gravurInput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n      }\n      if (gravurInput \u0026\u0026 previewText) {\n        const fontFamily = window.getComputedStyle(previewText).fontFamily;\n        gravurInput.style.fontFamily = fontFamily;\n\n        const back = document.querySelector(\"#gravurtext_2\");\n        if (back) back.style.fontFamily = fontFamily;\n        const back3 = document.querySelector(\"#gravurtext_3\");\n        if (back3) back3.style.fontFamily = fontFamily;\n        const back4 = document.querySelector(\"#gravurtext_4\");\n        if (back4) back4.style.fontFamily = fontFamily;\n        const back5 = document.querySelector(\"#gravurtext_5\");\n        if (back5) back5.style.fontFamily = fontFamily;\n        const back6 = document.querySelector(\"#gravurtext_6\");\n        if (back6) back6.style.fontFamily = fontFamily;\n      }\n\n      const gravurFontSelect = document.querySelector(\"#gravur_schriftart\");\n      if (gravurFontSelect \u0026\u0026 previewText) {\n        const previewFont = window.getComputedStyle(previewText).fontFamily;\n        let found = false;\n        Array.from(gravurFontSelect.options).forEach((opt, i) =\u003e {\n          if (previewFont.includes(opt.value)) {\n            gravurFontSelect.selectedIndex = i;\n            found = true;\n          }\n        });\n        if (!found) gravurFontSelect.selectedIndex = 0;\n      }\n\n      const productForm = document.querySelector(\"#product-form, form[action*='\/cart\/add']\");\n      if (!productForm) return;\n\n      productForm.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n      const firstInput = productForm.querySelector(\"input, textarea, select\");\n      if (firstInput) firstInput.focus();\n    });\n  });\n});\n\n\/* =========================\n   Specs Fade-In\n========================= *\/\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  const uls = document.querySelectorAll('.engraving-specs ul');\n  const observer = new IntersectionObserver(entries =\u003e {\n    entries.forEach(entry =\u003e {\n      if (entry.isIntersecting) entry.target.classList.add('visible');\n    });\n  }, { threshold: 0.3 });\n  uls.forEach(ul =\u003e observer.observe(ul));\n});\n\n\/* =========================\n   Size Buttons\n========================= *\/\ndocument.querySelectorAll('.size-btn').forEach(btn =\u003e {\n  btn.addEventListener('click', () =\u003e {\n    document.querySelectorAll('.size-btn').forEach(b =\u003e b.classList.remove('active'));\n    btn.classList.add('active');\n    document.getElementById('engraving-size-value').textContent =\n      btn.getAttribute('data-size');\n  });\n});\n\n\/* =========================\n   MAIN ENGRAVING LOGIC\n========================= *\/\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n  const input = document.getElementById(\"engravingInput\");\n  const previewText = document.getElementById(\"engravingPreviewText\");\n  const overlay = document.getElementById(\"engravingOverlay\");\n\n  \/* ---- Mobile Popup ---- *\/\n  const mobilePopup = document.getElementById(\"engraving-mobile-popup\");\n  const mobilePopupText = mobilePopup?.querySelector(\".popup-preview-text\");\n\n  function showPopup() {\n    if (window.innerWidth \u003e 768) return;\n    mobilePopup.classList.add(\"show\");\n  }\n  function hidePopup() {\n    mobilePopup.classList.remove(\"show\");\n  }\n\n  \/* ---- Desktop Effects ---- *\/\n  function triggerDesktopEffects() {\n    previewText.classList.remove(\"engrave-fade\");\n    void previewText.offsetWidth;\n    previewText.classList.add(\"engrave-fade\");\n\n    const check = document.querySelector(\".preview-check\");\n    if (check) {\n      check.classList.add(\"show\");\n      clearTimeout(check._timeout);\n      check._timeout = setTimeout(() =\u003e check.classList.remove(\"show\"), 1000);\n    }\n  }\n\n  \/* ---- Mobile Popup Sync ---- *\/\n  function updateMobilePopup(value) {\n    if (!mobilePopupText) return;\n\n    mobilePopupText.textContent = value;\n    mobilePopupText.style.fontFamily =\n      window.getComputedStyle(previewText).fontFamily;\n\n    mobilePopupText.classList.remove(\"engrave-fade\");\n    void mobilePopupText.offsetWidth;\n    mobilePopupText.classList.add(\"engrave-fade\");\n\n    let popupCheck = mobilePopup.querySelector(\".popup-preview-check\");\n    if (!popupCheck) {\n      popupCheck = document.createElement(\"span\");\n      popupCheck.className = \"popup-preview-check\";\n      popupCheck.innerHTML = \"✔\";\n      mobilePopupText.parentElement.appendChild(popupCheck);\n    }\n\n    popupCheck.classList.add(\"show\");\n    clearTimeout(popupCheck._timeout);\n    popupCheck._timeout = setTimeout(() =\u003e popupCheck.classList.remove(\"show\"), 1000);\n\n    showPopup();\n  }\n\n  const symbolButtons = document.querySelectorAll(\".symbol-btn\");\n  const fontButtons = document.querySelectorAll(\".font-btn\");\n  const hiddenFontInput = document.getElementById(\"selectedFont\");\n  const MAX_LENGTH = 11;\n  let lastValue = \"\";\n\n  function updatePreview(force = false) {\n    const value = input.value;\n    if (!value) {\n      overlay.classList.remove(\"active\");\n      hidePopup();\n      lastValue = \"\";\n      return;\n    }\n\n    previewText.textContent = value;\n    overlay.classList.add(\"active\");\n\n    if (force || value.length !== lastValue.length) {\n      triggerDesktopEffects();\n      updateMobilePopup(value);\n    }\n\n    lastValue = value;\n  }\n\n  input.addEventListener(\"input\", () =\u003e updatePreview());\n\n  \/* ---- Symbols ---- *\/\n  symbolButtons.forEach(btn =\u003e {\n    btn.addEventListener(\"click\", () =\u003e {\n      const symbol = btn.dataset.symbol;\n      const maxLen = input.maxLength \u003e 0 ? input.maxLength : MAX_LENGTH;\n      if (input.value.length + symbol.length \u003e maxLen) return;\n\n      const start = input.selectionStart;\n      const end = input.selectionEnd;\n      input.value =\n        input.value.substring(0, start) +\n        symbol +\n        input.value.substring(end);\n\n      input.focus();\n      input.selectionStart = input.selectionEnd = start + symbol.length;\n      updatePreview(true);\n    });\n  });\nfunction forcePopupUpdate() {\n  const value = input.value.trim();\n  if (!value) return;\n\n  \/\/ Popup Text \u0026 Font\n  mobilePopupText.textContent = value;\n  mobilePopupText.style.fontFamily =\n    window.getComputedStyle(previewText).fontFamily;\n\n  \/\/ Glow\n  mobilePopupText.classList.remove(\"engrave-fade\");\n  void mobilePopupText.offsetWidth;\n  mobilePopupText.classList.add(\"engrave-fade\");\n\n  \/\/ Micro Check\n  let popupCheck = mobilePopup.querySelector(\".popup-preview-check\");\n  if (!popupCheck) {\n    popupCheck = document.createElement(\"span\");\n    popupCheck.className = \"popup-preview-check\";\n    popupCheck.innerHTML = '\u003ci class=\"bi bi-check\" style=\"color:#34aa8b;\"\u003e\u003c\/i\u003e';\n    mobilePopupText.parentElement.appendChild(popupCheck);\n  }\n  popupCheck.classList.add(\"show\");\n  clearTimeout(popupCheck._timeout);\n  popupCheck._timeout = setTimeout(() =\u003e popupCheck.classList.remove(\"show\"), 1000);\n\n  \/\/ SHOW\n  if (window.innerWidth \u003c= 768) {\n    mobilePopup.classList.add(\"show\");\n  }\n}\n\n  \/* ---- Fonts ---- *\/\n  fontButtons.forEach(btn =\u003e {\n    btn.addEventListener(\"click\", () =\u003e {\n      const font = btn.dataset.font;\n      previewText.style.fontFamily = font;\n\n      const back = document.getElementById(\"gravurtext_2\");\n      if (back) back.style.fontFamily = font;\n      const back3 = document.getElementById(\"gravurtext_3\");\n      if (back3) back3.style.fontFamily = font;\n      const back4 = document.getElementById(\"gravurtext_4\");\n      if (back4) back4.style.fontFamily = font;\n      const back5 = document.getElementById(\"gravurtext_5\");\n      if (back5) back5.style.fontFamily = font;\n      const back6 = document.getElementById(\"gravurtext_6\");\n      if (back6) back6.style.fontFamily = font;\n\n      hiddenFontInput.value = font;\n      updatePreview(true);\n          \/\/ 🔥 DAS IST DER FIX\n    forcePopupUpdate();\n\n      fontButtons.forEach(b =\u003e b.classList.remove(\"active\"));\n      btn.classList.add(\"active\");\n    });\n  });\n\n  document.addEventListener(\"click\", e =\u003e {\n    if (!mobilePopup.contains(e.target) \u0026\u0026 e.target !== input) hidePopup();\n  });\n  window.addEventListener(\"scroll\", hidePopup);\n});\n\n\/* =========================\n   Preview Image Pulse\n========================= *\/\nconst previewImage = document.querySelector('.engraving-preview-image');\nlet hasPulsed = false;\n\nfunction triggerPulse() {\n  if (!previewImage) return;\n  previewImage.classList.remove('pulse');\n  void previewImage.offsetWidth;\n  previewImage.classList.add('pulse');\n}\n\ndocument.getElementById(\"engravingInput\")?.addEventListener('input', e =\u003e {\n  if (!hasPulsed \u0026\u0026 e.target.value.trim()) {\n    triggerPulse();\n    hasPulsed = true;\n  }\n});\n\n\/* =========================\n   Hero-Link „Zu den Produktdetails“\n========================= *\/\ndocument.querySelectorAll('.jm-hz-details-link').forEach(link =\u003e {\n  link.addEventListener('click', e =\u003e {\n    const t = document.getElementById('jm-produktdetails');\n    if (!t) return;\n    e.preventDefault();\n    t.classList.add('show');   \/* Einblend-Animation sofort auslösen *\/\n    t.scrollIntoView({ behavior: 'smooth', block: 'start' });\n  });\n});\n\n\/* =========================\n   Live Preview Link (WICHTIG!)\n========================= *\/\n\/* Gilt für ALLE „Live-Vorschau ansehen“-Links der Seite – auch den im Produkt-Template\n   (href=\"#engraving-preview\"). Nur wenn diese Beschreibung den Konfigurator (#jm-cfg-wrap) hat,\n   wird zum Konfigurator gescrollt; auf anderen Produkten passiert hier nichts. *\/\ndocument.addEventListener('click', e =\u003e {\n  const link = e.target.closest \u0026\u0026 e.target.closest('a[href=\"#engraving-preview\"], a[href=\"#jm-cfg-wrap\"], .live-preview-link');\n  if (!link) return;\n  const wrap = document.getElementById('jm-cfg-wrap');\n  if (!wrap) return;\n  e.preventDefault();\n  e.stopPropagation();\n  wrap.scrollIntoView({ behavior: 'smooth', block: 'start' });\n}, true);\n\/* =========================\n   MOBILE FONT POPUP FIX\n   (isoliert, zerstört nichts)\n========================= *\/\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n\n  if (window.innerWidth \u003e 768) return;\n\n  const input = document.getElementById(\"engravingInput\");\n  const previewText = document.getElementById(\"engravingPreviewText\");\n  const mobilePopup = document.getElementById(\"engraving-mobile-popup\");\n  const popupText = mobilePopup?.querySelector(\".popup-preview-text\");\n  const popupCheck = mobilePopup?.querySelector(\".popup-preview-check\");\n  const fontButtons = document.querySelectorAll(\".font-btn\");\n\n  if (!input || !previewText || !popupText || !mobilePopup) return;\n\n  function showMobilePopup() {\n    mobilePopup.classList.add(\"show\");\n  }\n\n  function syncPopupFromPreview() {\n    const value = input.value.trim();\n    if (!value) return;\n\n    \/\/ Text + Font\n    popupText.textContent = value;\n    popupText.style.fontFamily =\n      window.getComputedStyle(previewText).fontFamily;\n\n    \/\/ Glow\n    popupText.classList.remove(\"engrave-fade\");\n    void popupText.offsetWidth;\n    popupText.classList.add(\"engrave-fade\");\n\n    \/\/ Micro Check\n    if (popupCheck) {\n      popupCheck.classList.add(\"show\");\n      clearTimeout(popupCheck._timeout);\n      popupCheck._timeout = setTimeout(\n        () =\u003e popupCheck.classList.remove(\"show\"),\n        1000\n      );\n    }\n\n    showMobilePopup();\n  }\n\n  \/* 🔥 FONT-WECHSEL → POPUP *\/\n  fontButtons.forEach(btn =\u003e {\n    btn.addEventListener(\"click\", () =\u003e {\n      requestAnimationFrame(syncPopupFromPreview);\n    });\n  });\n\n  \/* Sicherheit: auch bei erneutem Tippen *\/\n  input.addEventListener(\"input\", syncPopupFromPreview);\n\n}); \n\u003c\/script\u003e\n\n\u003cscript\u003e\n\/* =========================\n   GRAVUR-STUDIO: VORDERSEITE \/ RÜCKSEITE · je 3 Zeilen (oben \/ Mitte \/ unten)\n   (Ergänzung – nutzt das vorhandene Eingabefeld #engravingInput als Zeile 1)\n========================= *\/\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  const lineInputs = [\"engravingInput\", \"engravingInput2\", \"engravingInput3\"].map(id =\u003e document.getElementById(id));\n  const input = lineInputs[0];\n  const tabs  = document.querySelectorAll(\".jm-gk-side\");\n  if (!input || !tabs.length) return;\n\n  const previewText = document.getElementById(\"engravingPreviewText\");\n  const overlay     = document.getElementById(\"engravingOverlay\");\n  const mobilePopup = document.getElementById(\"engraving-mobile-popup\");\n  const popupText   = mobilePopup \u0026\u0026 mobilePopup.querySelector(\".popup-preview-text\");\n  const studioImg   = document.getElementById(\"engravingProductImage\");\n  const popupImg    = mobilePopup \u0026\u0026 mobilePopup.querySelector(\".popup-preview-image\");\n  \/* Zoom-Rahmen um Studio- und Popup-Bild (Bild-Zoom per --st-zoom \/ --st-px \/ --st-py, Tweak-Panel) *\/\n  [studioImg, popupImg].forEach(img =\u003e {\n    if (!img || img.parentElement.classList.contains(\"jm-st-zoom\")) return;\n    const z = document.createElement(\"div\");\n    z.className = \"jm-st-zoom\";\n    z.style.borderRadius = getComputedStyle(img).borderRadius;\n    img.parentNode.insertBefore(z, img);\n    z.appendChild(img);\n  });\n\n  const LABEL = { front: \"Vorderseite\", back: \"Rückseite\" };\n\n  \/* ── Herzanhänger: Zeilen + Zeichen aus dem Produktformular übernehmen ── *\/\n  const LINES = window.jmGravurZeilen ? window.jmGravurZeilen() : 3;\n  const hasBack = false;   \/* Plattenarmband: nur Vorderseite → Tabs Vorder-\/Rückseite ausgeblendet *\/\n  (function setupLines() {\n    const wrap = document.getElementById(\"jmGkInputWrap\");\n    if (wrap) wrap.classList.toggle(\"jm-gk-lines-1\", LINES === 1);\n    lineInputs.forEach((i, n) =\u003e {\n      if (!i) return;\n      const row = i.closest(\".jm-gk-line\");\n      if (row) row.style.display = n \u003c LINES ? \"\" : \"none\";\n      \/* Studio: fest max. 11 Zeichen (Formularfeld bitte ebenfalls maxlength=\"11\") *\/\n    });\n    if (LINES === 1) input.placeholder = \"z. B. Für immer ♥\";\n    const max = lineInputs[0] \u0026\u0026 lineInputs[0].maxLength \u003e 0 ? lineInputs[0].maxLength : 11;\n    const hint = document.getElementById(\"jmGkHint\");\n    if (hint) hint.innerHTML = (LINES === 1 ? \"Max. \" + max + \" Zeichen\" : \"Je Zeile max. \" + max + \" Zeichen\")\n      + \" · Zahlen \u0026amp; Symbole möglich\" + (LINES \u003e 1 ? \" · Zeile\" + (LINES === 3 ? \"n 2 + 3\" : \" 2\") + \" optional\" : \"\")\n      + (hasBack ? \" · Rückseite optional\" : \"\");\n    const sideTabs = document.querySelector(\".jm-gk-sides\");\n    if (sideTabs \u0026\u0026 !hasBack) sideTabs.style.display = \"none\";\n  })();\n  const S = window.jmGkSides = { front: [\"\", \"\", \"\"], back: [\"\", \"\", \"\"], side: \"front\" };\n  let focused = input;\n  lineInputs.forEach(i =\u003e i \u0026\u0026 i.addEventListener(\"focus\", () =\u003e { focused = i; }));\n\n  S.has  = k =\u003e S[k].some(v =\u003e v.trim());\n  S.save = function () { S[S.side] = lineInputs.map((i, n) =\u003e (i \u0026\u0026 n \u003c LINES) ? i.value : \"\"); renderTabs(); };\n\n  function renderTabs() {\n    [\"front\", \"back\"].forEach(k =\u003e {\n      const sm = document.getElementById(\"jm-gk-side-\" + k);\n        if (sm) {\n            \/* jede Zeile als eigenes Element → Desktop: „a \/ b \/ c“, Mobile: untereinander *\/\n            const filled = S[k].filter(v =\u003e v.trim());\n            sm.textContent = \"\";\n            if (!filled.length) sm.textContent = \"–\";\n            filled.forEach(v =\u003e {\n                const el = document.createElement(\"span\");\n                el.className = \"jm-gk-sum\";\n                el.textContent = v.trim();\n                sm.appendChild(el);\n            });\n        }\n      const b = document.querySelector('.jm-gk-side[data-side=\"' + k + '\"]');\n      if (b) b.classList.toggle(\"filled\", S.has(k));\n    });\n  }\n\n  \/* Vorschau: Zeile 1 im Text, Zeile 2 + 3 darunter (data-rest) *\/\n  function restOf(l) { return l[2].trim() ? (l[1] + \"\\n\" + l[2]) : l[1]; }\n  function render(openPopup) {\n    const l = S[S.side];\n    const any = l.some(v =\u003e v.trim());\n    [previewText, popupText].forEach(el =\u003e {\n      if (!el) return;\n      if (any) el.textContent = l[0] || \"\\u00A0\";\n      el.setAttribute(\"data-rest\", any ? restOf(l) : \"\");\n    });\n    if (overlay) overlay.classList.toggle(\"active\", any);\n    if (openPopup \u0026\u0026 any \u0026\u0026 mobilePopup \u0026\u0026 window.innerWidth \u003c= 768) mobilePopup.classList.add(\"show\");\n  }\n\n  \/* ── Bilder je Seite + Farbe (Alt-Text „Vorderseite Vergoldet“, „Rückseite Stahl matt“ …) ── *\/\n  const IMG = {};                \/* variantId → { front, back } *\/\n  const TITLES = {};             \/* variantId → slug (vergoldet, schwarz-matt …) *\/\n  const studioBox = document.querySelector(\".engraving-preview-image\");\n  const popupBox  = mobilePopup \u0026\u0026 mobilePopup.querySelector(\".popup-preview\");\n  function slug(t) {\n    return String(t || \"\").toLowerCase().replace(\/ä\/g, \"ae\").replace(\/ö\/g, \"oe\").replace(\/ü\/g, \"ue\").replace(\/ß\/g, \"ss\")\n      .replace(\/[^a-z0-9]+\/g, \"-\").replace(\/^-|-$\/g, \"\");\n  }\n  \/* Farbe + Seite an Studio-Bild und Popup schreiben → CSS-Regeln je Farbe\/Seite greifen *\/\n  function markStudio() {\n    [studioBox, popupBox].forEach(box =\u003e {\n      if (!box) return;\n      box.dataset.side = S.side;\n      box.dataset.variant = TITLES[currentVariant()] || \"\";\n      const v = getComputedStyle(box).getPropertyValue(\"--st-x\").trim();\n      box.classList.toggle(\"jm-st-pos\", !!v || !!box.style.getPropertyValue(\"--st-x\"));\n    });\n  }\n  const FALLBACK = studioImg ? studioImg.getAttribute(\"src\") : \"\";\n  const FALLBACK_POP = popupImg ? popupImg.getAttribute(\"src\") : \"\";\n  let want = \"\", wantPop = \"\";\n  \/* Schlüssel einer Option: Größe „16 × 20 mm“ → „16x20“, sonst erstes Wort („vergoldet“) *\/\n  \/* Schlüssel einer Option: Größe „16 × 20 mm“ → „16x20“, Farbe „Rosé Gold“ → „rosegold“ (+ erstes Wort) *\/\n  function plain(t) { return String(t || \"\").toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\").replace(\/ß\/g, \"ss\"); }\n  function optKeys(o) {\n    o = plain(o);\n    const m = o.match(\/(\\d+(?:[.,]\\d+)?)\\s*[x×]\\s*(\\d+(?:[.,]\\d+)?)\/);\n    if (m) return [m[1] + \"x\" + m[2]];\n    return [o.replace(\/[^a-z0-9]+\/g, \"\"), o.split(\/[\\s-]+\/)[0]].filter(Boolean);\n  }\n  \/* Alt-Text kompakt: „Herz Zirkonia Vorderseite Rose Gold“ → „herzzirkoniavorderseiterosegold“ *\/\n  function altNorm(a) { return plain(a).replace(\/(\\d)\\s*[x×]\\s*(\\d)\/g, \"$1x$2\").replace(\/[^a-z0-9]+\/g, \"\"); }\n  function imgUrl(src) {\n    if (!src) return \"\";\n    if (src.indexOf(\"\/\/\") === 0) src = \"https:\" + src;\n    return src + (src.indexOf(\"?\") \u003e -1 ? \"\u0026\" : \"?\") + \"width=900\";\n  }\n  function currentVariant() {\n    const f = document.querySelector('form[action*=\"\/cart\/add\"] [name=\"id\"]');\n    return f ? String(f.value) : \"\";\n  }\n  function applyImage() {\n    markStudio();\n    syncSizes();\n    const m = IMG[currentVariant()] || {};\n    const url = m[S.side] || \"\";\n    \/* Kein Foto mit passendem Alt-Text → bisherige Studio-\/Popup-Bilder *\/\n    want = url || FALLBACK;\n    wantPop = url || FALLBACK_POP;\n    if (studioImg \u0026\u0026 studioImg.getAttribute(\"src\") !== want) studioImg.src = want;\n    if (popupImg \u0026\u0026 popupImg.getAttribute(\"src\") !== wantPop) popupImg.src = wantPop;\n  }\n  function guard(img, pop) {\n    if (!img) return;\n    new MutationObserver(() =\u003e {\n      const w = pop ? wantPop : want;\n      if (w \u0026\u0026 img.getAttribute(\"src\") !== w) img.src = w;\n    }).observe(img, { attributes: true, attributeFilter: [\"src\"] });\n  }\n\n  \/* ── Größe + Farbe (Schritt 1) ──\n     Quelle 1: Auswahlfelder im Produktformular (Debut: .single-option-selector) – funktioniert sofort\n     Quelle 2: Produktdaten (ProductJson \/ .js) – für Verfügbarkeit und als Ersatz *\/\n  let PRODUCT = null, SIZE_IDX = -1, COLOR_IDX = -1;\n  const sizeWrap  = document.getElementById(\"jm-hz-size-wrap\");\n  const sizeBox   = document.getElementById(\"jm-hz-sizes\");\n  const colorWrap = document.getElementById(\"jm-hz-color-wrap\");\n  const colorBox  = document.getElementById(\"jm-hz-colors\");\n  const isSize = o =\u003e \/\\d\\s*[x×]\\s*\\d\/i.test(String(o || \"\"));\n  const optsOf = v =\u003e (v.options || [v.option1, v.option2, v.option3]).filter(o =\u003e o != null).map(String);\n  const COLOR_INFO = { rot: \"Cotton-Seil\", schwarz: \"Cotton-Seil\", gruen: \"Cotton-Seil\", edelstahl: \"silberfarbig\", vergoldet: \"goldfarbig\", rosegold: \"roséfarbig\" };\n  function dotOf(c) { c = plain(c); return \/\\brot\\b|red\/.test(c) ? \"rot\" : \/schwarz|black\/.test(c) ? \"schwarz\" : \/grun|gruen|green\/.test(c) ? \"gruen\" : \/ros\/.test(c) ? \"rosegold\" : (\/gold\/.test(c) ? \"vergoldet\" : \"edelstahl\"); }\n  function area(o) {\n    const m = String(o).match(\/(\\d+(?:[.,]\\d+)?)\\s*[x×]\\s*(\\d+(?:[.,]\\d+)?)\/);\n    return m ? parseFloat(m[1].replace(\",\", \".\")) * parseFloat(m[2].replace(\",\", \".\")) : 0;\n  }\n  function variantById(id) { return PRODUCT \u0026\u0026 (PRODUCT.variants || []).find(v =\u003e String(v.id) === String(id)); }\n  function cartForm() { return document.querySelector('form[action*=\"\/cart\/add\"]'); }\n\n  \/* Auswahlfelder im Formular: Größe = Werte wie „16 × 20 mm“ oder Label „Größe\/Size“, Farbe = das andere *\/\n  function labelOf(sel) {\n    const l = sel.id \u0026\u0026 document.querySelector('label[for=\"' + sel.id + '\"]');\n    return plain((l \u0026\u0026 l.textContent) || sel.getAttribute(\"data-name\") || sel.getAttribute(\"aria-label\") || sel.name || \"\");\n  }\n  function formSelects() {\n    const f = cartForm();\n    if (!f) return { size: null, color: null };\n    const list = Array.from(f.querySelectorAll(\"select\")).filter(sel =\u003e\n      sel.name !== \"id\" \u0026\u0026 !\/productselect\/i.test(sel.id || \"\") \u0026\u0026 sel.options.length \u003e 1);\n    let size = list.find(sel =\u003e Array.from(sel.options).some(o =\u003e isSize(o.value)) || \/gro|size\/.test(labelOf(sel))) || null;\n    let color = list.find(sel =\u003e sel !== size \u0026\u0026 \/farb|color|colour|material|metall\/.test(labelOf(sel))) ||\n                list.find(sel =\u003e sel !== size) || null;\n    return { size: size, color: color };\n  }\n  function setSelect(sel, val) {\n    if (!sel || sel.value === val) return;\n    sel.value = val;\n    sel.dispatchEvent(new Event(\"change\", { bubbles: true }));\n    setTimeout(() =\u003e { lastVariant = currentVariant(); applyImage(); }, 120);\n  }\n\n  \/* aktuelle Werte (Formular hat Vorrang, sonst Variante) *\/\n  function curSize() {\n    const fs = formSelects();\n    if (fs.size) return fs.size.value;\n    const v = variantById(currentVariant());\n    return v ? (SIZE_IDX \u003e -1 ? optsOf(v)[SIZE_IDX] : v.title) : \"\";\n  }\n  function curColor() {\n    const fs = formSelects();\n    if (fs.color) return fs.color.value;\n    const v = variantById(currentVariant());\n    return v \u0026\u0026 COLOR_IDX \u003e -1 ? optsOf(v)[COLOR_IDX] : \"\";\n  }\n  \/* Werteliste + Verfügbarkeit einer Option *\/\n  function valuesFor(kind) {\n    const fs = formSelects();\n    const sel = kind === \"size\" ? fs.size : fs.color;\n    const vs = PRODUCT ? (PRODUCT.variants || []) : [];\n    const idx = kind === \"size\" ? SIZE_IDX : COLOR_IDX;\n    let vals = [];\n    if (sel) vals = Array.from(sel.options).map(o =\u003e o.value).filter(Boolean);\n    else if (vs.length) vs.forEach(v =\u003e {\n      const x = idx \u003e -1 ? optsOf(v)[idx] : (kind === \"size\" ? v.title : null);\n      if (x \u0026\u0026 vals.indexOf(x) === -1) vals.push(x);\n    });\n    return vals.map(x =\u003e ({\n      value: x,\n      avail: !vs.length || idx \u003c 0 ? true : vs.some(v =\u003e optsOf(v)[idx] === x \u0026\u0026 v.available !== false)\n    }));\n  }\n  function chooseSize(val)  { const fs = formSelects(); if (fs.size)  setSelect(fs.size, val);  else selectOpt(SIZE_IDX, val); }\n  function chooseColor(val) { const fs = formSelects(); if (fs.color) setSelect(fs.color, val); else selectOpt(COLOR_IDX, val); }\n\n  function buildSizes() {\n    if (!sizeBox || !sizeWrap) return;\n    const sizes = valuesFor(\"size\");\n    if (sizes.length \u003c 2) { sizeWrap.hidden = true; return; }\n    const maxA = Math.max.apply(null, sizes.map(x =\u003e area(x.value)));\n    sizeBox.innerHTML = \"\";\n    sizes.forEach(x =\u003e {\n      const big = maxA \u003e 0 \u0026\u0026 area(x.value) === maxA;\n      const b = document.createElement(\"button\");\n      b.type = \"button\";\n      b.className = \"jm-hz-size\" + (x.avail ? \"\" : \" unavailable\");\n      b.dataset.size = x.value;\n      b.setAttribute(\"role\", \"radio\");\n      b.innerHTML = (big ? \"\u003cem\u003eNeu · größer\u003c\/em\u003e\" : \"\") + \"\u003cspan\u003e\u003c\/span\u003e\u003csmall\u003e\u003c\/small\u003e\";\n      b.querySelector(\"span\").textContent = x.value;\n      b.querySelector(\"small\").textContent = !x.avail ? \"ausverkauft\" : (big ? \"mehr Sichtbarkeit\" : (maxA \u003e 0 ? \"klassisch\" : \"\"));\n      b.addEventListener(\"click\", () =\u003e chooseSize(x.value));\n      sizeBox.appendChild(b);\n    });\n    sizeWrap.hidden = false;\n  }\n  function buildColors() {\n    if (!colorBox || !colorWrap) return;\n    const colors = valuesFor(\"color\");\n    if (colors.length \u003c 2) { colorWrap.hidden = true; return; }\n    colorBox.innerHTML = \"\";\n    colors.forEach(x =\u003e {\n      const b = document.createElement(\"button\");\n      b.type = \"button\";\n      b.className = \"jm-mh-color\" + (x.avail ? \"\" : \" unavailable\");\n      b.dataset.color = x.value;\n      b.setAttribute(\"role\", \"radio\");\n      b.innerHTML = '\u003cspan class=\"jm-mh-color-dot ' + dotOf(x.value) + '\"\u003e\u003c\/span\u003e\u003cspan class=\"jm-mh-color-info\"\u003e\u003cspan class=\"jm-mh-color-name\"\u003e\u003c\/span\u003e\u003cspan class=\"jm-mh-color-desc\"\u003e\u003c\/span\u003e\u003c\/span\u003e';\n      const m = String(x.value).match(\/^(.*?)\\s*\\((.*)\\)\\s*$\/);   \/* „Roségold (vergoldet)“ *\/\n      b.querySelector(\".jm-mh-color-name\").textContent = m ? m[1] : x.value;\n      b.querySelector(\".jm-mh-color-desc\").textContent = !x.avail ? \"ausverkauft\"\n        : [m ? m[2] : \"\", COLOR_INFO[dotOf(x.value)] || \"\"].filter(Boolean).join(\" · \");\n      b.title = x.value;\n      b.addEventListener(\"click\", () =\u003e chooseColor(x.value));\n      colorBox.appendChild(b);\n    });\n    colorWrap.hidden = false;\n  }\n  function buildChoices() {\n    if (PRODUCT) {\n      const first = (PRODUCT.variants || [])[0] ? optsOf(PRODUCT.variants[0]) : [];\n      SIZE_IDX = first.findIndex(isSize);\n      COLOR_IDX = first.findIndex((o, i) =\u003e i !== SIZE_IDX);\n    }\n    buildSizes();\n    buildColors();\n    syncSizes();\n    if (sizeWrap \u0026\u0026 colorWrap \u0026\u0026 sizeWrap.hidden \u0026\u0026 colorWrap.hidden) {\n      const fs = formSelects();\n      console.warn(\"[JM Armband] Schritt 1: keine Größen\/Farben gefunden\",\n        { formular: !!cartForm(), auswahlfelder: [fs.size, fs.color], produktdaten: !!PRODUCT,\n          varianten: PRODUCT ? PRODUCT.variants.map(v =\u003e v.title) : null });\n    }\n  }\n\n  \/* Gewicht je Größe *\/\n  const WEIGHT = { \"16x20\": \"ca. 1,6 g\", \"20x25\": \"ca. 2,6 g\" };\n  function info() {\n    const v = variantById(currentVariant());\n    const size  = curSize() || \"Platte 3,5 × 0,5 cm\";\n    const color = curColor() || \"\";\n    return { variant: v, size: size, color: color, weight: \"ca. 7,2 g\",\n             front: (IMG[currentVariant()] || {}).front || FALLBACK };\n  }\n  \/* Schritt-1-Karte + Texte (Größe, Farbe, Gewicht, Bild) *\/\n  function syncCard() {\n    const i = info();\n    document.querySelectorAll(\".js-hz-size\").forEach(el =\u003e { el.textContent = i.size; });\n    document.querySelectorAll(\".js-hz-color\").forEach(el =\u003e { el.textContent = i.color; });\n\n    const lb = document.getElementById(\"hzCfgLabel\");\n    if (lb) { lb.textContent = i.color; lb.style.display = i.color ? \"\" : \"none\"; }\n    const im = document.getElementById(\"hzCfgImg\");\n    if (im \u0026\u0026 i.front \u0026\u0026 im.getAttribute(\"src\") !== i.front) { im.src = i.front; im.alt = \"Plattenarmband \" + i.color; }\n  }\n  function syncSizes() {\n    const s = curSize(), c = curColor();\n    if (sizeBox) sizeBox.querySelectorAll(\".jm-hz-size\").forEach(b =\u003e {\n      const on = b.dataset.size === s;\n      b.classList.toggle(\"active\", on);\n      b.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n    });\n    if (colorBox) colorBox.querySelectorAll(\".jm-mh-color\").forEach(b =\u003e {\n      const on = b.dataset.color === c;\n      b.classList.toggle(\"active\", on);\n      b.setAttribute(\"aria-checked\", on ? \"true\" : \"false\");\n    });\n    syncCard();\n  }\n  \/* Formularauswahl geändert (auch direkt oben im Produktformular) → Karten nachziehen *\/\n  document.addEventListener(\"change\", e =\u003e {\n    if (e.target \u0026\u0026 e.target.tagName === \"SELECT\" \u0026\u0026 e.target.closest('form[action*=\"\/cart\/add\"]')) setTimeout(() =\u003e { syncSizes(); applyImage(); }, 150);\n  });\n  \/* sofort aus dem Formular aufbauen – nicht erst auf die Produktdaten warten *\/\n  setTimeout(buildChoices, 0);\n\n  function selectSize(s) { chooseSize(s); }\n  \/* Ersatz ohne Auswahlfelder: Variante über Produktdaten wählen (übrige Optionen beibehalten) *\/\n  function selectOpt(idx, s) {\n    if (!PRODUCT) return;\n    const form = cartForm();\n    if (!form) return;\n    const cur = variantById(currentVariant());\n    const curOpts = cur ? optsOf(cur) : [];\n    const list = (PRODUCT.variants || []).filter(v =\u003e (idx \u003e -1 ? optsOf(v)[idx] : v.title) === s);\n    const score = v =\u003e optsOf(v).filter((o, i) =\u003e i !== idx \u0026\u0026 o === curOpts[i]).length * 2 + (v.available !== false ? 1 : 0);\n    const v = list.sort((a, b) =\u003e score(b) - score(a))[0];\n    if (!v) return;\n    const vals = optsOf(v);\n    form.querySelectorAll('input[type=\"radio\"]').forEach(r =\u003e {\n      if (vals.indexOf(r.value) \u003e -1 \u0026\u0026 !r.checked) {\n        r.checked = true;\n        r.dispatchEvent(new Event(\"change\", { bubbles: true }));\n        const lab = r.id \u0026\u0026 form.querySelector('label[for=\"' + r.id + '\"]');\n        if (lab) lab.click();\n      }\n    });\n    const idSel = form.querySelector('select[name=\"id\"], input[name=\"id\"]');\n    if (idSel \u0026\u0026 String(idSel.value) !== String(v.id)) {\n      idSel.value = v.id;\n      idSel.dispatchEvent(new Event(\"change\", { bubbles: true }));\n    }\n    lastVariant = currentVariant();\n    applyImage();\n  }\n  (function loadProduct() {\n    const el = document.querySelector('script[id^=\"ProductJson\"], script[data-product-json]');\n    const get = el ? Promise.resolve(JSON.parse(el.textContent))\n                   : fetch(location.pathname.replace(\/\\\/$\/, \"\") + \".js\").then(r =\u003e r.json());\n    get.then(p =\u003e {\n      const media = (p.media || []).map(m =\u003e ({ alt: String(m.alt || \"\").toLowerCase(), src: m.src || (m.preview_image \u0026\u0026 m.preview_image.src) }));\n      const pick = (side, opts, strict) =\u003e {\n        const sideKeys = side === \"front\" ? [\"vorderseite\"] : [\"rückseite\", \"rueckseite\"];\n        const list = media.filter(m =\u003e sideKeys.some(k =\u003e m.alt.indexOf(k) \u003e -1));\n        let hit = list.find(m =\u003e opts.some(o =\u003e optKeys(o).some(k =\u003e altNorm(m.alt).indexOf(k) \u003e -1)));\n        if (!hit \u0026\u0026 !strict \u0026\u0026 list.length === 1) hit = list[0];\n        return hit ? imgUrl(hit.src) : \"\";\n      };\n      \/* Hauptbild des Produkts → Hero-Bild + Ersatz, wenn kein Foto mit Alt-Text „Vorderseite \u003cFarbe\u003e“ existiert *\/\n      const heroSrc = (typeof p.featured_image === \"object\" \u0026\u0026 p.featured_image) ? p.featured_image.src : (p.featured_image || (p.images \u0026\u0026 p.images[0]) || \"\");\n      const hero = document.getElementById(\"jmArmHeroImg\");\n      if (hero \u0026\u0026 heroSrc) hero.src = imgUrl(heroSrc);\n      p.variants.forEach(v =\u003e {\n        const opts = v.options || [v.option1, v.option2, v.option3];\n        \/* Reihenfolge: Foto „Vorderseite \u003cFarbe\u003e“ → Variantenbild → einziges Vorderseiten-Foto → Hauptbild *\/\n        const fr = pick(\"front\", opts, true) || imgUrl(v.featured_image \u0026\u0026 (v.featured_image.src || v.featured_image)) || pick(\"front\", opts) || imgUrl(heroSrc);\n        IMG[String(v.id)] = { front: fr, back: pick(\"back\", opts) || fr };\n        \/* Größe aus dem Namen entfernen → Regeln gelten je Farbe für 16 × 20 UND 20 × 25 mm (gleiche Fotos) *\/\n        TITLES[String(v.id)] = slug(String(v.title).replace(\/\\d+(?:[.,]\\d+)?\\s*[x×]\\s*\\d+(?:[.,]\\d+)?\\s*(?:mm|cm)?\/gi, \" \"));\n      });\n      PRODUCT = p;\n      buildChoices();\n      applyImage();\n    }).catch(err =\u003e { console.warn(\"[JM Armband] Produktdaten nicht geladen\", err); buildChoices(); });\n  })();\n  guard(studioImg, false); guard(popupImg, true);\n  let lastVariant = currentVariant();\n  setInterval(() =\u003e { const v = currentVariant(); if (v !== lastVariant) { lastVariant = v; applyImage(); } }, 400);\n\n  \/* ── Seite wechseln ── *\/\n  function setSide(k) {\n    if (!LABEL[k] || (k === \"back\" \u0026\u0026 !hasBack)) return;\n    S.save();\n    S.side = k;\n    tabs.forEach(b =\u003e {\n      const on = b.dataset.side === k;\n      b.classList.toggle(\"active\", on);\n      b.setAttribute(\"aria-selected\", on ? \"true\" : \"false\");\n    });\n    const lb = document.getElementById(\"jmGkInputLabel\");\n    if (lb) lb.textContent = \"Gravur \" + LABEL[k] + (k === \"back\" ? \" (optional)\" : \"\");\n    [\"jmGkSideLabel\", \"jmGkPopupSideLabel\"].forEach(id =\u003e {\n      const el = document.getElementById(id);\n      if (el) el.textContent = LABEL[k];\n    });\n    lineInputs.forEach((i, n) =\u003e { if (i) i.value = S[k][n]; });\n    applyImage();\n    \/* vorhandene Vorschau-Logik (Effekte, Mobile-Popup) auslösen *\/\n    input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n    render(true);\n    (lineInputs.find(i =\u003e i \u0026\u0026 !i.value) || input).focus();\n  }\n  tabs.forEach(b =\u003e b.addEventListener(\"click\", () =\u003e setSide(b.dataset.side)));\n\n  \/* ── Eingaben ── *\/\n  lineInputs.forEach(i =\u003e i \u0026\u0026 i.addEventListener(\"input\", () =\u003e { S.save(); render(true); }));\n\n  \/* Symbole: in die zuletzt gewählte Zeile einfügen (Zeile 1 übernimmt die vorhandene Logik) *\/\n  document.addEventListener(\"click\", function (e) {\n    const btn = e.target.closest \u0026\u0026 e.target.closest(\"#engraving-preview .symbol-btn\");\n    if (!btn) return;\n    if (focused === input) { setTimeout(() =\u003e { S.save(); render(true); }, 30); return; }\n    e.stopImmediatePropagation();\n    const sym = btn.dataset.symbol || btn.textContent.trim();\n    const max = focused.maxLength \u003e 0 ? focused.maxLength : 11;\n    if (Array.from(focused.value + sym).length \u003e max) return;\n    const st = focused.selectionStart != null ? focused.selectionStart : focused.value.length;\n    const en = focused.selectionEnd != null ? focused.selectionEnd : focused.value.length;\n    focused.value = focused.value.substring(0, st) + sym + focused.value.substring(en);\n    focused.focus();\n    focused.selectionStart = focused.selectionEnd = st + sym.length;\n    S.save(); render(true);\n  }, true);\n\n  \/* Schriftart: vorhandene Logik setzt nur Zeile 1 → danach komplett neu zeichnen *\/\n  document.querySelectorAll(\"#engraving-preview .font-btn\").forEach(b =\u003e\n    b.addEventListener(\"click\", () =\u003e setTimeout(() =\u003e render(true), 30)));\n\n  \/* Werte, die per Skript gesetzt werden → regelmäßig übernehmen *\/\n  setInterval(() =\u003e {\n    const now = lineInputs.map((i, n) =\u003e (i \u0026\u0026 n \u003c LINES) ? i.value : \"\");\n    if (now.join(\"|\") !== S[S.side].join(\"|\")) { S.save(); render(false); }\n  }, 200);\n\n  \/* Schnittstelle für das Tweak-Panel *\/\n  window.jmGkStudio = { setSide: setSide, mark: markStudio, box: () =\u003e (window.innerWidth \u003c= 768 ? popupBox : studioBox),\n                        studioBox: studioBox, popupBox: popupBox, side: () =\u003e S.side, render: render,\n                        info: info, lines: () =\u003e LINES };\n  markStudio();\n  renderTabs();\n});\n\u003c\/script\u003e\n\u003cscript\u003e\n\/* =========================\n   3-SCHRITT KONFIGURATOR: 1 Schmuckstück → 2 Gravur → 3 Bestätigung\n   (nutzt window.jmGkSides \/ window.jmGkStudio aus dem Gravur-Studio)\n========================= *\/\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  const wrap = document.getElementById(\"jm-cfg-wrap\");\n  if (!wrap) return;\n  const TOTAL = 3;\n  let step = 1;\n  const next2 = document.getElementById(\"jm-cfg-next-2\");\n  const LABEL = { front: \"Vorderseite\", back: \"Rückseite\" };\n  const sides = () =\u003e window.jmGkSides || { front: [], back: [], has: () =\u003e false };\n  const hasAny = () =\u003e sides().has(\"front\") || sides().has(\"back\");\n  const esc = t =\u003e String(t).replace(\/[\u0026\u003c\u003e\"]\/g, c =\u003e ({ \"\u0026\": \"\u0026amp;\", \"\u003c\": \"\u0026lt;\", \"\u003e\": \"\u0026gt;\", '\"': \"\u0026quot;\" }[c]));\n\n  function updNext2() {\n    if (!next2) return;\n    next2.disabled = !hasAny();\n    next2.title = next2.disabled ? \"Bitte zuerst eine Gravur eingeben\" : \"\";\n  }\n  function hidePopup() {\n    const p = document.getElementById(\"engraving-mobile-popup\");\n    if (p) p.classList.remove(\"show\");\n  }\n\n  function go(n, scroll) {\n    step = n;\n    for (let i = 1; i \u003c= TOTAL; i++) {\n      const card = document.getElementById(\"jm-cfg-card-\" + i);\n      if (card) card.classList.toggle(\"active\", i === n);\n      const si = document.getElementById(\"jm-cfg-si-\" + i);\n      const sc = document.getElementById(\"jm-cfg-sc-\" + i);\n      if (!si || !sc) continue;\n      si.classList.remove(\"active\", \"done\");\n      if (i \u003c n)   { si.classList.add(\"done\"); sc.innerHTML = '\u003ci class=\"bi bi-check-lg\"\u003e\u003c\/i\u003e'; }\n      if (i === n) { si.classList.add(\"active\"); sc.textContent = i; }\n      if (i \u003e n)   { sc.textContent = i; }\n    }\n    for (let i = 1; i \u003c TOTAL; i++) {\n      const ln = document.getElementById(\"jm-cfg-line-\" + i);\n      if (ln) ln.classList.toggle(\"done\", n \u003e i);\n    }\n    const fill = document.getElementById(\"jm-cfg-progress\");\n    if (fill) fill.style.width = Math.round(((n - 1) \/ (TOTAL - 1)) * 100) + \"%\";\n\n    if (n !== 2) hidePopup();\n    if (n === 2) { updNext2(); if (window.jmGkStudio) { window.jmGkStudio.mark(); window.jmGkStudio.render(false); } }\n    if (n === 3) fillSummary();\n    if (scroll) wrap.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n  }\n\n  function fillSummary() {\n    const st = window.jmGkStudio;\n    const i = st \u0026\u0026 st.info ? st.info() : {};\n    const S = sides();\n    if (S.save) S.save();\n    const set = (id, v) =\u003e { const el = document.getElementById(id); if (el \u0026\u0026 v != null) el.textContent = v; };\n    \/* Platte: fester Text im HTML *\/\n    set(\"jm-cfg-s3-color\", i.color);\n    \/* Länge · Gewicht: fester Text im HTML *\/\n    const thumb = document.getElementById(\"jm-cfg-s3-thumb\");\n    if (thumb \u0026\u0026 i.front) thumb.src = i.front;\n\n    const pv = document.getElementById(\"engravingPreviewText\");\n    const font = pv ? getComputedStyle(pv).fontFamily : \"Playfair Display\";\n    const fontName = font.replace(\/['\"]\/g, \"\").split(\",\")[0].trim();\n    const used = [\"front\", \"back\"].filter(k =\u003e S.has(k));\n    const box = document.getElementById(\"jm-cfg-s3-gravur-text\");\n    if (box) {\n      box.innerHTML = used.length ? used.map(k =\u003e\n        '\u003cdiv class=\"jm-cfg-s3-gravur-side-block\"\u003e\u003cspan class=\"jm-cfg-s3-gravur-side\"\u003e' + LABEL[k] + '\u003c\/span\u003e' +\n        '\u003cspan class=\"jm-cfg-s3-gravur-lines\" style=\"font-family:' + esc(font) + '\"\u003e' +\n        S[k].filter(v =\u003e v.trim()).map(v =\u003e \"\u003cspan\u003e\" + esc(v.trim()) + \"\u003c\/span\u003e\").join(\"\") + \"\u003c\/span\u003e\u003c\/div\u003e\").join(\"\") : \"–\";\n    }\n    set(\"jm-cfg-s3-sides\", (used.length ? used.map(k =\u003e LABEL[k]).join(\" \u0026 \") : \"Keine\") + \" · kostenlos\");\n    set(\"jm-cfg-s3-gravur-meta\", \"Schriftart: \" + fontName + \" · 1 Zeile · max. 11 Zeichen\");\n\n    \/* Preis: aus dem Theme übernehmen, sonst aus der Variante *\/\n    const target = document.getElementById(\"jm-cfg-s3-price\");\n    if (target) {\n      const src = document.querySelector(\".price__pricing-group\");\n      if (src) target.innerHTML = src.innerHTML;\n      else if (i.variant \u0026\u0026 i.variant.price != null) {\n        const p = Number(i.variant.price);\n        const eur = (p \u003e 999 || String(i.variant.price).indexOf(\".\") === -1 ? p \/ 100 : p);\n        target.innerHTML = '\u003cspan class=\"jm-cfg-s3-price-fallback\"\u003e' + eur.toFixed(2).replace(\".\", \",\") + \" €\u003c\/span\u003e\";\n      }\n    }\n  }\n\n  const on = (id, fn) =\u003e { const el = document.getElementById(id); if (el) el.addEventListener(\"click\", fn); };\n  on(\"jm-cfg-next-1\", () =\u003e go(2, true));\n  on(\"jm-cfg-back-2\", () =\u003e go(1, true));\n  on(\"jm-cfg-next-2\", () =\u003e { if (hasAny()) go(3, true); });\n  on(\"jm-cfg-back-3\", () =\u003e go(2, true));\n  on(\"jm-cfg-popup-next\", e =\u003e {\n    e.preventDefault(); e.stopPropagation();\n    hidePopup();\n    if (step === 2 \u0026\u0026 hasAny()) go(3, true);\n  });\n\n  \/* Weiter-Button erst aktiv, wenn eine Seite befüllt ist *\/\n  setInterval(() =\u003e { if (step === 2) updNext2(); }, 300);\n\n  \/* sticky geht nicht, wenn ein Elterncontainer overflow hidden\/auto hat → Bild stattdessen mittig *\/\n  (function checkSticky() {\n    const s2 = wrap.querySelector(\".jm-cfg-s2-wrap\");\n    if (!s2) return;\n    let el = s2.parentElement, blocked = false;\n    while (el \u0026\u0026 el !== document.body) {\n      const o = getComputedStyle(el);\n      if (\/(hidden|auto|scroll|clip)\/.test(o.overflow + o.overflowY + o.overflowX)) { blocked = true; break; }\n      el = el.parentElement;\n    }\n    s2.classList.toggle(\"jm-no-sticky\", blocked);\n    if (!blocked) return;\n    \/* Bild mitführen: bleibt mittig im Fenster, aber innerhalb der Gravur-Spalte *\/\n    const grid = s2.querySelector(\".engraving-preview-grid\");\n    const img  = s2.querySelector(\".engraving-preview-image\");\n    if (!grid || !img) return;\n    let raf = 0;\n    function follow() {\n      raf = 0;\n      if (window.innerWidth \u003c= 900 || step !== 2) { img.style.transform = \"\"; return; }\n      const g = grid.getBoundingClientRect();\n      const h = img.offsetHeight;\n      const want = (window.innerHeight - h) \/ 2 - g.top;\n      const y = Math.max(0, Math.min(want, g.height - h));\n      img.style.transform = y ? \"translateY(\" + Math.round(y) + \"px)\" : \"\";\n    }\n    const req = () =\u003e { if (!raf) raf = requestAnimationFrame(follow); };\n    window.addEventListener(\"scroll\", req, { passive: true });\n    window.addEventListener(\"resize\", req);\n    wrap.addEventListener(\"click\", () =\u003e setTimeout(req, 50));\n    setInterval(req, 500);\n  })();\n\n  window.jmCfg = { go: go, step: () =\u003e step };\n  go(1, false);\n});\n\u003c\/script\u003e\n\n  \u003cstyle\u003e\n.jm-lv-stage {\n  \/* ── Gravur-Position (mit ?jmtweak=1 einstellen) ── *\/\n  --lv-x: 50%;\n  --lv-y: 50%;\n  --lv-rot: 0deg;\n  --lv-size: 6;\n  --lv-tx: -50%;     \/* Anker: Zeile 1 mittig auf x\/y *\/\n  --lv-ty: -50%;\n  --lv-color: rgba(205,205,205,0.92);\n  \/* Feinjustierung (mit ?jmtweak=1 einstellbar) *\/\n  --lv-lh: 1.15;     \/* Zeilenabstand Zeile 2 + 3 *\/\n  --lv-gap: 0em;     \/* Abstand Zeile 1 → Zeile 2 *\/\n  --lv-ls: 0.06em;   \/* Zeichenabstand *\/\n  --lv-op: 1;        \/* Deckkraft der Gravur *\/\n  --lv-rdx: 0em;     \/* Versatz Zeile 2 + 3 seitlich *\/\n  position: relative;\n  container-type: inline-size;\n  border-radius: 14px;\n  overflow: hidden;\n}\n.jm-lv-img {\n  width: 100%;\n  display: block;\n  border-radius: 14px;\n  transition: opacity 0.3s ease;\n}\n\/* Bild-Zoom (Tweak-Panel): --lv-zoom (1 = Original), --lv-px \/ --lv-py (Verschiebung in %) – Bühne schneidet ab *\/\n.jm-lv-stage { background: #000; }\n.jm-lv-stage .jm-lv-img, .jm-lv-stage .jm-lv-img-back {\n  transform: translate(var(--lv-px, 0%), var(--lv-py, 0%)) scale(var(--lv-zoom, 1));\n  transform-origin: center center;\n}\n.jm-lv-text {\n  position: absolute;\n  left: var(--lv-x);\n  top: var(--lv-y);\n  transform: translate(var(--lv-tx, -50%), var(--lv-ty, -190%)) rotate(var(--lv-rot));\n  font-size: calc(var(--lv-size) * 1cqw);\n  font-family: 'Playfair Display', serif;\n  color: var(--lv-color);\n  letter-spacing: var(--lv-ls, 0.06em);\n  opacity: var(--lv-op, 1);\n  white-space: nowrap;\n  text-shadow: 0 1px 1px rgba(0,0,0,0.6), 0 -1px 0 rgba(255,255,255,0.15);\n  pointer-events: none;\n}\n.jm-lv-text.is-empty { opacity: 0.65; }\n\/* Zeile 2 + 3 unter Zeile 1 (Zeile 1 bleibt an der eingestellten Position) *\/\n.jm-lv-text::after {\n  content: attr(data-rest); position: absolute; left: 50%; top: calc(100% + var(--lv-gap, 0em)); transform: translateX(calc(-50% + var(--lv-rdx, 0em)));\n  white-space: pre; text-align: center; font: inherit; line-height: var(--lv-lh, 1.15); color: inherit; letter-spacing: inherit; text-shadow: inherit;\n}\n    @keyframes jmLvShake {\n  0%, 100% { transform: translateX(0); }\n  20%, 60% { transform: translateX(-5px); }\n  40%, 80% { transform: translateX(5px); }\n}\n.jm-lv-shake { animation: jmLvShake 0.35s ease; }\n.jm-lv-label {\n  display: block;\n  text-align: center;\n  margin-top: 10px;\n  font-size: 9px;\n  letter-spacing: 2px;\n  text-transform: uppercase;\n  color: #c9a84c;\n  font-weight: 700;\n}\n.jm-lv-close {\n  position: absolute;\n  top: 8px;\n  right: 10px;\n  background: none;\n  border: none;\n  color: #c9a84c;\n  font-size: 20px;\n  line-height: 1;\n  cursor: pointer;\n  padding: 4px;\n  z-index: 10;\n  opacity: 0.7;\n  transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.jm-lv-close:hover { opacity: 1; transform: scale(1.15); }\n\n\/* Desktop-Panel *\/\n#jm-lv-desktop {\n  display: none;\n  position: fixed;\n  left: 25vh;\n  top: 50vh;\n  transform: translateY(-50%);\n  z-index: 8888;\n  width: 460px;\n  background: #1a1410;\n  border: 1px solid rgba(201,168,76,0.4);\n  border-radius: 20px;\n  padding: 16px;\n  box-shadow: 0 20px 60px rgba(0,0,0,0.5);\n}\n\/* ── Desktop: Werte je Größe + Seite (mit ?jmtweak=1 ermitteln, Regel hier einfügen) ──\n   Beispiel: #jm-lv-desktop[data-variant=\"20-25-mm\"] .jm-lv-stage { --lv-x: 50%; --lv-y: 48%; --lv-rot: 0deg; --lv-size: 7; }\n             #jm-lv-desktop[data-variant=\"20-25-mm\"] .jm-lv-stage.jm-lv-stage--back { … }\n   Gravur-Studio: .engraving-preview-image[data-variant=\"20-25-mm\"][data-side=\"front\"] { --st-x: …; } *\/\n\n#jm-lv-desktop.show { display: block; animation: jmLvIn 0.3s ease; }\n@keyframes jmLvIn {\n  from { opacity: 0; transform: translateY(-50%) translateX(-12px); }\n  to   { opacity: 1; transform: translateY(-50%) translateX(0); }\n}\n\n\/* Mobile-Popup *\/\n#jm-lv-mobile {\n  position: fixed;\n  left: 50%;\n  bottom: 110px;\n  width: calc(100% - 24px);\n  max-width: 380px;\n  z-index: 9998;\n  background: #1a1410;\n  border: 1px solid rgba(201,168,76,0.4);\n  border-radius: 18px;\n  padding: 12px;\n  box-shadow: 0 -10px 40px rgba(0,0,0,0.35);\n  opacity: 0;\n  pointer-events: none;\n  transform: translate(-50%, 20px);\n  transition: opacity 0.3s ease, transform 0.3s ease;\n}\n#jm-lv-mobile.show { opacity: 1; pointer-events: auto; transform: translate(-50%, 0); }\n\n@media (max-width: 768px) {\n  #jm-lv-desktop { display: none !important; }\n\n  #jm-lv-mobile .jm-lv-stage {\n    --lv-x: 50%;\n    --lv-y: 50%;\n    --lv-rot: 0deg;\n    --lv-size: 6;\n    --lv-tx: -50%;\n    --lv-ty: -50%;\n    --lv-color: rgba(205, 205, 205, 0.92);\n    position: relative;\n    container-type: inline-size;\n    border-radius: 14px;\n    overflow: hidden;\n  }\n\n  \/* ── Mobile: Werte je Größe + Seite (mit ?jmtweak=1 am Handy ermitteln) ──\n     Beispiel: #jm-lv-mobile[data-variant=\"20-25-mm\"] .jm-lv-stage { … } *\/\n}\n@media (min-width: 769px) { #jm-lv-mobile { display: none !important; } }\n\n\/* Vorder- + Rückseite nebeneinander *\/\n.jm-lv-grid { display: grid; grid-template-columns: 1fr; gap: 10px; }\n.jm-lv-both .jm-lv-grid { grid-template-columns: 1fr 1fr; }\n.jm-lv-side { display: none; }\n.jm-lv-side.on { display: block; }\n.jm-lv-side-label { display: block; text-align: center; margin-top: 6px; font-size: 9px; letter-spacing: 1.5px; text-transform: uppercase; color: #8a7055; font-weight: 700; }\n\/* Vorder- + Rückseite befüllt: immer EIN großes Bild – Umschalter Vorderseite \/ Rückseite\n   (Panel bleibt so schmal wie bisher und verdeckt das Produktformular nicht) *\/\n.jm-lv-tabs { display: none; gap: 6px; margin-bottom: 8px; padding-right: 26px; }\n.jm-lv-both .jm-lv-tabs { display: flex; }\n.jm-lv-both .jm-lv-grid { grid-template-columns: 1fr; }\n.jm-lv-tabs button { flex: 1; padding: 6px 8px; border-radius: 999px; border: 1px solid rgba(201,168,76,0.45); background: transparent; color: #e6d3a3; font: 700 10px Inter, sans-serif; letter-spacing: 1.2px; text-transform: uppercase; cursor: pointer; }\n.jm-lv-tabs button.active { background: #c9a84c; color: #1a1410; }\n\/* ── RÜCKSEITE: eigene Werte je Größe (mit ?jmtweak=1 → Seite „Rückseite“ ermitteln) ──\n   Höhere Spezifität (.jm-lv-stage.jm-lv-stage--back) → greift immer vor den Vorderseiten-Werten. *\/\n\n\/* ── LIVE-VORSCHAU OBEN: Startposition für alle Bandfarben ──\n   Mit ?jmtweak=1 → „Live-Vorschau oben“ je Farbe einstellen und die ausgegebene Regel hier ergänzen. *\/\n#jm-lv-desktop .jm-lv-stage {\n  --lv-x: 50%;\n  --lv-y: 50%;\n  --lv-rot: 0deg;\n  --lv-size: 5;\n  --lv-ty: -50%;\n  --lv-l: 28%;\n  --lv-sh: 0.15;\n}\n@media (max-width: 768px) {\n  #jm-lv-mobile .jm-lv-stage {\n    --lv-x: 50%;\n    --lv-y: 50%;\n    --lv-rot: 0deg;\n    --lv-size: 5;\n    --lv-tx: -50%;\n    --lv-ty: -50%;\n    --lv-l: 28%;\n    --lv-sh: 0.15;\n  }\n}\n\n\/* ── WERTE JE BANDFARBE (mit ?jmtweak=1 ermittelt) ──\n   Reihenfolge wichtig: Desktop-Regeln zuerst, Mobile-Regeln (@media) danach – sonst überschreibt Desktop das Handy. *\/\n#jm-lv-desktop[data-variant=\"rot\"] .jm-lv-stage {\n  --lv-x: 50%;\n  --lv-y: 72.5%;\n  --lv-rot: 0deg;\n  --lv-size: 5;\n  --lv-ty: -50%;\n  --lv-arc: -0.14em;\n  --lv-l: 28%;\n  --lv-sh: 0.15;\n}\n\n#jm-lv-desktop[data-variant=\"schwarz\"] .jm-lv-stage {\n  --lv-x: 50%;\n  --lv-y: 72.5%;\n  --lv-rot: 0deg;\n  --lv-size: 5;\n  --lv-ty: -50%;\n  --lv-arc: -0.14em;\n  --lv-l: 28%;\n  --lv-sh: 0.15;\n}\n\n.engraving-preview-image[data-variant=\"rot\"][data-side=\"front\"] {\n  --st-x: 50%;\n  --st-y: 65%;\n  --st-rot: 0deg;\n  --st-size: 5;\n  --st-arc: -0.17em;\n  --st-l: 28%;\n  --st-sh: 0.15;\n}\n\n.engraving-preview-image[data-variant=\"schwarz\"][data-side=\"front\"] {\n  --st-x: 50%;\n  --st-y: 65%;\n  --st-rot: 0deg;\n  --st-size: 5;\n  --st-arc: -0.17em;\n  --st-l: 28%;\n  --st-sh: 0.15;\n}\n\n@media (max-width: 768px) {\n  #jm-lv-mobile[data-variant=\"rot\"] .jm-lv-stage {\n    --lv-x: 50%;\n    --lv-y: 72%;\n    --lv-rot: 0deg;\n    --lv-size: 5;\n    --lv-tx: -50%;\n    --lv-ty: -50%;\n    --lv-arc: -0.12em;\n    --lv-l: 28%;\n    --lv-sh: 0.15;\n  }\n  #jm-lv-mobile[data-variant=\"schwarz\"] .jm-lv-stage {\n    --lv-x: 50%;\n    --lv-y: 72%;\n    --lv-rot: 0deg;\n    --lv-size: 5;\n    --lv-tx: -50%;\n    --lv-ty: -50%;\n    --lv-arc: -0.12em;\n    --lv-l: 28%;\n    --lv-sh: 0.15;\n  }\n  .engraving-preview-image[data-variant=\"rot\"][data-side=\"front\"] {\n    --st-x: 50%;\n    --st-y: 54%;\n    --st-rot: 0deg;\n    --st-size: 5;\n    --st-arc: -0.34em;\n    --st-l: 28%;\n    --st-sh: 0.15;\n  }\n  .engraving-preview-image[data-variant=\"schwarz\"][data-side=\"front\"] {\n    --st-x: 50%;\n    --st-y: 54%;\n    --st-rot: 0deg;\n    --st-size: 5;\n    --st-arc: -0.34em;\n    --st-l: 28%;\n    --st-sh: 0.15;\n  }\n  #engraving-mobile-popup .popup-preview[data-variant=\"rot\"][data-side=\"front\"] {\n    --st-x: 50.5%;\n    --st-y: 72%;\n    --st-rot: 0deg;\n    --st-size: 5;\n    --st-arc: -0.17em;\n    --st-l: 28%;\n    --st-sh: 0.15;\n  }\n  #engraving-mobile-popup .popup-preview[data-variant=\"schwarz\"][data-side=\"front\"] {\n    --st-x: 50.5%;\n    --st-y: 72%;\n    --st-rot: 0deg;\n    --st-size: 5;\n    --st-arc: -0.17em;\n    --st-l: 28%;\n    --st-sh: 0.15;\n  }\n}\n\n\/* Tweak-Panel *\/\n#jm-lv-tweak {\n  position: fixed;\n  right: 20px;\n  top: 120px;\n  z-index: 99999;\n  width: 240px;\n  background: #111;\n  color: #eee;\n  border: 1px solid #c9a84c;\n  border-radius: 12px;\n  padding: 12px;\n  font: 12px\/1.4 Inter, sans-serif;\n  cursor: move;\n  box-shadow: 0 10px 30px rgba(0,0,0,0.4);\n}\n#jm-lv-tweak label { display: flex; justify-content: space-between; margin-top: 8px; }\n#jm-lv-tweak input[type=range] { width: 100%; cursor: pointer; }\n#jm-lv-tweak code { display: block; margin-top: 10px; padding: 6px; background: #222; border-radius: 6px; font-size: 11px; white-space: pre-wrap; cursor: text; }\n#jm-lv-tweak button { margin-top: 8px; width: 100%; padding: 6px; background: #c9a84c; color: #111; border: 0; border-radius: 6px; cursor: pointer; font-weight: 600; }\n#jm-lv-tweak select { width: 100%; margin-top: 8px; padding: 5px; border-radius: 6px; border: 0; font: inherit; }\n#jm-lv-tweak { max-height: 85vh; overflow: auto; }\n#jm-lv-tweak strong { display: block; touch-action: none; user-select: none; }\n@media (max-width: 768px) { #jm-lv-tweak { top: 10px; right: 8px; width: 220px; max-height: 45vh; overflow: auto; background: rgba(17,17,17,.88); } }\n\u003c\/style\u003e\n\n\n\u003cscript\u003e\n\/* =========================\n   WÖLBUNG DER GRAVURZEILE (Zeile 1)\n   Liest --lv-arc (Live-Vorschau oben) bzw. --st-arc (Gravur-Studio + Mobile-Popup) aus dem CSS \/ Tweak-Panel.\n   Jeder Buchstabe wird entlang eines Bogens versetzt und gedreht – Text bleibt sonst unverändert.\n========================= *\/\n(function () {\n  const TARGETS = [[\".jm-lv-text\", \"--lv-arc\"], [\"#engravingPreviewText\", \"--st-arc\"], [\".popup-preview-text\", \"--st-arc\"]];\n  function textOf(el) {\n    return el._jmBent \u0026\u0026 el.querySelector(\".jm-arc-ch\") ? el._jmText : el.textContent;\n  }\n  function bend(el, arc, txt) {\n    el._jmText = txt;\n    if (!arc || !txt) {\n      if (el.querySelector(\".jm-arc-ch\")) el.textContent = txt;\n      el._jmBent = false; el._jmKey = \"0|\" + txt;\n      return;\n    }\n    el.textContent = \"\";\n    const chars = Array.from(txt).map(ch =\u003e {\n      const sp = document.createElement(\"span\");\n      sp.className = \"jm-arc-ch\";\n      sp.textContent = ch === \" \" ? \"\\u00A0\" : ch;\n      el.appendChild(sp);\n      return sp;\n    });\n    const fs = parseFloat(getComputedStyle(el).fontSize) || 16;\n    const xs = chars.map(c =\u003e c.offsetLeft + c.offsetWidth \/ 2);\n    const mid = (xs[0] + xs[xs.length - 1]) \/ 2;\n    const half = Math.max(1, (xs[xs.length - 1] - xs[0]) \/ 2);\n    chars.forEach((c, i) =\u003e {\n      const u = (xs[i] - mid) \/ half;                 \/* −1 … +1 *\/\n      const dy = arc * u * u;                          \/* Enden um „arc“ em versetzt *\/\n      const ang = Math.atan(2 * arc * u \/ (half \/ fs)) * 180 \/ Math.PI;\n      c.style.transform = \"translateY(\" + dy.toFixed(3) + \"em) rotate(\" + ang.toFixed(2) + \"deg)\";\n    });\n    el._jmBent = true; el._jmKey = arc + \"|\" + txt;\n  }\n  function tick() {\n    TARGETS.forEach(([sel, v]) =\u003e {\n      document.querySelectorAll(sel).forEach(el =\u003e {\n        if (!el.getClientRects().length) return;          \/* unsichtbar → später *\/\n        const arc = parseFloat(getComputedStyle(el).getPropertyValue(v)) || 0;\n        const txt = textOf(el);\n        if (el._jmKey !== arc + \"|\" + txt \u0026\u0026 !(arc === 0 \u0026\u0026 !el._jmBent \u0026\u0026 el._jmKey === undefined)) bend(el, arc, txt);\n      });\n    });\n  }\n  window.jmArcRefresh = tick;\n  setInterval(tick, 250);\n})();\n\u003c\/script\u003e\n\u003c!-- JM LIVE-VORSCHAU: Desktop-Panel + Mobile-Popup --\u003e\n\u003cdiv id=\"jm-lv-desktop\"\u003e\n  \u003cbutton type=\"button\" class=\"jm-lv-close\" aria-label=\"Vorschau schließen\"\u003e×\u003c\/button\u003e\n  \u003cdiv class=\"jm-lv-tabs\"\u003e\n    \u003cbutton type=\"button\" data-side=\"front\" class=\"active\"\u003eVorderseite\u003c\/button\u003e\n    \u003cbutton type=\"button\" data-side=\"back\"\u003eRückseite\u003c\/button\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"jm-lv-grid\"\u003e\n    \u003cdiv class=\"jm-lv-side on\" data-side=\"front\"\u003e\n      \u003cdiv class=\"jm-lv-stage\"\u003e\n        \u003cimg class=\"jm-lv-img\" src=\"\" alt=\"Gravur Vorschau Vorderseite\"\u003e\n        \u003cspan class=\"jm-lv-text is-empty\"\u003eDeine Gravur\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cspan class=\"jm-lv-side-label\"\u003eVorderseite\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"jm-lv-side\" data-side=\"back\"\u003e\n      \u003cdiv class=\"jm-lv-stage jm-lv-stage--back\"\u003e\n        \u003cimg class=\"jm-lv-img-back\" src=\"\" alt=\"Gravur Vorschau Rückseite\" style=\"width:100%;display:block;border-radius:14px;transition:opacity .3s ease;\"\u003e\n        \u003cspan class=\"jm-lv-text jm-lv-text--back\"\u003e\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cspan class=\"jm-lv-side-label\"\u003eRückseite\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cspan class=\"jm-lv-label\"\u003eLive-Vorschau · \u003cspan class=\"jm-lv-color\"\u003e\u003c\/span\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\n\u003cdiv id=\"jm-lv-mobile\"\u003e\n  \u003cbutton type=\"button\" class=\"jm-lv-close\" aria-label=\"Vorschau schließen\"\u003e×\u003c\/button\u003e\n  \u003cdiv class=\"jm-lv-tabs\"\u003e\n    \u003cbutton type=\"button\" data-side=\"front\" class=\"active\"\u003eVorderseite\u003c\/button\u003e\n    \u003cbutton type=\"button\" data-side=\"back\"\u003eRückseite\u003c\/button\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"jm-lv-grid\"\u003e\n    \u003cdiv class=\"jm-lv-side on\" data-side=\"front\"\u003e\n      \u003cdiv class=\"jm-lv-stage\"\u003e\n        \u003cimg class=\"jm-lv-img\" src=\"\" alt=\"Gravur Vorschau Vorderseite\"\u003e\n        \u003cspan class=\"jm-lv-text is-empty\"\u003eDeine Gravur\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cspan class=\"jm-lv-side-label\"\u003eVorderseite\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"jm-lv-side\" data-side=\"back\"\u003e\n      \u003cdiv class=\"jm-lv-stage jm-lv-stage--back\"\u003e\n        \u003cimg class=\"jm-lv-img-back\" src=\"\" alt=\"Gravur Vorschau Rückseite\" style=\"width:100%;display:block;border-radius:14px;transition:opacity .3s ease;\"\u003e\n        \u003cspan class=\"jm-lv-text jm-lv-text--back\"\u003e\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cspan class=\"jm-lv-side-label\"\u003eRückseite\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cspan class=\"jm-lv-label\"\u003eLive-Vorschau · \u003cspan class=\"jm-lv-color\"\u003e\u003c\/span\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n\/* Optional: eigene Vorschaubilder pro Farbe (Name wie in der Variante, klein geschrieben).\n   Leer lassen = Variantenbild aus Shopify wird genutzt. *\/\nvar JM_LV_BILDER = {\n  \/\/ 'gold':    'https:\/\/cdn.shopify.com\/...',\n  \/\/ 'schwarz': 'https:\/\/cdn.shopify.com\/...',\n  \/\/ 'silber':  'https:\/\/cdn.shopify.com\/...'\n};\n\ndocument.addEventListener('DOMContentLoaded', function () {\n  var form    = document.querySelector('form[action*=\"\/cart\/add\"]');\n  var desktop = document.getElementById('jm-lv-desktop');\n  var mobile  = document.getElementById('jm-lv-mobile');\n  if (!form || !desktop || !mobile) return;\n\n  \/* Panels an den body hängen → nie im Formular, X löst kein Add-to-Cart aus *\/\n  document.body.appendChild(desktop);\n  document.body.appendChild(mobile);\n\n  var stages = document.querySelectorAll('.jm-lv-stage');\n  var texts  = document.querySelectorAll('.jm-lv-text:not(.jm-lv-text--back)');\n  var imgs   = document.querySelectorAll('.jm-lv-img');\n  \/* Rückseite *\/\n  var backTexts = document.querySelectorAll('.jm-lv-text--back');\n  var backImgs  = document.querySelectorAll('.jm-lv-img-back');\n  var colors = document.querySelectorAll('.jm-lv-color');\n  var variants = {};\n  var currentId = null;\n\n  \/* ── Produktdaten: erst Theme-JSON, sonst \/products\/handle.js ── *\/\n  function loadProduct() {\n    var el = document.querySelector('script[id^=\"ProductJson\"], script[data-product-json]');\n    if (el) {\n      try { return Promise.resolve(JSON.parse(el.textContent)); } catch (e) {}\n    }\n    var path = location.pathname.replace(\/\\\/$\/, '');\n    return fetch(path + '.js').then(function (r) { return r.json(); });\n  }\n\n  function imgUrl(src) {\n    if (!src) return '';\n    if (src.indexOf('\/\/') === 0) src = 'https:' + src;\n    return src + (src.indexOf('?') \u003e -1 ? '\u0026' : '?') + 'width=900';\n  }\n\n  \/* Schlüssel einer Option: Größe „16 × 20 mm“ → „16x20“, sonst erstes Wort *\/\n  function plain(t) { return String(t || '').toLowerCase().normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '').replace(\/ß\/g, 'ss'); }\n  function optKeys(o) {\n    o = plain(o);\n    var m = o.match(\/(\\d+(?:[.,]\\d+)?)\\s*[x×]\\s*(\\d+(?:[.,]\\d+)?)\/);\n    if (m) return [m[1] + 'x' + m[2]];\n    return [o.replace(\/[^a-z0-9]+\/g, ''), o.split(\/[\\s-]+\/)[0]].filter(Boolean);\n  }\n  function altNorm(a) { return plain(a).replace(\/(\\d)\\s*[x×]\\s*(\\d)\/g, '$1x$2').replace(\/[^a-z0-9]+\/g, ''); }\n\n  loadProduct().then(function (p) {\n    var fallback = p.featured_image || (p.images \u0026\u0026 p.images[0]) || '';\n    if (typeof fallback === 'object') fallback = fallback.src;\n    \/* Rückseiten-Fotos: Alt-Text mit „Rückseite“ + Farbe (z. B. „Rückseite Vergoldet“) *\/\n    var backMedia = (p.media || []).filter(function (m) {\n      var a = String(m.alt || '').toLowerCase();\n      return a.indexOf('rückseite') \u003e -1 || a.indexOf('rueckseite') \u003e -1;\n    });\n    p.variants.forEach(function (v) {\n      var src = v.featured_image ? v.featured_image.src : fallback;\n      var own = null;\n      var opts = (v.options || [v.option1, v.option2, v.option3]);\n      opts.forEach(function (o) {\n        if (o \u0026\u0026 JM_LV_BILDER[String(o).toLowerCase()]) own = JM_LV_BILDER[String(o).toLowerCase()];\n      });\n      var back = null;\n      backMedia.forEach(function (m) {\n        var a = altNorm(m.alt);\n        opts.forEach(function (o) {\n          var hitK = optKeys(o).some(function (k) { return a.indexOf(k) \u003e -1; });\n          if (!back \u0026\u0026 hitK) back = m.src || (m.preview_image \u0026\u0026 m.preview_image.src);\n        });\n      });\n      if (!back \u0026\u0026 backMedia.length === 1) back = backMedia[0].src || (backMedia[0].preview_image \u0026\u0026 backMedia[0].preview_image.src);\n      \/* Vorderseiten-Foto: Alt-Text mit „Vorderseite“ + Farbe *\/\n      var frontMedia = (p.media || []).filter(function (m) { return String(m.alt || '').toLowerCase().indexOf('vorderseite') \u003e -1; });\n      var frontOwn = null;\n      frontMedia.forEach(function (m) {\n        var a = altNorm(m.alt);\n        opts.forEach(function (o) {\n          var hitK = optKeys(o).some(function (k) { return a.indexOf(k) \u003e -1; });\n          if (!frontOwn \u0026\u0026 hitK) frontOwn = m.src || (m.preview_image \u0026\u0026 m.preview_image.src);\n        });\n      });\n      if (!frontOwn \u0026\u0026 frontMedia.length === 1) frontOwn = frontMedia[0].src || (frontMedia[0].preview_image \u0026\u0026 frontMedia[0].preview_image.src);\n      var front = own || (frontOwn ? imgUrl(frontOwn) : imgUrl(src));\n      variants[String(v.id)] = { img: front, back: back ? imgUrl(back) : front, title: v.title };\n    });\n    checkVariant();\n  });\n\n  function getInput() {\n    return (window.jmGravurFeld \u0026\u0026 window.jmGravurFeld('Vorderseite', 1)) ||\n           form.querySelector('.gravurText, input[type=\"text\"][name*=\"ravur\"]');\n  }\n  \/* Rückseite (Zeile 1) im Produktformular *\/\n  function getBackInput() {\n    return window.jmGravurFeld ? window.jmGravurFeld('Rückseite', 1)\n      : form.querySelector('#gravur_Rückseite_1, #gravurtext_rueckseite, #gravurtext_rückseite, input[data-gravur-seite=\"Rückseite\"]');\n  }\n  var ZEILEN = window.jmGravurZeilen ? window.jmGravurZeilen() : 3;\n\n  function getFont(input) {\n    var f = form.querySelector('#gravur_schriftart_input, input[name*=\"Schriftart\"], select[name*=\"Schriftart\"]');\n    if (f \u0026\u0026 f.value) return f.value;\n    return input ? getComputedStyle(input).fontFamily : 'Playfair Display';\n  }\n\n  \/* Zeilen 1–3 einer Seite (Zeile 1 = Feld der Seite, 2 + 3 per ID) *\/\n  function sideLines(seite, first) {\n    var l = [first ? first.value : ''];\n    for (var n = 2; n \u003c= 3; n++) {\n      var f = n \u003c= ZEILEN \u0026\u0026 window.jmGravurFeld ? window.jmGravurFeld(seite, n) : null;\n      l.push(f ? f.value : '');\n    }\n    return l.map(function (v) { return v.trim(); });\n  }\n  function restOf(l) { return l[2] ? (l[1] + '\\n' + l[2]) : l[1]; }\n\n  function updateText() {\n    var input = getInput();\n    var fl    = sideLines('Vorderseite', input);\n    if (lvSample \u0026\u0026 !fl.join('')) fl = ['A + M', 'Für immer', '12.06.24'].map(function (v, i) { return i \u003c ZEILEN ? v : ''; });\n    var val   = fl.join('');\n    var font  = getFont(input);\n    var bl    = sideLines('Rückseite', getBackInput());\n    if (lvSample \u0026\u0026 !bl.join('')) bl = ['♥', 'In Liebe', '2024'].map(function (v, i) { return i \u003c ZEILEN ? v : ''; });\n    var bVal  = bl.join('');\n    texts.forEach(function (t) {\n      t.textContent = fl[0] || (val ? '\\u00A0' : 'Deine Gravur');\n      t.setAttribute('data-rest', val ? restOf(fl) : '');\n      t.classList.toggle('is-empty', !val);\n      t.style.fontFamily = font + ', serif';\n    });\n    backTexts.forEach(function (t) {\n      t.textContent = bl[0] || (bVal ? '\\u00A0' : '');\n      t.setAttribute('data-rest', bVal ? restOf(bl) : '');\n      t.style.fontFamily = font + ', serif';\n    });\n    \/* Vorderseite zeigen, wenn befüllt oder keine Rückseite – Rückseite nur wenn befüllt *\/\n    \/* Beide Seiten befüllt: zuletzt bearbeitete Seite groß zeigen (Tweak: gewählte Seite) *\/\n    var fKey = fl.join('|'), bKey = bl.join('|');\n    if (bKey !== lastBKey \u0026\u0026 bVal) mSide = 'back';\n    if (fKey !== lastFKey \u0026\u0026 val)  mSide = 'front';\n    lastFKey = fKey; lastBKey = bKey;\n    if (tweakActive) mSide = tweakSide;\n    [desktop, mobile].forEach(function (panel) {\n      var f = panel.querySelector('.jm-lv-side[data-side=\"front\"]');\n      var b = panel.querySelector('.jm-lv-side[data-side=\"back\"]');\n      var both = (!!val || tweakSide === 'back') \u0026\u0026 (!!bVal || tweakSide === 'back');\n      var fOn = !!val || !bVal, bOn = !!bVal || tweakSide === 'back';\n      if (both) { fOn = mSide === 'front'; bOn = mSide === 'back'; }\n      if (f) f.classList.toggle('on', fOn);\n      if (b) b.classList.toggle('on', bOn);\n      panel.classList.toggle('jm-lv-both', both);\n    });\n    document.querySelectorAll('.jm-lv-tabs button').forEach(function (t) {\n      t.classList.toggle('active', t.dataset.side === mSide);\n    });\n  }\n  var tweakSide = 'front';\n  var lvSample = false;   \/* Tweak: Beispieltext mit 3 Zeilen *\/\n  var mSide = 'front', lastFKey = '', lastBKey = '', tweakActive = false;\n  \/* Umschalter Vorderseite \/ Rückseite (Desktop + Mobile) *\/\n  document.querySelectorAll('.jm-lv-tabs button').forEach(function (t) {\n    t.addEventListener('click', function (e) {\n      e.preventDefault(); e.stopPropagation();\n      mSide = t.dataset.side;\n      if (tweakActive) { tweakSide = mSide; var sel = document.getElementById('jm-lv-side'); if (sel) { sel.value = mSide; sel.dispatchEvent(new Event('change')); } }\n      updateText();\n    });\n  });\n\n  function show() {\n    updateText();\n    if (window.innerWidth \u003e 768) desktop.classList.add('show');\n    else mobile.classList.add('show');\n  }\n\n  \/* X schließt nur das Panel *\/\n  document.querySelectorAll('.jm-lv-close').forEach(function (btn) {\n    btn.addEventListener('click', function (e) {\n      e.preventDefault();\n      e.stopPropagation();\n      btn.parentElement.classList.remove('show');\n    });\n  });\n\n  \/* Tippen → öffnen *\/\n  function isGravurField(el) {\n    if (!el) return false;\n    if (el === getInput() || el === getBackInput()) return true;\n    for (var n = 2; n \u003c= ZEILEN; n++) {\n      if (window.jmGravurFeld \u0026\u0026 (el === window.jmGravurFeld('Vorderseite', n) || el === window.jmGravurFeld('Rückseite', n))) return true;\n    }\n    return !!(el.id \u0026\u0026 \/^gravur_(Vorderseite|Rückseite)_[123]$\/.test(el.id));\n  }\n  form.addEventListener('input', function (e) {\n    if (isGravurField(e.target)) show();\n  });\n\n  \/* Schriftart → öffnen *\/\n  form.addEventListener('click', function (e) {\n    if (e.target.closest('.font-btn')) setTimeout(show, 60);\n  });\n  form.addEventListener('change', function (e) {\n    if (e.target.name \u0026\u0026 e.target.name.indexOf('Schriftart') \u003e -1) show();\n  });\n\n  \/* Symbole → wie Buchstaben einfügen + öffnen *\/\n  var SYM_SEL = '.symbol-btn, .symbol-btn-2, .symbol-button';\n  var valBefore = null;\n\n  \/* Zu welchem Feld gehört der Symbol-Button? (nächstes Gravurfeld im selben Block) *\/\n  function inputForSymbol(btn) {\n    var el = btn.parentElement;\n    while (el \u0026\u0026 el !== form) {\n      var i = el.querySelector('input[type=\"text\"][name*=\"ravur\"], .gravurText');\n      if (i) return i;\n      el = el.parentElement;\n    }\n    return getInput();\n  }\n\n  function isFormSymbol(el) {\n    var btn = el.closest(SYM_SEL);\n    if (!btn || btn.closest('#engraving-preview')) return null; \/* Vorschau-Block in der Beschreibung ignorieren *\/\n    return btn;\n  }\n\n  function shake(input) {\n    input.classList.remove('jm-lv-shake', 'jm-shake');\n    void input.offsetWidth;\n    input.classList.add('jm-lv-shake', 'jm-shake');\n  }\n\n  document.addEventListener('pointerdown', function (e) {\n    var b = isFormSymbol(e.target);\n    var input = b ? inputForSymbol(b) : null;\n    if (input) valBefore = input.value;\n  }, true);\n\n  document.addEventListener('click', function (e) {\n    var btn = isFormSymbol(e.target);\n    var input = btn ? inputForSymbol(btn) : null;\n    if (!btn || !input) return;\n    e.preventDefault();\n    var before = valBefore;\n    valBefore = null;\n    setTimeout(function () {\n      \/* Hat das Gravur-Snippet das Symbol schon eingefügt? Dann nur anzeigen. *\/\n      if (before === null || input.value !== before) { show(); return; }\n      var sym = (btn.dataset.symbol || btn.textContent).trim();\n      var max = input.maxLength \u003e 0 ? input.maxLength : Infinity;\n      if (input.value.length + sym.length \u003e max) { shake(input); show(); return; }\n      input.value += sym;\n      input.dispatchEvent(new Event('input', { bubbles: true }));\n      show();\n    }, 40);\n  });\n\n  \/* Jede Wertänderung (auch per Script eingefügt) → Vorschau öffnen *\/\n  function bothVals() {\n    return sideLines('Vorderseite', getInput()).join('|') + '||' + sideLines('Rückseite', getBackInput()).join('|');\n  }\n  var lastVal = bothVals();\n  setInterval(function () {\n    var now = bothVals();\n    if (now !== lastVal) { lastVal = now; show(); }\n  }, 200);\n\n  \/* ── Farbe \/ Variante → Bild wechseln ── *\/\n  function setBackImage(url) {\n    backImgs.forEach(function (img) { if (url) img.src = url; });\n  }\n\n  function setImage(url) {\n    var pre = new Image();\n    pre.onload = function () {\n      imgs.forEach(function (img) {\n        if (!img.getAttribute('src')) { img.src = url; return; }\n        img.style.opacity = 0;\n        setTimeout(function () { img.src = url; img.style.opacity = 1; }, 150);\n      });\n    };\n    pre.src = url;\n  }\n\n  var onVariant = null;\n\n  function checkVariant() {\n    var idField = form.querySelector('[name=\"id\"]');\n    var id = idField ? String(idField.value) : null;\n    if (!id || id === currentId || !variants[id]) return;\n    currentId = id;\n    \/* Größe aus dem Namen entfernen → Regeln gelten je Farbe für 16 × 20 UND 20 × 25 mm (gleiche Fotos) *\/\n    var slug = variants[id].title.replace(\/\\d+(?:[.,]\\d+)?\\s*[x×]\\s*\\d+(?:[.,]\\d+)?\\s*(?:mm|cm)?\/gi, ' ').toLowerCase()\n      .replace(\/ä\/g, 'ae').replace(\/ö\/g, 'oe').replace(\/ü\/g, 'ue').replace(\/ß\/g, 'ss')\n      .replace(\/[^a-z0-9]+\/g, '-').replace(\/^-|-$\/g, '');\n    desktop.dataset.variant = slug;\n    mobile.dataset.variant  = slug;\n    setImage(variants[id].img);\n    setBackImage(variants[id].back);\n    colors.forEach(function (c) { c.textContent = variants[id].title; });\n    if (onVariant) onVariant();\n  }\n\n  form.addEventListener('change', function () { setTimeout(checkVariant, 50); });\n  form.addEventListener('click',  function () { setTimeout(checkVariant, 80); });\n  setInterval(checkVariant, 400);\n  updateText();\n\n  \/* ── Tweak-Panel: URL mit ?jmtweak=1 aufrufen ── *\/\n  if (location.search.indexOf('jmtweak') === -1) return;\n\n  var ranges = { x: [0, 100, 0.5], y: [0, 100, 0.5], rot: [-90, 90, 1], size: [2, 20, 0.25],\n                 tx: [-150, 50, 1], ty: [-400, 100, 1],\n                 lh: [0.6, 2.5, 0.05], gap: [-1.5, 2, 0.05], ls: [-0.1, 0.5, 0.01], rdx: [-3, 3, 0.05], op: [0.2, 1, 0.05],\n                 arc: [-1.5, 1.5, 0.01], l: [0, 100, 1], sh: [0, 1, 0.05],\n                 zoom: [0.5, 3, 0.01], px: [-50, 50, 0.5], py: [-50, 50, 0.5] };\n  var names  = { x: 'Horizontal %', y: 'Vertikal %', rot: 'Drehung °', size: 'Größe',\n                 tx: 'Anker horizontal %', ty: 'Anker vertikal %',\n                 lh: 'Zeilenabstand (Z. 2+3)', gap: 'Abstand Zeile 1 → 2', ls: 'Zeichenabstand', rdx: 'Versatz Z. 2+3 seitlich', op: 'Deckkraft',\n                 arc: 'Wölbung (− ∪ \/ + ∩)', l: 'Schrift hell ↔ dunkel %', sh: 'Gravur-Schatten',\n                 zoom: 'Bild-Zoom ×', px: 'Bild horizontal %', py: 'Bild vertikal %' };\n  \/* Variable, Einheit, Standardwert *\/\n  var PROPS  = { x: ['--lv-x', '%', 50], y: ['--lv-y', '%', 50], rot: ['--lv-rot', 'deg', 0], size: ['--lv-size', '', 5],\n                 tx: ['--lv-tx', '%', -50], ty: ['--lv-ty', '%', -190],\n                 lh: ['--lv-lh', '', 1.15], gap: ['--lv-gap', 'em', 0], ls: ['--lv-ls', 'em', 0.06], rdx: ['--lv-rdx', 'em', 0], op: ['--lv-op', '', 1],\n                 arc: ['--lv-arc', 'em', 0], l: ['--lv-l', '%', 80], sh: ['--lv-sh', '', 0.6],\n                 zoom: ['--lv-zoom', '', 1], px: ['--lv-px', '%', 0], py: ['--lv-py', '%', 0] };\n  var vals   = {};\n  \/* Gravur-Studio unten: eigene Variablen (ohne Anker) *\/\n  var PROPS_ST = { x: ['--st-x', '%', 50], y: ['--st-y', '%', 50], rot: ['--st-rot', 'deg', 0], size: ['--st-size', '', 8],\n                   lh: ['--st-lh', '', 1.15], gap: ['--st-gap', 'em', 0], ls: ['--st-ls', 'em', 0.08], rdx: ['--st-rdx', 'em', 0], op: ['--st-op', '', 1],\n                   arc: ['--st-arc', 'em', 0], l: ['--st-l', '%', 73], sh: ['--st-sh', '', 0.6],\n                   zoom: ['--st-zoom', '', 1], px: ['--st-px', '%', 0], py: ['--st-py', '%', 0] };\n  var area = 'top';   \/* top | studio | studiopop *\/\n  function curProps() { return area === 'top' ? PROPS : PROPS_ST; }\n  function studioTarget() {\n    var st = window.jmGkStudio;\n    if (!st) return null;\n    return area === 'studiopop' ? st.popupBox : st.studioBox;\n  }\n  function tTargets() {\n    if (area === 'top') return Array.prototype.slice.call(sideStages());\n    var t = studioTarget();\n    return t ? [t] : [];\n  }\n\n  function activePanel() { return window.innerWidth \u003e 768 ? desktop : mobile; }\n\n  \/* Stages der gewählten Seite (Vorderseite \/ Rückseite) *\/\n  var SIDE_SEL = { front: '.jm-lv-stage:not(.jm-lv-stage--back)', back: '.jm-lv-stage--back' };\n  function sideStages() { return document.querySelectorAll(SIDE_SEL[tweakSide]); }\n\n  function readVals() {\n    if (area !== 'top') {\n      var st = window.jmGkStudio, tg = studioTarget();\n      if (st \u0026\u0026 st.side() !== tweakSide) st.setSide(tweakSide);\n      if (st) st.mark();\n      if (tg) {\n        Object.keys(PROPS_ST).forEach(function (k) { tg.style.removeProperty(PROPS_ST[k][0]); });\n        if (st) st.mark();\n        var cst = getComputedStyle(tg);\n        Object.keys(PROPS_ST).forEach(function (k) {\n          var v = parseFloat(cst.getPropertyValue(PROPS_ST[k][0]));\n          vals[k] = isNaN(v) ? PROPS_ST[k][2] : v;\n        });\n      }\n      return;\n    }\n    sideStages().forEach(function (s) {\n      Object.keys(PROPS).forEach(function (k) { s.style.removeProperty(PROPS[k][0]); });\n    });\n    var cs = getComputedStyle(activePanel().querySelector(SIDE_SEL[tweakSide]));\n    \/* Anker-Standard je Ansicht (Desktop: -50 \/ -190 · Mobile: -9 \/ -239 bzw. 0 \/ -239) *\/\n    var mob = activePanel() === mobile;\n    var hasVar = \/translate\\(-9%\/.test(getComputedStyle(activePanel().querySelector('.jm-lv-text')).transform) || !!activePanel().dataset.variant;\n    PROPS.tx[2] = mob ? (hasVar ? -9 : 0) : -50;\n    PROPS.ty[2] = mob ? -239 : -190;\n    Object.keys(PROPS).forEach(function (k) {\n      var v = parseFloat(cs.getPropertyValue(PROPS[k][0]));\n      vals[k] = isNaN(v) ? PROPS[k][2] : v;\n    });\n  }\n  readVals();\n\n  var tw = document.createElement('div');\n  tw.id = 'jm-lv-tweak';\n  tweakActive = true;\n  var html = '\u003cstrong style=\"color:#c9a84c;display:flex;justify-content:space-between;align-items:center\"\u003e⠿ Gravur-Position · \u003cspan id=\"jm-lv-view\"\u003e\u003c\/span\u003e'\n           + '\u003cbutton type=\"button\" id=\"jm-lv-min\" title=\"einklappen\" style=\"width:auto;margin:0;padding:2px 10px;background:#333;color:#eee\"\u003e–\u003c\/button\u003e\u003c\/strong\u003e'\n           + '\u003cselect id=\"jm-lv-area\"\u003e\u003coption value=\"top\"\u003eBereich: Live-Vorschau oben\u003c\/option\u003e'\n           + '\u003coption value=\"studio\"\u003eBereich: Gravur-Studio (Bild)\u003c\/option\u003e'\n           + '\u003coption value=\"studiopop\"\u003eBereich: Gravur-Studio Mobile-Popup\u003c\/option\u003e\u003c\/select\u003e'\n           + '\u003cselect id=\"jm-lv-side\"\u003e\u003coption value=\"front\"\u003eVorderseite\u003c\/option\u003e\u003coption value=\"back\"\u003eRückseite\u003c\/option\u003e\u003c\/select\u003e';\n  Object.keys(vals).forEach(function (k) {\n    if (k === 'tx') html += '\u003cdiv data-row=\"tx\" style=\"margin-top:10px;padding-top:6px;border-top:1px solid #333;color:#c9a84c;font-size:11px\"\u003eAnker (Feinposition des Textblocks)\u003c\/div\u003e';\n    if (k === 'lh') html += '\u003cdiv style=\"margin-top:10px;padding-top:6px;border-top:1px solid #333;color:#c9a84c;font-size:11px\"\u003eZeilen \u0026amp; Schrift\u003c\/div\u003e';\n    if (k === 'arc') html += '\u003cdiv style=\"margin-top:10px;padding-top:6px;border-top:1px solid #333;color:#c9a84c;font-size:11px\"\u003eWölbung \u0026amp; Lesbarkeit\u003c\/div\u003e';\n    if (k === 'zoom') html += '\u003cdiv style=\"margin-top:10px;padding-top:6px;border-top:1px solid #333;color:#c9a84c;font-size:11px\"\u003eBild-Zoom \u0026amp; Ausschnitt\u003c\/div\u003e';\n    html += '\u003cdiv data-row=\"' + k + '\"\u003e\u003clabel\u003e' + names[k] + ' \u003cspan id=\"jm-lv-v-' + k + '\"\u003e' + vals[k] + '\u003c\/span\u003e\u003c\/label\u003e' +\n            '\u003cinput type=\"range\" data-k=\"' + k + '\" min=\"' + ranges[k][0] + '\" max=\"' + ranges[k][1] +\n            '\" step=\"' + ranges[k][2] + '\" value=\"' + vals[k] + '\"\u003e\u003c\/div\u003e';\n  });\n  html += '\u003cbutton type=\"button\" id=\"jm-lv-sample\" style=\"background:#333;color:#eee\"\u003eBeispieltext: aus\u003c\/button\u003e'\n        + '\u003cbutton type=\"button\" id=\"jm-lv-reset\" style=\"background:#333;color:#eee\"\u003eSeite zurücksetzen\u003c\/button\u003e'\n        + '\u003ccode id=\"jm-lv-out\"\u003e\u003c\/code\u003e\u003cbutton type=\"button\" id=\"jm-lv-copy\"\u003eWerte kopieren\u003c\/button\u003e';\n  tw.innerHTML = html;\n  document.body.appendChild(tw);\n\n  function apply() {\n    if (area !== 'top') return applyStudio();\n    sideStages().forEach(function (s) {\n      Object.keys(PROPS).forEach(function (k) { s.style.setProperty(PROPS[k][0], vals[k] + PROPS[k][1]); });\n    });\n    var panel = activePanel();\n    \/* Ausgabe: Position immer, Feinjustierung nur wenn vom Standard abweichend *\/\n    var lines = Object.keys(PROPS).filter(function (k) {\n      return ['x', 'y', 'rot', 'size'].indexOf(k) \u003e -1 || vals[k] !== PROPS[k][2];\n    }).map(function (k) { return '  ' + PROPS[k][0] + ': ' + vals[k] + PROPS[k][1] + ';'; });\n    var rule = '#' + panel.id + '[data-variant=\"' + (panel.dataset.variant || '') + '\"] .jm-lv-stage' + (tweakSide === 'back' ? '.jm-lv-stage--back' : '') + ' {\\n' +\n      lines.join('\\n') + '\\n}';\n    document.getElementById('jm-lv-out').textContent = panel === mobile\n      ? '@media (max-width: 768px) {\\n' + rule.replace(\/^\/gm, '  ') + '\\n}'\n      : rule;\n  }\n\n  \/* Gravur-Studio: Werte anwenden + CSS-Regel ausgeben *\/\n  function applyStudio() {\n    var tg = studioTarget(), st = window.jmGkStudio;\n    if (!tg) { document.getElementById('jm-lv-out').textContent = '⚠ Bereich nicht gefunden'; return; }\n    Object.keys(PROPS_ST).forEach(function (k) { tg.style.setProperty(PROPS_ST[k][0], vals[k] + PROPS_ST[k][1]); });\n    tg.classList.add('jm-st-pos');\n    \/* Beispieltext im Studio, solange die Seite leer ist *\/\n    if (lvSample \u0026\u0026 st \u0026\u0026 !window.jmGkSides.has(tweakSide)) {\n      tg.querySelectorAll('#engravingPreviewText, .popup-preview-text').forEach(function (el) {\n        el.textContent = 'A + M';\n        el.setAttribute('data-rest', ZEILEN \u003e= 3 ? 'Für immer\\n12.06.24' : (ZEILEN === 2 ? 'Für immer' : ''));\n      });\n      var ov = tg.querySelector('.engraving-overlay');\n      if (ov) ov.classList.add('active');\n    }\n    if (area === 'studiopop') {\n      var pop = document.getElementById('engraving-mobile-popup');\n      if (pop) setTimeout(function () { pop.classList.add('show'); }, 30);\n    }\n    var lines = Object.keys(PROPS_ST).filter(function (k) {\n      return ['x', 'y', 'rot', 'size'].indexOf(k) \u003e -1 || vals[k] !== PROPS_ST[k][2];\n    }).map(function (k) { return '  ' + PROPS_ST[k][0] + ': ' + vals[k] + PROPS_ST[k][1] + ';'; });\n    var sel = (area === 'studiopop' ? '#engraving-mobile-popup .popup-preview' : '.engraving-preview-image')\n            + '[data-variant=\"' + (tg.dataset.variant || '') + '\"][data-side=\"' + tweakSide + '\"]';\n    var rule = sel + ' {\\n' + lines.join('\\n') + '\\n}';\n    \/* Mobile-Werte nur für Mobile, Desktop-Werte gelten als Basis für alle Größen *\/\n    document.getElementById('jm-lv-out').textContent = (area === 'studiopop' || activePanel() === mobile)\n      ? '@media (max-width: 768px) {\\n' + rule.replace(\/^\/gm, '  ') + '\\n}'\n      : rule;\n  }\n\n  \/* Bereich wechseln: Regler-Zeilen anpassen, Bereich sichtbar machen *\/\n  function syncRows() {\n    ['tx', 'ty'].forEach(function (k) {\n      tw.querySelectorAll('[data-row=\"' + k + '\"]').forEach(function (r) { r.style.display = area === 'top' ? '' : 'none'; });\n    });\n    var opt = tw.querySelector('#jm-lv-area option[value=\"studiopop\"]');\n    if (opt) opt.disabled = activePanel() !== mobile;\n  }\n  function focusArea() {\n    if (area === 'top') { show(); return; }\n    desktop.classList.remove('show'); mobile.classList.remove('show');\n    \/* Gravur-Studio liegt in Schritt 2 des Konfigurators → Schritt öffnen *\/\n    if (window.jmCfg \u0026\u0026 window.jmCfg.step() !== 2) window.jmCfg.go(2, false);\n    var tg = studioTarget();\n    if (area === 'studio' \u0026\u0026 tg) tg.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    if (area === 'studiopop') {\n      var sec = document.getElementById('engraving-preview');\n      if (sec) sec.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n  }\n\n  function viewLabel() {\n    var v = document.getElementById('jm-lv-view');\n    if (v) v.textContent = activePanel() === mobile ? 'Mobile' : 'Desktop';\n  }\n  \/* Ansicht gewechselt (Fenster schmaler\/breiter, Handy gedreht) → Werte der neuen Ansicht laden *\/\n  var lastView = activePanel();\n  window.addEventListener('resize', function () {\n    if (activePanel() !== lastView) { lastView = activePanel(); onVariant(); show(); }\n  });\n\n  \/* Variante gewechselt → Regler auf die Werte dieser Variante setzen *\/\n  onVariant = function () {\n    viewLabel();\n    syncRows();\n    readVals();\n    Object.keys(vals).forEach(function (k) {\n      tw.querySelector('[data-k=\"' + k + '\"]').value = vals[k];\n      document.getElementById('jm-lv-v-' + k).textContent = vals[k];\n    });\n    apply();\n  };\n\n  \/* Seite wechseln → Regler auf die Werte dieser Seite setzen, Rückseite sichtbar machen *\/\n  document.getElementById('jm-lv-side').addEventListener('change', function () {\n    tweakSide = this.value;\n    onVariant();\n    if (area === 'top') show(); else focusArea();\n  });\n  document.getElementById('jm-lv-area').addEventListener('change', function () {\n    area = this.value;\n    onVariant();\n    focusArea();\n  });\n\n  tw.addEventListener('input', function (e) {\n    var k = e.target.dataset.k;\n    if (!k) return;\n    vals[k] = parseFloat(e.target.value);\n    document.getElementById('jm-lv-v-' + k).textContent = vals[k];\n    apply();\n    if (window.jmArcRefresh) setTimeout(window.jmArcRefresh, 0);\n    if (area === 'top') show();\n  });\n\n  \/* Beispieltext: zeigt 3 Zeilen auf beiden Seiten (nur Vorschau, Formular bleibt leer) *\/\n  document.getElementById('jm-lv-sample').addEventListener('click', function () {\n    lvSample = !lvSample;\n    this.textContent = 'Beispieltext: ' + (lvSample ? 'an' : 'aus');\n    if (area === 'top') show();\n    else { if (!lvSample \u0026\u0026 window.jmGkStudio) window.jmGkStudio.render(false); apply(); }\n  });\n  \/* Zurücksetzen: Live-Werte der gewählten Seite verwerfen → Werte aus dem CSS *\/\n  document.getElementById('jm-lv-reset').addEventListener('click', function () {\n    onVariant();\n    if (area === 'top') show();\n  });\n\n  document.getElementById('jm-lv-copy').addEventListener('click', function () {\n    if (navigator.clipboard) navigator.clipboard.writeText(document.getElementById('jm-lv-out').textContent);\n    var b = this; b.textContent = 'Kopiert ✓';\n    setTimeout(function () { b.textContent = 'Werte kopieren'; }, 1500);\n  });\n\n  \/* Draggable ohne Sprung *\/\n  var drag = false, ox = 0, oy = 0;\n  \/* Touch (Mobile): über die Überschrift verschieben *\/\n  var head = tw.querySelector('strong');\n  \/* Einklappen: nur die Kopfzeile bleibt sichtbar → Vorschau frei *\/\n  document.getElementById('jm-lv-min').addEventListener('click', function (e) {\n    e.stopPropagation();\n    var min = tw.classList.toggle('jm-lv-min');\n    Array.prototype.forEach.call(tw.children, function (c) { if (c !== head) c.style.display = min ? 'none' : ''; });\n    if (!min) syncRows();\n    this.textContent = min ? '+' : '–';\n  });\n  head.addEventListener('touchstart', function (e) {\n    if (e.target.closest \u0026\u0026 e.target.closest('button')) return;\n    var t = e.touches[0], r = tw.getBoundingClientRect();\n    tw.style.left = r.left + 'px'; tw.style.top = r.top + 'px'; tw.style.right = 'auto';\n    drag = true; ox = t.clientX - r.left; oy = t.clientY - r.top;\n    e.preventDefault();\n  }, { passive: false });\n  document.addEventListener('touchmove', function (e) {\n    if (!drag) return;\n    var t = e.touches[0];\n    tw.style.left = Math.min(Math.max(t.clientX - ox, 0), window.innerWidth - 60) + 'px';\n    tw.style.top  = Math.min(Math.max(t.clientY - oy, 0), window.innerHeight - 40) + 'px';\n    e.preventDefault();\n  }, { passive: false });\n  document.addEventListener('touchend', function () { drag = false; });\n\n  tw.addEventListener('mousedown', function (e) {\n    if (['INPUT', 'BUTTON', 'CODE', 'SELECT', 'OPTION'].indexOf(e.target.tagName) \u003e -1) return;\n    var r = tw.getBoundingClientRect();\n    tw.style.left = r.left + 'px'; tw.style.top = r.top + 'px'; tw.style.right = 'auto';\n    drag = true; ox = e.clientX - r.left; oy = e.clientY - r.top;\n    e.preventDefault();\n  });\n  document.addEventListener('mousemove', function (e) {\n    if (!drag) return;\n    tw.style.left = (e.clientX - ox) + 'px';\n    tw.style.top  = (e.clientY - oy) + 'px';\n  });\n  document.addEventListener('mouseup', function () { drag = false; });\n\n  apply();\n  show();\n});\n\u003c\/script\u003e\n\u003c\/div\u003e","brand":"Juwelier Milano e.K.","offers":[{"title":"rot","offer_id":44634157613321,"sku":"","price":39.0,"currency_code":"EUR","in_stock":true},{"title":"schwarz","offer_id":44634157646089,"sku":"","price":39.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/Gravur_armband_81993b0c-004c-4146-8db1-a46cb99d6073.png?v=1696436243","url":"https:\/\/shop.juwelier-milano.de\/products\/plattenarmband-faltschliesse-gravur-edelstahl","provider":"Juwelier Milano","version":"1.0","type":"link"}