{"title":"Neuheiten","description":null,"products":[{"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"},{"product_id":"geflochtenes-plattenarmband-gravur-edelstahl","title":"Geflochtenes Plattenarmband mit Gravur | Verstellbares Edelstahl-Armband für Damen","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: Geflochtenes Plattenarmband\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\u003eGeflochtenes 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\u003eFein. Elegant. Persönlich. Zartes Damen-Armband mit edler Edelstahl-Platte an einem geflochtenen Band – mit Namen, Initialen oder Datum 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\"\u003e\u003cspan class=\"jm-arm-dot gruen\"\u003e\u003c\/span\u003e\u003cstrong\u003eGrün\u003c\/strong\u003e\u003c\/span\u003e\n\u003cspan class=\"jm-hz-hero-size\"\u003everstellbar \u003cstrong\u003e14–21 cm\u003c\/strong\u003e\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-arrows-expand\"\u003e\u003c\/i\u003e Verstellbar\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-gift\"\u003e\u003c\/i\u003e Ideal als Geschenk\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=\"Geflochtenes Plattenarmband mit 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\u003ePerfekter Sitz\u003c\/h3\u003e\n\u003cp\u003eDas geflochtene Band ist stufenlos von ca. 14 bis 21 cm verstellbar – angenehm zu tragen, für fast jedes Handgelenk.\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\u003eVon Herzen geschenkt\u003c\/h3\u003e\n\u003cp\u003eZart, feminin und persönlich – vom Alltag bis zu besonderen Momenten. 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 zartes Damen-Armband verleiht deinem Look eine stilvolle, persönliche Note. Das filigrane Design mit edler Platte macht es zu einem besonderen Schmuckstück für jeden Anlass. Dein Schmuckstück – so einzigartig wie du.\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\u003eDrei Bandfarben\u003c\/h3\u003e\n\u003cp\u003eRot, Schwarz oder Grün – geflochtenes Baumwollband, 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\u003eVerstellbar\u003c\/h3\u003e\n\u003cp\u003eCa. 14–21 cm Armbandlänge – einfach anpassen, bequem 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 Plattenarmband mit geflochtenem Band, verstellbar\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-box\"\u003e\u003c\/i\u003e \u003cstrong\u003eMaterial:\u003c\/strong\u003e Edelstahl-Platte · Band aus Baumwolle\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-palette\"\u003e\u003c\/i\u003e \u003cstrong\u003eBandfarben:\u003c\/strong\u003e Rot · Schwarz · Grün\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. 14–21 cm (verstellbar)\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-database\"\u003e\u003c\/i\u003e \u003cstrong\u003eGewicht:\u003c\/strong\u003e ca. 4 g\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-gender-female\"\u003e\u003c\/i\u003e \u003cstrong\u003eGeschlecht:\u003c\/strong\u003e Damen\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 Baumwollband 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 geflochtenen Baumwollband – 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. 4 g\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-arrows-expand\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eVerstellbar\u003c\/strong\u003e\u003csmall\u003eca. 14–21 cm\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\"\u003eGeflochtenes Plattenarmband mit 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. 14–21 cm verstellbar · ca. 4 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: \"geflochtenes Band\", schwarz: \"geflochtenes Band\", gruen: \"geflochtenes Band\", 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. 4 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#jm-lv-desktop[data-variant=\"rot\"] .jm-lv-stage {\n  --lv-x: 50%;\n  --lv-y: 62%;\n  --lv-rot: 0deg;\n  --lv-size: 4.25;\n  --lv-ty: -50%;\n  --lv-arc: -0.24em;\n  --lv-l: 28%;\n  --lv-sh: 0.15;\n}\n\n#jm-lv-desktop[data-variant=\"schwarz\"] .jm-lv-stage {\n  --lv-x: 56%;\n  --lv-y: 60%;\n  --lv-rot: 16deg;\n  --lv-size: 3.75;\n  --lv-ty: -50%;\n  --lv-arc: 0.26em;\n  --lv-l: 28%;\n  --lv-sh: 0.15;\n  --lv-zoom: 1.56;\n}\n\n#jm-lv-desktop[data-variant=\"gruen\"] .jm-lv-stage {\n  --lv-x: 50%;\n  --lv-y: 59.5%;\n  --lv-rot: 0deg;\n  --lv-size: 3.75;\n  --lv-ty: -50%;\n  --lv-arc: -0.16em;\n  --lv-l: 28%;\n  --lv-sh: 0.15;\n}\n\n.engraving-preview-image[data-variant=\"gruen\"][data-side=\"front\"] {\n  --st-x: 50%;\n  --st-y: 53.5%;\n  --st-rot: 0deg;\n  --st-size: 3.75;\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: 57%;\n  --st-rot: 0deg;\n  --st-size: 5;\n  --st-arc: -0.24em;\n  --st-l: 28%;\n  --st-sh: 0.15;\n}\n\n.engraving-preview-image[data-variant=\"rot\"][data-side=\"front\"] {\n  --st-x: 50%;\n  --st-y: 55%;\n  --st-rot: 0deg;\n  --st-size: 4.25;\n  --st-arc: -0.32em;\n  --st-l: 28%;\n  --st-sh: 0.15;\n}\n\n@media (max-width: 768px) {\n  .engraving-preview-image[data-variant=\"gruen\"][data-side=\"front\"] {\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    --st-zoom: 1.81;\n  }\n  #engraving-mobile-popup .popup-preview[data-variant=\"gruen\"][data-side=\"front\"] {\n    --st-x: 50%;\n    --st-y: 59.5%;\n    --st-rot: 0deg;\n    --st-size: 4;\n    --st-arc: -0.04em;\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%;\n    --st-y: 64%;\n    --st-rot: 0deg;\n    --st-size: 3.75;\n    --st-arc: -0.14em;\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%;\n    --st-y: 62.5%;\n    --st-rot: 0deg;\n    --st-size: 3.75;\n    --st-arc: -0.19em;\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":55357573398793,"sku":null,"price":39.0,"currency_code":"EUR","in_stock":true},{"title":"schwarz","offer_id":55357573431561,"sku":null,"price":39.0,"currency_code":"EUR","in_stock":true},{"title":"grün","offer_id":55364247290121,"sku":null,"price":39.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/IMG_6690.jpg?v=1745673875"},{"product_id":"herzanhaenger-mit-zirkon","title":"Herzanhänger mit Zirkon – Edelstahl Schmuck mit 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\/* 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   HERZANHÄNGER: Größenwahl 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 HERZ: Position für ALLE Varianten (Größe + Farbe) – gleiche Fotos ──\n   Eigene Werte für einzelne Varianten: mit ?jmtweak=1 ermitteln und die ausgegebene Regel\n   ([data-variant][data-side]) zusätzlich einfügen – sie greift automatisch vor diesen Werten. *\/\n.engraving-preview-image[data-side=\"front\"] {\n  --st-x: 50%;\n  --st-y: 45.5%;\n  --st-rot: 0deg;\n  --st-size: 3;\n  --st-gap: -0.1em;\n}\n.engraving-preview-image[data-side=\"back\"] {\n  --st-x: 50%;\n  --st-y: 45.5%;\n  --st-rot: 0deg;\n  --st-size: 3;\n  --st-gap: -0.1em;\n}\n@media (max-width: 768px) {\n  .engraving-preview-image[data-side=\"front\"] {\n    --st-x: 50%;\n    --st-y: 36.5%;\n    --st-rot: 0deg;\n    --st-size: 3.25;\n  }\n  .engraving-preview-image[data-side=\"back\"] {\n    --st-x: 50%;\n    --st-y: 38.5%;\n    --st-rot: 0deg;\n    --st-size: 3.25;\n  }\n  #engraving-mobile-popup .popup-preview[data-side=\"front\"] {\n    --st-x: 50%;\n    --st-y: 54%;\n    --st-rot: 0deg;\n    --st-size: 3;\n  }\n  #engraving-mobile-popup .popup-preview[data-side=\"back\"] {\n    --st-x: 50%;\n    --st-y: 54%;\n    --st-rot: 0deg;\n    --st-size: 3;\n  }\n}\n\u003c\/style\u003e\n\n\u003cdiv class=\"engraving-product\"\u003e\n\u003c!-- =========================\n     HERO: Edelstahl Herzanhänger\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\u003eEdelstahl Herzanhänger mit persönlicher 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=\"#engraving-preview\" 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\u003eEin zeitloses Herz aus massivem Edelstahl mit funkelndem Zirkonia – individuell graviert, um Gefühle für immer festzuhalten.\u003c\/p\u003e\n\u003c!-- Größen kompakt (Auswahl erfolgt im Produktformular \/ Gravur-Studio) --\u003e\n\u003cdiv class=\"jm-hz-hero-sizes\"\u003e\n\u003cspan class=\"jm-hz-hero-size\"\u003e\u003cstrong\u003e16 × 20 mm\u003c\/strong\u003e klassisch\u003c\/span\u003e\n\u003cspan class=\"jm-hz-hero-size jm-hz-hero-size--new\"\u003e\u003cem\u003eNeu\u003c\/em\u003e\u003cstrong\u003e20 × 25 mm\u003c\/strong\u003e mehr Fläche\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-gem\"\u003e\u003c\/i\u003e Edelstahl \u0026amp; Zirkonia\u003c\/span\u003e \u003cspan\u003e\u003ci class=\"bi bi-palette\"\u003e\u003c\/i\u003e 3 Farben\u003c\/span\u003e \u003cspan\u003e\u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e Vorne \u0026amp; hinten gravierbar\u003c\/span\u003e \u003cspan\u003e\u003ci class=\"bi bi-info-circle\"\u003e\u003c\/i\u003e Ohne Kette\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 --\u003e\n\u003cdiv class=\"engraving-image\"\u003e\n\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/UN-0107_rfx8y9b2hs_2026-01-26-18-07-47.jpg?v=1769521881\" alt=\"Edelstahl Herzanhänger mit Gravur\"\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\u003eWarum dieses Herz?\u003c\/h2\u003e\n\u003cp\u003eJedes Herz erzählt seine eigene Geschichte. Massives Edelstahl, fein verarbeitet und mit deiner persönlichen Gravur – ein Symbol für Nähe, Liebe und besondere Momente.\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\u003eHochwertiges Material\u003c\/h3\u003e\n\u003cp\u003eEdelstahl, der robust, glänzend und hypoallergen ist – für ein Leben lang.\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\u003eDeine Botschaft, Initialen oder ein Datum – direkt auf das Herz graviert – vorne und auf Wunsch auch hinten, kostenlos.\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\u003eEmotion \u0026amp; Bedeutung\u003c\/h3\u003e\n\u003cp\u003eEin Herz, das Nähe ausdrückt – perfekt für Armbänder, Ketten oder Schlüsselanhänger. Ob Jahrestag, Geburtstag, Valentinstag oder einfach als Zeichen deiner Liebe – dieser Herzanhänger ist ein persönliches Geschenk, das Emotionen trägt.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-stars\"\u003e\u003c\/i\u003e\n\u003ch3\u003ePerfekte Verarbeitung\u003c\/h3\u003e\n\u003cp\u003eFein poliert, klare Linien, elegante Optik – ein echtes Premium-Schmuckstück.\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\u003eMehr als ein Schmuckstück\u003c\/h1\u003e\n\u003cp class=\"engraving-section-desc\"\u003eDieser Herzanhänger steht für Beständigkeit, Persönlichkeit und zeitlose Eleganz. In 16 × 20 mm klassisch und fein – oder in 20 × 25 mm mit mehr Fläche, damit deine Gravur noch besser zur Geltung kommt.\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\u003eIndividuelle Gravur\u003c\/h3\u003e\n\u003cp\u003eKostenlose Personalisierung mit Initialen, Datum oder Botschaft – auf Vorder- und Rückseite.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-gem\"\u003e\u003c\/i\u003e\n\u003ch3\u003eHochwertiges Edelstahl\u003c\/h3\u003e\n\u003cp\u003eHochwertig verarbeitet, langlebig und formstabil – entwickelt für Gravuren, die ein Leben lang halten.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-arrows-angle-expand\"\u003e\u003c\/i\u003e\n\u003ch3\u003eZwei Größen\u003c\/h3\u003e\n\u003cp\u003eKlassisch mit 16 × 20 mm oder größer mit 20 × 25 mm – für mehr Sichtbarkeit deiner Gravur.\u003c\/p\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"engraving-feature\"\u003e\n\u003ci class=\"bi bi-heart\"\u003e\u003c\/i\u003e\n\u003ch3\u003eRomantisch \u0026amp; Zeitlos\u003c\/h3\u003e\n\u003cp\u003eGlänzender Herzanhänger mit funkelndem Zirkonia – in Edelstahl, Vergoldet oder Rosegold. Ein Geschenk voller Liebe, das Emotionen transportiert statt nur gut auszusehen.\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-box\"\u003e\u003c\/i\u003e \u003cstrong\u003eMaterial:\u003c\/strong\u003e Edelstahl\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e \u003cstrong\u003eGrößen:\u003c\/strong\u003e\n\u003cdiv class=\"ring-size-visual\"\u003e\n\u003cdiv class=\"ring-size\"\u003e\n\u003cspan class=\"size\"\u003eKlassisch\u003c\/span\u003e \u003cspan class=\"diameter\"\u003e16 × 20 mm\u003c\/span\u003e \u003cspan class=\"circumference\"\u003emit Zirkonia · ca. 1,6 g\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"ring-size\"\u003e\n\u003cspan class=\"size\"\u003eGrößer · Neu\u003c\/span\u003e \u003cspan class=\"diameter\"\u003e20 × 25 mm\u003c\/span\u003e \u003cspan class=\"circumference\"\u003emit Zirkonia · ca. 2,6 g\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-palette\"\u003e\u003c\/i\u003e \u003cstrong\u003eFarben:\u003c\/strong\u003e Edelstahl · Vergoldet · Rosegold\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-gem\"\u003e\u003c\/i\u003e \u003cstrong\u003eStein:\u003c\/strong\u003e eingeriebener Zirkonia (beide Größen)\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-database\"\u003e\u003c\/i\u003e \u003cstrong\u003eGewicht:\u003c\/strong\u003e ca. 1,6 g (16 × 20 mm) · ca. 2,6 g (20 × 25 mm)\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-brightness-high\"\u003e\u003c\/i\u003e \u003cstrong\u003eFinish:\u003c\/strong\u003e Hochglanz\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-link\"\u003e\u003c\/i\u003e \u003cstrong\u003eVerwendung:\u003c\/strong\u003e Kette · Armband · Schlüsselanhänger\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-info-circle\"\u003e\u003c\/i\u003e \u003cstrong\u003eLieferumfang:\u003c\/strong\u003e nur Anhänger – ohne Kette\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-gender-ambiguous\"\u003e\u003c\/i\u003e \u003cstrong\u003eGeschlecht:\u003c\/strong\u003e Dame\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e \u003cstrong\u003eGravur:\u003c\/strong\u003e Kostenlos · Vorder- \u0026amp; Rückseite · je 3 Zeilen\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-heart\"\u003e\u003c\/i\u003e \u003cstrong\u003eBedeutung:\u003c\/strong\u003e Persönlich \u0026amp; emotional\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 Herz. Deine Worte.\u003c\/h2\u003e\n\u003cp class=\"jm-cfg-subline\"\u003eGestalte in 3 Schritten deinen persönlichen Herzanhänger – Größe \u0026amp; Farbe wählen, Vorder- und Rückseite 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: Größe + Farbe --\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 Herzanhänger\u003c\/h3\u003e\n\u003cp\u003eMassiver Edelstahl mit funkelndem Zirkonia – wähle Größe und Farbe. Die Auswahl wird direkt ins Produktformular übernommen.\u003c\/p\u003e\n\u003c!-- GRÖSSE (wird aus den Varianten erzeugt, synchron zum Produktformular) --\u003e\n\u003cdiv class=\"jm-hz-size-wrap\" id=\"jm-hz-size-wrap\" hidden\u003e\n\u003cspan class=\"jm-hz-size-title\"\u003eWähle deine Größe\u003c\/span\u003e\n\u003cdiv class=\"jm-hz-sizes\" id=\"jm-hz-sizes\" role=\"radiogroup\" aria-label=\"Größe wählen\"\u003e\u003c\/div\u003e\n\u003c\/div\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 Farbe\u003c\/span\u003e\n\u003cdiv class=\"jm-mh-colors jm-hz-colors\" id=\"jm-hz-colors\" role=\"radiogroup\" aria-label=\"Farbe 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-heart\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003e\u003cspan class=\"js-hz-size\"\u003e16 × 20 mm\u003c\/span\u003e\u003c\/strong\u003e\u003csmall\u003e\u003cspan class=\"js-hz-weight\"\u003eca. 1,6 g\u003c\/span\u003e · Hochglanz\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-gem\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eZirkonia\u003c\/strong\u003e\u003csmall\u003ebei beiden Größen\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\u003evorne \u0026amp; hinten · je 3 Zeilen\u003c\/small\u003e\u003c\/span\u003e\n\u003c\/li\u003e\n\u003cli\u003e\n\u003ci class=\"bi bi-info-circle\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eNur Anhänger\u003c\/strong\u003e\u003csmall\u003eohne Kette\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=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/IMG_2581_-_Kopie.png?v=1769525954\" alt=\"Herz Zirkonia Vorderseite\"\u003e\n\u003cspan class=\"jm-cfg-ring-img-label\" id=\"hzCfgLabel\"\u003eEdelstahl\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cp class=\"jm-cfg-ring-img-caption\"\u003e\u003cspan class=\"js-hz-size\"\u003e16 × 20 mm\u003c\/span\u003e · \u003cspan class=\"js-hz-color\"\u003eEdelstahl\u003c\/span\u003e\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 3 Zeilen) --\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=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/IMG_2581_-_Kopie.png?v=1769525954\" alt=\"Edelstahl Herzanhänger 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 dieses Herz einzigartig\u003c\/h2\u003e\n\u003cp\u003eGib deine gewünschte Gravur ein und sieh sofort, wie dein persönlicher Herzanhänger Gestalt annimmt.\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. A + M\" 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\"\u003eJe Zeile max. 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\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=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/IMG_2581_-_Kopie.png?v=1769525954\" alt=\"Herzanhänger mit Gravur\"\u003e\n\u003cdiv\u003e\n\u003cp class=\"jm-cfg-s3-product-name\"\u003eEdelstahl Herzanhänger mit 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\"\u003eGröße\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-size\"\u003e16 × 20 mm\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-s3-row\"\u003e\n\u003cspan class=\"jm-cfg-s3-row-label\"\u003eFarbe\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-color\"\u003eEdelstahl\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-s3-row\"\u003e\n\u003cspan class=\"jm-cfg-s3-row-label\"\u003eStein · Gewicht\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-weight\"\u003eZirkonia · ca. 1,6 g\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"jm-cfg-s3-row\"\u003e\n\u003cspan class=\"jm-cfg-s3-row-label\"\u003eLieferumfang\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\"\u003enur Anhänger – ohne Kette\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=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/IMG_2579_-_Kopie.jpg?v=1769525954\" 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 (Herzanhänger)\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 3; };\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========================= *\/\ndocument.querySelectorAll('.live-preview-link').forEach(link =\u003e {\n  link.addEventListener('click', e =\u003e {\n    e.preventDefault();\n    if (window.jmCfg) window.jmCfg.go(2, false);\n    document\n      .querySelector('#engraving-preview')\n      .scrollIntoView({ behavior: 'smooth', block: 'center' });\n  });\n});\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 = !!(window.jmGravurFeld \u0026\u0026 window.jmGravurFeld(\"Rückseite\", 1));\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 je Zeile (Formularfelder bitte ebenfalls maxlength=\"11\") *\/\n    });\n    if (LINES === 1) input.placeholder = \"z. B. A ♥ M\";\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 = { edelstahl: \"silberfarbig\", vergoldet: \"goldfarbig\", rosegold: \"roséfarbig\" };\n  function dotOf(c) { c = plain(c); return \/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 Herz] 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() || \"16 × 20 mm\";\n    const color = curColor() || \"Edelstahl\";\n    return { variant: v, size: size, color: color, weight: WEIGHT[optKeys(size)[0]] || \"\",\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    document.querySelectorAll(\".js-hz-weight\").forEach(el =\u003e { el.textContent = i.weight || \"Hochglanz\"; });\n    const lb = document.getElementById(\"hzCfgLabel\");\n    if (lb) lb.textContent = i.color;\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 = \"Herz Zirkonia Vorderseite \" + 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) =\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 list.length === 1) hit = list[0];\n        return hit ? imgUrl(hit.src) : \"\";\n      };\n      p.variants.forEach(v =\u003e {\n        const opts = v.options || [v.option1, v.option2, v.option3];\n        const fr = pick(\"front\", opts);\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 Herz] 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    set(\"jm-cfg-s3-size\", i.size);\n    set(\"jm-cfg-s3-color\", i.color);\n    set(\"jm-cfg-s3-weight\", \"Zirkonia\" + (i.weight ? \" · \" + i.weight : \"\"));\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 + \" · je Seite 3 Zeilen à 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: Position für ALLE Varianten (Größe + Farbe) – gleiche Fotos ──\n   Variantenregeln aus ?jmtweak=1 ([data-variant]) greifen weiterhin vor diesen Werten. *\/\n#jm-lv-desktop .jm-lv-stage {\n  --lv-x: 50%;\n  --lv-y: 53.5%;\n  --lv-rot: 0deg;\n  --lv-size: 3.25;\n  --lv-ty: -50%;\n  --lv-lh: 1.35;\n}\n#jm-lv-desktop .jm-lv-stage.jm-lv-stage--back {\n  --lv-x: 50%;\n  --lv-y: 52.5%;\n  --lv-rot: 0deg;\n  --lv-size: 3.25;\n  --lv-ty: -50%;\n}\n@media (max-width: 768px) {\n  #jm-lv-mobile .jm-lv-stage {\n    --lv-x: 50%;\n    --lv-y: 53%;\n    --lv-rot: 0deg;\n    --lv-size: 3.25;\n    --lv-tx: -50%;\n    --lv-ty: -50%;\n    --lv-gap: -0.15em;\n  }\n  #jm-lv-mobile .jm-lv-stage.jm-lv-stage--back {\n    --lv-x: 50%;\n    --lv-y: 54%;\n    --lv-rot: 0deg;\n    --lv-size: 3.25;\n    --lv-tx: -50%;\n    --lv-ty: -50%;\n    --lv-gap: 0.05em;\n  }\n}\n\n\/* ── WERTE JE FARBE (gelten für 16 × 20 UND 20 × 25 mm – gleiche Fotos) ──\n   data-variant = Farbe ohne Größe: „edelstahl“, „vergoldet“, „ros-gold-vergoldet“ (Roségold (vergoldet)) *\/\n#jm-lv-desktop[data-variant=\"ros-gold-vergoldet\"] .jm-lv-stage {\n  --lv-x: 50%;\n  --lv-y: 53.5%;\n  --lv-rot: 0deg;\n  --lv-size: 3.25;\n  --lv-ty: -50%;\n  --lv-lh: 1.35;\n  --lv-zoom: 1.5;\n  --lv-py: -7%;\n}\n\n#jm-lv-desktop[data-variant=\"ros-gold-vergoldet\"] .jm-lv-stage.jm-lv-stage--back {\n  --lv-x: 50%;\n  --lv-y: 52.5%;\n  --lv-rot: 0deg;\n  --lv-size: 3.25;\n  --lv-ty: -50%;\n  --lv-lh: 1.35;\n  --lv-zoom: 1.46;\n  --lv-py: -9%;\n}\n\n#jm-lv-desktop[data-variant=\"edelstahl\"] .jm-lv-stage {\n  --lv-x: 50%;\n  --lv-y: 53.5%;\n  --lv-rot: 0deg;\n  --lv-size: 3.25;\n  --lv-ty: -50%;\n  --lv-lh: 1.35;\n  --lv-zoom: 1.57;\n}\n#jm-lv-desktop[data-variant=\"edelstahl\"] .jm-lv-stage.jm-lv-stage--back {\n  --lv-x: 50%;\n  --lv-y: 52.5%;\n  --lv-rot: 0deg;\n  --lv-size: 3.25;\n  --lv-ty: -50%;\n  --lv-lh: 1.35;\n  --lv-zoom: 1.37;\n}\n\n#jm-lv-desktop[data-variant=\"vergoldet\"] .jm-lv-stage {\n  --lv-x: 50%;\n  --lv-y: 53.5%;\n  --lv-rot: 0deg;\n  --lv-size: 3.25;\n  --lv-ty: -50%;\n  --lv-lh: 1.35;\n  --lv-zoom: 1.32;\n}\n\n#jm-lv-desktop[data-variant=\"vergoldet\"] .jm-lv-stage.jm-lv-stage--back {\n  --lv-x: 50%;\n  --lv-y: 52.5%;\n  --lv-rot: 0deg;\n  --lv-size: 3.25;\n  --lv-ty: -50%;\n  --lv-lh: 1.35;\n  --lv-zoom: 1.28;\n}\n\n.engraving-preview-image[data-variant=\"ros-gold-vergoldet\"][data-side=\"back\"] {\n  --st-x: 50%;\n  --st-y: 45.5%;\n  --st-rot: 0deg;\n  --st-size: 3;\n  --st-gap: -0.1em;\n  --st-zoom: 1.31;\n  --st-py: -8%;\n}\n\n.engraving-preview-image[data-variant=\"ros-gold-vergoldet\"][data-side=\"front\"] {\n  --st-x: 50%;\n  --st-y: 45.5%;\n  --st-rot: 0deg;\n  --st-size: 3;\n  --st-gap: -0.1em;\n  --st-zoom: 1.26;\n  --st-py: -6.5%;\n}\n\n.engraving-preview-image[data-variant=\"edelstahl\"][data-side=\"front\"] {\n  --st-x: 50%;\n  --st-y: 45.5%;\n  --st-rot: 0deg;\n  --st-size: 3;\n  --st-gap: -0.1em;\n  --st-zoom: 1.23;\n}\n\n.engraving-preview-image[data-variant=\"edelstahl\"][data-side=\"back\"] {\n  --st-x: 50%;\n  --st-y: 45.5%;\n  --st-rot: 0deg;\n  --st-size: 3;\n  --st-gap: -0.1em;\n  --st-zoom: 1.26;\n  --st-py: -2%;\n}\n\n.engraving-preview-image[data-variant=\"vergoldet\"][data-side=\"back\"] {\n  --st-x: 50%;\n  --st-y: 45.5%;\n  --st-rot: 0deg;\n  --st-size: 3;\n  --st-gap: -0.1em;\n}\n\n.engraving-preview-image[data-variant=\"vergoldet\"][data-side=\"front\"] {\n  --st-x: 50%;\n  --st-y: 45.5%;\n  --st-rot: 0deg;\n  --st-size: 3;\n  --st-gap: -0.1em;\n}\n\n@media (max-width: 768px) {\n  #engraving-mobile-popup .popup-preview[data-variant=\"vergoldet\"][data-side=\"front\"] {\n    --st-x: 50%;\n    --st-y: 54%;\n    --st-rot: 0deg;\n    --st-size: 3;\n    --st-zoom: 1.21;\n  }\n}\n\n@media (max-width: 768px) {\n  #engraving-mobile-popup .popup-preview[data-variant=\"vergoldet\"][data-side=\"back\"] {\n    --st-x: 50%;\n    --st-y: 54%;\n    --st-rot: 0deg;\n    --st-size: 3;\n    --st-zoom: 1.21;\n  }\n}\n\n@media (max-width: 768px) {\n  .engraving-preview-image[data-variant=\"vergoldet\"][data-side=\"back\"] {\n    --st-x: 50%;\n    --st-y: 38.5%;\n    --st-rot: 0deg;\n    --st-size: 3.75;\n    --st-gap: -0.1em;\n    --st-zoom: 1.32;\n  }\n}\n\n@media (max-width: 768px) {\n  .engraving-preview-image[data-variant=\"vergoldet\"][data-side=\"front\"] {\n    --st-x: 50%;\n    --st-y: 38.5%;\n    --st-rot: 0deg;\n    --st-size: 3.75;\n    --st-gap: -0.1em;\n    --st-zoom: 1.32;\n  }\n}\n\n@media (max-width: 768px) {\n  .engraving-preview-image[data-variant=\"edelstahl\"][data-side=\"back\"] {\n    --st-x: 50%;\n    --st-y: 38.5%;\n    --st-rot: 0deg;\n    --st-size: 4;\n    --st-gap: -0.1em;\n    --st-zoom: 1.54;\n  }\n}\n\n@media (max-width: 768px) {\n  .engraving-preview-image[data-variant=\"edelstahl\"][data-side=\"front\"] {\n    --st-x: 50%;\n    --st-y: 38.5%;\n    --st-rot: 0deg;\n    --st-size: 4;\n    --st-gap: -0.1em;\n    --st-zoom: 1.67;\n  }\n}\n\n@media (max-width: 768px) {\n  .engraving-preview-image[data-variant=\"ros-gold-vergoldet\"][data-side=\"front\"] {\n    --st-x: 50%;\n    --st-y: 36.5%;\n    --st-rot: 0deg;\n    --st-size: 4.25;\n    --st-gap: -0.1em;\n    --st-zoom: 1.99;\n    --st-py: -15%;\n  }\n}\n\n@media (max-width: 768px) {\n  .engraving-preview-image[data-variant=\"ros-gold-vergoldet\"][data-side=\"back\"] {\n    --st-x: 50%;\n    --st-y: 36.5%;\n    --st-rot: 0deg;\n    --st-size: 4;\n    --st-gap: -0.1em;\n    --st-zoom: 1.99;\n    --st-py: -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\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                 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                 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                 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                   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 === '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 (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","offers":[{"title":"Vergoldet \/ 16 x 20 mm","offer_id":56782182449417,"sku":null,"price":59.0,"currency_code":"EUR","in_stock":true},{"title":"Vergoldet \/ 20 x 25 mm","offer_id":57455140241673,"sku":null,"price":59.0,"currency_code":"EUR","in_stock":true},{"title":"Edelstahl \/ 16 x 20 mm","offer_id":56782182416649,"sku":null,"price":49.0,"currency_code":"EUR","in_stock":true},{"title":"Edelstahl \/ 20 x 25 mm","offer_id":57455140274441,"sku":null,"price":49.0,"currency_code":"EUR","in_stock":true},{"title":"Roségold (vergoldet) \/ 16 x 20 mm","offer_id":56782182482185,"sku":null,"price":59.0,"currency_code":"EUR","in_stock":true},{"title":"Roségold (vergoldet) \/ 20 x 25 mm","offer_id":57455140307209,"sku":null,"price":59.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/UN-0107_rfx8y9b2hs_2026-01-26-18-07-47.jpg?v=1769524700"},{"product_id":"herren-siegelring-vergoldet-onyx-tigerauge","title":"Vergoldeter Herren Siegelring mit Gravur | Schwarz-Onyx, Tigerauge \u0026 Rot-Onyx","description":"\u003c!-- Fonts \u0026 Icons --\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:wght@600;700\u0026amp;family=Inter:wght@300;400;500;600\u0026amp;family=Allura\u0026amp;family=Alex+Brush\u0026amp;family=Kaushan+Script\u0026amp;family=Pacifico\u0026amp;family=Indie+Flower\u0026amp;family=Dancing+Script\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003clink href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap-icons@1.11.1\/font\/bootstrap-icons.css\" rel=\"stylesheet\"\u003e\n\n\u003c!-- SEO: Titel \u0026 Meta-Beschreibung im Admin unter \"Suchmaschinen-Eintrag bearbeiten\" pflegen --\u003e\n\n\u003cstyle\u003e\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.jm-cfg-stone-list { display: flex; flex-direction: column; gap: 10px; }\n.jm-cfg-stone-option { display: flex; align-items: center; gap: 14px; padding: 14px 16px; border: 1.5px solid #e8e0d0; border-radius: 12px; cursor: pointer; transition: all 0.25s ease; background: #faf9f7; }\n.jm-cfg-stone-option:hover { border-color: #c9a84c; background: #fdf8f0; }\n.jm-cfg-stone-option.active { border-color: #c9a84c; background: #fdf8f0; box-shadow: 0 0 0 3px rgba(201,168,76,0.12); }\n.jm-cfg-stone-dot { width: 22px; height: 22px; border-radius: 50%; flex-shrink: 0; }\n.jm-cfg-stone-dot.onyx    { background: #1a1a1a; border: 1px solid #444; }\n.jm-cfg-stone-dot.tiger   { background: radial-gradient(circle at 40% 40%, #c08830, #7a4e10); }\n.jm-cfg-stone-dot.rot     { background: radial-gradient(circle at 40% 40%, #c0392b, #6e1414); }\n.jm-cfg-stone-info { flex: 1; }\n.jm-cfg-stone-name { display: block; font-weight: 700; font-size: 14px; color: #1a1410; margin-bottom: 2px; }\n.jm-cfg-stone-desc { display: block; font-size: 12px; color: #9a8a6a; }\n.jm-cfg-stone-check { width: 20px; height: 20px; border-radius: 50%; border: 2px solid #d4c5a0; display: flex; align-items: center; justify-content: center; flex-shrink: 0; transition: all 0.2s; }\n.jm-cfg-stone-option.active .jm-cfg-stone-check { background: #c9a84c; border-color: #c9a84c; }\n.jm-cfg-stone-check::after { content: ''; width: 6px; height: 6px; border-radius: 50%; background: #fff; opacity: 0; transition: opacity 0.2s; }\n.jm-cfg-stone-option.active .jm-cfg-stone-check::after { opacity: 1; }\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\/* Größenwahl (vergoldete Variante) *\/\n.jm-gs-size-title { display: block; margin: 22px 0 10px; font-family: 'Playfair Display', serif; font-size: 1.1rem; color: #1a1410; }\n.jm-gs-sizes { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }\n.jm-gs-size { display: flex; flex-direction: column; align-items: center; gap: 2px; padding: 12px 8px; border: 1.5px solid #e8e0d0; border-radius: 12px; background: #faf9f7; cursor: pointer; font-family: inherit; transition: all 0.25s ease; }\n.jm-gs-size strong { font-size: 15px; color: #1a1410; }\n.jm-gs-size small { font-size: 11px; color: #9a8a6a; line-height: 1.35; text-align: center; }\n.jm-gs-size:hover { border-color: #c9a84c; background: #fdf8f0; }\n.jm-gs-size.active { border-color: #c9a84c; background: #fdf8f0; box-shadow: 0 0 0 3px rgba(201,168,76,0.12); }\n.jm-gs-size.unavailable { opacity: 0.4; cursor: not-allowed; text-decoration: line-through; }\n.jm-gs-shake { animation: jmGsShake 0.35s ease; }\n@keyframes jmGsShake { 0%,100% { transform: translateX(0); } 25%,75% { transform: translateX(-5px); } 50% { transform: translateX(5px); } }\n.jm-rsz-tr[data-size] { cursor: pointer; }\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\/* ── PRODUCT STYLES ── *\/\n.engraving-product { font-family: 'Inter', sans-serif; color: #111; }\n.engraving-product .container { max-width: 1200px; margin: 0 auto; padding: 0 20px; }\n.engraving-product .container2 { max-width: 1200px; width: 110%; margin: 0 auto; padding: 0 20px; }\n.engraving-hero { padding: 80px 20px; background: #f9f9f9; }\n.engraving-hero-grid-wrapper { max-width: 1200px; margin: 0 auto; padding: 0 15px; }\n.engraving-hero-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: start; }\n.engraving-hero-text { display: flex; flex-direction: column; justify-content: center; }\n.engraving-badge { display: inline-block; margin-bottom: 16px; font-size: 1.2rem; padding: 6px 14px; border-radius: 999px; background: #f4f1e8; color: #7a6a3a; font-weight: 600; }\n.engraving-badge i { font-size: 1.2rem; }\n.engraving-hero-text h1 { font-size: 3.8rem; line-height: 1.2; margin-bottom: 20px; color: #222; font-weight: 600; font-family: 'Playfair Display', serif; }\n.engraving-hero-text p { font-size: 1.4rem; color: #555; margin-bottom: 25px; }\n.engraving-trust { margin-top: 25px; display: flex; flex-wrap: wrap; gap: 20px; color: #777; }\n.engraving-trust span { display: flex; align-items: center; gap: 8px; }\n.engraving-image { display: flex; align-items: flex-start; justify-content: center; }\n.watch-image { position: relative; width: 140%; max-width: 550px; }\n.watch-image img { width: 100%; object-fit: contain; border-radius: 30px; box-shadow: 0 2px 28px rgb(0 0 0 \/ 47%); transition: opacity 0.45s ease; display: block; }\n.watch-img-hover { position: absolute; inset: 0; opacity: 0; }\n.watch-image:hover .watch-img-primary { opacity: 0; }\n.watch-image:hover .watch-img-hover   { opacity: 1; }\n.watch-image.swapping .watch-img-primary, .watch-image.swapping .watch-img-hover { transition: opacity .6s ease; }\n@media (max-width: 992px) { .engraving-hero-grid { grid-template-columns: 1fr; gap: 50px; } .engraving-image { justify-content: center; } .engraving-hero-text h1 { font-size: 2.4rem; margin-top: -40px !important; } }\n.engraving-section { padding: 40px 0; }\n.engraving-section h2 { font-family: 'Playfair Display', serif; font-size: 38px; margin-bottom: 20px; }\n.engraving-section-desc { max-width: 720px; color: #666; margin-bottom: 60px; }\n.engraving-features { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 40px; }\n.engraving-feature { background: #fff; padding: 40px; border-radius: 28px; box-shadow: 0 20px 50px rgba(0,0,0,.06); transition: transform .4s ease; }\n.engraving-feature:hover { transform: translateY(-6px); }\n.engraving-feature i { font-size: 32px; color: #b6a573; margin-bottom: 14px; display: inline-block; }\n.engraving-feature h3 { margin-bottom: 10px; font-size: 18px; }\n.engraving-feature p { font-size: 15px; color: #666; }\n.engraving-specs { display: flex; justify-content: center; gap: 60px; flex-wrap: wrap; margin-top: 30px; }\n.engraving-specs ul { list-style: none; padding: 0; margin: 0; }\n.engraving-specs ul li { display: flex; align-items: center; gap: 10px; color: #555; margin-bottom: 12px; padding: 12px 0; border-bottom: 1px solid #eee; font-size: 15px; }\n.engraving-specs ul li i { color: #bfac79; transition: transform 0.3s ease, color 0.3s ease; }\n.engraving-specs ul li:hover i { transform: scale(1.3); color: #9f8650; }\n@media (max-width: 768px) { .engraving-specs { flex-direction: column; align-items: center; gap: 25px; } .engraving-specs ul { text-align: center; } }\n.engraving-cta-strip { background: linear-gradient(135deg, #111, #1c1c1c); color: #fff; padding: 80px 20px; text-align: center; }\n.engraving-cta-strip h2 { color: #fff; margin-bottom: 20px; }\n.engraving-cta-strip p { color: #ccc; margin-bottom: 30px; }\n.engraving-fade { opacity: 0; transform: translateY(30px); transition: 1s ease; }\n.engraving-fade.show { opacity: 1; transform: none; }\n.engraving-collection-btn { position: relative; padding: 14px 28px; border-radius: 999px; background: linear-gradient(135deg, #c7aaaa, #1a1a1a); color: #fff; font-weight: 400; font-size: 13px; letter-spacing: .5px; border: 1px solid rgba(220,184,75,0.6); cursor: pointer; overflow: hidden; transition: all .35s ease; }\n.engraving-collection-btn:hover { transform: translateY(-1px); box-shadow: 0 0 25px rgba(220,184,75,.45), inset 0 0 20px rgba(220,184,75,.15); color: #ffdd7a; }\n.engraving-collection-btn::before { content: ''; position: absolute; inset: -1px; border-radius: inherit; background: radial-gradient(circle at 50% 120%, rgba(220,184,75,.35), transparent 65%); opacity: .45; pointer-events: none; }\n.engraving-collection-btn i { margin-left: 8px; }\n.micro-trust-valentine { margin-top: 1.5rem; font-size: 1.3rem; color: #746742; font-weight: 600; }\n.hero-subline { display: flex; align-items: center; gap: 14px; margin-top: 12px; flex-wrap: wrap; }\n.hero-subline .engraving-badge { font-size: 1.1rem; opacity: 0.85; }\n@media (max-width: 768px) { .hero-subline { justify-content: center; } }\n.luxury-shine-btn { position: relative; font-size: 1.2rem; margin-bottom: 16px; display: inline-flex; align-items: center; gap: 8px; padding: 5px 12px; border-radius: 999px; font-weight: 600; letter-spacing: 0.03em; text-decoration: none; color: #e6d3a3; background: linear-gradient(180deg, #141414, #0d0d0d); border: 1px solid rgba(201,168,92,0.45); overflow: hidden; isolation: isolate; transition: transform 0.25s ease, box-shadow 0.25s ease; }\n.luxury-shine-btn:hover { transform: translateY(-1px); box-shadow: 0 8px 20px rgba(0,0,0,0.35), 0 0 0 1px rgba(201,168,92,0.35); }\n.luxury-shine-btn::before { content: \"\"; position: absolute; top: -60%; left: -120%; width: 60%; height: 220%; background: linear-gradient(120deg, transparent 0%, rgba(255,255,255,0) 35%, rgba(255,214,130,0.65) 50%, rgba(255,255,255,0) 65%, transparent 100%); transform: skewX(-20deg); opacity: 0.9; animation: goldLaser 3s ease-in-out infinite; }\n@keyframes goldLaser { 0% { left: -120%; } 55% { left: 140%; } 100% { left: 140%; } }\n.luxury-shine-btn i { color: #c9a85c; font-size: 1.1em; }\n.live-preview-link.luxury { margin-left: 8px; font-weight: 600; color: #ab8e4c; text-decoration: none; position: relative; letter-spacing: 0.02em; transition: color 0.25s ease, opacity 0.25s ease; }\n.live-preview-link.luxury::after { content: \"\"; position: absolute; left: 0; bottom: -2px; width: 0%; height: 1px; background: linear-gradient(90deg, rgba(201,168,92,0), rgba(201,168,92,0.9), rgba(201,168,92,0)); transition: width 0.35s ease; }\n.live-preview-link.luxury:hover::after { width: 100%; }\n.live-preview-link.luxury:hover { opacity: 0.9; }\n.engraving-stone-selector { display: flex; gap: 16px; margin: 20px 0 30px; flex-wrap: wrap; }\n.stone-btn { border: 2px solid #ddd; background: #fff; border-radius: 14px; padding: 12px 20px; cursor: pointer; font-weight: 600; font-size: 13px; display: flex; align-items: center; gap: 10px; transition: all 0.3s ease; }\n.stone-btn .stone-dot { width: 18px; height: 18px; border-radius: 50%; display: inline-block; flex-shrink: 0; }\n.stone-btn.onyx   .stone-dot { background: #1a1a1a; border: 1px solid #444; }\n.stone-btn.tiger  .stone-dot { background: radial-gradient(circle at 40% 40%, #c08830, #7a4e10); }\n.stone-btn.rot    .stone-dot { background: radial-gradient(circle at 40% 40%, #c0392b, #6e1414); }\n.stone-btn:hover { border-color: #bfac79; transform: translateY(-2px); }\n.stone-btn.active { background: #f7f4ef; border-color: #bfac79; box-shadow: 0 8px 20px rgba(0,0,0,0.08); }\n@media (max-width: 768px) { .engraving-stone-selector { gap: 10px; } .stone-btn { width: 100%; max-width: 260px; } }\n.size-info { margin-top: 10px; margin-bottom: 10px; }\n.size-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 6px; }\n.shape-badge { display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; font-family: 'Inter', sans-serif; font-size: 13px; letter-spacing: 0.5px; background: #f5f5f5; color: #333; border: 2px solid #e0e0e0; margin-right: 10px; margin-top: 8px; border-radius: 6px; transition: all 0.25s ease; }\n.shape-badge:hover { border-color: #b6a573; color: #34aa8b; transform: translateY(-2px); }\n\n\/* RINGGROESSE *\/\n.jm-rsz-section { background: linear-gradient(160deg, #2a2018 0%, #1a1410 55%, #241c0e 100%); padding: 56px 24px 52px; position: relative; }\n.jm-rsz-section::before { content: ''; position: absolute; inset: 0; background: radial-gradient(ellipse at 50% 0%, rgba(201,168,76,0.06) 0%, transparent 65%); pointer-events: none; }\n.jm-rsz-inner { max-width: 1200px; margin: 0 auto; }\n.jm-rsz-header { text-align: center; margin-bottom: 40px; }\n.jm-rsz-eyebrow { display: block; font-family: 'Playfair Display', serif; font-size: 11px; letter-spacing: 4px; text-transform: uppercase; color: #c9a84c; margin-bottom: 8px; opacity: 0.75; }\n.jm-rsz-title { display: block; font-family: 'Playfair Display', serif; font-size: 28px; color: #f7f0e3; line-height: 1.2; margin-bottom: 10px; }\n.jm-rsz-subtitle { display: block; color: #8a7055; font-size: 14px; font-weight: 300; letter-spacing: 0.3px; }\n.jm-rsz-grid { display: grid; grid-template-columns: 200px 1fr 1fr; gap: 40px; align-items: start; }\n@media (max-width: 900px) { .jm-rsz-grid { grid-template-columns: 1fr 1fr; gap: 28px; } .jm-rsz-col--svg { grid-column: 1 \/ -1; display: flex; justify-content: center; } }\n@media (max-width: 560px) { .jm-rsz-grid { grid-template-columns: 1fr; gap: 24px; } .jm-rsz-col--svg { grid-column: auto; } }\n.jm-rsz-svg-wrap svg { filter: drop-shadow(0 0 18px rgba(201,168,76,0.22)); display: block; }\n.jm-rsz-col--anno { display: flex; flex-direction: column; gap: 14px; }\n.jm-rsz-anno { background: rgba(201,168,76,0.07); border-left: 3px solid #c9a84c; border-radius: 4px; padding: 12px 16px; }\n.jm-rsz-anno-label { display: block; font-size: 10px; letter-spacing: 2px; text-transform: uppercase; color: #c9a84c; font-weight: 700; margin-bottom: 4px; }\n.jm-rsz-anno-value { display: block; font-family: 'Playfair Display', serif; font-size: 20px; color: #f7f0e3; line-height: 1.15; margin-bottom: 5px; }\n.jm-rsz-anno-desc { display: block; font-size: 13px; color: #8a7055; line-height: 1.55; }\n.jm-rsz-anno-desc strong { color: #e8c96a; font-weight: 500; }\n.jm-rsz-tip { display: flex; gap: 12px; background: rgba(201,168,76,0.06); border: 1px solid rgba(201,168,76,0.2); border-radius: 6px; padding: 12px 14px; align-items: flex-start; margin-top: 4px; }\n.jm-rsz-tip-icon { font-size: 16px; flex-shrink: 0; margin-top: 2px; }\n.jm-rsz-tip-title { display: block; font-size: 13px; font-weight: 700; color: #e8c96a; margin-bottom: 4px; }\n.jm-rsz-tip-text { display: block; font-size: 12px; color: #8a7055; line-height: 1.55; }\n.jm-rsz-tip-text strong { color: #e8c96a; font-weight: 500; }\n.jm-rsz-col--guide { display: flex; flex-direction: column; gap: 16px; }\n.jm-rsz-block-title { display: block; font-family: 'Playfair Display', serif; font-size: 13px; color: #c9a84c; letter-spacing: 1px; margin-bottom: 4px; text-transform: uppercase; }\n.jm-rsz-steps { display: flex; flex-direction: column; gap: 10px; }\n.jm-rsz-step { display: flex; align-items: flex-start; gap: 12px; background: rgba(255,255,255,0.03); border: 1px solid rgba(201,168,76,0.12); border-radius: 6px; padding: 11px 14px; }\n.jm-rsz-step-num { flex-shrink: 0; width: 26px; height: 26px; border: 1.5px solid rgba(201,168,76,0.5); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-family: 'Playfair Display', serif; font-size: 12px; color: #c9a84c; font-weight: 700; margin-top: 1px; }\n.jm-rsz-step-title { display: block; font-weight: 700; font-size: 13px; color: #f7f0e3; margin-bottom: 3px; }\n.jm-rsz-step-text { display: block; font-size: 12px; color: #8a7055; line-height: 1.5; }\n.jm-rsz-step-text strong { color: #e8c96a; font-weight: 500; }\n.jm-rsz-table-wrap { overflow-x: auto; }\n.jm-rsz-table { width: 100%; border-collapse: collapse; font-size: 13px; min-width: 280px; }\n.jm-rsz-thead { display: table-header-group; }\n.jm-rsz-tbody { display: table-row-group; }\n.jm-rsz-thead .jm-rsz-tr { border-bottom: 1px solid rgba(201,168,76,0.35); }\n.jm-rsz-th { text-align: left; padding: 7px 10px; font-size: 10px; letter-spacing: 1.5px; text-transform: uppercase; color: #c9a84c; font-weight: 500; }\n.jm-rsz-tbody .jm-rsz-tr { border-bottom: 1px solid rgba(255,255,255,0.04); transition: background 0.15s; }\n.jm-rsz-tbody .jm-rsz-tr:hover { background: rgba(201,168,76,0.05); }\n.jm-rsz-tbody .jm-rsz-tr.jm-rsz-hl { background: rgba(201,168,76,0.1); border-color: rgba(201,168,76,0.3); }\n.jm-rsz-td { padding: 8px 10px; color: #8a7055; font-size: 13px; }\n.jm-rsz-td:first-child { color: #f7f0e3; font-weight: 700; }\n.jm-rsz-tbody .jm-rsz-tr.jm-rsz-hl .jm-rsz-td { color: #f7f0e3; }\n.jm-rsz-hl-badge { display: inline-block; background: #c9a84c; color: #1a1410; font-size: 9px; letter-spacing: 0.8px; text-transform: uppercase; padding: 2px 7px; border-radius: 10px; margin-left: 6px; font-weight: 700; vertical-align: middle; }\n\n\/* SHIPPING *\/\n.engraving-shipping { padding: 20px 0; background: linear-gradient(180deg, #faf9f7 0%, #ffffff 100%); }\n.engraving-shipping-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 40px; }\n.engraving-shipping h2 { font-size: 2.2rem; font-weight: 700; margin-bottom: 40px; color: #1f2a2a; text-align: center; }\n.shipping-item { text-align: center; padding: 40px 28px; background: #fff; border-radius: 20px; box-shadow: 0 18px 45px rgba(0,0,0,0.06); transition: transform 0.4s ease, box-shadow 0.4s ease; }\n.shipping-item:hover { transform: translateY(-6px); box-shadow: 0 28px 65px rgba(0,0,0,0.1); }\n.shipping-item i { font-size: 2.8rem; color: #bfac79; margin-bottom: 18px; }\n.shipping-item h3 { font-size: 1.6rem; margin-bottom: 10px; font-weight: 600; color: #1f2a2a; margin-top: 10px; }\n.shipping-item p { font-size: 1.3rem; color: #555; line-height: 1.6; }\n@media (max-width: 900px) { .engraving-shipping-grid { grid-template-columns: 1fr; gap: 28px; } .shipping-item { padding: 32px 22px; } }\n\n\/* WHY *\/\n.engraving-why-heart { padding: 80px 0; background: #faf9f7; text-align: center; }\n.engraving-why-heart h2 { font-size: 2.2rem; font-weight: 700; margin-bottom: 16px; color: #1f2a2a; }\n.engraving-why-heart p { max-width: 650px; margin: 0 auto 50px auto; font-size: 1.3rem; line-height: 1.7; color: #555; }\n.engraving-why-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 13px; }\n@media (max-width: 1200px) { .engraving-why-grid { grid-template-columns: repeat(2, 1fr); gap: 30px; } }\n@media (max-width: 700px) { .engraving-why-grid { grid-template-columns: 1fr; gap: 25px; } .engraving-why-heart p { margin-bottom: 40px; } }\n\n\/* WARNING *\/\n.jm-rgt-warning { display: flex; gap: 14px; align-items: flex-start; background: linear-gradient(135deg, #2a1f0a, #1e1608); border: 1px solid rgba(201,168,76,0.35); border-left: 4px solid #c9a84c; border-radius: 10px; padding: 18px 20px; margin-bottom: 40px; }\n.jm-rgt-warning-icon { font-size: 22px; color: #c9a84c; flex-shrink: 0; margin-top: 1px; }\n.jm-rgt-warning-title { display: block; font-size: 14px; font-weight: 700; color: #f7f0e3; margin-bottom: 6px; }\n.jm-rgt-warning-text { display: block; font-size: 13px; color: #8a7055; line-height: 1.65; }\n.jm-rgt-warning-text strong { color: #e8c96a; font-weight: 500; }\n\n\/* PREVIEW SECTION *\/\n.engraving-preview-section { padding: 40px 0; background: #ffffff; }\n.engraving-preview-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: center; }\n.engraving-preview-image { position: relative; max-width: 560px; }\n.engraving-preview-image img { width: 100%; border-radius: 28px; transition: opacity 0.3s ease; }\n @media (max-width: 768px) {\n  .engraving-preview-image img {\n    border-radius: 0 !important;   \/* ❌ kein Abschneiden mehr *\/\n    transform: scale(1.4);         \/* 🔥 deutlich größer *\/\n  }\n}\n.engraving-overlay { position: absolute; inset: 0; pointer-events: none; opacity: 0; transform: translateY(6px); transition: opacity 0.35s ease, transform 0.35s ease; }\n.engraving-overlay.active { opacity: 1; transform: translateY(0); }\n.engraving-overlay svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }\n.engraving-arc-text { font-size: 3px; letter-spacing: 0; fill: rgb(210 195 160 \/ 92%); font-style: italic; filter: drop-shadow(0 0.3px 0.5px rgba(0,0,0,0.8)) drop-shadow(0 -0.3px 0 rgba(255,255,255,0.1)); }\n.engraving-arc-popup-text { font-size: 3px; letter-spacing: 0; fill: rgb(210 195 160 \/ 92%); filter: drop-shadow(0 0.3px 0.5px rgba(0,0,0,0.8)) drop-shadow(0 -0.3px 0 rgba(255,255,255,0.1)); }\n@media (max-width: 1200px) { .engraving-arc-text { font-size: 3.5px; } }\n@media (max-width: 900px)  { .engraving-arc-text { font-size: 4px; } }\n@media (max-width: 768px)  { .engraving-arc-text { font-size: 5px; } }\n@media (max-width: 480px)  { .engraving-arc-text { font-size: 3px; } .engraving-arc-popup-text { font-size: 15px; } }\n@media (max-width: 900px) { #engravingOverlay svg { transform: translateX(3%) translateY(2%); } }\n@media (max-width: 768px) { #engravingOverlay svg { transform: translateX(3%) translateY(0%); } }\n@media (max-width: 480px) { #engravingOverlay svg { transform: translateX(1%) translateY(-5%); } }\n@media (max-width: 768px)  { #engraving-mobile-popup .engraving-overlay svg { transform: translateX(3%) translateY(9.8%); } }\n@media (min-width: 480px)  { #engraving-mobile-popup .engraving-overlay svg { transform: translateX(3%) translateY(10.8%); } }\n.engraving-preview-content h2 { font-size: 2.1rem; margin-bottom: 12px; color: #2a1f10; font-weight: 600; margin-top: 25px; }\n.engraving-preview-content p { max-width: 480px; margin-bottom: 28px; color: #555; line-height: 1.6; }\n.engraving-input-wrap, .engraving-font-select { margin-bottom: 18px; }\n.engraving-input-wrap label, .engraving-font-select label { display: block; font-weight: 600; margin-bottom: 6px; }\n.engraving-input-wrap input, .engraving-font-select select { width: 50%; padding: 14px 16px; border-radius: 12px; border: 1px solid #ddd; font-size: 1.5rem; }\n.engraving-input-wrap input:focus, .engraving-font-select select:focus { outline: none; border-color: #bfac79; }\n.engraving-input-wrap small { display: block; margin-top: 6px; font-size: 0.85rem; color: #777; }\n.engraving-symbol-picker { margin-bottom: 22px; }\n.symbol-title { display: block; font-size: 1.1rem; font-weight: 600; margin-bottom: 8px; color: #444; }\n.symbol-list { display: flex; gap: 10px; flex-wrap: wrap; }\n.symbol-btn { width: 44px; height: 44px; border-radius: 12px; border: 1px solid #ddd; background: #fff; font-size: 2rem; cursor: pointer; transition: all 0.25s ease; }\n.symbol-btn:hover { border-color: #bfac79; background: #f6f3ea; transform: translateY(-2px); }\n.symbol-btn:active { transform: scale(1.05); background: #d7bf78; }\n.engraving-font-picker { margin-bottom: 28px; }\n.font-picker-label { display: block; margin-bottom: 12px; }\n.font-group { margin-bottom: 16px; }\n.font-group-title { display: block; font-size: 0.85rem; text-transform: uppercase; letter-spacing: 1px; color: #777; margin-bottom: 8px; }\n.font-btn { display: inline-block; margin: 6px 6px 0 0; padding: 12px 16px; border-radius: 14px; border: 1px solid #ddd; background: #fff; cursor: pointer; font-size: 1.05rem; transition: all 0.25s ease; }\n.font-btn.script { font-size: 1.2rem; }\n.font-btn:hover { border-color: #bfac79; transform: translateY(-1px); }\n.font-btn.active { border-color: #bfac79; background: rgba(191,172,121,0.15); box-shadow: 0 6px 18px rgba(0,0,0,0.08); }\n.innengravur-badge { display: inline-flex; align-items: center; gap: 8px; background: linear-gradient(135deg, #2a1f10, #3d2c0e); color: #e6d3a3; border: 1px solid rgba(201,168,92,0.4); border-radius: 999px; padding: 6px 14px; font-size: 1.1rem; font-weight: 600; letter-spacing: 0.03em; margin-bottom: 12px; }\n.innengravur-badge i { color: #c9a85c; }\n.jm-grav-trust-line { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: #4b8484; margin-top: 16px; }\n.jm-grav-trust-line i { color: #4b8484; }\n@media (max-width: 900px) { .engraving-preview-grid { grid-template-columns: 1fr; gap: 50px; text-align: center; } .engraving-preview-image { margin: 0 auto; } }\n@media (max-width: 640px) {\n  .font-group { display: grid; grid-template-columns: auto 1fr; column-gap: 50px; align-items: start; margin-bottom: 16px; border-bottom: 1px solid rgba(0,0,0,0.06); padding-bottom: 12px; }\n  .font-group-buttons { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }\n  .font-btn { height: 42px; padding: 0 6px; font-size: 0.9rem; border-radius: 10px; display: flex; align-items: center; justify-content: center; white-space: nowrap; line-height: 1; }\n  .font-btn.script { font-size: 1rem; }\n  .symbol-list { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; }\n  .symbol-btn { height: 44px; font-size: 1.25rem; display: flex; align-items: center; justify-content: center; border-radius: 10px; }\n  .font-group-title { font-size: 0.75rem; font-weight: 600; opacity: 0.6; white-space: nowrap; padding-top: 12px; }\n}\n.preview-check { font-size: 14px; opacity: 0; transform: scale(0.6); transition: opacity 0.25s ease, transform 0.25s ease; }\n.preview-check.show { opacity: 1; transform: scale(1); }\n@keyframes engraveFade { 0% { text-shadow: 0 0 0 rgba(191,172,121,0); } 40% { text-shadow: 0 0 6px rgba(191,172,121,0.55), 0 0 14px rgba(191,172,121,0.30); } 100% { text-shadow: 0 0 0 rgba(191,172,121,0); } }\n.engrave-fade { animation: engraveFade 0.9s ease-out; }\n@keyframes engravingPulse { 0% { transform: scale(1); box-shadow: 0 0 0 rgba(191,172,121,0); } 40% { transform: scale(1.02); box-shadow: 0 0 0 6px rgba(191,172,121,0.25); } 100% { transform: scale(1); box-shadow: 0 0 0 rgba(191,172,121,0); } }\n.engraving-preview-image.pulse { animation: engravingPulse 0.6s ease-out; }\n.engraving-preview-note { margin-top: 10px; font-size: 12.5px; line-height: 1.45; color: rgba(60,60,60,0.75); text-align: center; letter-spacing: 0.02em; }\n@media (max-width: 640px) { .engraving-preview-note { font-size: 12px; padding: 0 12px; } }\n\n\/* MOBILE POPUP *\/\n#engraving-mobile-popup { display: block; position: fixed; left: 0; right: 0; bottom: 285px; z-index: 9999; background: #6e644533; padding: 20px; box-shadow: 0 -10px 30px rgba(0,0,0,.18); opacity: 0; transform: translateY(18px); pointer-events: none; transition: opacity 0.35s ease, transform 0.35s ease; }\n#engraving-mobile-popup.show { opacity: 1; transform: translateY(0); pointer-events: auto; }\n.popup-preview-check { position: absolute; top: 36%; right: 14%; font-size: 2rem; opacity: 0; transition: opacity 0.5s ease; }\n.popup-preview-check.show { opacity: 1; }\n@media (min-width: 769px) { #engraving-mobile-popup { display: none !important; } }\n#engraving-mobile-popup .engraving-overlay svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; transform: translateX(3%) translateY(10.8%); }\n  \/* ═══════════════════════════════════════════════════════\n   TRUST BAR (LIGHT VERSION)  AB HIER ins GLOBALE CSS DATEI\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\n    \/* ═══════════════════════════════════════════════════════\n   SECTION SHARED (OPTIMIERT)\n═══════════════════════════════════════════════════════ *\/\n\n    .section-dark {\n        background: #ffff;\n        padding: 120px 40px;\n    }\n\n    .section-cream {\n        background: var(--cream);\n        padding: 120px 40px;\n    }\n\n    .section-mid {\n        background: #ffff;\n        padding: 60px 15px;\n    }\n\n    .container-lg {\n        max-width: 1200px;\n        margin: 0 auto;\n    }\n\n    \/* 🔥 Eyebrow *\/\n    .section-eyebrow {\n        display: inline-block;\n        font-size: 14px;\n        letter-spacing: 4px;\n        text-transform: uppercase;\n        color: #bfac79; \/* Gold sauber definiert *\/\n        font-weight: 700;\n        margin-bottom: 16px;\n    }\n\n    \/* optional override für light *\/\n    .section-eyebrow-dark {\n        color: #bfac79;\n    }\n\n    \/* 🔥 Titel *\/\n    .section-title {\n        font-family: 'Playfair Display', serif;\n        font-size: clamp(28px, 3.5vw, 52px);\n        line-height: 1.1;\n        font-weight: 600;\n        color: #000;\n        margin-bottom: 20px;\n    }\n\n    \/* ✅ Light Mode Titel *\/\n    .section-title-dark {\n        color: #ffffff; \/* statt var(--text) → edler, wärmer *\/\n    }\n\n    \/* 🔥 Subtext *\/\n    .section-sub {\n        font-size: 16px;\n        line-height: 1.7;\n        color: rgb(25 23 23 \/ 70%); \/* vorher zu schwach *\/\n        max-width: 560px;\n    }\n\n    \/* ✅ Light Mode Subtext *\/\n    .section-sub-dark {\n        color: #746742; \/* dein Wunschton *\/\n    }\n\n\/* ═══════════════════════════════════════════════════════\n   WHY \/ FEATURES – 3D CARDS\n═══════════════════════════════════════════════════════ *\/\n.cards-3d-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n  gap: 24px;\n  margin-top: 64px;\n}\n  @media (max-width: 768px) {\n   .cards-3d-grid {\n     grid-template-columns: repeat(auto-fit, minmax(240px, 1fr))!important;\n   }\n}\n\n.card-3d {\n  position: relative;\n  background: #faf9f7;\n  border: 1px solid rgba(255,255,255,.07);\n  border-radius: 20px;\n  padding: 44px 36px;\n  overflow: hidden;\n  transition: transform 0.4s ease, box-shadow 0.4s ease;\n  transform-style: preserve-3d;\n  cursor: default;\n}\n.card-3d::before {\n  content: '';\n  position: absolute;\n  inset: 0;\n  background: radial-gradient(ellipse at 30% 0%, rgba(201,168,76,.08) 0%, transparent 60%);\n  opacity: 0;\n  transition: opacity .4s;\n}\n.card-3d::after {\n  content: '';\n  position: absolute;\n  top: 0; left: 0; right: 0;\n  height: 1px;\n  background: linear-gradient(90deg, transparent, var(--gold), transparent);\n  opacity: 0;\n  transition: opacity .4s;\n}\n.card-3d:hover {\n  transform: translateY(-6px);\n  border-color: rgba(201,168,76,.3);\n  box-shadow: 0 28px 65px rgba(0, 0, 0, 0.1);\n}\n.card-3d:hover::before, .card-3d:hover::after { opacity: 1; }\n\n.card-3d-icon {\n  width: 56px;\n  height: 56px;\n  border-radius: 16px;\n  background: rgba(201,168,76,.1);\n  border: 1px solid rgba(201,168,76,.2);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 24px;\n  font-size: 24px;\n  color: #bfac79;\n  transition: all .4s;\n}\n.card-3d:hover .card-3d-icon {\n  background: rgba(201,168,76,.18);\n  box-shadow: 0 18px 45px rgba(0, 0, 0, 0.06);\n}\n.card-3d h3 {\n  font-size: 17px;\n  font-weight: 600;\n  color: #000;\n  margin-bottom: 10px;\n}\n.card-3d p {\n  font-size: 14px;\n  line-height: 1.65;\n  color: #555;\n}\n\n\/* Cream variant *\/\n.card-3d-light {\n  background: #fff;\n  border-color: rgba(0,0,0,.06);\n}\n.card-3d-light::before {\n  background: radial-gradient(ellipse at 30% 0%, rgba(201,168,76,.06) 0%, transparent 60%);\n}\n.card-3d-light:hover {\n  box-shadow: 0 32px 80px rgba(0,0,0,.1), 0 0 30px rgba(201,168,76,.08);\n  border-color: rgba(201,168,76,.3);\n}\n.card-3d-light h3 { color: #000; }\n.card-3d-light p { color: #7a6d47; }\n.card-3d-light .card-3d-icon {\n  background: rgba(201,168,76,.08);\n}\n  \/* ═══════════════════════════════════════════════════════\n   SPECS – TWO COLUMN MINIMAL\n═══════════════════════════════════════════════════════ *\/\n.specs-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 60px;\n  margin-top: 60px;\n      border-radius: 30px;\n   background:radial-gradient(ellipse at 30% 0%, rgba(201, 168, 76, .08) 0%, transparent 60%);\n    padding-right: 20px;\n}\n.specs-list {\n  list-style: none;\n}\n.specs-list li {\n  display: flex;\n  align-items: center;\n  gap: 14px;\n  padding: 16px 0;\n  border-bottom: 1px solid rgba(255,255,255,.06);\n  font-size: 14px;\n  color: #555;\n}\n.specs-list li i { color: #bfac79;\n    transition: transform 0.3s ease, color 0.3s ease; font-size: 16px; flex-shrink: 0; }\n.specs-list li strong { color: #555; margin-right: 4px; }\n@media (max-width: 768px) { .specs-grid { grid-template-columns: 1fr 1fr; gap: 0; } }\n\/* ═══════════════════════════════════════════════════════\n   SCROLL ANIMATIONS\n═══════════════════════════════════════════════════════ *\/\n.reveal,\n.reveal-left,\n.reveal-right,\n.reveal-scale {\n  opacity: 0;\n  will-change: transform, opacity;\n}\n\n\/* ↓ Standard *\/\n.reveal {\n  transform: translateY(48px);\n  transition: opacity .9s cubic-bezier(.22,1,.36,1),\n              transform .9s cubic-bezier(.22,1,.36,1);\n}\n.reveal.in {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n\/* ↓ LEFT *\/\n.reveal-left {\n  transform: translateX(-60px);\n  transition: opacity 1s cubic-bezier(.22,1,.36,1),\n              transform 1s cubic-bezier(.22,1,.36,1);\n}\n.reveal-left.in {\n  opacity: 1;\n  transform: translateX(0);\n}\n\n\/* ↓ RIGHT *\/\n.reveal-right {\n  transform: translateX(60px);\n  transition: opacity 1s cubic-bezier(.22,1,.36,1),\n              transform 1s cubic-bezier(.22,1,.36,1);\n}\n.reveal-right.in {\n  opacity: 1;\n  transform: translateX(0);\n}\n\n\/* ↓ SCALE *\/\n.reveal-scale {\n  transform: scale(.88);\n  transition: opacity .9s cubic-bezier(.22,1,.36,1),\n              transform .9s cubic-bezier(.22,1,.36,1);\n}\n.reveal-scale.in {\n  opacity: 1;\n  transform: scale(1);\n}\n\n[data-delay=\"1\"] { transition-delay: .1s !important; }\n[data-delay=\"2\"] { transition-delay: .2s !important; }\n[data-delay=\"3\"] { transition-delay: .3s !important; }\n[data-delay=\"4\"] { transition-delay: .4s !important; }\n[data-delay=\"5\"] { transition-delay: .5s !important; }\n[data-delay=\"6\"] { transition-delay: .6s !important; }\n\n  \/* ═══════════════════════════════════════════════════════\n   HERO PRODUCT GRID (two-col section)\n═══════════════════════════════════════════════════════ *\/\n.product-grid-section {\n  padding: 0 40px 120px;\n  background: var(--dark);\n}\n.product-split {\n  max-width: 1200px;\n  margin: 0 auto;\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 80px;\n  align-items: start;\n}\n@media (max-width: 900px) {\n  .product-split { grid-template-columns: 1fr; gap: 48px; }\n}\n\n\u003c\/style\u003e\n\n\n\u003cdiv class=\"engraving-product\"\u003e\n\n    \u003c!-- HERO --\u003e\n    \u003csection class=\"engraving-hero engraving-fade show\"\u003e\n        \u003cdiv class=\"engraving-hero-grid-wrapper\"\u003e\n            \u003cdiv class=\"hero-eyebrow hero-visible\"\u003eGravur mit Liebe · Seit 1991\u003c\/div\u003e\n            \u003cdiv class=\"engraving-hero-grid\"\u003e\n                \u003cdiv class=\"engraving-hero-text\"\u003e\n\n                    \u003ch1\u003eVergoldeter Herren Siegelring mit Gravur | Schwarz-Onyx, Tigerauge \u0026amp; Rot-Onyx\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 Innengravur\u003c\/span\u003e\n                        \u003ca href=\"#jm-cfg-wrap\" class=\"luxury-shine-btn live-preview-link luxury\"\u003e\u003ci class=\"bi bi-eye\"\u003e\u003c\/i\u003e Live-Vorschau ansehen\u003c\/a\u003e\n                    \u003c\/div\u003e\n                    \u003cp\u003eDieser vergoldete Siegelring aus 316L Edelstahl vereint maskuline Stärke mit edlem Glanz. Wähle deinen Stein – Schwarz-Onyx, Tigerauge oder Rot-Onyx – und veredle ihn mit einer persönlichen Gravur auf der Innenseite.\u003c\/p\u003e\n                    \u003cdiv class=\"engraving-stone-selector\"\u003e\n                        \u003cbutton type=\"button\" class=\"stone-btn onyx active\" data-stone=\"onyx\" data-label=\"Schwarz-Onyx\"\u003e\u003cspan class=\"stone-dot\"\u003e\u003c\/span\u003e Schwarz-Onyx\u003c\/button\u003e\n                        \u003cbutton type=\"button\" class=\"stone-btn tiger\" data-stone=\"tiger\" data-label=\"Tigerauge\"\u003e\u003cspan class=\"stone-dot\"\u003e\u003c\/span\u003e Tigerauge\u003c\/button\u003e\n                        \u003cbutton type=\"button\" class=\"stone-btn rot\" data-stone=\"rot\" data-label=\"Rot-Onyx\"\u003e\u003cspan class=\"stone-dot\"\u003e\u003c\/span\u003e Rot-Onyx\u003c\/button\u003e\n                    \u003c\/div\u003e\n                    \u003cbutton type=\"button\" class=\"engraving-collection-btn js-scroll-to-form\" data-target=\"#product-form\"\u003eJetzt personalisieren \u003ci class=\"bi bi-arrow-up\"\u003e\u003c\/i\u003e\u003c\/button\u003e\n             \n                    \u003cdiv class=\"micro-trust-valentine\"\u003eSicher · Persönlich · Individuell graviert\u003c\/div\u003e\n                    \u003cdiv class=\"engraving-trust\"\u003e\n                        \u003cspan\u003e\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e 316L Edelstahl vergoldet\u003c\/span\u003e\n                        \u003cspan\u003e\u003ci class=\"bi bi-pencil-square\"\u003e\u003c\/i\u003e Gravur auf der Innenseite\u003c\/span\u003e\n                           \u003cbutton type=\"button\" class=\"jm-hero-details-btn\" onclick=\"document.getElementById('jm-features-specs').scrollIntoView({behavior:'smooth', block:'start'})\"\u003e\n  \u003ci class=\"bi bi-list-ul\"\u003e\u003c\/i\u003e Produktdetails ansehen \u003ci class=\"bi bi-chevron-down\"\u003e\u003c\/i\u003e\n\u003c\/button\u003e\n                        \u003cdiv class=\"size-info\"\u003e\n                            \u003cdiv class=\"size-badges\"\u003e\n                                \u003cspan class=\"shape-badge\"\u003e\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e Ringbreite: 21 mm\u003c\/span\u003e\n                                \u003cspan class=\"shape-badge\"\u003e\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e Steinbreite: 16 mm\u003c\/span\u003e\n                                \u003cspan class=\"shape-badge\"\u003e\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e 3 Größen: Ø 18,9 · 19,75 · 20,6 mm\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"micro-trust-valentine\"\u003e3 Steinfarben · je 3 Größen verfügbar\u003c\/div\u003e\n                        \u003c\/div\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"engraving-image\"\u003e\n                    \u003cdiv class=\"watch-image\"\u003e\n                        \u003cimg class=\"watch-img-primary\" id=\"heroRingPrimary\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Vergoldeter Siegelring Schwarz-Onyx\"\u003e\n                        \u003cimg class=\"watch-img-hover\" id=\"heroRingHover\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Vergoldeter Siegelring Innenseite\"\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"hero-scroll hero-visible\"\u003e\n            \u003cdiv class=\"scroll-line\"\u003e\u003c\/div\u003e\n            Scroll\n        \u003c\/div\u003e\n    \u003c\/section\u003e\n\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\u003eHandgravur 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-badge-3d\"\u003e\u003c\/i\u003e\n                \u003cspan\u003ePräzisionsgravur 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\n    \u003c!-- RINGGROESSE --\u003e\n    \u003csection class=\"jm-rsz-section engraving-fade\"\u003e\n        \u003cdiv class=\"jm-rsz-inner\"\u003e\n            \u003cdiv class=\"jm-rsz-header\"\u003e\n                \u003cspan class=\"jm-rsz-eyebrow\"\u003eJuwelier Milano\u003c\/span\u003e\n                \u003cspan class=\"jm-rsz-title\"\u003eRinggröße verstehen\u003c\/span\u003e\n                \u003cspan class=\"jm-rsz-subtitle\"\u003eDrei Größen zur Wahl – was bedeuten Umfang und Durchmesser? Alle Angaben einfach erklärt.\u003c\/span\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"jm-rsz-grid\"\u003e\n                \u003cdiv class=\"jm-rsz-col jm-rsz-col--svg\"\u003e\n                    \u003cdiv class=\"jm-rsz-svg-wrap\"\u003e\n                        \u003csvg viewbox=\"0 0 180 200\" width=\"180\" height=\"200\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\u003e\n                            \u003cdefs\u003e\n                                \u003cradialgradient id=\"jmRszRg1\" cx=\"50%\" cy=\"40%\" r=\"55%\"\u003e\u003cstop offset=\"0%\" stop-color=\"#e8c96a\"\u003e\u003c\/stop\u003e\u003cstop offset=\"45%\" stop-color=\"#c9a84c\"\u003e\u003c\/stop\u003e\u003cstop offset=\"100%\" stop-color=\"#7a5820\"\u003e\u003c\/stop\u003e\u003c\/radialgradient\u003e\n                                \u003cradialgradient id=\"jmRszRg2\" cx=\"50%\" cy=\"50%\" r=\"50%\"\u003e\u003cstop offset=\"0%\" stop-color=\"#3a2e1e\"\u003e\u003c\/stop\u003e\u003cstop offset=\"100%\" stop-color=\"#1a1410\"\u003e\u003c\/stop\u003e\u003c\/radialgradient\u003e\n                                \u003cfilter id=\"jmRszGlow\"\u003e\u003cfegaussianblur stddeviation=\"2.5\" result=\"blur\"\u003e\u003c\/fegaussianblur\u003e\u003cfemerge\u003e\u003cfemergenode in=\"blur\"\u003e\u003c\/femergenode\u003e\u003cfemergenode in=\"SourceGraphic\"\u003e\u003c\/femergenode\u003e\u003c\/femerge\u003e\u003c\/filter\u003e\n                            \u003c\/defs\u003e\n                            \u003ctext x=\"90\" y=\"14\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"9.5\" font-weight=\"600\" fill=\"#c9a84c\" letter-spacing=\"0.8\" id=\"jm-gs-svg-umfang\"\u003eUMFANG ≈ 59,6 mm\u003c\/text\u003e\n                            \u003cline x1=\"90\" y1=\"17\" x2=\"90\" y2=\"55\" stroke=\"#c9a84c\" stroke-width=\"1\" opacity=\"0.6\"\u003e\u003c\/line\u003e\n                            \u003cpolygon points=\"90,59 86.5,52 93.5,52\" fill=\"#c9a84c\" opacity=\"0.6\"\u003e\u003c\/polygon\u003e\n                            \u003ccircle cx=\"90\" cy=\"110\" r=\"78\" fill=\"url(#jmRszRg1)\" filter=\"url(#jmRszGlow)\"\u003e\u003c\/circle\u003e\n                            \u003cellipse cx=\"70\" cy=\"72\" rx=\"30\" ry=\"13\" fill=\"rgba(255,255,255,0.11)\" transform=\"rotate(-18,70,72)\"\u003e\u003c\/ellipse\u003e\n                            \u003ccircle cx=\"90\" cy=\"110\" r=\"52\" fill=\"url(#jmRszRg2)\"\u003e\u003c\/circle\u003e\n                            \u003ccircle cx=\"90\" cy=\"110\" r=\"52\" fill=\"none\" stroke=\"#c9a84c\" stroke-width=\"1.2\" opacity=\"0.4\"\u003e\u003c\/circle\u003e\n                            \u003cline x1=\"40\" y1=\"110\" x2=\"140\" y2=\"110\" stroke=\"#e8c96a\" stroke-width=\"1.5\" stroke-dasharray=\"4,3\"\u003e\u003c\/line\u003e\n                            \u003cpolygon points=\"40,110 50,106 50,114\" fill=\"#e8c96a\"\u003e\u003c\/polygon\u003e\n                            \u003cpolygon points=\"140,110 130,106 130,114\" fill=\"#e8c96a\"\u003e\u003c\/polygon\u003e\n                            \u003crect x=\"61\" y=\"98\" width=\"58\" height=\"18\" rx=\"4\" fill=\"#1a1410\" opacity=\"0.9\"\u003e\u003c\/rect\u003e\n                            \u003ctext x=\"90\" y=\"111\" text-anchor=\"middle\" font-family=\"Playfair Display, serif\" font-size=\"11.5\" fill=\"#e8c96a\" id=\"jm-gs-svg-d\"\u003eØ 18,9 mm\u003c\/text\u003e\n                        \u003c\/svg\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"jm-rsz-col jm-rsz-col--anno\"\u003e\n                    \u003cdiv class=\"jm-rsz-anno\"\u003e\n                        \u003cspan class=\"jm-rsz-anno-label\"\u003eGewählter Umfang\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-value\" id=\"jm-gs-anno-umfang\"\u003eUmfang = 59,6 mm\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-desc\"\u003eIn Europa ist die Ringgröße der \u003cstrong\u003eInnenumfang\u003c\/strong\u003e in Millimetern – also der Umfang deines Fingers.\u003c\/span\u003e\n                    \u003c\/div\u003e\n                    \u003cdiv class=\"jm-rsz-anno\"\u003e\n                        \u003cspan class=\"jm-rsz-anno-label\"\u003eInnendurchmesser\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-value\" id=\"jm-gs-anno-d\"\u003eØ 18,9 mm\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-desc\"\u003eAbstand von Innenwand zu Innenwand. Für genau diesen Fingerdurchmesser ist der Ring gefertigt.\u003c\/span\u003e\n                    \u003c\/div\u003e\n                    \u003cdiv class=\"jm-rsz-anno\"\u003e\n                        \u003cspan class=\"jm-rsz-anno-label\"\u003eDieser Ring\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-value\"\u003e3 Größen verfügbar\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-desc\"\u003e59,6 mm · 62 mm · 64,6 mm Umfang – für schlanke bis kräftige Finger. Tippe in der Tabelle auf deine Größe.\u003c\/span\u003e\n                    \u003c\/div\u003e\n                    \u003cdiv class=\"jm-rsz-tip\"\u003e\n                        \u003cspan class=\"jm-rsz-tip-icon\"\u003e💡\u003c\/span\u003e\u003cdiv\u003e\n                            \u003cspan class=\"jm-rsz-tip-title\"\u003eRing bereits vorhanden?\u003c\/span\u003e\u003cspan class=\"jm-rsz-tip-text\"\u003e\u003cstrong\u003eInnendurchmesser messen\u003c\/strong\u003e → in der Tabelle rechts in der Spalte „Ø\" nachschlagen.\u003c\/span\u003e\n                        \u003c\/div\u003e\n                    \u003c\/div\u003e\n                    \u003cdiv class=\"jm-rgt-warning\"\u003e\n                        \u003ci class=\"bi bi-exclamation-triangle-fill jm-rgt-warning-icon\"\u003e\u003c\/i\u003e\u003cdiv\u003e\n                            \u003cspan class=\"jm-rgt-warning-title\"\u003eWichtiger Hinweis: Ringgröße variiert je nach Ringstärke\u003c\/span\u003e\u003cspan class=\"jm-rgt-warning-text\"\u003eDie angegebene Ringgröße bezieht sich auf den \u003cstrong\u003eInnenumfang\u003c\/strong\u003e. Bei breiten Ringen empfehlen wir \u003cstrong\u003eeine halbe bis eine ganze Größe größer\u003c\/strong\u003e. Messen Sie am besten \u003cstrong\u003emittags oder nachmittags\u003c\/strong\u003e.\u003c\/span\u003e\n                        \u003c\/div\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"jm-rsz-col jm-rsz-col--guide\"\u003e\n                    \u003cspan class=\"jm-rsz-block-title\"\u003eSo messen Sie zu Hause\u003c\/span\u003e\n                    \u003cdiv class=\"jm-rsz-steps\"\u003e\n                        \u003cdiv class=\"jm-rsz-step\"\u003e\n                            \u003cdiv class=\"jm-rsz-step-num\"\u003e1\u003c\/div\u003e\n                            \u003cdiv\u003e\n                                \u003cspan class=\"jm-rsz-step-title\"\u003eStreifen schneiden\u003c\/span\u003e\u003cspan class=\"jm-rsz-step-text\"\u003eSchmalen Papier- oder Fadenstreifen (~15 cm) zuschneiden.\u003c\/span\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"jm-rsz-step\"\u003e\n                            \u003cdiv class=\"jm-rsz-step-num\"\u003e2\u003c\/div\u003e\n                            \u003cdiv\u003e\n                                \u003cspan class=\"jm-rsz-step-title\"\u003eFinger umwickeln\u003c\/span\u003e\u003cspan class=\"jm-rsz-step-text\"\u003eEng um den \u003cstrong\u003edicksten Teil\u003c\/strong\u003e legen \u0026amp; Überlappung markieren.\u003c\/span\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"jm-rsz-step\"\u003e\n                            \u003cdiv class=\"jm-rsz-step-num\"\u003e3\u003c\/div\u003e\n                            \u003cdiv\u003e\n                                \u003cspan class=\"jm-rsz-step-title\"\u003eLänge messen\u003c\/span\u003e\u003cspan class=\"jm-rsz-step-text\"\u003eStreifen abflachen \u0026amp; messen → \u003cstrong\u003eErgebnis in mm = Ihre Größe\u003c\/strong\u003e.\u003c\/span\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"jm-rsz-step\"\u003e\n                            \u003cdiv class=\"jm-rsz-step-num\"\u003e4\u003c\/div\u003e\n                            \u003cdiv\u003e\n                                \u003cspan class=\"jm-rsz-step-title\"\u003eTabelle ablesen\u003c\/span\u003e\u003cspan class=\"jm-rsz-step-text\"\u003eWert unten nachschlagen und die passende unserer 3 Größen wählen.\u003c\/span\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                    \u003c\/div\u003e\n                    \u003cspan class=\"jm-rsz-block-title\"\u003eGrößentabelle\u003c\/span\u003e\n                    \u003cdiv class=\"jm-rsz-table-wrap\"\u003e\n                        \u003ctable class=\"jm-rsz-table\"\u003e\n                            \u003cthead class=\"jm-rsz-thead\"\u003e\n                                \u003ctr class=\"jm-rsz-tr\"\u003e\n                                    \u003cth class=\"jm-rsz-th\"\u003eGröße\u003c\/th\u003e\n                                    \u003cth class=\"jm-rsz-th\"\u003eUmfang\u003c\/th\u003e\n                                    \u003cth class=\"jm-rsz-th\"\u003eØ mm\u003c\/th\u003e\n                                    \u003cth class=\"jm-rsz-th\"\u003ePassform\u003c\/th\u003e\n                                \u003c\/tr\u003e\n                            \u003c\/thead\u003e\n                            \u003ctbody class=\"jm-rsz-tbody\"\u003e\n                                \u003ctr class=\"jm-rsz-tr jm-rsz-hl\" data-size=\"s1\"\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e60 \u003cspan class=\"jm-rsz-hl-badge\"\u003eGewählt\u003c\/span\u003e\n\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e59,6 mm\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e18,9\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003eSchlanke bis normale Finger\u003c\/td\u003e\n                                \u003c\/tr\u003e\n                                \u003ctr class=\"jm-rsz-tr\" data-size=\"s2\"\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e62 \u003cspan class=\"jm-rsz-hl-badge\"\u003eGewählt\u003c\/span\u003e\n\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e62 mm\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e19,75\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003eHäufigste Herrengröße\u003c\/td\u003e\n                                \u003c\/tr\u003e\n                                \u003ctr class=\"jm-rsz-tr\" data-size=\"s3\"\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e65 \u003cspan class=\"jm-rsz-hl-badge\"\u003eGewählt\u003c\/span\u003e\n\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e64,6 mm\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e20,6\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003eKräftige Hände\u003c\/td\u003e\n                                \u003c\/tr\u003e\n                            \u003c\/tbody\u003e\n                        \u003c\/table\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n    \u003c\/section\u003e\n\n\n    \u003c!-- WHY --\u003e\n    \u003csection class=\"engraving-why-heart engraving-fade\"\u003e\n        \u003cdiv class=\"container\"\u003e\n            \u003ch2\u003eWarum ein Siegelring mit Innengravur?\u003c\/h2\u003e\n            \u003cp\u003eEin Siegelring ist seit Jahrhunderten Symbol für Identität, Stärke und Persönlichkeit. Durch die individuelle Innengravur wird dieses zeitlose Schmuckstück zu einem einzigartigen Begleiter.\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\u003ch3\u003eSchwarz-Onyx · Tigerauge · Rot-Onyx\u003c\/h3\u003e\n                    \u003cp\u003eSchwarzer Onyx steht für Stärke und Ausdauer. Tigerauge fördert Mut. Roter Onyx steht für Leidenschaft und Energie.\u003c\/p\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"engraving-feature\"\u003e\n                    \u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e\u003ch3\u003ePersönliche Innengravur\u003c\/h3\u003e\n                    \u003cp\u003eInitialen, ein Datum, ein Name – deine Gravur auf der Innenseite ist dein persönliches Geheimnis.\u003c\/p\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"engraving-feature\"\u003e\n                    \u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e\u003ch3\u003eVergoldeter 316L Edelstahl\u003c\/h3\u003e\n                    \u003cp\u003eHochwertiger Edelstahl in Schmuckqualität mit edler Vergoldung – robust, hautfreundlich und mit warmem Goldglanz.\u003c\/p\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"engraving-feature\"\u003e\n                    \u003ci class=\"bi bi-gift\"\u003e\u003c\/i\u003e\u003ch3\u003ePerfektes Herrengeschenk\u003c\/h3\u003e\n                    \u003cp\u003eFür Geburtstage, Jubiläen oder besondere Anlässe – ein bedeutungsvolles, individuelles Geschenk.\u003c\/p\u003e\n                \u003c\/div\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n    \u003c\/section\u003e\n\n\n    \u003c!-- SHIPPING --\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\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\u003ch3\u003eHandarbeit in Deutschland\u003c\/h3\u003e\n                    \u003cp\u003eJede Gravur entsteht in unserem Familienbetrieb – \u003cstrong\u003ekein Dropshipping\u003c\/strong\u003e, keine externe Arbeit.\u003c\/p\u003e\n                    \u003cp\u003eJede Gravur wird vor dem Versand manuell kontrolliert.\u003c\/p\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"shipping-item\"\u003e\n                    \u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e\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                \u003c\/div\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n    \u003c\/section\u003e\n\n\n    \u003c!-- ════════════════════════════════════════\n         FEATURES + SPECS\n    ════════════════════════════════════════ --\u003e\n    \u003csection class=\"section-mid\" id=\"jm-features-specs\"\u003e\n        \u003cdiv class=\"container-lg\"\u003e\n            \u003cdiv class=\"product-split\"\u003e\n                \u003c!-- Features --\u003e\n                \u003cdiv class=\"reveal-left\"\u003e\n                    \u003cspan class=\"section-eyebrow\"\u003eFeatures\u003c\/span\u003e\n                    \u003ch2 class=\"section-title\" style=\"font-size:clamp(24px,2.8vw,40px);\"\u003ePräzision in\u003cbr\u003ejedem Detail\u003c\/h2\u003e\n                    \u003cp class=\"section-sub\" style=\"margin-bottom:40px;\"\u003eDieser vergoldete Siegelring vereint maskulinen Charakter mit handwerklicher Perfektion.\u003c\/p\u003e\n                    \u003cdiv class=\"cards-3d-grid\" style=\"grid-template-columns:1fr 1fr;gap:16px;margin-top:0;\"\u003e\n                        \u003cdiv class=\"card-3d\" style=\"padding:28px 24px;\"\u003e\n                            \u003cdiv class=\"card-3d-icon\" style=\"width:44px;height:44px;font-size:18px;margin-bottom:16px;\"\u003e\u003ci class=\"bi bi-pencil-square\"\u003e\u003c\/i\u003e\u003c\/div\u003e\n                            \u003ch3 style=\"font-size:15px;\"\u003eInnengravur\u003c\/h3\u003e\n                            \u003cp style=\"font-size:13px;\"\u003eAuf der Ringinnenseite – nur für dich sichtbar.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"card-3d\" style=\"padding:28px 24px;\"\u003e\n                            \u003cdiv class=\"card-3d-icon\" style=\"width:44px;height:44px;font-size:18px;margin-bottom:16px;\"\u003e\u003ci class=\"bi bi-gem\"\u003e\u003c\/i\u003e\u003c\/div\u003e\n                            \u003ch3 style=\"font-size:15px;\"\u003eDrei Edelsteine\u003c\/h3\u003e\n                            \u003cp style=\"font-size:13px;\"\u003eSchwarz-Onyx, Tigerauge oder Rot-Onyx – jeder mit eigener Symbolik.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"card-3d\" style=\"padding:28px 24px;\"\u003e\n                            \u003cdiv class=\"card-3d-icon\" style=\"width:44px;height:44px;font-size:18px;margin-bottom:16px;\"\u003e\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e\u003c\/div\u003e\n                            \u003ch3 style=\"font-size:15px;\"\u003e316L vergoldet\u003c\/h3\u003e\n                            \u003cp style=\"font-size:13px;\"\u003eEdelstahl in Schmuckqualität mit warmem Goldglanz.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"card-3d\" style=\"padding:28px 24px;\"\u003e\n                            \u003cdiv class=\"card-3d-icon\" style=\"width:44px;height:44px;font-size:18px;margin-bottom:16px;\"\u003e\u003ci class=\"bi bi-gift\"\u003e\u003c\/i\u003e\u003c\/div\u003e\n                            \u003ch3 style=\"font-size:15px;\"\u003eElegant verpackt\u003c\/h3\u003e\n                            \u003cp style=\"font-size:13px;\"\u003eHochwertige Verpackung – sofort bereit als Geschenk.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n\n                \u003c!-- Specs --\u003e\n                \u003cdiv class=\"reveal-right\"\u003e\n                    \u003cspan class=\"section-eyebrow\"\u003eProduktdetails\u003c\/span\u003e\n                    \u003ch2 class=\"section-title\" style=\"font-size:clamp(24px,2.8vw,40px);\"\u003eTechnische\u003cbr\u003eSpezifikationen\u003c\/h2\u003e\n                    \u003cdiv class=\"specs-grid\" style=\"margin-top:36px;gap:0;\"\u003e\n                        \u003cul class=\"specs-list\"\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-gem\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eTyp:\u003c\/strong\u003e Siegelring mit Edelstein\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eMaterial:\u003c\/strong\u003e 316L Edelstahl, vergoldet\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-person\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eGeschlecht:\u003c\/strong\u003e Herren\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-palette\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eSteinfarben:\u003c\/strong\u003e Schwarz-Onyx, Tigerauge, Rot-Onyx\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eRingbreite:\u003c\/strong\u003e 21 mm\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eSteinbreite:\u003c\/strong\u003e 16 mm\u003c\/span\u003e\n\u003c\/li\u003e\n                        \u003c\/ul\u003e\n                        \u003cul class=\"specs-list\"\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eDurchmesser:\u003c\/strong\u003e 18,9 · 19,75 · 20,6 mm\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eUmfang:\u003c\/strong\u003e 59,6 · 62 · 64,6 mm\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-box-seam\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eGewicht:\u003c\/strong\u003e ca. 17–30 g\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eGravur:\u003c\/strong\u003e Innenseite · kostenlos\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-star\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eStil:\u003c\/strong\u003e Modisch · Unisex-tauglich\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-droplet-half\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eHinweis:\u003c\/strong\u003e Wasser \u0026amp; Chemikalien vermeiden\u003c\/span\u003e\n\u003c\/li\u003e\n                        \u003c\/ul\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n    \u003c\/section\u003e\n\n\n\n\n\n\n\n\n\n\n    \u003c!-- 3-SCHRITT KONFIGURATOR --\u003e\n    \u003cdiv class=\"jm-cfg-wrap\" id=\"jm-cfg-wrap\"\u003e\n      \u003c!-- ambient particles --\u003e\n  \u003cdiv class=\"hero-particles\" id=\"heroParticles\"\u003e\u003c\/div\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\"\u003eDeine Botschaft. Für immer eingraviert.\u003c\/h2\u003e\n            \u003cp class=\"jm-cfg-subline\"\u003eGestalte jetzt in 3 Schritten deine persönliche Innengravur – und sieh sofort, wie sie auf dem Ring wirkt. 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\"\u003eVariante\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 --\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\u003eWähle deinen Stein\u003c\/h3\u003e\n                        \u003cp\u003e Jeder Edelstein steht für eine eigene Symbolik – wähle den, der zu dir passt.\u003c\/p\u003e\n                        \u003cdiv class=\"jm-cfg-stone-list\"\u003e\n                            \u003cdiv class=\"jm-cfg-stone-option active\" data-stone=\"onyx\" data-label=\"Schwarz-Onyx\"\u003e\n                                \u003cspan class=\"jm-cfg-stone-dot onyx\"\u003e\u003c\/span\u003e\n                                \u003cspan class=\"jm-cfg-stone-info\"\u003e\u003cspan class=\"jm-cfg-stone-name\"\u003eSchwarz-Onyx\u003c\/span\u003e\u003cspan class=\"jm-cfg-stone-desc\"\u003eStärke \u0026amp; Ausdauer\u003c\/span\u003e\u003c\/span\u003e\n                                \u003cspan class=\"jm-cfg-stone-check\"\u003e\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"jm-cfg-stone-option\" data-stone=\"tiger\" data-label=\"Tigerauge\"\u003e\n                                \u003cspan class=\"jm-cfg-stone-dot tiger\"\u003e\u003c\/span\u003e\n                                \u003cspan class=\"jm-cfg-stone-info\"\u003e\u003cspan class=\"jm-cfg-stone-name\"\u003eTigerauge\u003c\/span\u003e\u003cspan class=\"jm-cfg-stone-desc\"\u003eMut \u0026amp; Selbstbewusstsein\u003c\/span\u003e\u003c\/span\u003e\n                                \u003cspan class=\"jm-cfg-stone-check\"\u003e\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"jm-cfg-stone-option\" data-stone=\"rot\" data-label=\"Rot-Onyx\"\u003e\n                                \u003cspan class=\"jm-cfg-stone-dot rot\"\u003e\u003c\/span\u003e\n                                \u003cspan class=\"jm-cfg-stone-info\"\u003e\u003cspan class=\"jm-cfg-stone-name\"\u003eRot-Onyx\u003c\/span\u003e\u003cspan class=\"jm-cfg-stone-desc\"\u003eLeidenschaft \u0026amp; Energie\u003c\/span\u003e\u003c\/span\u003e\n                                \u003cspan class=\"jm-cfg-stone-check\"\u003e\u003c\/span\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                        \u003cspan class=\"jm-gs-size-title\"\u003eWähle deine Größe\u003c\/span\u003e\n                        \u003cdiv class=\"jm-gs-sizes\" id=\"jm-gs-sizes\"\u003e\n                            \u003cbutton type=\"button\" class=\"jm-gs-size active\" data-size=\"s1\"\u003e\u003cstrong\u003e59,6 mm\u003c\/strong\u003e\u003csmall\u003eUmfang · Ø 18,9 mm\u003c\/small\u003e\u003c\/button\u003e\n                            \u003cbutton type=\"button\" class=\"jm-gs-size\" data-size=\"s2\"\u003e\u003cstrong\u003e62 mm\u003c\/strong\u003e\u003csmall\u003eUmfang · Ø 19,75 mm\u003c\/small\u003e\u003c\/button\u003e\n                            \u003cbutton type=\"button\" class=\"jm-gs-size\" data-size=\"s3\"\u003e\u003cstrong\u003e64,6 mm\u003c\/strong\u003e\u003csmall\u003eUmfang · Ø 20,6 mm\u003c\/small\u003e\u003c\/button\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"jm-cfg-size-strip\" id=\"jm-gs-size-strip\"\u003e\n                            \u003cstrong\u003eGröße 59,6 mm\u003c\/strong\u003e · Ø 18,9 mm · Ringbreite 21 mm · 316L vergoldet\n                        \u003c\/div\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=\"jm-cfg-ring-primary\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Vergoldeter Siegelring\"\u003e\n                            \u003cimg class=\"jm-cfg-ring-img-hover\" id=\"jm-cfg-ring-hover\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Vergoldeter Siegelring Innenseite\"\u003e\n                            \u003cspan class=\"jm-cfg-ring-img-label\" id=\"jm-cfg-ring-label\"\u003eSchwarz-Onyx\u003c\/span\u003e\n                        \u003c\/div\u003e\n                        \u003cp class=\"jm-cfg-ring-img-caption\" id=\"jm-cfg-ring-caption\"\u003eStein: Schwarz-Onyx\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 class=\"jm-cfg-btn-back\" hidden\u003e\u003ci class=\"bi bi-arrow-left\"\u003e\u003c\/i\u003e Zurück\u003c\/button\u003e\n                \u003cbutton 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 --\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\n                    \u003cdiv class=\"engraving-preview-grid\"\u003e\n                        \u003cdiv class=\"engraving-preview-image\" id=\"previewImageWrap\"\u003e\n                            \u003c!-- Bild kommt aus den Produktbildern dieses Produkts (JS) --\u003e\n                            \u003cimg id=\"jmGoldStep2Img\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Vergoldeter Siegelring Innengravur Vorschau\"\u003e\n                            \u003cdiv class=\"engraving-overlay\" id=\"engravingOverlay\"\u003e\n                                \u003csvg id=\"engravingArcSvg\" viewbox=\"0 0 100 100\" preserveaspectratio=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\u003e\n                                    \u003cdefs\u003e\u003cpath id=\"ringArcPath\" d=\"M 18,36 A 55,18 0 0,1 82,42\" fill=\"none\"\u003e\u003c\/path\u003e\u003c\/defs\u003e\n                                    \u003ctext class=\"engraving-arc-text\"\u003e\n                                        \u003ctextpath href=\"#ringArcPath\" id=\"engravingArcTextEl\" startoffset=\"53%\" text-anchor=\"middle\"\u003eDeine Gravur\u003c\/textpath\u003e\n                                    \u003c\/text\u003e\n                                \u003c\/svg\u003e\n                                \u003cspan id=\"engravingPreviewText\" style=\"display:none;\"\u003eDeine Gravur\u003c\/span\u003e\n                                \u003cspan class=\"preview-check\" style=\"position:absolute;top:36%;right:14%;font-size:2rem;\"\u003e\u003ci class=\"bi bi-check\" style=\"color:#34aa8b;\"\u003e\u003c\/i\u003e\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cp class=\"engraving-preview-note\"\u003e✦ Diese Darstellung zeigt die Innengravur als Vorschau. Jede Gravur ist handwerkliches Unikat – Schriftgröße und Position wird optimal angepasst.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"engraving-preview-content\" id=\"engraving-preview\"\u003e\n                            \u003cspan class=\"innengravur-badge\"\u003e\u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e Innengravur · Kostenlos \u0026amp; Persönlich\u003c\/span\u003e\n                            \u003ch2\u003eDeine Botschaft. Für immer eingraviert.\u003c\/h2\u003e\n                            \u003cp\u003eGib deine gewünschte Gravur ein – Initialen, ein Datum, ein Name – und sieh sofort, wie dein persönlicher vergoldeter Siegelring entsteht.\u003c\/p\u003e\n                            \u003cdiv class=\"engraving-input-wrap\"\u003e\n                                \u003clabel for=\"engravingInput\"\u003eDeine Innengravur\u003c\/label\u003e\n                                \u003cinput type=\"text\" id=\"engravingInput\" maxlength=\"11\" placeholder=\"z. B. A + M | 12.06.24\"\u003e\n                                \u003csmall id=\"engravingCounter\"\u003eMax. 11 Zeichen · Initialen, Datum oder Botschaft\u003c\/small\u003e\n                            \u003c\/div\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\n                                    \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"∞\"\u003e∞\u003c\/button\u003e\n                                    \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"★\"\u003e★\u003c\/button\u003e\n                                    \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"✝\"\u003e✝\u003c\/button\u003e\n                                    \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"❥\"\u003e❥\u003c\/button\u003e\n                                \u003c\/div\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"engraving-font-picker\"\u003e\n                                \u003clabel class=\"font-picker-label\"\u003eSchriftart wählen\u003c\/label\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eSerif\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Times New Roman\" style=\"font-family:'Times New Roman'\"\u003eTimes New Roman\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Georgia\" style=\"font-family:Georgia\"\u003eGeorgia\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eSans-serif\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Arial\" style=\"font-family:Arial\"\u003eArial\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Helvetica\" style=\"font-family:Helvetica\"\u003eHelvetica\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eMonospace\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Courier New\" style=\"font-family:'Courier New'\"\u003eCourier New\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Lucida Console\" style=\"font-family:'Lucida Console'\"\u003eLucida Console\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eSchreibschrift\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Allura\" style=\"font-family:'Allura'\"\u003eAllura\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Alex Brush\" style=\"font-family:'Alex Brush'\"\u003eAlex Brush\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Kaushan Script\" style=\"font-family:'Kaushan Script'\"\u003eKaushan Script\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eHandschrift\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Pacifico\" style=\"font-family:'Pacifico'\"\u003ePacifico\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Indie Flower\" style=\"font-family:'Indie Flower'\"\u003eIndie Flower\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Dancing Script\" style=\"font-family:'Dancing Script'\"\u003eDancing Script\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cinput type=\"hidden\" name=\"properties[Schriftart]\" id=\"selectedFont\"\u003e\n                            \u003c\/div\u003e\n                            \u003cspan class=\"jm-grav-trust-line\"\u003e\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e Jede Gravur wird individuell geprüft \u0026amp; präzise gefertigt\u003c\/span\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 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 class=\"jm-cfg-btn-next\" id=\"jm-cfg-next-2\"\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 --\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\"\u003eIhre Konfiguration im Überblick\u003c\/h3\u003e\n                \u003cp class=\"jm-cfg-s3-subtitle\"\u003ePrüfe alle deine 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=\"Gewählter Ring\"\u003e\n                    \u003cdiv\u003e\n                        \u003cp class=\"jm-cfg-s3-product-name\"\u003eVergoldeter Herren Siegelring mit 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\"\u003eStein\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-stone\"\u003eSchwarz-Onyx\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"jm-cfg-s3-row\"\u003e\n                                \u003cspan class=\"jm-cfg-s3-row-label\"\u003eRinggröße\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-size\"\u003e59,6 mm · Ø 18,9 mm\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\"\u003eInnenseite · 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\"\u003eIhre Innengravur\u003c\/span\u003e\n                    \u003cspan class=\"jm-cfg-s3-gravur-text\" id=\"jm-cfg-s3-gravur-text\"\u003e–\u003c\/span\u003e\n                    \u003cspan class=\"jm-cfg-s3-gravur-meta\" id=\"jm-cfg-s3-gravur-meta\"\u003eSchriftart: Playfair Display\u003c\/span\u003e\n                    \u003cdiv style=\"margin-top:14px;padding-top:12px;border-top:1px solid rgba(201,168,76,0.2);\"\u003e\n                        \u003cspan style=\"display:block;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:#c9a84c;font-weight:700;margin-bottom:10px;\"\u003eGewählte Schriftart\u003c\/span\u003e\n                        \u003cdiv id=\"jm-cfg-s3-font-preview\" style=\"display:inline-block;padding:10px 18px;border:2px solid #c9a84c;border-radius:12px;background:rgba(201,168,76,0.12);color:#f7f0e3;font-size:1.3rem;letter-spacing:0.05em;box-shadow:0 4px 14px rgba(0,0,0,0.15);\"\u003e\u003c\/div\u003e\n                    \u003c\/div\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 jm-cfg-s3-cta\" id=\"jm-cfg-s3-cta-btn\" style=\"width:100%;justify-content:center;font-size:15px;padding:18px 32px;\"\u003e\n                    \u003ci class=\"bi bi-bag-check\"\u003e\u003c\/i\u003e Jetzt personalisieren \u003ci class=\"bi bi-arrow-up\"\u003e\u003c\/i\u003e\n                \u003c\/button\u003e\n                \u003cdiv class=\"jm-cfg-s3-trust\"\u003e\n                    \u003cspan\u003e\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e Handgravur 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üfen Sie Ihre Angaben sorgfältig.\u003c\/p\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"jm-cfg-card-footer\"\u003e\n                \u003cbutton 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\n    \u003c\/div\u003e\n    \u003c!-- \/jm-cfg-wrap --\u003e\n    \u003c!-- CTA STRIP --\u003e\n    \u003csection class=\"engraving-cta-strip engraving-fade\" id=\"gravur\"\u003e\n        \u003ci class=\"bi bi-stars\" style=\"font-size:6rem;color:#c0a860;\"\u003e\u003c\/i\u003e\n        \u003ch2 style=\"margin-top:15px;\"\u003eDeine Gravur.\u003cbr\u003e Deine Geschichte.\u003c\/h2\u003e\n        \u003cp\u003eEin Ring, der 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        \u003cbutton type=\"button\" class=\"engraving-collection-btn js-scroll-to-form\" data-target=\"#product-form\"\u003eJetzt personalisieren \u003ci class=\"bi bi-arrow-up\"\u003e\u003c\/i\u003e\u003c\/button\u003e\n    \u003c\/section\u003e\n\n\u003c\/div\u003e\u003c!-- \/engraving-product --\u003e\n\u003c!-- MOBILE POPUP --\u003e\n\u003cdiv id=\"engraving-mobile-popup\"\u003e\n    \u003cdiv class=\"popup-preview\" style=\"position:relative;margin-bottom:10px;\"\u003e\n        \u003c!-- Eigene ID: wird nicht vom globalen theme.js überschrieben --\u003e\n        \u003cimg id=\"jmGoldPopupImg\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Gravur Vorschau Mobile\" style=\"width:100%;border-radius:14px;\"\u003e\n        \u003cdiv class=\"engraving-overlay active\"\u003e\n            \u003csvg viewbox=\"0 0 400 400\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"position:absolute;inset:0;width:100%;height:100%;overflow:visible;\"\u003e\n                \u003cdefs\u003e\u003cpath id=\"popupArcPath\" d=\"M 76,232 A 120,120 0 0,1 320,240\" fill=\"none\"\u003e\u003c\/path\u003e\u003c\/defs\u003e\n                \u003ctext class=\"engraving-arc-popup-text\"\u003e\n                    \u003ctextpath href=\"#popupArcPath\" id=\"popupArcTextEl\" startoffset=\"50%\" text-anchor=\"middle\"\u003e\u003c\/textpath\u003e\n                \u003c\/text\u003e\n            \u003c\/svg\u003e\n            \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    \u003cbutton type=\"button\" class=\"engraving-collection-btn\" id=\"jm-cfg-popup-next\"\u003e\n        Zur Bestätigung \u003ci class=\"bi bi-arrow-right\"\u003e\u003c\/i\u003e\n    \u003c\/button\u003e\n\u003c\/div\u003e\n\n\n\u003cscript\u003e\/* ═══════════════════════════════════════════════════════════════\n   JUWELIER MILANO – FINALES JS\n   Stand: 25.04.2025\n   Neu: Inner-Vorschaubild pro Stein · Mobile Popup bei Symbol + Font\n        Polling Fallback für Symbol-Inserts (Shopify Handler)\n   ═══════════════════════════════════════════════════════════════ *\/\n\n\n\/* ════════════════════════════════════════════════════════════\n   GRAVUR-POSITION PRO FARBE  (Werte mit ?jmtweak=1 ermitteln)\n   Ziele:\n     step2_desktop – Gravur-Studio Schritt 2, Desktop\n     step2_mobile  – Gravur-Studio Schritt 2, Mobile\n     popup         – Mobile-Popup unten (Gravur-Studio)\n     panel         – Live-Vorschau oben, Desktop-Panel\n     mfp           – Live-Vorschau oben, Mobile-Popup\n   Schlüssel je Ziel: default (alle Farben) oder onyx \/ tiger \/ rot.\n   Werte in % der Bildfläche:\n     cx\/cy = Mitte · w = Breite · tilt = Winkel (+ = rechts höher, − = rechts tiefer)\n     bulge = Wölbung · rot = Drehung ° · size = Schriftgröße\n     offset = Textposition auf dem Bogen · spacing = Zeichenabstand\n   Ziele ohne Eintrag bleiben unverändert.\n   ════════════════════════════════════════════════════════════ *\/\n    var JM_ARC = {\n        step2_desktop: {\n            default: { cx: 50, cy: 39, w: 64, tilt: -6, bulge: 7, rot: 0, size: 3, offset: 53, spacing: 0 },\n            onyx: { cx: 53, cy: 51, w: 73, tilt: -6, bulge: 55, rot: -13, size: 4.4, offset: 52, spacing: 0 },\n            tiger: { cx: 51, cy: 38.5, w: 56.5, tilt: 0.5, bulge: 26.5, rot: 0, size: 3.95, offset: 52.5, spacing: 0 },\n            rot: { cx: 49.5, cy: 32.5, w: 61.5, tilt: -6, bulge: 9.5, rot: -5, size: 3.55, offset: 53, spacing: 0 }\n        },\n        step2_mobile: {\n            default: { cx: 50, cy: 39, w: 64, tilt: -6, bulge: 7, rot: 0, size: 4, offset: 53, spacing: 0 },\n            rot: { cx: 50, cy: 40.5, w: 65.5, tilt: -1.5, bulge: 29.5, rot: 0, size: 4, offset: 48, spacing: 0 }\n        },\n        popup: {\n            default: { cx: 49.5, cy: 59, w: 61, tilt: -2, bulge: 61, rot: 0, size: 3.75, offset: 50, spacing: 0 },\n            onyx: { cx: 48.5, cy: 46.5, w: 98.5, tilt: -3, bulge: 61, rot: -3, size: 4.7, offset: 50, spacing: 0 },\n            tiger: { cx: 48, cy: 47.5, w: 77.5, tilt: -2, bulge: 58, rot: -1, size: 5.2, offset: 50, spacing: 0 },\n            rot: { cx: 48, cy: 50.5, w: 83.5, tilt: -2, bulge: 59, rot: 0, size: 3.75, offset: 50, spacing: 0 }\n        },\n        panel: {\n            onyx: { cx: 50.5, cy: 33.5, w: 60, tilt: 0.5, bulge: 12, rot: 0, size: 5.1, offset: 50, spacing: 0 },\n            tiger: { cx: 51, cy: 40, w: 55, tilt: 0, bulge: 23, rot: 0, size: 4.05, offset: 50, spacing: 0 },\n            rot: { cx: 50.5, cy: 40, w: 41.5, tilt: 0, bulge: 19, rot: 0, size: 3.65, offset: 50, spacing: 0 }\n        },\n        mfp: {}\n    };\n\nwindow.currentFont = \"'Playfair Display', serif\";\n\n(function () {\n  'use strict';\n\n  const MAX_CHARS = 11;\n\n  \/* ════════════════════════════════════════════\n     BILDER AUS DEN PRODUKTBILDERN DIESES PRODUKTS\n     – Hauptbild je Stein  = Variantenbild der Farbe\n     – Innenseite je Stein = Produktbild mit Alt-Text \"innen\" + Farbe\n       (z. B. \"Innenseite Schwarz-Onyx\"), sonst Hauptbild\n     ════════════════════════════════════════════ *\/\n  const PH = 'data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n  const STONES = {\n    onyx:  { keys: ['schwarz', 'black'], label: 'Schwarz-Onyx' },\n    tiger: { keys: ['tiger'],            label: 'Tigerauge' },\n    rot:   { keys: ['rot', 'red'],       label: 'Rot-Onyx' }\n  };\n  const SIZES = {\n    s1: { keys: ['59'], umfang: '59,6 mm', d: '18,9 mm' },\n    s2: { keys: ['62'], umfang: '62 mm',   d: '19,75 mm' },\n    s3: { keys: ['64'], umfang: '64,6 mm', d: '20,6 mm' }\n  };\n  \/* Übergangsweise EIN Innenseiten-Vorschaubild für alle Farben.\n     Sobald je Farbe eigene Innenseiten-Bilder (Alt-Text \"Innenseite vergoldet …\") hochgeladen sind,\n     hier einfach '' eintragen – dann greift automatisch das Bild pro Farbe. *\/\n  const INNER_FIXED = '';\n  const IMGS = { onyx: { inner: INNER_FIXED }, tiger: { inner: INNER_FIXED }, rot: { inner: INNER_FIXED } };   \/* {primary, inner, hover} *\/\n  const INNER_IMGS = {};                           \/* Kompatibilität *\/\n  let PRODUCT = null;\n  \/* ── DOM ── *\/\n  const engInput        = document.getElementById('engravingInput');\n  const arcEl           = document.getElementById('engravingArcTextEl');\n  const hiddenSpan      = document.getElementById('engravingPreviewText');\n  const overlay         = document.getElementById('engravingOverlay');\n  const mobilePopup     = document.getElementById('engraving-mobile-popup');\n  const popupArcEl      = document.getElementById('popupArcTextEl');\n  const popupPreviewImg = document.getElementById('jmGoldPopupImg');\n  const hiddenFont      = document.getElementById('selectedFont');\n  const previewImage    = document.querySelector('.engraving-preview-image');\n  const symbolBtns      = document.querySelectorAll('.symbol-btn');\n  const fontBtns        = document.querySelectorAll('.font-btn');\n  const popupCheck      = mobilePopup \u0026\u0026 mobilePopup.querySelector('.popup-preview-check');\n  const desktopCheck    = document.querySelector('.preview-check');\n  const engCounter      = document.getElementById('engravingCounter');\n\n  let lastValue = '';\n  let hasPulsed = false;\n\n  \/* ── Konfigurator State ── *\/\n  const jmCfgState = {\n    stone:      'onyx',\n    label:      'Schwarz-Onyx',\n    size:       's1',\n    imgPrimary: PH,\n    imgInner:   PH,\n  };\n\n  \/* ── Zähler ── *\/\n  function updateCounter(val) {\n    if (!engCounter) return;\n    const r = MAX_CHARS - val.length;\n    if (!val.length) {\n      engCounter.textContent = 'Max. 11 Zeichen · Initialen, Datum oder Botschaft';\n      engCounter.style.color = '';\n    } else {\n      engCounter.textContent = val.length + ' \/ 11 Zeichen';\n      engCounter.style.color = r === 0 ? '#d44' : r \u003c= 2 ? '#c9630e' : '#777';\n    }\n  }\n\n  \/* ── Popup ── *\/\n  function showPopup() { if (window.innerWidth \u003e 768) return; mobilePopup \u0026\u0026 mobilePopup.classList.add('show'); }\n  function hidePopup() { mobilePopup \u0026\u0026 mobilePopup.classList.remove('show'); }\n\n  \/* ── Popup Arc + Check sync ── *\/\n  function syncPopupFromPreview() {\n    \/* Konfigurator-Input (Schritt 2) ODER Product Form Input *\/\n    const konfVal   = engInput ? engInput.value.trim() : '';\n    const formInput = document.querySelector('#gravurtext_innenseite');\n    const formVal   = formInput ? formInput.value.trim() : '';\n    const val       = konfVal || formVal;\n    if (!val) return;\n\n    if (popupArcEl) {\n      popupArcEl.textContent      = val;\n      popupArcEl.style.fontFamily = window.currentFont;\n    }\n    if (popupCheck) {\n      popupCheck.classList.add('show');\n      clearTimeout(popupCheck._t);\n      popupCheck._t = setTimeout(() =\u003e popupCheck.classList.remove('show'), 1000);\n    }\n    mobilePopup \u0026\u0026 mobilePopup.classList.add('show');\n  }\n\n  \/* ── Arc update (Desktop + Popup) ── *\/\n  function updateArcs(value) {\n    if (arcEl)      { arcEl.textContent = value; arcEl.style.fontFamily = window.currentFont; }\n    if (hiddenSpan) hiddenSpan.textContent = value;\n    if (popupArcEl) { popupArcEl.textContent = value; popupArcEl.style.fontFamily = window.currentFont; }\n  }\n\n  \/* ── Desktop Check ── *\/\n  function showCheck() {\n    [desktopCheck, popupCheck].forEach(el =\u003e {\n      if (!el) return;\n      el.classList.add('show');\n      clearTimeout(el._t);\n      el._t = setTimeout(() =\u003e el.classList.remove('show'), 1000);\n    });\n  }\n\n  \/* ── Glow ── *\/\n  function triggerGlow() {\n    if (!arcEl) return;\n    arcEl.classList.remove('engrave-fade');\n    void arcEl.getBoundingClientRect();\n    arcEl.classList.add('engrave-fade');\n  }\n\n  \/* ── Pulse (einmalig) ── *\/\n  function triggerPulse() {\n    if (hasPulsed || !previewImage) return;\n    previewImage.classList.remove('pulse');\n    void previewImage.offsetWidth;\n    previewImage.classList.add('pulse');\n    hasPulsed = true;\n  }\n\n  \/* ── Hauptfunktion ── *\/\n  function updatePreview(forceEffects) {\n    const val = engInput ? engInput.value : '';\n    if (!val) { overlay \u0026\u0026 overlay.classList.remove('active'); hidePopup(); lastValue = ''; return; }\n    updateArcs(val);\n    overlay \u0026\u0026 overlay.classList.add('active');\n    if (forceEffects || val !== lastValue) {\n      triggerGlow();\n      showCheck();\n      if (val.length === 1) triggerPulse();\n      showPopup();\n    }\n    lastValue = val;\n  }\n\n  \/* ── Next2 disabled state ── *\/\n  const next2Btn = document.getElementById('jm-cfg-next-2');\n  function updateNext2State() {\n    if (!next2Btn) return;\n    const empty = !engInput || !engInput.value.trim();\n    next2Btn.disabled            = empty;\n    next2Btn.style.opacity       = empty ? '0.4' : '1';\n    next2Btn.style.cursor        = empty ? 'not-allowed' : 'pointer';\n    next2Btn.style.pointerEvents = empty ? 'none' : 'auto';\n  }\n  updateNext2State();\n\n  \/* ── Input ── *\/\n  if (engInput) {\n    engInput.addEventListener('input', () =\u003e {\n      updatePreview(false);\n      updateNext2State();\n      updateCounter(engInput.value);\n      \/* Mobile: Popup bei Tippen *\/\n      if (engInput.value.trim()) requestAnimationFrame(syncPopupFromPreview);\n    });\n  }\n\n  \/* ── Symbols (Konfigurator .symbol-btn) ── *\/\n  symbolBtns.forEach(btn =\u003e {\n    btn.addEventListener('click', () =\u003e {\n      if (!engInput) return;\n      const sym = btn.dataset.symbol || '';\n      if (engInput.value.length + sym.length \u003e MAX_CHARS) return;\n      const s = engInput.selectionStart, e = engInput.selectionEnd;\n      engInput.value = engInput.value.substring(0, s) + sym + engInput.value.substring(e);\n      engInput.focus();\n      engInput.selectionStart = engInput.selectionEnd = s + sym.length;\n      updatePreview(true);\n      updateNext2State();\n      updateCounter(engInput.value);\n      \/* Mobile Popup bei Symbol-Insert *\/\n      requestAnimationFrame(syncPopupFromPreview);\n    });\n  });\n\n  \/* ── Fonts ── *\/\n  fontBtns.forEach(btn =\u003e {\n    btn.addEventListener('click', () =\u003e {\n      window.currentFont = btn.dataset.font || window.currentFont;\n      if (hiddenFont) hiddenFont.value = window.currentFont;\n      if (arcEl)      arcEl.style.fontFamily      = window.currentFont;\n      if (popupArcEl) popupArcEl.style.fontFamily = window.currentFont;\n\n      const fontSelect = document.querySelector('#gravur_schriftart');\n      if (fontSelect) {\n        Array.from(fontSelect.options).forEach((opt, i) =\u003e {\n          if (window.currentFont.includes(opt.value)) fontSelect.selectedIndex = i;\n        });\n      }\n\n      fontBtns.forEach(b =\u003e b.classList.remove('active'));\n      btn.classList.add('active');\n      updatePreview(true);\n      \/* Mobile Popup bei Font-Wechsel *\/\n      requestAnimationFrame(syncPopupFromPreview);\n    });\n  });\n\n  \/* ── Polling Fallback: Konfigurator engInput ──\n     Erkennt Symbol-Inserts die kein native input-Event feuern *\/\n  if (engInput) {\n    let lastEngVal = engInput.value;\n    setInterval(() =\u003e {\n      if (engInput.value !== lastEngVal) {\n        lastEngVal = engInput.value;\n        updateCounter(engInput.value);\n        updateNext2State();\n        if (engInput.value.trim()) requestAnimationFrame(syncPopupFromPreview);\n      }\n    }, 200);\n  }\n\n  \/* ── Polling Fallback: Product Form #gravurtext_innenseite ──\n     Erkennt Symbol-Inserts vom Shopify Symbol-Handler *\/\n  const formInputRef = document.querySelector('#gravurtext_innenseite');\n  if (formInputRef) {\n    let lastFormVal = formInputRef.value;\n    setInterval(() =\u003e {\n      if (formInputRef.value !== lastFormVal) {\n        lastFormVal = formInputRef.value;\n        if (formInputRef.value.trim()) requestAnimationFrame(syncPopupFromPreview);\n      }\n    }, 200);\n  }\n\n  \/* ── Hero Stone Selector ── *\/\n  document.querySelectorAll('.stone-btn').forEach(btn =\u003e {\n    btn.addEventListener('click', () =\u003e {\n      document.querySelectorAll('.stone-btn').forEach(b =\u003e b.classList.remove('active'));\n      btn.classList.add('active');\n      const primary = document.getElementById('heroRingPrimary');\n      const hover   = document.getElementById('heroRingHover');\n      const wrap    = primary \u0026\u0026 primary.closest('.watch-image');\n      if (primary \u0026\u0026 hover \u0026\u0026 wrap) {\n        wrap.classList.add('swapping');\n        primary.style.opacity = '0'; hover.style.opacity = '0';\n        setTimeout(() =\u003e {\n          const im = IMGS[btn.dataset.stone] || {};\n          primary.src = im.primary || PH;\n          hover.src   = im.hover || im.primary || PH;\n          primary.alt = 'Vergoldeter Siegelring ' + btn.dataset.label;\n          primary.style.opacity = '1';\n          wrap.classList.remove('swapping');\n        }, 220);\n      }\n      \/* Konfigurator + Produktformular mitziehen *\/\n      const opt = document.querySelector('.jm-cfg-stone-option[data-stone=\"' + btn.dataset.stone + '\"]');\n      if (opt \u0026\u0026 !opt.classList.contains('active')) opt.click();\n    });\n  });\n\n  \/* ── Hero CTA ── *\/\n  document.querySelectorAll('.js-scroll-to-form').forEach(btn =\u003e {\n    btn.addEventListener('click', e =\u003e {\n      e.preventDefault();\n      const gravurInput = document.querySelector('#gravurtext_innenseite');\n      if (gravurInput \u0026\u0026 hiddenSpan) {\n        gravurInput.value            = hiddenSpan.textContent.trim();\n        gravurInput.style.fontFamily = window.currentFont;\n      }\n      const fontSelect = document.querySelector('#gravur_schriftart');\n      if (fontSelect) {\n        Array.from(fontSelect.options).forEach((opt, i) =\u003e {\n          if (window.currentFont.includes(opt.value)) fontSelect.selectedIndex = i;\n        });\n      }\n      const form = document.querySelector('#product-form, form[action*=\"\/cart\/add\"]');\n      if (!form) return;\n      form.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      const first = form.querySelector('input, textarea, select');\n      if (first) setTimeout(() =\u003e first.focus(), 500);\n    });\n  });\n\n  \/* ── Live Preview Link ── *\/\n  document.querySelectorAll('.live-preview-link').forEach(link =\u003e {\n    link.addEventListener('click', e =\u003e {\n      e.preventDefault();\n      document.getElementById('jm-cfg-wrap') \u0026\u0026\n        document.getElementById('jm-cfg-wrap').scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n  });\n\n  \/* ── Popup außerhalb \/ Scroll ── *\/\n  document.addEventListener('click', e =\u003e {\n    if (!mobilePopup) return;\n    if (!mobilePopup.contains(e.target) \u0026\u0026 e.target !== engInput) hidePopup();\n  });\n  window.addEventListener('scroll', hidePopup, { passive: true });\n\n  \/* ── Intersection Observer ── *\/\n  const io = new IntersectionObserver(entries =\u003e {\n    entries.forEach(en =\u003e { if (en.isIntersecting) en.target.classList.add('show'); });\n  }, { threshold: 0.15 });\n  document.querySelectorAll('.engraving-fade').forEach(el =\u003e io.observe(el));\n\n\n  \/* ════════════════════════════════════════════\n     3-SCHRITT KONFIGURATOR\n     ════════════════════════════════════════════ *\/\n\n  let jmStep = 1;\n  const TOTAL = 3;\n\n  function jmSetStep(n, scroll) {\n    jmStep = n;\n    document.querySelectorAll('.jm-cfg-card').forEach(c =\u003e c.classList.remove('active'));\n    const card = document.getElementById('jm-cfg-card-' + n);\n    if (card) card.classList.add('active');\n\n    for (let i = 1; i \u003c= TOTAL; i++) {\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\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\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 === 3) jmFillSummary();\n    if (n === 2) updateNext2State();\n\n    if (scroll) {\n      const wrap = document.getElementById('jm-cfg-wrap');\n      if (wrap) wrap.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n  }\n\n  \/* ── Stone Options ── *\/\n  document.querySelectorAll('.jm-cfg-stone-option').forEach(opt =\u003e {\n    opt.addEventListener('click', function () {\n      document.querySelectorAll('.jm-cfg-stone-option').forEach(o =\u003e o.classList.remove('active'));\n      this.classList.add('active');\n\n      const im = IMGS[this.dataset.stone] || {};\n      jmCfgState.stone      = this.dataset.stone;\n      jmCfgState.label      = this.dataset.label;\n      jmCfgState.imgPrimary = im.primary || PH;\n      jmCfgState.imgInner   = im.inner || im.primary || PH;\n\n      const p  = document.getElementById('jm-cfg-ring-primary');\n      const h  = document.getElementById('jm-cfg-ring-hover');\n      const lb = document.getElementById('jm-cfg-ring-label');\n      const cp = document.getElementById('jm-cfg-ring-caption');\n      if (p) { p.style.opacity = '0'; setTimeout(() =\u003e { p.src = jmCfgState.imgPrimary; p.style.opacity = '1'; }, 200); }\n      if (h)  h.src = im.hover || jmCfgState.imgPrimary;\n      if (lb) lb.textContent = this.dataset.label;\n      if (cp) cp.textContent = 'Stein: ' + this.dataset.label;\n\n      \/* Schritt-2-Vorschaubild tauschen *\/\n      const previewImg = document.getElementById('jmGoldStep2Img');\n      if (previewImg) {\n        previewImg.style.opacity = '0';\n        setTimeout(() =\u003e { previewImg.src = jmCfgState.imgInner; previewImg.style.opacity = '1'; }, 200);\n      }\n      if (popupPreviewImg) popupPreviewImg.src = jmCfgState.imgInner;\n\n      const hp = document.getElementById('heroRingPrimary');\n      const hh = document.getElementById('heroRingHover');\n      if (hp) hp.src = jmCfgState.imgPrimary;\n      if (hh) hh.src = im.hover || jmCfgState.imgPrimary;\n\n      document.querySelectorAll('.stone-btn').forEach(b =\u003e {\n        b.classList.toggle('active', b.dataset.stone === this.dataset.stone);\n      });\n\n      updateSizeAvailability();\n      if (!jmSilent) {\n        ensureAvailableSize();\n        selectVariant();\n        \/* Swatch im Produktformular mitklicken → gleiche Bildlogik wie oben *\/\n        const sw = formSwatchFor(this.dataset.stone);\n        if (sw) { jmSilent = true; sw.click(); jmSilent = false; }\n      }\n      const imNow = IMGS[this.dataset.stone] || {};\n      setTimeout(() =\u003e setPanels(imNow.inner || imNow.primary), 80);\n      if (typeof window.jmArcOnStone === 'function') window.jmArcOnStone();\n      if (typeof applyAllArcs === 'function') applyAllArcs();\n    });\n  });\n\n  \/* ── Summary ── *\/\n  function jmFillSummary() {\n    const stoneEl = document.getElementById('jm-cfg-s3-stone');\n    if (stoneEl) stoneEl.textContent = jmCfgState.label;\n    const sizeEl = document.getElementById('jm-cfg-s3-size');\n    const sz = SIZES[jmCfgState.size];\n    if (sizeEl \u0026\u0026 sz) sizeEl.textContent = sz.umfang + ' · Ø ' + sz.d;\n\n    const thumb = document.getElementById('jm-cfg-s3-thumb');\n    if (thumb) thumb.src = jmCfgState.imgPrimary;\n\n    const gravurText = hiddenSpan ? hiddenSpan.textContent.trim() : '';\n    const gravurEl   = document.getElementById('jm-cfg-s3-gravur-text');\n    const gravurMeta = document.getElementById('jm-cfg-s3-gravur-meta');\n    if (gravurEl) { gravurEl.textContent = gravurText || '–'; gravurEl.style.fontFamily = window.currentFont; }\n\n    const fontName = window.currentFont.replace(\/['\"]\/g, '').split(',')[0].trim();\n    if (gravurMeta) gravurMeta.textContent = 'Schriftart: ' + fontName + ' · ' + gravurText.length + ' Zeichen';\n\n    const fp = document.getElementById('jm-cfg-s3-font-preview');\n    if (fp) { fp.textContent = fontName; fp.style.fontFamily = window.currentFont; }\n\n    const priceSource = document.querySelector('.price__pricing-group');\n    const priceTarget = document.getElementById('jm-cfg-s3-price');\n    if (priceSource \u0026\u0026 priceTarget) priceTarget.innerHTML = priceSource.innerHTML;\n  }\n\n  \/* ── Navigation ── *\/\n  const next1 = document.getElementById('jm-cfg-next-1');\n  const next2 = document.getElementById('jm-cfg-next-2');\n  const back2 = document.getElementById('jm-cfg-back-2');\n  const back3 = document.getElementById('jm-cfg-back-3');\n\n  if (next1) next1.addEventListener('click', () =\u003e jmSetStep(2, true));\n  if (back2) back2.addEventListener('click', () =\u003e jmSetStep(1, true));\n\n  if (next2) next2.addEventListener('click', () =\u003e {\n    const gravurInput = document.querySelector('#gravurtext_innenseite');\n    if (gravurInput \u0026\u0026 hiddenSpan) {\n      gravurInput.value            = hiddenSpan.textContent.trim();\n      gravurInput.style.fontFamily = window.currentFont;\n    }\n    const fontSelect = document.querySelector('#gravur_schriftart');\n    if (fontSelect) {\n      Array.from(fontSelect.options).forEach((opt, i) =\u003e {\n        if (window.currentFont.includes(opt.value)) fontSelect.selectedIndex = i;\n      });\n    }\n    jmSetStep(3, true);\n  });\n\n  if (back3) back3.addEventListener('click', () =\u003e jmSetStep(2, true));\n\n  \/* ── Popup CTA ── *\/\n  const popupNext = document.getElementById('jm-cfg-popup-next');\n  if (popupNext) {\n    popupNext.addEventListener('click', () =\u003e {\n      hidePopup();\n      if (jmStep === 2) {\n        const gravurInput = document.querySelector('#gravurtext_innenseite');\n        if (gravurInput \u0026\u0026 hiddenSpan) {\n          gravurInput.value            = hiddenSpan.textContent.trim();\n          gravurInput.style.fontFamily = window.currentFont;\n        }\n        jmSetStep(3, true);\n      }\n    });\n  }\n\n  \/* ── Schritt 3 CTA ── *\/\n  const s3Cta = document.getElementById('jm-cfg-s3-cta-btn');\n  if (s3Cta) {\n    s3Cta.addEventListener('click', () =\u003e {\n      const gravurInput = document.querySelector('#gravurtext_innenseite');\n      if (gravurInput \u0026\u0026 hiddenSpan) {\n        const val = hiddenSpan.textContent.trim();\n        gravurInput.value            = val;\n        gravurInput.style.fontFamily = window.currentFont;\n        gravurInput.dispatchEvent(new Event('input',  { bubbles: true }));\n        gravurInput.dispatchEvent(new Event('change', { bubbles: true }));\n        const maxNote = gravurInput.parentElement \u0026\u0026 gravurInput.parentElement.querySelector('.max-length-note');\n        if (maxNote) maxNote.textContent = maxNote.textContent.replace(\/\\d+(?=\\s*\\\/|\\s*Zeichen)\/, val.length);\n      }\n      const fontSelect = document.querySelector('#gravur_schriftart');\n      if (fontSelect) {\n        Array.from(fontSelect.options).forEach((opt, i) =\u003e {\n          if (window.currentFont.includes(opt.value)) fontSelect.selectedIndex = i;\n        });\n        fontSelect.dispatchEvent(new Event('change', { bubbles: true }));\n      }\n      selectVariant();\n      document.querySelectorAll('.font-btn').forEach(btn =\u003e {\n        btn.classList.toggle('active', window.currentFont.includes(btn.dataset.font || ''));\n      });\n      const form = document.querySelector('#product-form, form[action*=\"\/cart\/add\"]');\n      if (!form) return;\n      form.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n  }\n\n  \/* ════════════════════════════════════════════\n     VARIANTEN-LOGIK (Stein + Größe ↔ Produktformular)\n     ════════════════════════════════════════════ *\/\n  let jmSilent = false;\n  const productForm = document.querySelector('#product-form, form[action*=\"\/cart\/add\"]');\n\n  function hasKey(str, keys) {\n    const s = String(str || '').toLowerCase();\n    return keys.some(k =\u003e s.indexOf(k) \u003e -1);\n  }\n  function stoneOfVariant(v) {\n    for (const k in STONES) { if (v.options.some(o =\u003e hasKey(o, STONES[k].keys))) return k; }\n    return null;\n  }\n  function sizeOfVariant(v) {\n    for (const k in SIZES) { if (v.options.some(o =\u003e hasKey(String(o).replace(',', '.'), SIZES[k].keys))) return k; }\n    return null;\n  }\n  function findVariant(stone, size) {\n    if (!PRODUCT) return null;\n    return PRODUCT.variants.find(v =\u003e stoneOfVariant(v) === stone \u0026\u0026 sizeOfVariant(v) === size) || null;\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  \/* Produktformular auf Stein + Größe setzen *\/\n  function selectVariant() {\n    const v = findVariant(jmCfgState.stone, jmCfgState.size);\n    if (!v || !productForm) return;\n    const vals = v.options.map(String);\n    productForm.querySelectorAll('select').forEach(sel =\u003e {\n      if (sel.name === 'id') return;\n      Array.from(sel.options).forEach((o, i) =\u003e {\n        if (vals.indexOf(o.value) \u003e -1 \u0026\u0026 sel.selectedIndex !== i) {\n          sel.selectedIndex = i;\n          sel.dispatchEvent(new Event('change', { bubbles: true }));\n        }\n      });\n    });\n    productForm.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      }\n    });\n    const idSel = productForm.querySelector('select[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  }\n\n  \/* Größen ohne Bestand für den gewählten Stein ausgrauen *\/\n  function updateSizeAvailability() {\n    document.querySelectorAll('.jm-gs-size').forEach(b =\u003e {\n      const v = findVariant(jmCfgState.stone, b.dataset.size);\n      b.classList.toggle('unavailable', !!PRODUCT \u0026\u0026 (!v || !v.available));\n    });\n  }\n\n  \/* Gewählte Größe für diesen Stein ausverkauft → erste verfügbare Größe nehmen *\/\n  function ensureAvailableSize() {\n    if (!PRODUCT) return;\n    const cur = findVariant(jmCfgState.stone, jmCfgState.size);\n    if (cur \u0026\u0026 cur.available) return;\n    const alt = Object.keys(SIZES).find(k =\u003e { const v = findVariant(jmCfgState.stone, k); return v \u0026\u0026 v.available; });\n    if (alt) applySize(alt);\n  }\n\n  \/* Größenanzeige überall aktualisieren *\/\n  function applySize(key) {\n    const sz = SIZES[key];\n    if (!sz) return;\n    jmCfgState.size = key;\n    document.querySelectorAll('.jm-gs-size').forEach(b =\u003e b.classList.toggle('active', b.dataset.size === key));\n    document.querySelectorAll('.jm-rsz-tr[data-size]').forEach(tr =\u003e tr.classList.toggle('jm-rsz-hl', tr.dataset.size === key));\n    const set = (id, txt) =\u003e { const el = document.getElementById(id); if (el) el.textContent = txt; };\n    set('jm-gs-svg-umfang', 'UMFANG ≈ ' + sz.umfang);\n    set('jm-gs-svg-d', 'Ø ' + sz.d);\n    set('jm-gs-anno-umfang', 'Umfang = ' + sz.umfang);\n    set('jm-gs-anno-d', 'Ø ' + sz.d);\n    const strip = document.getElementById('jm-gs-size-strip');\n    if (strip) strip.innerHTML = '\u003cstrong\u003eGröße ' + sz.umfang + '\u003c\/strong\u003e · Ø ' + sz.d + ' · Ringbreite 21 mm · 316L vergoldet';\n  }\n\n  function chooseSize(key, el) {\n    const v = findVariant(jmCfgState.stone, key);\n    if (PRODUCT \u0026\u0026 (!v || !v.available)) {\n      if (el) { el.classList.remove('jm-gs-shake'); void el.offsetWidth; el.classList.add('jm-gs-shake'); }\n      return;\n    }\n    applySize(key);\n    selectVariant();\n  }\n\n  document.querySelectorAll('.jm-gs-size').forEach(b =\u003e b.addEventListener('click', () =\u003e chooseSize(b.dataset.size, b)));\n  document.querySelectorAll('.jm-rsz-tr[data-size]').forEach(tr =\u003e tr.addEventListener('click', () =\u003e chooseSize(tr.dataset.size, tr)));\n\n  \/* Produktformular → Konfigurator (Dropdown\/Swatches geändert) *\/\n  let lastVariantId = null;\n  function syncFromForm() {\n    if (!PRODUCT || !productForm) return;\n    const idField = productForm.querySelector('[name=\"id\"]');\n    const id = idField ? String(idField.value) : null;\n    if (!id || id === lastVariantId) return;\n    lastVariantId = id;\n    const v = PRODUCT.variants.find(x =\u003e String(x.id) === id);\n    if (!v) return;\n    const stone = stoneOfVariant(v), size = sizeOfVariant(v);\n    jmSilent = true;\n    if (stone \u0026\u0026 stone !== jmCfgState.stone) {\n      const opt = document.querySelector('.jm-cfg-stone-option[data-stone=\"' + stone + '\"]');\n      if (opt) opt.click();\n    }\n    jmSilent = false;\n    if (size) applySize(size);\n    updateSizeAvailability();\n    const imF = IMGS[jmCfgState.stone] || {};\n    setTimeout(() =\u003e setPanels(imF.inner || imF.primary), 120);\n  }\n  if (productForm) {\n    productForm.addEventListener('change', () =\u003e setTimeout(syncFromForm, 60));\n    setInterval(syncFromForm, 500);\n  }\n\n  \/* ── Fallback: Bilder aus den Farb-Swatches im Produktformular ──\n     (die Swatches tragen das Variantenbild in data-img-primary) *\/\n  function formSwatchFor(stone) {\n    if (!productForm || !STONES[stone]) return null;\n    const els = productForm.querySelectorAll('[data-img-primary]');\n    for (const el of els) {\n      const inp = el.querySelector('input');\n      const txt = [el.dataset.value, el.dataset.label, el.getAttribute('title'), el.getAttribute('aria-label'),\n                   inp \u0026\u0026 inp.value, el.textContent].join(' ');\n      if (hasKey(txt, STONES[stone].keys)) return el;\n    }\n    return null;\n  }\n  function fillFromSwatches() {\n    Object.keys(STONES).forEach(k =\u003e {\n      const sw = formSwatchFor(k);\n      if (!sw || !sw.dataset.imgPrimary) return;\n      const url = imgUrl(sw.dataset.imgPrimary);\n      const cur = IMGS[k] || {};\n      if (!cur.primary) IMGS[k] = { primary: url, inner: INNER_FIXED || cur.inner || url, hover: cur.hover || INNER_FIXED || cur.inner || url };\n    });\n  }\n\n  \/* ── Live-Vorschau oben im Produktformular (Desktop-Panel + Mobile-Popup) ──\n     Nutzt die vorhandene Funktion window.syncPanelImages aus dem Gravur-Snippet\n     und den Freigabe-Flag, damit der Bildschutz dort das Bild nicht zurücksetzt. *\/\n  function setPanels(url) {\n    if (!url || url === PH) return;\n    window.jmAllowPanelChange = true;\n    if (typeof window.syncPanelImages === 'function') {\n      window.syncPanelImages(url);\n    } else {\n      const d = document.getElementById('jm-desktop-preview-img');\n      const m = document.querySelector('#jm-mobile-form-popup img');\n      if (d) d.src = url;\n      if (m) m.src = url;\n    }\n    clearTimeout(setPanels._t);\n    setPanels._t = setTimeout(() =\u003e { window.jmAllowPanelChange = false; }, 700);\n    guardPanels();\n  }\n\n  \/* Wächter: setzt ein fremdes Skript (z. B. das Gravur-Snippet beim Öffnen des Panels)\n     ein anderes Bild, wird sofort wieder das Bild dieses Produkts eingesetzt. *\/\n  function panelWant() {\n    const im = IMGS[jmCfgState.stone] || {};\n    return im.inner || im.primary || '';\n  }\n  function guardOne(img) {\n    if (!img || img._jmGuard) return;\n    img._jmGuard = true;\n    new MutationObserver(() =\u003e {\n      const want = panelWant();\n      if (!want || img._jmBusy) return;\n      const a = document.createElement('a'); a.href = want;\n      if (img.src === a.href) return;\n      img._jmBusy = true;\n      window.jmAllowPanelChange = true;\n      img.src = want;\n      setTimeout(() =\u003e { img._jmBusy = false; window.jmAllowPanelChange = false; }, 60);\n    }).observe(img, { attributes: true, attributeFilter: ['src'] });\n  }\n  function guardPanels() {\n    guardOne(document.getElementById('jm-desktop-preview-img'));\n    guardOne(document.querySelector('#jm-mobile-form-popup img'));\n  }\n\n  \/* Bilder setzen, sobald Produktdaten da sind *\/\n  function applyImages() {\n    const im = IMGS[jmCfgState.stone] || {};\n    const set = (id, src) =\u003e { const el = document.getElementById(id); if (el \u0026\u0026 src) el.src = src; };\n    set('heroRingPrimary', im.primary);\n    set('heroRingHover', im.hover || im.primary);\n    set('jm-cfg-ring-primary', im.primary);\n    set('jm-cfg-ring-hover', im.hover || im.primary);\n    set('jmGoldStep2Img', im.inner || im.primary);\n    set('jmGoldPopupImg', im.inner || im.primary);\n    set('jm-cfg-s3-thumb', im.primary);\n    setPanels(im.inner || im.primary);\n    jmCfgState.imgPrimary = im.primary || PH;\n    jmCfgState.imgInner   = im.inner || im.primary || PH;\n  }\n\n  function loadProduct() {\n    const el = document.querySelector('script[id^=\"ProductJson\"], script[data-product-json]');\n    if (el) { try { return Promise.resolve(JSON.parse(el.textContent)); } catch (e) {} }\n    return fetch(location.pathname.replace(\/\\\/$\/, '') + '.js').then(r =\u003e r.json());\n  }\n\n  loadProduct().then(p =\u003e {\n    PRODUCT = p;\n    const media = (p.media || []).map(m =\u003e ({ alt: String(m.alt || ''), src: m.src || (m.preview_image \u0026\u0026 m.preview_image.src) }));\n    const first = imgUrl(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\n    Object.keys(STONES).forEach(k =\u003e {\n      const keys = STONES[k].keys;\n      const v = p.variants.find(x =\u003e stoneOfVariant(x) === k \u0026\u0026 x.featured_image);\n      const altMain  = media.find(m =\u003e hasKey(m.alt, keys) \u0026\u0026 !hasKey(m.alt, ['innen']));\n      \/* Nur Bilder mit Alt-Text \"Innenseite vergoldet \u003cFarbe\u003e\" – schließt kopierte Edelstahl-Bilder aus *\/\n      const altInner = media.find(m =\u003e hasKey(m.alt, keys) \u0026\u0026 hasKey(m.alt, ['innenseite']) \u0026\u0026 hasKey(m.alt, ['vergoldet']));\n      const primary  = v ? imgUrl(v.featured_image.src) : (altMain ? imgUrl(altMain.src) : first);\n      const inner    = INNER_FIXED || (altInner ? imgUrl(altInner.src) : primary);\n      IMGS[k] = { primary: primary, inner: inner, hover: inner !== primary ? inner : primary };\n      INNER_IMGS[k] = inner;\n    });\n\n    \/* Startzustand aus der aktuell gewählten Variante *\/\n    const idField = productForm \u0026\u0026 productForm.querySelector('[name=\"id\"]');\n    const cur = idField \u0026\u0026 p.variants.find(x =\u003e String(x.id) === String(idField.value));\n    const startStone = (cur \u0026\u0026 stoneOfVariant(cur)) || 'onyx';\n    const startSize  = (cur \u0026\u0026 sizeOfVariant(cur)) || 's1';\n    lastVariantId = cur ? String(cur.id) : null;\n\n    jmSilent = true;\n    const opt = document.querySelector('.jm-cfg-stone-option[data-stone=\"' + startStone + '\"]');\n    if (opt) opt.click();\n    jmSilent = false;\n    applySize(startSize);\n    applyImages();\n    updateSizeAvailability();\n  }).catch(err =\u003e { console.warn('[JM Siegelring] Produktdaten nicht geladen:', err); });\n\n  \/* ════════════════════════════════════════════\n     GRAVUR-BOGEN: Werte pro Farbe anwenden\n     ════════════════════════════════════════════ *\/\n  const ARC_TARGETS = {\n    step2_desktop: { label: 'Schritt 2 · Desktop', el: 'engravingArcTextEl', path: 'ringArcPath' },\n    step2_mobile:  { label: 'Schritt 2 · Mobile',  el: 'engravingArcTextEl', path: 'ringArcPath' },\n    popup:         { label: 'Mobile-Popup (mit „Zur Bestätigung“)', el: 'popupArcTextEl', path: 'popupArcPath' },\n    panel:         { label: 'Live-Vorschau oben · Desktop', el: 'jm-desktop-arc-text', box: '#jm-desktop-preview-panel' },\n    mfp:           { label: 'Theme-Popup oben · Mobile',    el: 'jm-mfp-text',         box: '#jm-mobile-form-popup' }\n  };\n  const ARC_FALLBACK = { cx: 50, cy: 40, w: 60, tilt: 0, bulge: 10, rot: 0, size: 6, offset: 50, spacing: 0 };\n  const arcOverride = {};   \/* Live-Werte aus dem Tweak-Panel *\/\n\n  function arcParts(name) {\n    const t = ARC_TARGETS[name];\n    if (!t) return null;\n    \/* 1. Bogen-Text (textPath) im Container suchen, 2. per ID, 3. normales Text-Element *\/\n    const box = t.box ? document.querySelector(t.box) : null;\n    let el = box ? box.querySelector('textPath, textpath') : null;\n    if (!el) el = document.getElementById(t.el);\n    if (!el) return null;\n    const svg = el.closest('svg');\n    if (!svg) {\n      \/* Kein SVG: Text ist ein normales HTML-Element → Position\/Drehung\/Größe per CSS *\/\n      return { html: true, el: el, box: box || el.parentElement };\n    }\n    const tp = el.tagName.toLowerCase() === 'textpath' ? el : el.querySelector('textPath, textpath');\n    const text = tp ? tp.closest('text') : (el.tagName.toLowerCase() === 'text' ? el : null);\n    if (!tp || !text) return null;\n    let path = t.path ? document.getElementById(t.path) : null;\n    if (!path) {\n      const ref = (tp.getAttribute('href') || tp.getAttribute('xlink:href') || '').replace('#', '');\n      path = (ref \u0026\u0026 document.getElementById(ref)) || svg.querySelector('path');\n    }\n    if (!path) return null;\n    const vb = svg.viewBox \u0026\u0026 svg.viewBox.baseVal;\n    return { svg, tp, text, path, vw: (vb \u0026\u0026 vb.width) || 100, vh: (vb \u0026\u0026 vb.height) || 100 };\n  }\n\n  function arcValues(name, stone) {\n    if (arcOverride[name]) return arcOverride[name];\n    const cfg = (window.JM_ARC || {})[name] || {};\n    return cfg[stone] || cfg.default || null;\n  }\n\n  function applyArc(name, v) {\n    const p = arcParts(name);\n    if (!p || !v) return;\n    if (p.html) {\n      const W = (p.box \u0026\u0026 p.box.getBoundingClientRect().width) || window.innerWidth * 0.9;\n      p.el.style.position = 'absolute';\n      p.el.style.left = v.cx + '%';\n      p.el.style.top = v.cy + '%';\n      p.el.style.transform = 'translate(-50%, -50%) rotate(' + v.rot + 'deg)';\n      p.el.style.fontSize = (v.size * W \/ 100).toFixed(2) + 'px';\n      p.el.style.letterSpacing = (v.spacing * W \/ 100).toFixed(2) + 'px';\n      p.el.style.whiteSpace = 'nowrap';\n      return;\n    }\n    const kx = p.vw \/ 100, ky = p.vh \/ 100;\n    const x1 = (v.cx - v.w \/ 2) * kx, x2 = (v.cx + v.w \/ 2) * kx;\n    const y1 = (v.cy + v.tilt \/ 2) * ky, y2 = (v.cy - v.tilt \/ 2) * ky;\n    const qx = (x1 + x2) \/ 2, qy = (y1 + y2) \/ 2 - v.bulge * ky;\n    p.path.setAttribute('d', 'M ' + x1.toFixed(2) + ',' + y1.toFixed(2) + ' Q ' + qx.toFixed(2) + ',' + qy.toFixed(2) + ' ' + x2.toFixed(2) + ',' + y2.toFixed(2));\n    p.text.style.transform = '';\n    p.text.setAttribute('transform', 'rotate(' + v.rot + ' ' + (v.cx * kx).toFixed(2) + ' ' + (v.cy * ky).toFixed(2) + ')');\n    p.text.style.fontSize = (v.size * kx).toFixed(2) + 'px';\n    p.text.style.letterSpacing = (v.spacing * kx).toFixed(2) + 'px';\n    p.tp.setAttribute('startOffset', v.offset + '%');\n    p.tp.setAttribute('text-anchor', 'middle');\n  }\n\n  function step2Mode() { return window.innerWidth \u003e 768 ? 'step2_desktop' : 'step2_mobile'; }\n\n  function applyAllArcs() {\n    const st = jmCfgState.stone;\n    applyArc(step2Mode(), arcValues(step2Mode(), st));\n    ['popup', 'panel', 'mfp'].forEach(n =\u003e applyArc(n, arcValues(n, st)));\n  }\n\n  window.addEventListener('resize', () =\u003e { clearTimeout(applyAllArcs._r); applyAllArcs._r = setTimeout(applyAllArcs, 150); });\n  if (productForm) productForm.addEventListener('input', () =\u003e setTimeout(applyAllArcs, 60));\n  document.addEventListener('DOMContentLoaded', () =\u003e setTimeout(applyAllArcs, 200));\n  window.addEventListener('load', () =\u003e setTimeout(applyAllArcs, 400));\n\n  \/* ── Tweak-Panel: ?jmtweak=1 ── *\/\n  \/* Tweak-Modus merken: Shopify ersetzt beim Variantenwechsel die URL (?variant=…),\n     dadurch würde ?jmtweak=1 nach einem Neuladen fehlen. ?jmtweak=0 schaltet ihn wieder aus. *\/\n  let jmTweakOn = false;\n  try {\n    if (\/[?\u0026]jmtweak=0\/.test(location.search)) sessionStorage.removeItem('jmtweak');\n    else if (\/[?\u0026]jmtweak\/.test(location.search)) sessionStorage.setItem('jmtweak', '1');\n    jmTweakOn = sessionStorage.getItem('jmtweak') === '1';\n  } catch (e) { jmTweakOn = \/[?\u0026]jmtweak(?!=0)\/.test(location.search); }\n\n  if (jmTweakOn) {\n    const FIELDS = [\n      ['cx', 'Mitte horizontal %', 0, 100, 0.5], ['cy', 'Mitte vertikal %', 0, 100, 0.5],\n      ['w', 'Breite %', 5, 120, 0.5], ['tilt', 'Winkel', -40, 40, 0.5],\n      ['bulge', 'Wölbung', -80, 80, 0.5], ['rot', 'Drehung °', -60, 60, 1],\n      ['size', 'Schriftgröße', 0.5, 15, 0.05], ['offset', 'Position auf Bogen %', 0, 100, 0.5],\n      ['spacing', 'Zeichenabstand', -1, 3, 0.05]\n    ];\n    const css = document.createElement('style');\n    css.textContent = '#jm-arc-tweak{position:fixed;right:20px;top:90px;z-index:2147483647;width:270px;max-width:calc(100vw - 20px);max-height:85vh;overflow:auto;background:rgba(17,17,17,.94);color:#eee;border:1px solid #c9a84c;border-radius:12px;padding:0 12px 12px;font:12px\/1.4 Inter,sans-serif;box-shadow:0 10px 30px rgba(0,0,0,.4)}'\n      + '#jm-at-head{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 -12px 4px;padding:10px 12px;background:#1b1b1b;border-bottom:1px solid #333;cursor:move;touch-action:none;user-select:none}'\n      + '#jm-at-head strong{color:#c9a84c}'\n      + '#jm-at-min,#jm-at-flip{width:auto!important;margin:0!important;padding:4px 12px!important;background:#333!important;color:#eee!important;font-size:14px!important}'\n      + '#jm-arc-tweak.jm-min{max-height:none;overflow:visible}#jm-arc-tweak.jm-min #jm-at-body{display:none}'\n      + '@media (max-width:768px){#jm-arc-tweak{width:230px;max-height:45vh;top:70px;right:8px;background:rgba(17,17,17,.85)}}'\n      + '#jm-arc-tweak select,#jm-arc-tweak button{width:100%;margin-top:6px;padding:5px;border-radius:6px;border:0;font:inherit}'\n      + '#jm-arc-tweak button{background:#c9a84c;color:#111;font-weight:600;cursor:pointer}'\n      + '#jm-arc-tweak label{display:flex;justify-content:space-between;margin-top:7px}'\n      + '#jm-arc-tweak input[type=range]{width:100%;cursor:pointer}'\n      + '#jm-arc-tweak code{display:block;margin-top:8px;padding:6px;background:#222;border-radius:6px;font-size:10.5px;white-space:pre-wrap;cursor:text;word-break:break-all}'\n      + '#jm-arc-tweak .jm-hint{color:#c9a84c;margin-top:6px;font-size:11px}';\n    document.head.appendChild(css);\n\n    const tw = document.createElement('div');\n    tw.id = 'jm-arc-tweak';\n    let html = '\u003cdiv id=\"jm-at-head\"\u003e\u003cstrong\u003e⠿ Gravur-Position\u003c\/strong\u003e\u003cspan\u003e\u003cbutton type=\"button\" id=\"jm-at-flip\" title=\"oben\/unten\"\u003e⇅\u003c\/button\u003e \u003cbutton type=\"button\" id=\"jm-at-min\" title=\"einklappen\"\u003e–\u003c\/button\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv id=\"jm-at-body\"\u003e'\n      + '\u003cselect id=\"jm-at-target\"\u003e' + Object.keys(ARC_TARGETS).map(k =\u003e '\u003coption value=\"' + k + '\"\u003e' + ARC_TARGETS[k].label + '\u003c\/option\u003e').join('') + '\u003c\/select\u003e'\n      + '\u003cselect id=\"jm-at-scope\"\u003e\u003coption value=\"stone\"\u003eNur aktuelle Farbe\u003c\/option\u003e\u003coption value=\"default\"\u003eAlle Farben (default)\u003c\/option\u003e\u003c\/select\u003e'\n      + '\u003cdiv class=\"jm-hint\" id=\"jm-at-info\"\u003e\u003c\/div\u003e';\n    FIELDS.forEach(f =\u003e {\n      html += '\u003clabel\u003e' + f[1] + ' \u003cspan id=\"jm-at-v-' + f[0] + '\"\u003e\u003c\/span\u003e\u003c\/label\u003e'\n           +  '\u003cinput type=\"range\" data-k=\"' + f[0] + '\" min=\"' + f[2] + '\" max=\"' + f[3] + '\" step=\"' + f[4] + '\"\u003e';\n    });\n    html += '\u003ccode id=\"jm-at-out\"\u003e\u003c\/code\u003e\u003cbutton type=\"button\" id=\"jm-at-copy\"\u003eWerte kopieren\u003c\/button\u003e\u003c\/div\u003e';\n    tw.innerHTML = html;\n    document.body.appendChild(tw);\n\n    \/* Sicherheitsnetz: liegt das Panel außerhalb des sichtbaren Bereichs, zurück nach oben rechts *\/\n    function keepVisible() {\n      const r = tw.getBoundingClientRect();\n      if (r.bottom \u003c 40 || r.top \u003e window.innerHeight - 40 || r.right \u003c 60 || r.left \u003e window.innerWidth - 60) {\n        tw.style.left = 'auto'; tw.style.right = '8px'; tw.style.top = '70px'; tw.style.bottom = 'auto';\n      }\n    }\n    setTimeout(keepVisible, 300);\n    window.addEventListener('resize', keepVisible);\n\n    const selT = tw.querySelector('#jm-at-target'), selS = tw.querySelector('#jm-at-scope');\n    Array.from(selT.options).forEach(o =\u003e {\n      if (!arcParts(o.value)) o.textContent = ARC_TARGETS[o.value].label + ' – nicht auf dieser Seite';\n    });\n    let cur = {};\n\n    \/* Live-Vorschau-Popup (mobil) schließt sonst nach 3 s – beim Einstellen offen halten *\/\n    function keepOpen() {\n      if (selT.value !== 'mfp') return;\n      const pop = document.getElementById('jm-mobile-form-popup');\n      if (!pop) return;\n      clearTimeout(pop._t);\n      pop.style.display = 'block';\n    }\n    function loadTarget() {\n      const name = selT.value;\n      keepOpen();\n      cur = Object.assign({}, ARC_FALLBACK, arcValues(name, jmCfgState.stone) || {});\n      FIELDS.forEach(f =\u003e {\n        tw.querySelector('[data-k=\"' + f[0] + '\"]').value = cur[f[0]];\n        tw.querySelector('#jm-at-v-' + f[0]).textContent = cur[f[0]];\n      });\n      const found = !!arcParts(name);\n      const parts = arcParts(name);\n      tw.querySelector('#jm-at-info').textContent = (found ? (parts \u0026\u0026 parts.html ? 'Text ohne Bogen: Breite\/Winkel\/Wölbung\/Position wirken hier nicht · ' : '') : '⚠ Element nicht gefunden – ') + 'Farbe: ' + jmCfgState.label\n        + (name.indexOf('step2') === 0 ? ' · Schritt 2 öffnen' : ' · Gravurtext eingeben, damit es sichtbar ist');\n      writeOut();\n    }\n    function writeOut() {\n      const key = selS.value === 'default' ? 'default' : jmCfgState.stone;\n      const vals = FIELDS.map(f =\u003e f[0] + ': ' + cur[f[0]]).join(', ');\n      tw.querySelector('#jm-at-out').textContent = 'JM_ARC.' + selT.value + '.' + key + ' = { ' + vals + ' };';\n    }\n    tw.addEventListener('input', e =\u003e {\n      const k = e.target.dataset \u0026\u0026 e.target.dataset.k;\n      if (!k) return;\n      cur[k] = parseFloat(e.target.value);\n      keepOpen();\n      tw.querySelector('#jm-at-v-' + k).textContent = cur[k];\n      arcOverride[selT.value] = Object.assign({}, cur);\n      applyArc(selT.value, cur);\n      writeOut();\n    });\n    selT.addEventListener('change', loadTarget);\n    selS.addEventListener('change', writeOut);\n    tw.querySelector('#jm-at-copy').addEventListener('click', function () {\n      if (navigator.clipboard) navigator.clipboard.writeText(tw.querySelector('#jm-at-out').textContent);\n      const b = this; b.textContent = 'Kopiert ✓';\n      setTimeout(() =\u003e { b.textContent = 'Werte kopieren'; }, 1500);\n    });\n    \/* Farbwechsel → Live-Werte verwerfen, Werte der neuen Farbe laden *\/\n    window.jmArcOnStone = () =\u003e { Object.keys(arcOverride).forEach(k =\u003e delete arcOverride[k]); loadTarget(); };\n\n    \/* verschiebbar per Maus UND Finger – nur über die Kopfzeile, damit die Regler normal bedienbar bleiben *\/\n    const head = tw.querySelector('#jm-at-head');\n    let drag = false, ox = 0, oy = 0;\n    function dragStart(x, y) {\n      const r = tw.getBoundingClientRect();\n      tw.style.left = r.left + 'px'; tw.style.top = r.top + 'px';\n      tw.style.right = 'auto'; tw.style.bottom = 'auto';\n      drag = true; ox = x - r.left; oy = y - r.top;\n    }\n    function dragMove(x, y) {\n      if (!drag) return;\n      const maxX = window.innerWidth - 60, maxY = window.innerHeight - 40;\n      tw.style.left = Math.min(Math.max(x - ox, -tw.offsetWidth + 60), maxX) + 'px';\n      tw.style.top  = Math.min(Math.max(y - oy, 0), maxY) + 'px';\n    }\n    const isBtn = t =\u003e t.closest \u0026\u0026 t.closest('button');\n    \/* Maus *\/\n    head.addEventListener('mousedown', e =\u003e { if (isBtn(e.target)) return; dragStart(e.clientX, e.clientY); e.preventDefault(); });\n    document.addEventListener('mousemove', e =\u003e dragMove(e.clientX, e.clientY));\n    document.addEventListener('mouseup', () =\u003e { drag = false; });\n    \/* Finger (iOS \/ Android) *\/\n    head.addEventListener('touchstart', e =\u003e {\n      if (isBtn(e.target)) return;\n      const t = e.touches[0]; dragStart(t.clientX, t.clientY); e.preventDefault();\n    }, { passive: false });\n    document.addEventListener('touchmove', e =\u003e {\n      if (!drag) return;\n      const t = e.touches[0]; dragMove(t.clientX, t.clientY); e.preventDefault();\n    }, { passive: false });\n    document.addEventListener('touchend', () =\u003e { drag = false; });\n\n    \/* ⇅ : Panel mit einem Tipp zwischen oben und unten wechseln *\/\n    tw.querySelector('#jm-at-flip').addEventListener('click', () =\u003e {\n      const r = tw.getBoundingClientRect();\n      const toTop = r.top \u003e window.innerHeight \/ 2;\n      tw.style.left = 'auto'; tw.style.right = '8px';\n      if (toTop) { tw.style.top = '10px'; tw.style.bottom = 'auto'; }\n      else { tw.style.top = 'auto'; tw.style.bottom = '10px'; }\n    });\n\n    \/* Minimieren: nur Kopfzeile sichtbar, Bild darunter frei *\/\n    tw.querySelector('#jm-at-min').addEventListener('click', function () {\n      const min = tw.classList.toggle('jm-min');\n      this.textContent = min ? '+' : '–';\n    });\n\n    loadTarget();\n  }\n\n  \/* ── Init ── *\/\n  document.addEventListener('DOMContentLoaded', () =\u003e setTimeout(applyImages, 150));\n  window.addEventListener('load', () =\u003e setTimeout(applyImages, 300));\n  fillFromSwatches();\n  applyImages();\n  applySize('s1');\n  jmSetStep(1, false);\n  applyAllArcs();\n\n})();\n  \/* ── Scroll Reveal (Features + Specs) ── *\/\nconst revealObs = new IntersectionObserver(entries =\u003e {\n  entries.forEach(entry =\u003e {\n    if (entry.isIntersecting) {\n      entry.target.classList.add('in');\n      revealObs.unobserve(entry.target);\n    }\n  });\n}, { threshold: 0.12 });\n\ndocument.querySelectorAll('.reveal-left, .reveal-right').forEach(el =\u003e {\n  revealObs.observe(el);\n});\n\n\n\/* ── 3D Card Tilt (nur Desktop) ── *\/\nif (window.innerWidth \u003e 1024) {\n  document.querySelectorAll('.card-3d').forEach(card =\u003e {\n\n    card.addEventListener('mousemove', e =\u003e {\n      const rect = card.getBoundingClientRect();\n      const x = (e.clientX - rect.left - rect.width \/ 2) \/ (rect.width \/ 2);\n      const y = (e.clientY - rect.top - rect.height \/ 2) \/ (rect.height \/ 2);\n\n      card.style.transform =\n        `translateY(-8px) rotateX(${ -y * 6 }deg) rotateY(${ x * 6 }deg)`;\n\n      card.style.transition = 'transform .08s ease';\n    });\n\n    card.addEventListener('mouseleave', () =\u003e {\n      card.style.transform = '';\n      card.style.transition = 'transform .5s cubic-bezier(.23,1,.32,1)';\n    });\n\n  });\n}\n  document.addEventListener(\"DOMContentLoaded\", function () {\n\n  \/* ── Scroll reveal ── *\/\n  const revealObs = new IntersectionObserver(entries =\u003e {\n    entries.forEach(e =\u003e {\n      if (e.isIntersecting) {\n        e.target.classList.add('in');\n        revealObs.unobserve(e.target);\n      }\n    });\n  }, { threshold: 0.25 });\n\n  document.querySelectorAll(\n    '.reveal, .reveal-left, .reveal-right, .reveal-scale'\n  ).forEach(el =\u003e revealObs.observe(el));\n\n});\n \n  \n\u003c\/script\u003e","brand":"Juwelier Milano","offers":[{"title":"vergoldet schwarz-onyx \/ 59.6 mm","offer_id":57448265154825,"sku":null,"price":99.0,"currency_code":"EUR","in_stock":true},{"title":"vergoldet schwarz-onyx \/ 62 mm","offer_id":57448341537033,"sku":null,"price":99.0,"currency_code":"EUR","in_stock":true},{"title":"vergoldet schwarz-onyx \/ 64.6 mm","offer_id":57448341569801,"sku":null,"price":99.0,"currency_code":"EUR","in_stock":true},{"title":"vergoldet tigerauge \/ 59.6 mm","offer_id":57448265187593,"sku":null,"price":99.0,"currency_code":"EUR","in_stock":true},{"title":"vergoldet tigerauge \/ 62 mm","offer_id":57448341602569,"sku":null,"price":99.0,"currency_code":"EUR","in_stock":true},{"title":"vergoldet tigerauge \/ 64.6 mm","offer_id":57448341635337,"sku":null,"price":99.0,"currency_code":"EUR","in_stock":true},{"title":"vergoldet rot-onyx \/ 59.6 mm","offer_id":57448265220361,"sku":null,"price":99.0,"currency_code":"EUR","in_stock":true},{"title":"vergoldet rot-onyx \/ 62 mm","offer_id":57448341668105,"sku":null,"price":99.0,"currency_code":"EUR","in_stock":true},{"title":"vergoldet rot-onyx \/ 64.6 mm","offer_id":57448341700873,"sku":null,"price":99.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/vergoldet_Siegelreing_tigerauge.png?v=1791935960"},{"product_id":"mini-herz-kette-gravur-edelstahl","title":"Mini Herz Kette mit Gravur | Initialen Herzanhänger Edelstahl","description":"\u003c!-- Fonts \u0026 Icons --\u003e\n\u003clink href=\"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:wght@600;700\u0026amp;family=Inter:wght@300;400;500;600\u0026amp;family=Allura\u0026amp;family=Alex+Brush\u0026amp;family=Kaushan+Script\u0026amp;family=Pacifico\u0026amp;family=Indie+Flower\u0026amp;family=Dancing+Script\u0026amp;display=swap\" rel=\"stylesheet\"\u003e\n\u003clink href=\"https:\/\/cdn.jsdelivr.net\/npm\/bootstrap-icons@1.11.1\/font\/bootstrap-icons.css\" rel=\"stylesheet\"\u003e\n\n\u003c!-- SEO: Titel \u0026 Meta-Beschreibung im Admin unter \"Suchmaschinen-Eintrag bearbeiten\" pflegen --\u003e\n\n\u003cstyle\u003e\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\/* ── PRODUCT STYLES ── *\/\n.engraving-product { font-family: 'Inter', sans-serif; color: #111; }\n.engraving-product .container { max-width: 1200px; margin: 0 auto; padding: 0 20px; }\n.engraving-product .container2 { max-width: 1200px; width: 110%; margin: 0 auto; padding: 0 20px; }\n.engraving-hero { padding: 80px 20px; background: #f9f9f9; }\n.engraving-hero-grid-wrapper { max-width: 1200px; margin: 0 auto; padding: 0 15px; }\n.engraving-hero-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: start; }\n.engraving-hero-text { display: flex; flex-direction: column; justify-content: center; }\n.engraving-badge { display: inline-block; margin-bottom: 16px; font-size: 1.2rem; padding: 6px 14px; border-radius: 999px; background: #f4f1e8; color: #7a6a3a; font-weight: 600; }\n.engraving-badge i { font-size: 1.2rem; }\n.engraving-hero-text h1 { font-size: 3.8rem; line-height: 1.2; margin-bottom: 20px; color: #222; font-weight: 600; font-family: 'Playfair Display', serif; }\n.engraving-hero-text p { font-size: 1.4rem; color: #555; margin-bottom: 25px; }\n.engraving-trust { margin-top: 25px; display: flex; flex-wrap: wrap; gap: 20px; color: #777; }\n.engraving-trust span { display: flex; align-items: center; gap: 8px; }\n.engraving-image { display: flex; align-items: flex-start; justify-content: center; }\n.watch-image { position: relative; width: 140%; max-width: 550px; }\n.watch-image img { width: 100%; object-fit: contain; border-radius: 30px; box-shadow: 0 2px 28px rgb(0 0 0 \/ 47%); transition: opacity 0.45s ease; display: block; }\n.watch-img-hover { position: absolute; inset: 0; opacity: 0; }\n.watch-image:hover .watch-img-primary { opacity: 0; }\n.watch-image:hover .watch-img-hover   { opacity: 1; }\n.watch-image.swapping .watch-img-primary, .watch-image.swapping .watch-img-hover { transition: opacity .6s ease; }\n@media (max-width: 992px) { .engraving-hero-grid { grid-template-columns: 1fr; gap: 50px; } .engraving-image { justify-content: center; } .engraving-hero-text h1 { font-size: 2.4rem; margin-top: -40px !important; } }\n.engraving-section { padding: 40px 0; }\n.engraving-section h2 { font-family: 'Playfair Display', serif; font-size: 38px; margin-bottom: 20px; }\n.engraving-section-desc { max-width: 720px; color: #666; margin-bottom: 60px; }\n.engraving-features { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 40px; }\n.engraving-feature { background: #fff; padding: 40px; border-radius: 28px; box-shadow: 0 20px 50px rgba(0,0,0,.06); transition: transform .4s ease; }\n.engraving-feature:hover { transform: translateY(-6px); }\n.engraving-feature i { font-size: 32px; color: #b6a573; margin-bottom: 14px; display: inline-block; }\n.engraving-feature h3 { margin-bottom: 10px; font-size: 18px; }\n.engraving-feature p { font-size: 15px; color: #666; }\n.engraving-specs { display: flex; justify-content: center; gap: 60px; flex-wrap: wrap; margin-top: 30px; }\n.engraving-specs ul { list-style: none; padding: 0; margin: 0; }\n.engraving-specs ul li { display: flex; align-items: center; gap: 10px; color: #555; margin-bottom: 12px; padding: 12px 0; border-bottom: 1px solid #eee; font-size: 15px; }\n.engraving-specs ul li i { color: #bfac79; transition: transform 0.3s ease, color 0.3s ease; }\n.engraving-specs ul li:hover i { transform: scale(1.3); color: #9f8650; }\n@media (max-width: 768px) { .engraving-specs { flex-direction: column; align-items: center; gap: 25px; } .engraving-specs ul { text-align: center; } }\n.engraving-cta-strip { background: linear-gradient(135deg, #111, #1c1c1c); color: #fff; padding: 80px 20px; text-align: center; }\n.engraving-cta-strip h2 { color: #fff; margin-bottom: 20px; }\n.engraving-cta-strip p { color: #ccc; margin-bottom: 30px; }\n.engraving-fade { opacity: 0; transform: translateY(30px); transition: 1s ease; }\n.engraving-fade.show { opacity: 1; transform: none; }\n.engraving-collection-btn { position: relative; padding: 14px 28px; border-radius: 999px; background: linear-gradient(135deg, #c7aaaa, #1a1a1a); color: #fff; font-weight: 400; font-size: 13px; letter-spacing: .5px; border: 1px solid rgba(220,184,75,0.6); cursor: pointer; overflow: hidden; transition: all .35s ease; }\n.engraving-collection-btn:hover { transform: translateY(-1px); box-shadow: 0 0 25px rgba(220,184,75,.45), inset 0 0 20px rgba(220,184,75,.15); color: #ffdd7a; }\n.engraving-collection-btn::before { content: ''; position: absolute; inset: -1px; border-radius: inherit; background: radial-gradient(circle at 50% 120%, rgba(220,184,75,.35), transparent 65%); opacity: .45; pointer-events: none; }\n.engraving-collection-btn i { margin-left: 8px; }\n.micro-trust-valentine { margin-top: 1.5rem; font-size: 1.3rem; color: #746742; font-weight: 600; }\n.hero-subline { display: flex; align-items: center; gap: 14px; margin-top: 12px; flex-wrap: wrap; }\n.hero-subline .engraving-badge { font-size: 1.1rem; opacity: 0.85; }\n@media (max-width: 768px) { .hero-subline { justify-content: center; } }\n.luxury-shine-btn { position: relative; font-size: 1.2rem; margin-bottom: 16px; display: inline-flex; align-items: center; gap: 8px; padding: 5px 12px; border-radius: 999px; font-weight: 600; letter-spacing: 0.03em; text-decoration: none; color: #e6d3a3; background: linear-gradient(180deg, #141414, #0d0d0d); border: 1px solid rgba(201,168,92,0.45); overflow: hidden; isolation: isolate; transition: transform 0.25s ease, box-shadow 0.25s ease; }\n.luxury-shine-btn:hover { transform: translateY(-1px); box-shadow: 0 8px 20px rgba(0,0,0,0.35), 0 0 0 1px rgba(201,168,92,0.35); }\n.luxury-shine-btn::before { content: \"\"; position: absolute; top: -60%; left: -120%; width: 60%; height: 220%; background: linear-gradient(120deg, transparent 0%, rgba(255,255,255,0) 35%, rgba(255,214,130,0.65) 50%, rgba(255,255,255,0) 65%, transparent 100%); transform: skewX(-20deg); opacity: 0.9; animation: goldLaser 3s ease-in-out infinite; }\n@keyframes goldLaser { 0% { left: -120%; } 55% { left: 140%; } 100% { left: 140%; } }\n.luxury-shine-btn i { color: #c9a85c; font-size: 1.1em; }\n.live-preview-link.luxury { margin-left: 8px; font-weight: 600; color: #ab8e4c; text-decoration: none; position: relative; letter-spacing: 0.02em; transition: color 0.25s ease, opacity 0.25s ease; }\n.live-preview-link.luxury::after { content: \"\"; position: absolute; left: 0; bottom: -2px; width: 0%; height: 1px; background: linear-gradient(90deg, rgba(201,168,92,0), rgba(201,168,92,0.9), rgba(201,168,92,0)); transition: width 0.35s ease; }\n.live-preview-link.luxury:hover::after { width: 100%; }\n.live-preview-link.luxury:hover { opacity: 0.9; }\n.size-info { margin-top: 10px; margin-bottom: 10px; }\n.size-badges { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 6px; }\n.shape-badge { display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; font-family: 'Inter', sans-serif; font-size: 13px; letter-spacing: 0.5px; background: #f5f5f5; color: #333; border: 2px solid #e0e0e0; margin-right: 10px; margin-top: 8px; border-radius: 6px; transition: all 0.25s ease; }\n.shape-badge:hover { border-color: #b6a573; color: #34aa8b; transform: translateY(-2px); }\n\n\/* RINGGROESSE *\/\n.jm-rsz-section { background: linear-gradient(160deg, #2a2018 0%, #1a1410 55%, #241c0e 100%); padding: 56px 24px 52px; position: relative; }\n.jm-rsz-section::before { content: ''; position: absolute; inset: 0; background: radial-gradient(ellipse at 50% 0%, rgba(201,168,76,0.06) 0%, transparent 65%); pointer-events: none; }\n.jm-rsz-inner { max-width: 1200px; margin: 0 auto; }\n.jm-rsz-header { text-align: center; margin-bottom: 40px; }\n.jm-rsz-eyebrow { display: block; font-family: 'Playfair Display', serif; font-size: 11px; letter-spacing: 4px; text-transform: uppercase; color: #c9a84c; margin-bottom: 8px; opacity: 0.75; }\n.jm-rsz-title { display: block; font-family: 'Playfair Display', serif; font-size: 28px; color: #f7f0e3; line-height: 1.2; margin-bottom: 10px; }\n.jm-rsz-subtitle { display: block; color: #8a7055; font-size: 14px; font-weight: 300; letter-spacing: 0.3px; }\n.jm-rsz-grid { display: grid; grid-template-columns: 200px 1fr 1fr; gap: 40px; align-items: start; }\n@media (max-width: 900px) { .jm-rsz-grid { grid-template-columns: 1fr 1fr; gap: 28px; } .jm-rsz-col--svg { grid-column: 1 \/ -1; display: flex; justify-content: center; } }\n@media (max-width: 560px) { .jm-rsz-grid { grid-template-columns: 1fr; gap: 24px; } .jm-rsz-col--svg { grid-column: auto; } }\n.jm-rsz-svg-wrap svg { filter: drop-shadow(0 0 18px rgba(201,168,76,0.22)); display: block; }\n.jm-rsz-col--anno { display: flex; flex-direction: column; gap: 14px; }\n.jm-rsz-anno { background: rgba(201,168,76,0.07); border-left: 3px solid #c9a84c; border-radius: 4px; padding: 12px 16px; }\n.jm-rsz-anno-label { display: block; font-size: 10px; letter-spacing: 2px; text-transform: uppercase; color: #c9a84c; font-weight: 700; margin-bottom: 4px; }\n.jm-rsz-anno-value { display: block; font-family: 'Playfair Display', serif; font-size: 20px; color: #f7f0e3; line-height: 1.15; margin-bottom: 5px; }\n.jm-rsz-anno-desc { display: block; font-size: 13px; color: #8a7055; line-height: 1.55; }\n.jm-rsz-anno-desc strong { color: #e8c96a; font-weight: 500; }\n.jm-rsz-tip { display: flex; gap: 12px; background: rgba(201,168,76,0.06); border: 1px solid rgba(201,168,76,0.2); border-radius: 6px; padding: 12px 14px; align-items: flex-start; margin-top: 4px; }\n.jm-rsz-tip-icon { font-size: 16px; flex-shrink: 0; margin-top: 2px; }\n.jm-rsz-tip-title { display: block; font-size: 13px; font-weight: 700; color: #e8c96a; margin-bottom: 4px; }\n.jm-rsz-tip-text { display: block; font-size: 12px; color: #8a7055; line-height: 1.55; }\n.jm-rsz-tip-text strong { color: #e8c96a; font-weight: 500; }\n.jm-rsz-col--guide { display: flex; flex-direction: column; gap: 16px; }\n.jm-rsz-block-title { display: block; font-family: 'Playfair Display', serif; font-size: 13px; color: #c9a84c; letter-spacing: 1px; margin-bottom: 4px; text-transform: uppercase; }\n.jm-rsz-steps { display: flex; flex-direction: column; gap: 10px; }\n.jm-rsz-step { display: flex; align-items: flex-start; gap: 12px; background: rgba(255,255,255,0.03); border: 1px solid rgba(201,168,76,0.12); border-radius: 6px; padding: 11px 14px; }\n.jm-rsz-step-num { flex-shrink: 0; width: 26px; height: 26px; border: 1.5px solid rgba(201,168,76,0.5); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-family: 'Playfair Display', serif; font-size: 12px; color: #c9a84c; font-weight: 700; margin-top: 1px; }\n.jm-rsz-step-title { display: block; font-weight: 700; font-size: 13px; color: #f7f0e3; margin-bottom: 3px; }\n.jm-rsz-step-text { display: block; font-size: 12px; color: #8a7055; line-height: 1.5; }\n.jm-rsz-step-text strong { color: #e8c96a; font-weight: 500; }\n.jm-rsz-table-wrap { overflow-x: auto; }\n.jm-rsz-table { width: 100%; border-collapse: collapse; font-size: 13px; min-width: 280px; }\n.jm-rsz-thead { display: table-header-group; }\n.jm-rsz-tbody { display: table-row-group; }\n.jm-rsz-thead .jm-rsz-tr { border-bottom: 1px solid rgba(201,168,76,0.35); }\n.jm-rsz-th { text-align: left; padding: 7px 10px; font-size: 10px; letter-spacing: 1.5px; text-transform: uppercase; color: #c9a84c; font-weight: 500; }\n.jm-rsz-tbody .jm-rsz-tr { border-bottom: 1px solid rgba(255,255,255,0.04); transition: background 0.15s; }\n.jm-rsz-tbody .jm-rsz-tr:hover { background: rgba(201,168,76,0.05); }\n.jm-rsz-tbody .jm-rsz-tr.jm-rsz-hl { background: rgba(201,168,76,0.1); border-color: rgba(201,168,76,0.3); }\n.jm-rsz-td { padding: 8px 10px; color: #8a7055; font-size: 13px; }\n.jm-rsz-td:first-child { color: #f7f0e3; font-weight: 700; }\n.jm-rsz-tbody .jm-rsz-tr.jm-rsz-hl .jm-rsz-td { color: #f7f0e3; }\n.jm-rsz-hl-badge { display: inline-block; background: #c9a84c; color: #1a1410; font-size: 9px; letter-spacing: 0.8px; text-transform: uppercase; padding: 2px 7px; border-radius: 10px; margin-left: 6px; font-weight: 700; vertical-align: middle; }\n\n\/* SHIPPING *\/\n.engraving-shipping { padding: 20px 0; background: linear-gradient(180deg, #faf9f7 0%, #ffffff 100%); }\n.engraving-shipping-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 40px; }\n.engraving-shipping h2 { font-size: 2.2rem; font-weight: 700; margin-bottom: 40px; color: #1f2a2a; text-align: center; }\n.shipping-item { text-align: center; padding: 40px 28px; background: #fff; border-radius: 20px; box-shadow: 0 18px 45px rgba(0,0,0,0.06); transition: transform 0.4s ease, box-shadow 0.4s ease; }\n.shipping-item:hover { transform: translateY(-6px); box-shadow: 0 28px 65px rgba(0,0,0,0.1); }\n.shipping-item i { font-size: 2.8rem; color: #bfac79; margin-bottom: 18px; }\n.shipping-item h3 { font-size: 1.6rem; margin-bottom: 10px; font-weight: 600; color: #1f2a2a; margin-top: 10px; }\n.shipping-item p { font-size: 1.3rem; color: #555; line-height: 1.6; }\n@media (max-width: 900px) { .engraving-shipping-grid { grid-template-columns: 1fr; gap: 28px; } .shipping-item { padding: 32px 22px; } }\n\n\/* WHY *\/\n.engraving-why-heart { padding: 80px 0; background: #faf9f7; text-align: center; }\n.engraving-why-heart h2 { font-size: 2.2rem; font-weight: 700; margin-bottom: 16px; color: #1f2a2a; }\n.engraving-why-heart p { max-width: 650px; margin: 0 auto 50px auto; font-size: 1.3rem; line-height: 1.7; color: #555; }\n.engraving-why-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 13px; }\n@media (max-width: 1200px) { .engraving-why-grid { grid-template-columns: repeat(2, 1fr); gap: 30px; } }\n@media (max-width: 700px) { .engraving-why-grid { grid-template-columns: 1fr; gap: 25px; } .engraving-why-heart p { margin-bottom: 40px; } }\n\n\/* WARNING *\/\n.jm-rgt-warning { display: flex; gap: 14px; align-items: flex-start; background: linear-gradient(135deg, #2a1f0a, #1e1608); border: 1px solid rgba(201,168,76,0.35); border-left: 4px solid #c9a84c; border-radius: 10px; padding: 18px 20px; margin-bottom: 40px; }\n.jm-rgt-warning-icon { font-size: 22px; color: #c9a84c; flex-shrink: 0; margin-top: 1px; }\n.jm-rgt-warning-title { display: block; font-size: 14px; font-weight: 700; color: #f7f0e3; margin-bottom: 6px; }\n.jm-rgt-warning-text { display: block; font-size: 13px; color: #8a7055; line-height: 1.65; }\n.jm-rgt-warning-text strong { color: #e8c96a; font-weight: 500; }\n\n\/* PREVIEW SECTION *\/\n.engraving-preview-section { padding: 40px 0; background: #ffffff; }\n.engraving-preview-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 80px; align-items: center; }\n.engraving-preview-image { position: relative; max-width: 560px; }\n.engraving-preview-image img { width: 100%; border-radius: 28px; transition: opacity 0.3s ease; }\n\/* Bild + Gravur liegen in derselben Box → Position nur über JM_ARC (Tweak) steuern, keine CSS-Verschiebungen *\/\n.jm-mh-stage { position: relative; border-radius: 28px; overflow: hidden; line-height: 0; }\n.jm-mh-stage img { display: block; width: 100%; }\n.engraving-overlay { position: absolute; inset: 0; pointer-events: none; opacity: 0; transform: translateY(6px); transition: opacity 0.35s ease, transform 0.35s ease; }\n.engraving-overlay.active { opacity: 1; transform: translateY(0); }\n.engraving-overlay svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }\n\/* Lasergravur-Optik auf silberfarbigem Edelstahl (wie Herzring) *\/\n.engraving-arc-text, .engraving-arc-popup-text { font-size: 8px; letter-spacing: 0; fill: rgb(120 120 124 \/ 92%);  }\n.engraving-preview-content h2 { font-size: 2.1rem; margin-bottom: 12px; color: #2a1f10; font-weight: 600; margin-top: 25px; }\n.engraving-preview-content p { max-width: 480px; margin-bottom: 28px; color: #555; line-height: 1.6; }\n.engraving-input-wrap, .engraving-font-select { margin-bottom: 18px; }\n.engraving-input-wrap label, .engraving-font-select label { display: block; font-weight: 600; margin-bottom: 6px; }\n.engraving-input-wrap input, .engraving-font-select select { width: 50%; padding: 14px 16px; border-radius: 12px; border: 1px solid #ddd; font-size: 1.5rem; }\n.engraving-input-wrap input:focus, .engraving-font-select select:focus { outline: none; border-color: #bfac79; }\n.engraving-input-wrap small { display: block; margin-top: 6px; font-size: 0.85rem; color: #777; }\n.engraving-symbol-picker { margin-bottom: 22px; }\n.symbol-title { display: block; font-size: 1.1rem; font-weight: 600; margin-bottom: 8px; color: #444; }\n.symbol-list { display: flex; gap: 10px; flex-wrap: wrap; }\n.symbol-btn { width: 44px; height: 44px; border-radius: 12px; border: 1px solid #ddd; background: #fff; font-size: 2rem; cursor: pointer; transition: all 0.25s ease; }\n.symbol-btn:hover { border-color: #bfac79; background: #f6f3ea; transform: translateY(-2px); }\n.symbol-btn:active { transform: scale(1.05); background: #d7bf78; }\n.engraving-font-picker { margin-bottom: 28px; }\n.font-picker-label { display: block; margin-bottom: 12px; }\n.font-group { margin-bottom: 16px; }\n.font-group-title { display: block; font-size: 0.85rem; text-transform: uppercase; letter-spacing: 1px; color: #777; margin-bottom: 8px; }\n.font-btn { display: inline-block; margin: 6px 6px 0 0; padding: 12px 16px; border-radius: 14px; border: 1px solid #ddd; background: #fff; cursor: pointer; font-size: 1.05rem; transition: all 0.25s ease; }\n.font-btn.script { font-size: 1.2rem; }\n.font-btn:hover { border-color: #bfac79; transform: translateY(-1px); }\n.font-btn.active { border-color: #bfac79; background: rgba(191,172,121,0.15); box-shadow: 0 6px 18px rgba(0,0,0,0.08); }\n.innengravur-badge { display: inline-flex; align-items: center; gap: 8px; background: linear-gradient(135deg, #2a1f10, #3d2c0e); color: #e6d3a3; border: 1px solid rgba(201,168,92,0.4); border-radius: 999px; padding: 6px 14px; font-size: 1.1rem; font-weight: 600; letter-spacing: 0.03em; margin-bottom: 12px; }\n.innengravur-badge i { color: #c9a85c; }\n.jm-grav-trust-line { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: #4b8484; margin-top: 16px; }\n.jm-grav-trust-line i { color: #4b8484; }\n@media (max-width: 900px) { .engraving-preview-grid { grid-template-columns: 1fr; gap: 50px; text-align: center; } .engraving-preview-image { margin: 0 auto; } }\n@media (max-width: 640px) {\n  .font-group { display: grid; grid-template-columns: auto 1fr; column-gap: 50px; align-items: start; margin-bottom: 16px; border-bottom: 1px solid rgba(0,0,0,0.06); padding-bottom: 12px; }\n  .font-group-buttons { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }\n  .font-btn { height: 42px; padding: 0 6px; font-size: 0.9rem; border-radius: 10px; display: flex; align-items: center; justify-content: center; white-space: nowrap; line-height: 1; }\n  .font-btn.script { font-size: 1rem; }\n  .symbol-list { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; }\n  .symbol-btn { height: 44px; font-size: 1.25rem; display: flex; align-items: center; justify-content: center; border-radius: 10px; }\n  .font-group-title { font-size: 0.75rem; font-weight: 600; opacity: 0.6; white-space: nowrap; padding-top: 12px; }\n}\n.preview-check { font-size: 14px; opacity: 0; transform: scale(0.6); transition: opacity 0.25s ease, transform 0.25s ease; }\n.preview-check.show { opacity: 1; transform: scale(1); }\n@keyframes engraveFade { 0% { text-shadow: 0 0 0 rgba(191,172,121,0); } 40% { text-shadow: 0 0 6px rgba(191,172,121,0.55), 0 0 14px rgba(191,172,121,0.30); } 100% { text-shadow: 0 0 0 rgba(191,172,121,0); } }\n.engrave-fade { animation: engraveFade 0.9s ease-out; }\n@keyframes engravingPulse { 0% { transform: scale(1); box-shadow: 0 0 0 rgba(191,172,121,0); } 40% { transform: scale(1.02); box-shadow: 0 0 0 6px rgba(191,172,121,0.25); } 100% { transform: scale(1); box-shadow: 0 0 0 rgba(191,172,121,0); } }\n.engraving-preview-image.pulse { animation: engravingPulse 0.6s ease-out; }\n.engraving-preview-note { margin-top: 10px; font-size: 12.5px; line-height: 1.45; color: rgba(60,60,60,0.75); text-align: center; letter-spacing: 0.02em; }\n@media (max-width: 640px) { .engraving-preview-note { font-size: 12px; padding: 0 12px; } }\n\n\/* MOBILE POPUP *\/\n#engraving-mobile-popup { display: block; position: fixed; left: 0; right: 0; bottom: 285px; z-index: 9999; background: #6e644533; padding: 20px; box-shadow: 0 -10px 30px rgba(0,0,0,.18); opacity: 0; transform: translateY(18px); pointer-events: none; transition: opacity 0.35s ease, transform 0.35s ease; }\n#engraving-mobile-popup.show { opacity: 1; transform: translateY(0); pointer-events: auto; }\n.popup-preview-check { position: absolute; top: 36%; right: 14%; font-size: 2rem; opacity: 0; transition: opacity 0.5s ease; }\n.popup-preview-check.show { opacity: 1; }\n@media (min-width: 769px) { #engraving-mobile-popup { display: none !important; } }\n#engraving-mobile-popup .engraving-overlay svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }\n#engraving-mobile-popup .jm-mh-stage { border-radius: 14px; max-width: 360px; margin: 0 auto; }\n  \/* ═══════════════════════════════════════════════════════\n   TRUST BAR (LIGHT VERSION)  AB HIER ins GLOBALE CSS DATEI\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\n    \/* ═══════════════════════════════════════════════════════\n   SECTION SHARED (OPTIMIERT)\n═══════════════════════════════════════════════════════ *\/\n\n    .section-dark {\n        background: #ffff;\n        padding: 120px 40px;\n    }\n\n    .section-cream {\n        background: var(--cream);\n        padding: 120px 40px;\n    }\n\n    .section-mid {\n        background: #ffff;\n        padding: 60px 15px;\n    }\n\n    .container-lg {\n        max-width: 1200px;\n        margin: 0 auto;\n    }\n\n    \/* 🔥 Eyebrow *\/\n    .section-eyebrow {\n        display: inline-block;\n        font-size: 14px;\n        letter-spacing: 4px;\n        text-transform: uppercase;\n        color: #bfac79; \/* Gold sauber definiert *\/\n        font-weight: 700;\n        margin-bottom: 16px;\n    }\n\n    \/* optional override für light *\/\n    .section-eyebrow-dark {\n        color: #bfac79;\n    }\n\n    \/* 🔥 Titel *\/\n    .section-title {\n        font-family: 'Playfair Display', serif;\n        font-size: clamp(28px, 3.5vw, 52px);\n        line-height: 1.1;\n        font-weight: 600;\n        color: #000;\n        margin-bottom: 20px;\n    }\n\n    \/* ✅ Light Mode Titel *\/\n    .section-title-dark {\n        color: #ffffff; \/* statt var(--text) → edler, wärmer *\/\n    }\n\n    \/* 🔥 Subtext *\/\n    .section-sub {\n        font-size: 16px;\n        line-height: 1.7;\n        color: rgb(25 23 23 \/ 70%); \/* vorher zu schwach *\/\n        max-width: 560px;\n    }\n\n    \/* ✅ Light Mode Subtext *\/\n    .section-sub-dark {\n        color: #746742; \/* dein Wunschton *\/\n    }\n\n\/* ═══════════════════════════════════════════════════════\n   WHY \/ FEATURES – 3D CARDS\n═══════════════════════════════════════════════════════ *\/\n.cards-3d-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n  gap: 24px;\n  margin-top: 64px;\n}\n  @media (max-width: 768px) {\n   .cards-3d-grid {\n     grid-template-columns: repeat(auto-fit, minmax(240px, 1fr))!important;\n   }\n}\n\n.card-3d {\n  position: relative;\n  background: #faf9f7;\n  border: 1px solid rgba(255,255,255,.07);\n  border-radius: 20px;\n  padding: 44px 36px;\n  overflow: hidden;\n  transition: transform 0.4s ease, box-shadow 0.4s ease;\n  transform-style: preserve-3d;\n  cursor: default;\n}\n.card-3d::before {\n  content: '';\n  position: absolute;\n  inset: 0;\n  background: radial-gradient(ellipse at 30% 0%, rgba(201,168,76,.08) 0%, transparent 60%);\n  opacity: 0;\n  transition: opacity .4s;\n}\n.card-3d::after {\n  content: '';\n  position: absolute;\n  top: 0; left: 0; right: 0;\n  height: 1px;\n  background: linear-gradient(90deg, transparent, var(--gold), transparent);\n  opacity: 0;\n  transition: opacity .4s;\n}\n.card-3d:hover {\n  transform: translateY(-6px);\n  border-color: rgba(201,168,76,.3);\n  box-shadow: 0 28px 65px rgba(0, 0, 0, 0.1);\n}\n.card-3d:hover::before, .card-3d:hover::after { opacity: 1; }\n\n.card-3d-icon {\n  width: 56px;\n  height: 56px;\n  border-radius: 16px;\n  background: rgba(201,168,76,.1);\n  border: 1px solid rgba(201,168,76,.2);\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin-bottom: 24px;\n  font-size: 24px;\n  color: #bfac79;\n  transition: all .4s;\n}\n.card-3d:hover .card-3d-icon {\n  background: rgba(201,168,76,.18);\n  box-shadow: 0 18px 45px rgba(0, 0, 0, 0.06);\n}\n.card-3d h3 {\n  font-size: 17px;\n  font-weight: 600;\n  color: #000;\n  margin-bottom: 10px;\n}\n.card-3d p {\n  font-size: 14px;\n  line-height: 1.65;\n  color: #555;\n}\n\n\/* Cream variant *\/\n.card-3d-light {\n  background: #fff;\n  border-color: rgba(0,0,0,.06);\n}\n.card-3d-light::before {\n  background: radial-gradient(ellipse at 30% 0%, rgba(201,168,76,.06) 0%, transparent 60%);\n}\n.card-3d-light:hover {\n  box-shadow: 0 32px 80px rgba(0,0,0,.1), 0 0 30px rgba(201,168,76,.08);\n  border-color: rgba(201,168,76,.3);\n}\n.card-3d-light h3 { color: #000; }\n.card-3d-light p { color: #7a6d47; }\n.card-3d-light .card-3d-icon {\n  background: rgba(201,168,76,.08);\n}\n  \/* ═══════════════════════════════════════════════════════\n   SPECS – TWO COLUMN MINIMAL\n═══════════════════════════════════════════════════════ *\/\n.specs-grid {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 60px;\n  margin-top: 60px;\n      border-radius: 30px;\n   background:radial-gradient(ellipse at 30% 0%, rgba(201, 168, 76, .08) 0%, transparent 60%);\n    padding-right: 20px;\n}\n.specs-list {\n  list-style: none;\n}\n.specs-list li {\n  display: flex;\n  align-items: center;\n  gap: 14px;\n  padding: 16px 0;\n  border-bottom: 1px solid rgba(255,255,255,.06);\n  font-size: 14px;\n  color: #555;\n}\n.specs-list li i { color: #bfac79;\n    transition: transform 0.3s ease, color 0.3s ease; font-size: 16px; flex-shrink: 0; }\n.specs-list li strong { color: #555; margin-right: 4px; }\n@media (max-width: 768px) { .specs-grid { grid-template-columns: 1fr 1fr; gap: 0; } }\n\/* ═══════════════════════════════════════════════════════\n   SCROLL ANIMATIONS\n═══════════════════════════════════════════════════════ *\/\n.reveal,\n.reveal-left,\n.reveal-right,\n.reveal-scale {\n  opacity: 0;\n  will-change: transform, opacity;\n}\n\n\/* ↓ Standard *\/\n.reveal {\n  transform: translateY(48px);\n  transition: opacity .9s cubic-bezier(.22,1,.36,1),\n              transform .9s cubic-bezier(.22,1,.36,1);\n}\n.reveal.in {\n  opacity: 1;\n  transform: translateY(0);\n}\n\n\/* ↓ LEFT *\/\n.reveal-left {\n  transform: translateX(-60px);\n  transition: opacity 1s cubic-bezier(.22,1,.36,1),\n              transform 1s cubic-bezier(.22,1,.36,1);\n}\n.reveal-left.in {\n  opacity: 1;\n  transform: translateX(0);\n}\n\n\/* ↓ RIGHT *\/\n.reveal-right {\n  transform: translateX(60px);\n  transition: opacity 1s cubic-bezier(.22,1,.36,1),\n              transform 1s cubic-bezier(.22,1,.36,1);\n}\n.reveal-right.in {\n  opacity: 1;\n  transform: translateX(0);\n}\n\n\/* ↓ SCALE *\/\n.reveal-scale {\n  transform: scale(.88);\n  transition: opacity .9s cubic-bezier(.22,1,.36,1),\n              transform .9s cubic-bezier(.22,1,.36,1);\n}\n.reveal-scale.in {\n  opacity: 1;\n  transform: scale(1);\n}\n\n[data-delay=\"1\"] { transition-delay: .1s !important; }\n[data-delay=\"2\"] { transition-delay: .2s !important; }\n[data-delay=\"3\"] { transition-delay: .3s !important; }\n[data-delay=\"4\"] { transition-delay: .4s !important; }\n[data-delay=\"5\"] { transition-delay: .5s !important; }\n[data-delay=\"6\"] { transition-delay: .6s !important; }\n\n  \/* ═══════════════════════════════════════════════════════\n   HERO PRODUCT GRID (two-col section)\n═══════════════════════════════════════════════════════ *\/\n.product-grid-section {\n  padding: 0 40px 120px;\n  background: var(--dark);\n}\n.product-split {\n  max-width: 1200px;\n  margin: 0 auto;\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 80px;\n  align-items: start;\n}\n@media (max-width: 900px) {\n  .product-split { grid-template-columns: 1fr; gap: 48px; }\n}\n\n\u003c\/style\u003e\n\n\n\u003cdiv class=\"engraving-product\"\u003e\n\n    \u003c!-- HERO --\u003e\n    \u003csection class=\"engraving-hero engraving-fade show\"\u003e\n        \u003cdiv class=\"engraving-hero-grid-wrapper\"\u003e\n            \u003cdiv class=\"hero-eyebrow hero-visible\"\u003eGravur mit Liebe · Seit 1991\u003c\/div\u003e\n            \u003cdiv class=\"engraving-hero-grid\"\u003e\n                \u003cdiv class=\"engraving-hero-text\"\u003e\n\n                    \u003ch1\u003eMini Herz Kette mit Gravur | Winziger Edelstahl Herzanhänger mit Initialen\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\n                        \u003ca href=\"#jm-cfg-wrap\" class=\"luxury-shine-btn live-preview-link luxury\"\u003e\u003ci class=\"bi bi-eye\"\u003e\u003c\/i\u003e Live-Vorschau ansehen\u003c\/a\u003e\n                    \u003c\/div\u003e\n                    \u003cp\u003eKlein, fein und ganz persönlich: Ein winziges Herz aus Edelstahl – nur 6 × 6 mm – an einer zarten Gliederkette. Graviert mit deinen Initialen, einem Buchstaben oder einem Symbol wird es zu einem stillen Liebesbeweis, den man jeden Tag trägt.\u003c\/p\u003e\n                    \u003cbutton type=\"button\" class=\"engraving-collection-btn js-scroll-to-form\" data-target=\"#product-form\"\u003eJetzt personalisieren \u003ci class=\"bi bi-arrow-up\"\u003e\u003c\/i\u003e\u003c\/button\u003e\n\n                    \u003cdiv class=\"micro-trust-valentine\"\u003eMinimalistisch · Persönlich · Mit Liebe graviert\u003c\/div\u003e\n                    \u003cdiv class=\"engraving-trust\"\u003e\n                        \u003cspan\u003e\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e Edelstahl oder Vergoldet\u003c\/span\u003e\n                        \u003cspan\u003e\u003ci class=\"bi bi-pencil-square\"\u003e\u003c\/i\u003e Gravur vorne \u0026amp; hinten\u003c\/span\u003e\n                        \u003cbutton type=\"button\" class=\"jm-hero-details-btn\" onclick=\"document.getElementById('jm-features-specs').scrollIntoView({behavior:'smooth', block:'start'})\"\u003e\n                            \u003ci class=\"bi bi-list-ul\"\u003e\u003c\/i\u003e Produktdetails ansehen \u003ci class=\"bi bi-chevron-down\"\u003e\u003c\/i\u003e\n                        \u003c\/button\u003e\n                        \u003cdiv class=\"size-info\"\u003e\n                            \u003cdiv class=\"size-badges\"\u003e\n                                \u003cspan class=\"shape-badge\"\u003e\u003ci class=\"bi bi-heart\"\u003e\u003c\/i\u003e Herz: 6 × 6 mm\u003c\/span\u003e\n                                \u003cspan class=\"shape-badge\"\u003e\u003ci class=\"bi bi-link-45deg\"\u003e\u003c\/i\u003e Kette: 38 + 4 cm\u003c\/span\u003e\n                                \u003cspan class=\"shape-badge\"\u003e\u003ci class=\"bi bi-feather\"\u003e\u003c\/i\u003e Nur 1,5 g\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"micro-trust-valentine\"\u003eVerstellbar von 38 bis 42 cm\u003c\/div\u003e\n                        \u003c\/div\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"engraving-image\"\u003e\n                    \u003cdiv class=\"watch-image\"\u003e\n                        \u003c!-- Bilder kommen aus den Produktbildern dieses Produkts (JS) --\u003e\n                        \u003cimg class=\"watch-img-primary\" id=\"mhHeroPrimary\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Mini Herz Kette aus Edelstahl mit Gravur\"\u003e\n                        \u003cimg class=\"watch-img-hover\" id=\"mhHeroHover\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Mini Herzanhänger getragen\"\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"hero-scroll hero-visible\"\u003e\n            \u003cdiv class=\"scroll-line\"\u003e\u003c\/div\u003e\n            Scroll\n        \u003c\/div\u003e\n    \u003c\/section\u003e\n\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-badge-3d\"\u003e\u003c\/i\u003e\n                \u003cspan\u003ePräzisionsgravur 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\n    \u003c!-- GRÖSSE \u0026 KETTENLÄNGE --\u003e\n    \u003csection class=\"jm-rsz-section engraving-fade\"\u003e\n        \u003cdiv class=\"jm-rsz-inner\"\u003e\n            \u003cdiv class=\"jm-rsz-header\"\u003e\n                \u003cspan class=\"jm-rsz-eyebrow\"\u003eJuwelier Milano\u003c\/span\u003e\n                \u003cspan class=\"jm-rsz-title\"\u003eWie klein ist „mini“?\u003c\/span\u003e\n                \u003cspan class=\"jm-rsz-subtitle\"\u003eHerzgröße, Kettenlänge und Gravurfläche – alle Maße einfach erklärt.\u003c\/span\u003e\n            \u003c\/div\u003e\n            \u003cdiv class=\"jm-rsz-grid\"\u003e\n                \u003cdiv class=\"jm-rsz-col jm-rsz-col--svg\"\u003e\n                    \u003cdiv class=\"jm-rsz-svg-wrap\"\u003e\n                        \u003csvg viewbox=\"0 0 180 200\" width=\"180\" height=\"200\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" role=\"img\" aria-label=\"Größenvergleich: Herz 6 mm neben einer 1-Cent-Münze\"\u003e\n                            \u003cdefs\u003e\n                                \u003cradialgradient id=\"jmMhCoin\" cx=\"45%\" cy=\"40%\" r=\"60%\"\u003e\u003cstop offset=\"0%\" stop-color=\"#e3a879\"\u003e\u003c\/stop\u003e\u003cstop offset=\"100%\" stop-color=\"#8a4f2a\"\u003e\u003c\/stop\u003e\u003c\/radialgradient\u003e\n                                \u003clineargradient id=\"jmMhSteel\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\"\u003e\u003cstop offset=\"0%\" stop-color=\"#f4f4f4\"\u003e\u003c\/stop\u003e\u003cstop offset=\"55%\" stop-color=\"#bdbdbd\"\u003e\u003c\/stop\u003e\u003cstop offset=\"100%\" stop-color=\"#8d8d8d\"\u003e\u003c\/stop\u003e\u003c\/lineargradient\u003e\n                                \u003cfilter id=\"jmRszGlow\"\u003e\u003cfegaussianblur stddeviation=\"2\" result=\"blur\"\u003e\u003c\/fegaussianblur\u003e\u003cfemerge\u003e\u003cfemergenode in=\"blur\"\u003e\u003c\/femergenode\u003e\u003cfemergenode in=\"SourceGraphic\"\u003e\u003c\/femergenode\u003e\u003c\/femerge\u003e\u003c\/filter\u003e\n                            \u003c\/defs\u003e\n                            \u003ctext x=\"90\" y=\"16\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"9.5\" font-weight=\"600\" fill=\"#c9a84c\" letter-spacing=\"0.8\"\u003eORIGINALGRÖSSE IM VERGLEICH\u003c\/text\u003e\n                            \u003c!-- 1-Cent-Münze Ø 16,25 mm (1 mm = 6 Einheiten) --\u003e\n                            \u003ccircle cx=\"58\" cy=\"100\" r=\"48.75\" fill=\"url(#jmMhCoin)\"\u003e\u003c\/circle\u003e\n                            \u003ccircle cx=\"58\" cy=\"100\" r=\"42\" fill=\"none\" stroke=\"rgba(255,255,255,0.25)\" stroke-width=\"1\"\u003e\u003c\/circle\u003e\n                            \u003ctext x=\"58\" y=\"106\" text-anchor=\"middle\" font-family=\"Playfair Display, serif\" font-size=\"18\" fill=\"rgba(255,255,255,0.55)\"\u003e1\u003c\/text\u003e\n                            \u003ctext x=\"58\" y=\"166\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"9\" fill=\"#8a7055\"\u003e1 Cent · Ø 16,25 mm\u003c\/text\u003e\n                            \u003c!-- Herz 6 × 6 mm = 36 Einheiten --\u003e\n                            \u003cg transform=\"translate(122,82)\" filter=\"url(#jmRszGlow)\"\u003e\n                                \u003cpath d=\"M18,36 C6,26 0,19 0,11 C0,4.5 4.5,0 10,0 C13.5,0 16.3,2 18,5 C19.7,2 22.5,0 26,0 C31.5,0 36,4.5 36,11 C36,19 30,26 18,36 Z\" fill=\"url(#jmMhSteel)\"\u003e\u003c\/path\u003e\n                                \u003ctext x=\"18\" y=\"19\" text-anchor=\"middle\" font-family=\"Playfair Display, serif\" font-size=\"10\" fill=\"#6f6f72\"\u003eAM\u003c\/text\u003e\n                            \u003c\/g\u003e\n                            \u003cline x1=\"122\" y1=\"128\" x2=\"158\" y2=\"128\" stroke=\"#e8c96a\" stroke-width=\"1\" stroke-dasharray=\"3,2\"\u003e\u003c\/line\u003e\n                            \u003cpolygon points=\"122,128 127,125.5 127,130.5\" fill=\"#e8c96a\"\u003e\u003c\/polygon\u003e\n                            \u003cpolygon points=\"158,128 153,125.5 153,130.5\" fill=\"#e8c96a\"\u003e\u003c\/polygon\u003e\n                            \u003ctext x=\"140\" y=\"142\" text-anchor=\"middle\" font-family=\"Playfair Display, serif\" font-size=\"11.5\" fill=\"#e8c96a\"\u003e6 mm\u003c\/text\u003e\n                            \u003ctext x=\"140\" y=\"166\" text-anchor=\"middle\" font-family=\"Inter, sans-serif\" font-size=\"9\" fill=\"#8a7055\"\u003eHerz 6 × 6 mm\u003c\/text\u003e\n                        \u003c\/svg\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"jm-rsz-col jm-rsz-col--anno\"\u003e\n                    \u003cdiv class=\"jm-rsz-anno\"\u003e\n                        \u003cspan class=\"jm-rsz-anno-label\"\u003eGewählte Länge\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-value\" id=\"jm-mh-anno-len\"\u003e38 cm\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-desc\" id=\"jm-mh-anno-fit\"\u003eSitzt dicht am Halsansatz – zart und dezent.\u003c\/span\u003e\n                    \u003c\/div\u003e\n                    \u003cdiv class=\"jm-rsz-anno\"\u003e\n                        \u003cspan class=\"jm-rsz-anno-label\"\u003eHerzanhänger\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-value\"\u003e6 × 6 mm · 1,5 g\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-desc\"\u003eKleiner als ein Fingernagel und federleicht – du spürst die Kette kaum.\u003c\/span\u003e\n                    \u003c\/div\u003e\n                    \u003cdiv class=\"jm-rsz-anno\"\u003e\n                        \u003cspan class=\"jm-rsz-anno-label\"\u003eGravurfläche\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-value\"\u003eje Seite max. 2 Zeichen\u003c\/span\u003e\u003cspan class=\"jm-rsz-anno-desc\"\u003eVorderseite und – optional – Rückseite: Auf jeder Seite bleiben \u003cstrong\u003ezwei Zeichen\u003c\/strong\u003e klar lesbar – z. B. vorne „AM“, hinten ein ♥.\u003c\/span\u003e\n                    \u003c\/div\u003e\n                    \u003cdiv class=\"jm-rgt-warning\"\u003e\n                        \u003ci class=\"bi bi-info-circle-fill jm-rgt-warning-icon\"\u003e\u003c\/i\u003e\u003cdiv\u003e\n                            \u003cspan class=\"jm-rgt-warning-title\"\u003eWarum nur 2 Zeichen?\u003c\/span\u003e\u003cspan class=\"jm-rgt-warning-text\"\u003eDas Herz misst nur 6 mm. Mit \u003cstrong\u003ezwei Zeichen\u003c\/strong\u003e wird jede Gravur groß genug, um sie mit bloßem Auge zu erkennen – mehr Zeichen würden zu winzig und unleserlich.\u003c\/span\u003e\n                        \u003c\/div\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"jm-rsz-col jm-rsz-col--guide\"\u003e\n                    \u003cspan class=\"jm-rsz-block-title\"\u003eLänge einstellen\u003c\/span\u003e\n                    \u003cdiv class=\"jm-rsz-steps\"\u003e\n                        \u003cdiv class=\"jm-rsz-step\"\u003e\n                            \u003cdiv class=\"jm-rsz-step-num\"\u003e1\u003c\/div\u003e\n                            \u003cdiv\u003e\n                                \u003cspan class=\"jm-rsz-step-title\"\u003eGrundlänge 38 cm\u003c\/span\u003e\u003cspan class=\"jm-rsz-step-text\"\u003eDie feine Gliederkette ist \u003cstrong\u003e38 cm\u003c\/strong\u003e lang.\u003c\/span\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"jm-rsz-step\"\u003e\n                            \u003cdiv class=\"jm-rsz-step-num\"\u003e2\u003c\/div\u003e\n                            \u003cdiv\u003e\n                                \u003cspan class=\"jm-rsz-step-title\"\u003e+ 4 cm Verlängerung\u003c\/span\u003e\u003cspan class=\"jm-rsz-step-text\"\u003eAm Ende sitzen \u003cstrong\u003everstellbare Ösen\u003c\/strong\u003e – für bis zu 42 cm.\u003c\/span\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"jm-rsz-step\"\u003e\n                            \u003cdiv class=\"jm-rsz-step-num\"\u003e3\u003c\/div\u003e\n                            \u003cdiv\u003e\n                                \u003cspan class=\"jm-rsz-step-title\"\u003eEinhängen\u003c\/span\u003e\u003cspan class=\"jm-rsz-step-text\"\u003eVerschluss in die gewünschte Öse einhängen – \u003cstrong\u003efertig\u003c\/strong\u003e.\u003c\/span\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                    \u003c\/div\u003e\n                    \u003cspan class=\"jm-rsz-block-title\"\u003eWo sitzt die Kette?\u003c\/span\u003e\n                    \u003cdiv class=\"jm-rsz-table-wrap\"\u003e\n                        \u003ctable class=\"jm-rsz-table\"\u003e\n                            \u003cthead class=\"jm-rsz-thead\"\u003e\n                                \u003ctr class=\"jm-rsz-tr\"\u003e\n                                    \u003cth class=\"jm-rsz-th\"\u003eLänge\u003c\/th\u003e\n                                    \u003cth class=\"jm-rsz-th\"\u003eSitz (ca.)\u003c\/th\u003e\n                                \u003c\/tr\u003e\n                            \u003c\/thead\u003e\n                            \u003ctbody class=\"jm-rsz-tbody\"\u003e\n                                \u003ctr class=\"jm-rsz-tr jm-rsz-hl\" data-len=\"38\" data-fit=\"Sitzt dicht am Halsansatz – zart und dezent.\"\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e38 cm \u003cspan class=\"jm-rsz-hl-badge\"\u003eGewählt\u003c\/span\u003e\n\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003eDicht am Halsansatz\u003c\/td\u003e\n                                \u003c\/tr\u003e\n                                \u003ctr class=\"jm-rsz-tr\" data-len=\"40\" data-fit=\"Liegt locker zwischen Hals und Schlüsselbein – der Klassiker.\"\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e40 cm \u003cspan class=\"jm-rsz-hl-badge\"\u003eGewählt\u003c\/span\u003e\n\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003eZwischen Hals \u0026amp; Schlüsselbein\u003c\/td\u003e\n                                \u003c\/tr\u003e\n                                \u003ctr class=\"jm-rsz-tr\" data-len=\"42\" data-fit=\"Fällt bis etwa aufs Schlüsselbein – ideal zum Layering.\"\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003e42 cm \u003cspan class=\"jm-rsz-hl-badge\"\u003eGewählt\u003c\/span\u003e\n\u003c\/td\u003e\n                                    \u003ctd class=\"jm-rsz-td\"\u003eEtwa am Schlüsselbein\u003c\/td\u003e\n                                \u003c\/tr\u003e\n                            \u003c\/tbody\u003e\n                        \u003c\/table\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n    \u003c\/section\u003e\n\n\n    \u003c!-- WHY --\u003e\n    \u003csection class=\"engraving-why-heart engraving-fade\"\u003e\n        \u003cdiv class=\"container\"\u003e\n            \u003ch2\u003eWarum ein Mini-Herz mit Gravur?\u003c\/h2\u003e\n            \u003cp\u003eDie schönsten Botschaften sind oft die leisesten. Ein winziges Herz mit zwei Zeichen – nur du weißt, wofür sie stehen. Minimalistisch getragen, maximal bedeutungsvoll.\u003c\/p\u003e\n            \u003cdiv class=\"engraving-why-grid\"\u003e\n                \u003cdiv class=\"engraving-feature\"\u003e\n                    \u003ci class=\"bi bi-heart\"\u003e\u003c\/i\u003e\u003ch3\u003eZart \u0026amp; minimalistisch\u003c\/h3\u003e\n                    \u003cp\u003eNur 6 × 6 mm und 1,5 g – perfekt für jeden Tag, allein oder im Layering mit anderen Ketten.\u003c\/p\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"engraving-feature\"\u003e\n                    \u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e\u003ch3\u003eZwei Zeichen, eine Geschichte\u003c\/h3\u003e\n                    \u003cp\u003eDeine Initialen, die eines geliebten Menschen, ein Buchstabe mit ♥ – klein graviert, groß in der Bedeutung.\u003c\/p\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"engraving-feature\"\u003e\n                    \u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e\u003ch3\u003eEdelstahl silberfarbig\u003c\/h3\u003e\n                    \u003cp\u003eRobust, hautfreundlich und pflegeleicht – mit klarem, silberfarbigem Glanz.\u003c\/p\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"engraving-feature\"\u003e\n                    \u003ci class=\"bi bi-gift\"\u003e\u003c\/i\u003e\u003ch3\u003eDas kleine Geschenk mit Gefühl\u003c\/h3\u003e\n                    \u003cp\u003eFür Freundin, Partnerin, Mama, Schwester oder Tochter – 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\n\n    \u003c!-- SHIPPING --\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\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\u003ch3\u003eHandarbeit in Deutschland\u003c\/h3\u003e\n                    \u003cp\u003eJede Gravur entsteht in unserem Familienbetrieb – \u003cstrong\u003ekein Dropshipping\u003c\/strong\u003e, keine externe Arbeit.\u003c\/p\u003e\n                    \u003cp\u003eJede Gravur wird vor dem Versand manuell kontrolliert.\u003c\/p\u003e\n                \u003c\/div\u003e\n                \u003cdiv class=\"shipping-item\"\u003e\n                    \u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e\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                \u003c\/div\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n    \u003c\/section\u003e\n\n\n    \u003c!-- ════════════════════════════════════════\n         FEATURES + SPECS\n    ════════════════════════════════════════ --\u003e\n    \u003csection class=\"section-mid\" id=\"jm-features-specs\"\u003e\n        \u003cdiv class=\"container-lg\"\u003e\n            \u003cdiv class=\"product-split\"\u003e\n                \u003c!-- Features --\u003e\n                \u003cdiv class=\"reveal-left\"\u003e\n                    \u003cspan class=\"section-eyebrow\"\u003eFeatures\u003c\/span\u003e\n                    \u003ch2 class=\"section-title\" style=\"font-size:clamp(24px,2.8vw,40px);\"\u003eKlein im Format.\u003cbr\u003eGroß im Gefühl.\u003c\/h2\u003e\n                    \u003cp class=\"section-sub\" style=\"margin-bottom:40px;\"\u003eEin filigranes Herz, das jeden Look begleitet – und mit deiner Gravur einzigartig wird.\u003c\/p\u003e\n                    \u003cdiv class=\"cards-3d-grid\" style=\"grid-template-columns:1fr 1fr;gap:16px;margin-top:0;\"\u003e\n                        \u003cdiv class=\"card-3d\" style=\"padding:28px 24px;\"\u003e\n                            \u003cdiv class=\"card-3d-icon\" style=\"width:44px;height:44px;font-size:18px;margin-bottom:16px;\"\u003e\u003ci class=\"bi bi-pencil-square\"\u003e\u003c\/i\u003e\u003c\/div\u003e\n                            \u003ch3 style=\"font-size:15px;\"\u003eGravur inklusive\u003c\/h3\u003e\n                            \u003cp style=\"font-size:13px;\"\u003eVorder- \u0026amp; Rückseite – je bis zu 2 Zeichen.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"card-3d\" style=\"padding:28px 24px;\"\u003e\n                            \u003cdiv class=\"card-3d-icon\" style=\"width:44px;height:44px;font-size:18px;margin-bottom:16px;\"\u003e\u003ci class=\"bi bi-arrows-angle-expand\"\u003e\u003c\/i\u003e\u003c\/div\u003e\n                            \u003ch3 style=\"font-size:15px;\"\u003eVerstellbar\u003c\/h3\u003e\n                            \u003cp style=\"font-size:13px;\"\u003e38 cm + 4 cm Verlängerung – passt sich deinem Look an.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"card-3d\" style=\"padding:28px 24px;\"\u003e\n                            \u003cdiv class=\"card-3d-icon\" style=\"width:44px;height:44px;font-size:18px;margin-bottom:16px;\"\u003e\u003ci class=\"bi bi-feather\"\u003e\u003c\/i\u003e\u003c\/div\u003e\n                            \u003ch3 style=\"font-size:15px;\"\u003eFederleicht\u003c\/h3\u003e\n                            \u003cp style=\"font-size:13px;\"\u003eNur 1,5 g – angenehm zu tragen, Tag und Nacht.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"card-3d\" style=\"padding:28px 24px;\"\u003e\n                            \u003cdiv class=\"card-3d-icon\" style=\"width:44px;height:44px;font-size:18px;margin-bottom:16px;\"\u003e\u003ci class=\"bi bi-gift\"\u003e\u003c\/i\u003e\u003c\/div\u003e\n                            \u003ch3 style=\"font-size:15px;\"\u003eElegant verpackt\u003c\/h3\u003e\n                            \u003cp style=\"font-size:13px;\"\u003eHochwertige Verpackung – sofort bereit als Geschenk.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n\n                \u003c!-- Specs --\u003e\n                \u003cdiv class=\"reveal-right\"\u003e\n                    \u003cspan class=\"section-eyebrow\"\u003eProduktdetails\u003c\/span\u003e\n                    \u003ch2 class=\"section-title\" style=\"font-size:clamp(24px,2.8vw,40px);\"\u003eTechnische\u003cbr\u003eSpezifikationen\u003c\/h2\u003e\n                    \u003cdiv class=\"specs-grid\" style=\"margin-top:36px;gap:0;\"\u003e\n                        \u003cul class=\"specs-list\"\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-heart\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eTyp:\u003c\/strong\u003e Herzanhänger mit Kette\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eMaterial:\u003c\/strong\u003e Edelstahl\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-palette\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eFarbe:\u003c\/strong\u003e Edelstahl · Vergoldet\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-rulers\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eHerz:\u003c\/strong\u003e 6 × 6 mm\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-gender-female\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eFür:\u003c\/strong\u003e Damen\u003c\/span\u003e\n\u003c\/li\u003e\n                        \u003c\/ul\u003e\n                        \u003cul class=\"specs-list\"\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-link-45deg\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eKette:\u003c\/strong\u003e feine Gliederkette\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-arrows-angle-expand\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eLänge:\u003c\/strong\u003e 38 + 4 cm (verstellbar)\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-box-seam\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eGewicht:\u003c\/strong\u003e 1,5 g\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003eGravur:\u003c\/strong\u003e Vorder- \u0026amp; Rückseite · je 2 Zeichen · kostenlos\u003c\/span\u003e\n\u003c\/li\u003e\n                            \u003cli\u003e\n\u003ci class=\"bi bi-droplet-half\"\u003e\u003c\/i\u003e\u003cspan\u003e\u003cstrong\u003ePflege:\u003c\/strong\u003e Parfüm \u0026amp; Chemikalien meiden\u003c\/span\u003e\n\u003c\/li\u003e\n                        \u003c\/ul\u003e\n                    \u003c\/div\u003e\n                \u003c\/div\u003e\n            \u003c\/div\u003e\n        \u003c\/div\u003e\n    \u003c\/section\u003e\n\n\n    \u003c!-- 3-SCHRITT KONFIGURATOR --\u003e\n    \u003cdiv class=\"jm-cfg-wrap\" id=\"jm-cfg-wrap\"\u003e\n        \u003cdiv class=\"hero-particles\" id=\"heroParticles\"\u003e\u003c\/div\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\"\u003eZwei Zeichen. Eine Geschichte.\u003c\/h2\u003e\n            \u003cp class=\"jm-cfg-subline\"\u003eGestalte in 3 Schritten deine persönliche Gravur – und sieh sofort, wie sie auf dem Mini-Herz wirkt. 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 --\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 Mini-Herz\u003c\/h3\u003e\n                        \u003cp\u003eEin Schmuckstück, das du kaum spürst – aber nie vergisst. Das steckt drin:\u003c\/p\u003e\n                        \u003cdiv id=\"jm-mh-color-wrap\"\u003e\n                            \u003cspan class=\"jm-mh-color-title\"\u003eWähle deine Farbe\u003c\/span\u003e\n                            \u003cdiv class=\"jm-mh-colors\"\u003e\n                                \u003cbutton type=\"button\" class=\"jm-mh-color active\" data-color=\"silber\"\u003e\n                                    \u003cspan class=\"jm-mh-color-dot silber\"\u003e\u003c\/span\u003e\n                                    \u003cspan class=\"jm-mh-color-info\"\u003e\u003cspan class=\"jm-mh-color-name\"\u003eEdelstahl\u003c\/span\u003e\u003cspan class=\"jm-mh-color-desc\"\u003esilberfarbig\u003c\/span\u003e\u003c\/span\u003e\n                                \u003c\/button\u003e\n                                \u003cbutton type=\"button\" class=\"jm-mh-color\" data-color=\"vergoldet\"\u003e\n                                    \u003cspan class=\"jm-mh-color-dot vergoldet\"\u003e\u003c\/span\u003e\n                                    \u003cspan class=\"jm-mh-color-info\"\u003e\u003cspan class=\"jm-mh-color-name\"\u003eVergoldet\u003c\/span\u003e\u003cspan class=\"jm-mh-color-desc\"\u003egoldfarbig\u003c\/span\u003e\u003c\/span\u003e\n                                \u003c\/button\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"jm-mh-facts\"\u003e\n                            \u003cdiv class=\"jm-mh-fact\"\u003e\n                                \u003ci class=\"bi bi-heart\"\u003e\u003c\/i\u003e\n                                \u003cspan class=\"jm-mh-fact-info\"\u003e\u003cspan class=\"jm-mh-fact-name\"\u003eHerzanhänger 6 × 6 mm\u003c\/span\u003e\u003cspan class=\"jm-mh-fact-desc\"\u003e\u003cspan class=\"js-mh-material\"\u003eEdelstahl · silberfarbig\u003c\/span\u003e · 1,5 g\u003c\/span\u003e\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"jm-mh-fact\"\u003e\n                                \u003ci class=\"bi bi-link-45deg\"\u003e\u003c\/i\u003e\n                                \u003cspan class=\"jm-mh-fact-info\"\u003e\u003cspan class=\"jm-mh-fact-name\"\u003eFeine Gliederkette 38 + 4 cm\u003c\/span\u003e\u003cspan class=\"jm-mh-fact-desc\"\u003eStufenlos über die Ösen von 38 bis 42 cm\u003c\/span\u003e\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"jm-mh-fact\"\u003e\n                                \u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e\n                                \u003cspan class=\"jm-mh-fact-info\"\u003e\u003cspan class=\"jm-mh-fact-name\"\u003eGravur vorne \u0026amp; hinten inklusive\u003c\/span\u003e\u003cspan class=\"jm-mh-fact-desc\"\u003eJe Seite max. 2 Zeichen – Rückseite optional\u003c\/span\u003e\u003c\/span\u003e\n                            \u003c\/div\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"jm-cfg-size-strip\"\u003e\n                            \u003cstrong\u003eMini-Herz 6 × 6 mm\u003c\/strong\u003e · Kette 38 + 4 cm · \u003cspan class=\"js-mh-material\"\u003eEdelstahl · silberfarbig\u003c\/span\u003e\n                        \u003c\/div\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=\"mhCfgPrimary\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Mini Herz Kette Edelstahl\"\u003e\n                            \u003cimg class=\"jm-cfg-ring-img-hover\" id=\"mhCfgHover\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Mini Herz Kette getragen\"\u003e\n                            \u003cspan class=\"jm-cfg-ring-img-label\" id=\"mhCfgLabel\"\u003eEdelstahl\u003c\/span\u003e\n                        \u003c\/div\u003e\n                        \u003cp class=\"jm-cfg-ring-img-caption js-mh-material\"\u003eEdelstahl · silberfarbig\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 class=\"jm-cfg-btn-back\" hidden\u003e\u003ci class=\"bi bi-arrow-left\"\u003e\u003c\/i\u003e Zurück\u003c\/button\u003e\n                \u003cbutton 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 --\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\n                    \u003cdiv class=\"engraving-preview-grid\"\u003e\n                        \u003cdiv class=\"engraving-preview-image\" id=\"previewImageWrap\"\u003e\n                            \u003cdiv class=\"jm-mh-stage\"\u003e\n                                \u003c!-- Eigene ID: wird nicht vom globalen theme.js überschrieben --\u003e\n                                \u003cspan class=\"jm-mh-side-label\" id=\"mhStep2SideLabel\"\u003eVorderseite\u003c\/span\u003e\n                                \u003cimg id=\"mhStep2Img\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Mini Herz Gravur Vorschau\"\u003e\n                                \u003cdiv class=\"engraving-overlay\" id=\"engravingOverlay\"\u003e\n                                    \u003csvg id=\"engravingArcSvg\" viewbox=\"0 0 100 100\" preserveaspectratio=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\u003e\n                                        \u003cdefs\u003e\u003cpath id=\"ringArcPath\" d=\"M 35,52 L 65,52\" fill=\"none\"\u003e\u003c\/path\u003e\u003c\/defs\u003e\n                                        \u003ctext class=\"engraving-arc-text\"\u003e\n                                            \u003ctextpath href=\"#ringArcPath\" id=\"engravingArcTextEl\" startoffset=\"50%\" text-anchor=\"middle\"\u003eAM\u003c\/textpath\u003e\n                                        \u003c\/text\u003e\n                                    \u003c\/svg\u003e\n                                    \u003cspan id=\"engravingPreviewText\" style=\"display:none;\"\u003eAM\u003c\/span\u003e\n                                    \u003cspan class=\"preview-check\" style=\"position:absolute;top:30%;right:14%;font-size:2rem;line-height:1;\"\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✦ Die Vorschau ist vergrößert dargestellt – das Herz misst in echt 6 × 6 mm. Jede Gravur ist handwerkliches Unikat; Schriftgröße und Position werden optimal angepasst.\u003c\/p\u003e\n                        \u003c\/div\u003e\n                        \u003cdiv class=\"engraving-preview-content\" id=\"engraving-preview\"\u003e\n                            \u003cspan class=\"innengravur-badge\"\u003e\u003ci class=\"bi bi-pencil\"\u003e\u003c\/i\u003e Gravur · Kostenlos \u0026amp; Persönlich\u003c\/span\u003e\n                            \u003ch2\u003eMach dein Mini-Herz einzigartig\u003c\/h2\u003e\n                            \u003cp\u003eGestalte die Vorderseite – und auf Wunsch auch die Rückseite – mit je bis zu zwei Zeichen und sieh sofort, wie dein Herz aussieht.\u003c\/p\u003e\n                            \u003cdiv class=\"jm-mh-limit\"\u003e\n\u003ci class=\"bi bi-info-circle\"\u003e\u003c\/i\u003e\u003cspan\u003eDas Herz ist nur 6 mm groß – deshalb sind \u003cstrong\u003eje Seite maximal 2 Zeichen\u003c\/strong\u003e möglich. Ein Symbol zählt als 1 Zeichen.\u003c\/span\u003e\n\u003c\/div\u003e\n                            \u003cdiv class=\"jm-mh-sides\" role=\"tablist\" aria-label=\"Gravurseite wählen\"\u003e\n                                \u003cbutton type=\"button\" class=\"jm-mh-side active\" data-side=\"front\" role=\"tab\" aria-selected=\"true\"\u003eVorderseite\u003csmall id=\"jm-mh-side-front\"\u003e–\u003c\/small\u003e\u003c\/button\u003e\n                                \u003cbutton type=\"button\" class=\"jm-mh-side\" data-side=\"back\" role=\"tab\" aria-selected=\"false\"\u003eRückseite \u003cem\u003eoptional\u003c\/em\u003e\u003csmall id=\"jm-mh-side-back\"\u003e–\u003c\/small\u003e\u003c\/button\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"engraving-input-wrap\"\u003e\n                                \u003clabel for=\"engravingInput\" id=\"engravingInputLabel\"\u003eGravur Vorderseite\u003c\/label\u003e\n                                \u003cinput type=\"text\" id=\"engravingInput\" maxlength=\"2\" placeholder=\"z. B. AM | J♥\" autocomplete=\"off\"\u003e\n                                \u003csmall id=\"engravingCounter\"\u003eMax. 2 Zeichen · Buchstaben, Zahlen \u0026amp; Symbole\u003c\/small\u003e\n                            \u003c\/div\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\n                                    \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"∞\"\u003e∞\u003c\/button\u003e\n                                    \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"★\"\u003e★\u003c\/button\u003e\n                                    \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"✝\"\u003e✝\u003c\/button\u003e\n                                    \u003cbutton type=\"button\" class=\"symbol-btn\" data-symbol=\"❥\"\u003e❥\u003c\/button\u003e\n                                \u003c\/div\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"engraving-font-picker\"\u003e\n                                \u003clabel class=\"font-picker-label\"\u003eSchriftart wählen\u003c\/label\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eSerif\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Times New Roman\" style=\"font-family:'Times New Roman'\"\u003eTimes New Roman\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Georgia\" style=\"font-family:Georgia\"\u003eGeorgia\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eSans-serif\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Arial\" style=\"font-family:Arial\"\u003eArial\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Helvetica\" style=\"font-family:Helvetica\"\u003eHelvetica\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eMonospace\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Courier New\" style=\"font-family:'Courier New'\"\u003eCourier New\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn\" data-font=\"Lucida Console\" style=\"font-family:'Lucida Console'\"\u003eLucida Console\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eSchreibschrift\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Allura\" style=\"font-family:'Allura'\"\u003eAllura\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Alex Brush\" style=\"font-family:'Alex Brush'\"\u003eAlex Brush\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Kaushan Script\" style=\"font-family:'Kaushan Script'\"\u003eKaushan Script\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cdiv class=\"font-group\"\u003e\n                                    \u003cspan class=\"font-group-title\"\u003eHandschrift\u003c\/span\u003e\u003cdiv class=\"font-group-buttons\"\u003e\n                                        \u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Pacifico\" style=\"font-family:'Pacifico'\"\u003ePacifico\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Indie Flower\" style=\"font-family:'Indie Flower'\"\u003eIndie Flower\u003c\/button\u003e\u003cbutton type=\"button\" class=\"font-btn script\" data-font=\"Dancing Script\" style=\"font-family:'Dancing Script'\"\u003eDancing Script\u003c\/button\u003e\n                                    \u003c\/div\u003e\n                                \u003c\/div\u003e\n                                \u003cinput type=\"hidden\" name=\"properties[Schriftart]\" id=\"selectedFont\"\u003e\n                            \u003c\/div\u003e\n                            \u003cspan class=\"jm-grav-trust-line\"\u003e\u003ci class=\"bi bi-shield-check\"\u003e\u003c\/i\u003e Jede Gravur wird individuell geprüft \u0026amp; präzise gefertigt\u003c\/span\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 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 class=\"jm-cfg-btn-next\" id=\"jm-cfg-next-2\"\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 --\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=\"Mini Herz Kette\"\u003e\n                    \u003cdiv\u003e\n                        \u003cp class=\"jm-cfg-s3-product-name\"\u003eMini Herz Kette mit 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\"\u003eAnhänger\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\"\u003eHerz 6 × 6 mm · Edelstahl\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"jm-cfg-s3-row\"\u003e\n                                \u003cspan class=\"jm-cfg-s3-row-label\"\u003eFarbe\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\" id=\"jm-cfg-s3-color\"\u003eSilber\u003c\/span\u003e\n                            \u003c\/div\u003e\n                            \u003cdiv class=\"jm-cfg-s3-row\"\u003e\n                                \u003cspan class=\"jm-cfg-s3-row-label\"\u003eKette\u003c\/span\u003e\u003cspan class=\"jm-cfg-s3-row-value\"\u003e38 + 4 cm · verstellbar\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                    \u003cdiv style=\"margin-top:14px;padding-top:12px;border-top:1px solid rgba(201,168,76,0.2);\"\u003e\n                        \u003cspan style=\"display:block;font-size:9px;letter-spacing:2px;text-transform:uppercase;color:#c9a84c;font-weight:700;margin-bottom:10px;\"\u003eGewählte Schriftart\u003c\/span\u003e\n                        \u003cdiv id=\"jm-cfg-s3-font-preview\" style=\"display:inline-block;padding:10px 18px;border:2px solid #c9a84c;border-radius:12px;background:rgba(201,168,76,0.12);color:#f7f0e3;font-size:1.3rem;letter-spacing:0.05em;box-shadow:0 4px 14px rgba(0,0,0,0.15);\"\u003e\u003c\/div\u003e\n                    \u003c\/div\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 jm-cfg-s3-cta\" id=\"jm-cfg-s3-cta-btn\" style=\"width:100%;justify-content:center;font-size:15px;padding:18px 32px;\"\u003e\n                    \u003ci class=\"bi bi-bag-check\"\u003e\u003c\/i\u003e Jetzt personalisieren \u003ci class=\"bi bi-arrow-up\"\u003e\u003c\/i\u003e\n                \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 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\n    \u003c\/div\u003e\n    \u003c!-- \/jm-cfg-wrap --\u003e\n    \u003c!-- CTA STRIP --\u003e\n    \u003csection class=\"engraving-cta-strip engraving-fade\" id=\"gravur\"\u003e\n        \u003ci class=\"bi bi-stars\" style=\"font-size:6rem;color:#c0a860;\"\u003e\u003c\/i\u003e\n        \u003ch2 style=\"margin-top:15px;\"\u003eDeine Gravur.\u003cbr\u003e Deine Geschichte.\u003c\/h2\u003e\n        \u003cp\u003eEin kleines Herz, 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        \u003cbutton type=\"button\" class=\"engraving-collection-btn js-scroll-to-form\" data-target=\"#product-form\"\u003eJetzt personalisieren \u003ci class=\"bi bi-arrow-up\"\u003e\u003c\/i\u003e\u003c\/button\u003e\n    \u003c\/section\u003e\n\n\u003c\/div\u003e\u003c!-- \/engraving-product --\u003e\n\u003c!-- MOBILE POPUP --\u003e\n\u003cdiv id=\"engraving-mobile-popup\"\u003e\n    \u003cdiv class=\"popup-preview\" style=\"position:relative;margin-bottom:10px;\"\u003e\n        \u003cdiv class=\"jm-mh-stage\"\u003e\n            \u003c!-- Eigene ID: wird nicht vom globalen theme.js überschrieben --\u003e\n            \u003cspan class=\"jm-mh-side-label\" id=\"mhPopupSideLabel\"\u003eVorderseite\u003c\/span\u003e\n            \u003cimg id=\"mhPopupImg\" src=\"data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7\" alt=\"Gravur Vorschau Mobile\"\u003e\n            \u003cdiv class=\"engraving-overlay active\"\u003e\n                \u003csvg viewbox=\"0 0 100 100\" preserveaspectratio=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"\u003e\n                    \u003cdefs\u003e\u003cpath id=\"popupArcPath\" d=\"M 35,52 L 65,52\" fill=\"none\"\u003e\u003c\/path\u003e\u003c\/defs\u003e\n                    \u003ctext class=\"engraving-arc-popup-text\"\u003e\n                        \u003ctextpath href=\"#popupArcPath\" id=\"popupArcTextEl\" startoffset=\"50%\" text-anchor=\"middle\"\u003e\u003c\/textpath\u003e\n                    \u003c\/text\u003e\n                \u003c\/svg\u003e\n                \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\n        Zur Bestätigung \u003ci class=\"bi bi-arrow-right\"\u003e\u003c\/i\u003e\n    \u003c\/button\u003e\n\u003c\/div\u003e\n\n\n\u003cscript\u003e\/* ═══════════════════════════════════════════════════════════════\n   JUWELIER MILANO – MINI HERZ KETTE MIT GRAVUR\n   Basis: Siegelring-Template · Gravur-Logik wie Herzring\n   Gravur: Vorderseite + optional Rückseite · je max. 2 Zeichen\n   Bilder kommen aus den Produktbildern DIESES Produkts (keine festen URLs)\n   ═══════════════════════════════════════════════════════════════ *\/\n\n\n\/* ════════════════════════════════════════════════════════════\n   GRAVUR-POSITION  (Werte mit ?jmtweak=1 ermitteln)\n   Ziele:\n     step2_desktop – Gravur-Studio Schritt 2, Desktop\n     step2_mobile  – Gravur-Studio Schritt 2, Mobile\n     popup         – Mobile-Popup unten (Gravur-Studio)\n     panel         – Live-Vorschau oben, Desktop-Panel\n     mfp           – Live-Vorschau oben, Mobile-Popup\n   Werte in % der Bildfläche:\n     cx\/cy = Mitte · w = Breite · tilt = Winkel (+ = rechts höher)\n     bulge = Wölbung (0 = gerade Linie) · rot = Drehung ° · size = Schriftgröße\n     offset = Textposition auf der Linie · spacing = Zeichenabstand\n   Ziele ohne Eintrag bleiben unverändert.\n   ════════════════════════════════════════════════════════════ *\/\nvar JM_ARC = {\n    step2_desktop: { default: { cx: 50.5, cy: 76, w: 30, tilt: 0, bulge: 0, rot: 0, size: 8, offset: 50, spacing: 0 } },\n    step2_mobile:  { default: { cx: 50, cy: 77.5, w: 30, tilt: 0, bulge: 0, rot: 0, size: 7, offset: 50, spacing: 0 } },\n    popup:         { default: { cx: 49.5, cy: 77.5, w: 30, tilt: 0, bulge: 0, rot: 0, size: 8, offset: 50, spacing: 0 } },\n    panel:         { default: { cx: 50, cy: 76, w: 29, tilt: 0, bulge: 0, rot: 0, size: 7.9, offset: 48, spacing: 0 } },\n    mfp:           { default: { cx: 50.5, cy: 77.5, w: 30, tilt: 0, bulge: 0, rot: 0, size: 7, offset: 50, spacing: 0 } }\n};\n\nwindow.currentFont = \"'Playfair Display', serif\";\n\n(function () {\n  'use strict';\n\n  const MAX_CHARS = 2;\n  const PH = 'data:image\/gif;base64,R0lGODlhAQABAIAAAAAAAP\/\/\/yH5BAEAAAAALAAAAAABAAEAAAIBRAA7';\n\n  \/* Gravurfeld im Produktformular – das erste vorhandene wird genutzt *\/\n  const FORM_FIELD_SEL = ['#gravurtext_vorderseite', '#gravurtext_oberfläche', '#gravurtext', '#gravurtext_innenseite'];\n  function formField() {\n    for (const s of FORM_FIELD_SEL) { const el = document.querySelector(s); if (el) return el; }\n    return null;\n  }\n  \/* Rückseite: vorhandenes Feld im Produktformular – sonst wird ein verstecktes Feld\n     „Gravur Rückseite“ angelegt, damit die Gravur in der Bestellung steht *\/\n  const BACK_FIELD_SEL = ['#gravurtext_rückseite', '#gravurtext_rueckseite', '#gravurtext_2'];\n  function formFieldBack() {\n    for (const s of BACK_FIELD_SEL) { const el = document.querySelector(s); if (el) return el; }\n    return null;\n  }\n  function backTarget() {\n    const ex = formFieldBack();\n    if (ex) return ex;\n    const form = document.querySelector('#product-form, form[action*=\"\/cart\/add\"]');\n    if (!form) return null;\n    let el = form.querySelector('input[name=\"properties[Gravur Rückseite]\"]');\n    if (!el) {\n      el = document.createElement('input');\n      el.type = 'hidden'; el.name = 'properties[Gravur Rückseite]'; el.disabled = true;\n      form.appendChild(el);\n    }\n    return el;\n  }\n\n  \/* Gravur je Seite *\/\n  const SIDES = { front: '', back: '' };\n  const SIDE_LABEL = { front: 'Vorderseite', back: 'Rückseite' };\n  let side = 'front';\n\n  \/* Bilder (werden aus den Produktbildern gefüllt):\n       primary = Hauptbild · hover = 2. Bild bzw. Alt-Text „getragen“\n       preview = Bild mit Alt-Text „Gravur“ oder „Vorschau“ (Nahaufnahme des Herzens) *\/\n  const IMGS = { primary: '', hover: '', preview: '', back: '' };   \/* Bilder der aktuell gewählten Farbe *\/\n  \/* Farben: Erkennung über Variantenname \/ Alt-Text *\/\n  const COLORS = {\n    silber:    { label: 'Silber',    material: 'Edelstahl · silberfarbig' },\n    vergoldet: { label: 'Vergoldet', material: 'Edelstahl · vergoldet' }\n  };\n  const isGold   = t =\u003e \/vergold|gold\/i.test(String(t || ''));\n  const IMG_BY   = { silber: null, vergoldet: null };   \/* je Farbe {primary, hover, preview, back} *\/\n  let PRODUCT    = null;\n  let curColor   = 'silber';\n\n  \/* ── DOM ── *\/\n  const engInput     = document.getElementById('engravingInput');\n  const arcEl        = document.getElementById('engravingArcTextEl');\n  const hiddenSpan   = document.getElementById('engravingPreviewText');\n  const overlay      = document.getElementById('engravingOverlay');\n  const mobilePopup  = document.getElementById('engraving-mobile-popup');\n  const popupArcEl   = document.getElementById('popupArcTextEl');\n  const hiddenFont   = document.getElementById('selectedFont');\n  const previewImage = document.querySelector('.engraving-preview-image');\n  const symbolBtns   = document.querySelectorAll('.symbol-btn');\n  const fontBtns     = document.querySelectorAll('.font-btn');\n  const popupCheck   = mobilePopup \u0026\u0026 mobilePopup.querySelector('.popup-preview-check');\n  const desktopCheck = document.querySelector('.preview-check');\n  const engCounter   = document.getElementById('engravingCounter');\n  const limitNote    = document.querySelector('.jm-mh-limit');\n\n  let lastValue = '';\n  let hasPulsed = false;\n  const jmCfgState = { stone: 'default', label: 'Mini-Herz' };\n\n  \/* Zeichen zählen (Symbole = 1 Zeichen) \u0026 auf 2 kürzen *\/\n  const chars = s =\u003e Array.from(String(s || ''));\n  function clampValue(el) {\n    if (!el) return;\n    const c = chars(el.value);\n    if (c.length \u003e MAX_CHARS) { el.value = c.slice(0, MAX_CHARS).join(''); shakeLimit(); }\n  }\n  function shakeLimit() {\n    if (!limitNote) return;\n    limitNote.classList.remove('jm-mh-shake'); void limitNote.offsetWidth; limitNote.classList.add('jm-mh-shake');\n  }\n\n  \/* ── Zähler ── *\/\n  function updateCounter(val) {\n    if (!engCounter) return;\n    const n = chars(val).length;\n    if (!n) {\n      engCounter.textContent = 'Max. 2 Zeichen · Buchstaben, Zahlen \u0026 Symbole';\n      engCounter.style.color = '';\n    } else {\n      engCounter.textContent = n + ' \/ 2 Zeichen' + (n === MAX_CHARS ? ' · voll' : '');\n      engCounter.style.color = n === MAX_CHARS ? '#c9630e' : '#777';\n    }\n  }\n\n  \/* ── Popup ── *\/\n  \/* Studio-Popup nur in Schritt 2 des Gravur-Studios – oben am Produktformular übernimmt jm-live-vorschau-herz *\/\n  function studioActive() {\n    const w = document.getElementById('jm-cfg-wrap');\n    if (jmStep !== 2 || !w) return false;\n    const r = w.getBoundingClientRect();\n    return r.top \u003c window.innerHeight \u0026\u0026 r.bottom \u003e 0;\n  }\n  function showPopup() { if (window.innerWidth \u003e 768 || !studioActive()) return; mobilePopup \u0026\u0026 mobilePopup.classList.add('show'); }\n  function hidePopup() { mobilePopup \u0026\u0026 mobilePopup.classList.remove('show'); }\n\n  function syncPopupFromPreview() {\n    const val = engInput ? engInput.value.trim() : '';\n    if (!val) return;\n    if (popupArcEl) { popupArcEl.textContent = val; popupArcEl.style.fontFamily = window.currentFont; }\n    if (popupCheck) {\n      popupCheck.classList.add('show');\n      clearTimeout(popupCheck._t);\n      popupCheck._t = setTimeout(() =\u003e popupCheck.classList.remove('show'), 1000);\n    }\n    showPopup();\n  }\n\n  function updateArcs(value) {\n    if (arcEl)      { arcEl.textContent = value; arcEl.style.fontFamily = window.currentFont; }\n    if (hiddenSpan) hiddenSpan.textContent = value;\n    if (popupArcEl) { popupArcEl.textContent = value; popupArcEl.style.fontFamily = window.currentFont; }\n  }\n\n  function showCheck() {\n    [desktopCheck, popupCheck].forEach(el =\u003e {\n      if (!el) return;\n      el.classList.add('show');\n      clearTimeout(el._t);\n      el._t = setTimeout(() =\u003e el.classList.remove('show'), 1000);\n    });\n  }\n\n  function triggerGlow() {\n    if (!arcEl) return;\n    arcEl.classList.remove('engrave-fade');\n    void arcEl.getBoundingClientRect();\n    arcEl.classList.add('engrave-fade');\n  }\n\n  function triggerPulse() {\n    if (hasPulsed || !previewImage) return;\n    previewImage.classList.remove('pulse');\n    void previewImage.offsetWidth;\n    previewImage.classList.add('pulse');\n    hasPulsed = true;\n  }\n\n  \/* ── Hauptfunktion ── *\/\n  function updatePreview(forceEffects) {\n    const val = engInput ? engInput.value : '';\n    SIDES[side] = val;\n    updateSideTabs();\n    if (!val) { overlay \u0026\u0026 overlay.classList.remove('active'); hidePopup(); lastValue = ''; return; }\n    updateArcs(val);\n    overlay \u0026\u0026 overlay.classList.add('active');\n    if (forceEffects || val !== lastValue) {\n      triggerGlow();\n      showCheck();\n      if (chars(val).length === 1) triggerPulse();\n      showPopup();\n    }\n    lastValue = val;\n  }\n\n  const next2Btn = document.getElementById('jm-cfg-next-2');\n  function updateNext2State() {\n    if (!next2Btn) return;\n    const empty = !SIDES.front.trim() \u0026\u0026 !SIDES.back.trim();\n    next2Btn.disabled            = empty;\n    next2Btn.style.opacity       = empty ? '0.4' : '1';\n    next2Btn.style.cursor        = empty ? 'not-allowed' : 'pointer';\n    next2Btn.style.pointerEvents = empty ? 'none' : 'auto';\n  }\n  updateNext2State();\n\n  \/* ── Vorderseite \/ Rückseite ── *\/\n  function updateSideTabs() {\n    ['front', 'back'].forEach(k =\u003e {\n      const sm = document.getElementById('jm-mh-side-' + k);\n      if (sm) sm.textContent = SIDES[k] || '–';\n      const b = document.querySelector('.jm-mh-side[data-side=\"' + k + '\"]');\n      if (b) b.classList.toggle('filled', !!SIDES[k]);\n    });\n  }\n  function sideImage() {\n    if (side === 'back') return IMGS.back || IMGS.preview || IMGS.primary;\n    return IMGS.preview || IMGS.primary;\n  }\n  function applySideImage() {\n    const flip = side === 'back' \u0026\u0026 !IMGS.back;\n    ['mhStep2Img', 'mhPopupImg'].forEach(id =\u003e {\n      const el = document.getElementById(id);\n      if (!el) return;\n      const src = sideImage();\n      if (src) el.src = src;\n      el.classList.toggle('jm-mh-flip', flip);\n    });\n    ['mhStep2SideLabel', 'mhPopupSideLabel'].forEach(id =\u003e {\n      const el = document.getElementById(id);\n      if (el) el.textContent = SIDE_LABEL[side];\n    });\n  }\n  function setSide(k) {\n    if (!SIDE_LABEL[k] || !engInput) return;\n    side = k;\n    document.querySelectorAll('.jm-mh-side').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('engravingInputLabel');\n    if (lb) lb.textContent = 'Gravur ' + SIDE_LABEL[k] + (k === 'back' ? ' (optional)' : '');\n    engInput.placeholder = k === 'back' ? 'z. B. ♥ | 24' : 'z. B. AM | J♥';\n    engInput.value = SIDES[k];\n    lastValue = '';\n    applySideImage();\n    updatePreview(true);\n    updateCounter(engInput.value);\n    updateNext2State();\n    engInput.focus();\n  }\n  document.querySelectorAll('.jm-mh-side').forEach(b =\u003e b.addEventListener('click', () =\u003e setSide(b.dataset.side)));\n\n  \/* ── Input ── *\/\n  if (engInput) {\n    engInput.addEventListener('input', () =\u003e {\n      clampValue(engInput);\n      updatePreview(false);\n      updateNext2State();\n      updateCounter(engInput.value);\n      if (engInput.value.trim()) requestAnimationFrame(syncPopupFromPreview);\n    });\n  }\n\n  \/* ── Symbole: wie Buchstaben an der Cursor-Position einfügen ── *\/\n  symbolBtns.forEach(btn =\u003e {\n    btn.addEventListener('click', () =\u003e {\n      if (!engInput) return;\n      const sym = btn.dataset.symbol || '';\n      const s = engInput.selectionStart != null ? engInput.selectionStart : engInput.value.length;\n      const e = engInput.selectionEnd != null ? engInput.selectionEnd : engInput.value.length;\n      const next = engInput.value.substring(0, s) + sym + engInput.value.substring(e);\n      if (chars(next).length \u003e MAX_CHARS) { shakeLimit(); return; }\n      engInput.value = next;\n      engInput.focus();\n      engInput.selectionStart = engInput.selectionEnd = s + sym.length;\n      updatePreview(true);\n      updateNext2State();\n      updateCounter(engInput.value);\n      requestAnimationFrame(syncPopupFromPreview);\n    });\n  });\n\n  \/* ── Fonts ── *\/\n  function syncFontSelect() {\n    const fontSelect = document.querySelector('#gravur_schriftart');\n    if (!fontSelect) return null;\n    Array.from(fontSelect.options).forEach((opt, i) =\u003e {\n      if (opt.value \u0026\u0026 window.currentFont.includes(opt.value)) fontSelect.selectedIndex = i;\n    });\n    return fontSelect;\n  }\n  fontBtns.forEach(btn =\u003e {\n    btn.addEventListener('click', () =\u003e {\n      window.currentFont = btn.dataset.font || window.currentFont;\n      if (hiddenFont) hiddenFont.value = window.currentFont;\n      if (arcEl)      arcEl.style.fontFamily      = window.currentFont;\n      if (popupArcEl) popupArcEl.style.fontFamily = window.currentFont;\n      const ff = formField();\n      if (ff) ff.style.fontFamily = window.currentFont;\n      syncFontSelect();\n      fontBtns.forEach(b =\u003e b.classList.remove('active'));\n      btn.classList.add('active');\n      updatePreview(true);\n      requestAnimationFrame(syncPopupFromPreview);\n    });\n  });\n\n  \/* ── Polling: erkennt Änderungen ohne input-Event (z. B. Symbol-Handler des Themes) ── *\/\n  if (engInput) {\n    let lastEngVal = engInput.value;\n    setInterval(() =\u003e {\n      if (engInput.value !== lastEngVal) {\n        clampValue(engInput);\n        lastEngVal = engInput.value;\n        updatePreview(false);\n        updateCounter(engInput.value);\n        updateNext2State();\n        if (engInput.value.trim()) requestAnimationFrame(syncPopupFromPreview);\n      }\n    }, 200);\n  }\n  (function watchFormField() {\n    const ff = formField();\n    if (!ff) return;\n    ff.setAttribute('maxlength', String(MAX_CHARS));    \/* auch im Produktformular max. 2 Zeichen *\/\n    const fb = formFieldBack();\n    if (fb) fb.setAttribute('maxlength', String(MAX_CHARS));\n    let lastFormVal = ff.value;\n    setInterval(() =\u003e {\n      if (ff.value !== lastFormVal) {\n        clampValue(ff);\n        lastFormVal = ff.value;\n        \/* kein Studio-Popup beim Tippen im Produktformular (dort zeigt jm-live-vorschau-herz die Vorschau) *\/\n      }\n    }, 200);\n  })();\n\n  \/* Gravur + Schrift ins Produktformular übernehmen *\/\n  function writeField(el, val, fireEvents) {\n    if (!el) return;\n    el.value = val;\n    if (el.type === 'hidden') { el.disabled = !val; return; }   \/* leere Rückseite nicht mitsenden *\/\n    el.style.fontFamily = window.currentFont;\n    if (fireEvents) {\n      el.dispatchEvent(new Event('input',  { bubbles: true }));\n      el.dispatchEvent(new Event('change', { bubbles: true }));\n      const maxNote = el.parentElement \u0026\u0026 el.parentElement.querySelector('.max-length-note');\n      if (maxNote) maxNote.textContent = maxNote.textContent.replace(\/\\d+(?=\\s*\\\/|\\s*Zeichen)\/, chars(val).length);\n    }\n  }\n  function pushToForm(fireEvents) {\n    const cut = v =\u003e chars(String(v || '').trim()).slice(0, MAX_CHARS).join('');\n    writeField(formField(), cut(SIDES.front), fireEvents);\n    writeField(SIDES.back.trim() || formFieldBack() ? backTarget() : null, cut(SIDES.back), fireEvents);\n    const fs = syncFontSelect();\n    if (fs \u0026\u0026 fireEvents) fs.dispatchEvent(new Event('change', { bubbles: true }));\n  }\n\n  \/* ── CTA „Jetzt personalisieren“ ── *\/\n  document.querySelectorAll('.js-scroll-to-form').forEach(btn =\u003e {\n    btn.addEventListener('click', e =\u003e {\n      e.preventDefault();\n      if (SIDES.front.trim() || SIDES.back.trim()) pushToForm(false);\n      const form = document.querySelector('#product-form, form[action*=\"\/cart\/add\"]');\n      if (!form) return;\n      form.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      const first = form.querySelector('input:not([type=\"hidden\"]), textarea, select');\n      if (first) setTimeout(() =\u003e first.focus(), 500);\n    });\n  });\n\n  \/* ── Live Preview Link ── *\/\n  document.querySelectorAll('.live-preview-link').forEach(link =\u003e {\n    link.addEventListener('click', e =\u003e {\n      e.preventDefault();\n      const w = document.getElementById('jm-cfg-wrap');\n      if (w) w.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n  });\n\n  \/* ── Popup außerhalb \/ Scroll ── *\/\n  document.addEventListener('click', e =\u003e {\n    if (!mobilePopup) return;\n    if (!mobilePopup.contains(e.target) \u0026\u0026 e.target !== engInput \u0026\u0026 !(e.target.closest \u0026\u0026 e.target.closest('.symbol-btn, .font-btn'))) hidePopup();\n  });\n  window.addEventListener('scroll', hidePopup, { passive: true });\n\n  \/* ── Intersection Observer ── *\/\n  const io = new IntersectionObserver(entries =\u003e {\n    entries.forEach(en =\u003e { if (en.isIntersecting) en.target.classList.add('show'); });\n  }, { threshold: 0.15 });\n  document.querySelectorAll('.engraving-fade').forEach(el =\u003e io.observe(el));\n\n  \/* ── Kettenlänge: Tabelle anklicken → Anzeige aktualisieren ── *\/\n  document.querySelectorAll('.jm-rsz-tr[data-len]').forEach(tr =\u003e {\n    tr.addEventListener('click', () =\u003e {\n      document.querySelectorAll('.jm-rsz-tr[data-len]').forEach(r =\u003e r.classList.toggle('jm-rsz-hl', r === tr));\n      const len = document.getElementById('jm-mh-anno-len');\n      const fit = document.getElementById('jm-mh-anno-fit');\n      if (len) len.textContent = tr.dataset.len + ' cm';\n      if (fit) fit.textContent = tr.dataset.fit || '';\n    });\n  });\n\n\n  \/* ════════════════════════════════════════════\n     3-SCHRITT KONFIGURATOR\n     ════════════════════════════════════════════ *\/\n  let jmStep = 1;\n  const TOTAL = 3;\n\n  function jmSetStep(n, scroll) {\n    jmStep = n;\n    document.querySelectorAll('.jm-cfg-card').forEach(c =\u003e c.classList.remove('active'));\n    const card = document.getElementById('jm-cfg-card-' + n);\n    if (card) card.classList.add('active');\n\n    for (let i = 1; i \u003c= TOTAL; i++) {\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 === 3) jmFillSummary();\n    if (n === 2) { updateNext2State(); setTimeout(applyAllArcs, 50); }\n\n    if (scroll) {\n      const wrap = document.getElementById('jm-cfg-wrap');\n      if (wrap) wrap.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n  }\n\n  function jmFillSummary() {\n    const thumb = document.getElementById('jm-cfg-s3-thumb');\n    if (thumb \u0026\u0026 IMGS.primary) thumb.src = IMGS.primary;\n\n    const gravurEl   = document.getElementById('jm-cfg-s3-gravur-text');\n    const gravurMeta = document.getElementById('jm-cfg-s3-gravur-meta');\n    const esc = t =\u003e String(t).replace(\/[\u0026\u003c\u003e\"]\/g, c =\u003e ({ '\u0026': '\u0026amp;', '\u003c': '\u0026lt;', '\u003e': '\u0026gt;', '\"': '\u0026quot;' }[c]));\n    const used = ['front', 'back'].filter(k =\u003e SIDES[k].trim());\n    if (gravurEl) {\n      gravurEl.innerHTML = used.length\n        ? used.map(k =\u003e '\u003cspan class=\"jm-cfg-s3-gravur-line\"\u003e\u003cspan class=\"jm-cfg-s3-gravur-side\"\u003e' + SIDE_LABEL[k] + '\u003c\/span\u003e\u003cspan style=\"font-family:' + esc(window.currentFont) + '\"\u003e' + esc(SIDES[k].trim()) + '\u003c\/span\u003e\u003c\/span\u003e').join('')\n        : '–';\n    }\n    const sidesEl = document.getElementById('jm-cfg-s3-sides');\n    if (sidesEl) sidesEl.textContent = (used.length ? used.map(k =\u003e SIDE_LABEL[k]).join(' \u0026 ') : 'Keine') + ' · kostenlos';\n\n    const fontName = window.currentFont.replace(\/['\"]\/g, '').split(',')[0].trim();\n    if (gravurMeta) gravurMeta.textContent = 'Schriftart: ' + fontName + ' · je Seite max. 2 Zeichen';\n\n    const fp = document.getElementById('jm-cfg-s3-font-preview');\n    if (fp) { fp.textContent = fontName; fp.style.fontFamily = window.currentFont; }\n\n    const priceSource = document.querySelector('.price__pricing-group');\n    const priceTarget = document.getElementById('jm-cfg-s3-price');\n    if (priceSource \u0026\u0026 priceTarget) priceTarget.innerHTML = priceSource.innerHTML;\n  }\n\n  const next1 = document.getElementById('jm-cfg-next-1');\n  const back2 = document.getElementById('jm-cfg-back-2');\n  const back3 = document.getElementById('jm-cfg-back-3');\n  if (next1) next1.addEventListener('click', () =\u003e jmSetStep(2, true));\n  if (back2) back2.addEventListener('click', () =\u003e jmSetStep(1, true));\n  if (next2Btn) next2Btn.addEventListener('click', () =\u003e { pushToForm(false); jmSetStep(3, true); });\n  if (back3) back3.addEventListener('click', () =\u003e jmSetStep(2, true));\n\n  const popupNext = document.getElementById('jm-cfg-popup-next');\n  if (popupNext) {\n    popupNext.addEventListener('click', () =\u003e {\n      hidePopup();\n      if (jmStep === 2 \u0026\u0026 (SIDES.front.trim() || SIDES.back.trim())) { pushToForm(false); jmSetStep(3, true); }\n    });\n  }\n\n  const s3Cta = document.getElementById('jm-cfg-s3-cta-btn');\n  if (s3Cta) {\n    s3Cta.addEventListener('click', () =\u003e {\n      pushToForm(true);\n      fontBtns.forEach(b =\u003e b.classList.toggle('active', window.currentFont.includes(b.dataset.font || '')));\n      const form = document.querySelector('#product-form, form[action*=\"\/cart\/add\"]');\n      if (form) form.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    });\n  }\n\n\n  \/* ════════════════════════════════════════════\n     BILDER AUS DEN PRODUKTBILDERN DIESES PRODUKTS\n     ════════════════════════════════════════════ *\/\n  function hasKey(str, keys) {\n    const s = String(str || '').toLowerCase();\n    return keys.some(k =\u003e s.indexOf(k) \u003e -1);\n  }\n  function imgUrl(src) {\n    if (!src) return '';\n    if (typeof src === 'object') src = src.src || '';\n    if (src.indexOf('\/\/') === 0) src = 'https:' + src;\n    return src + (src.indexOf('?') \u003e -1 ? '\u0026' : '?') + 'width=900';\n  }\n\n  \/* Live-Vorschau oben im Produktformular (Gravur-Snippet: Desktop-Panel + Mobile-Popup) *\/\n  function setPanels(url) {\n    if (!url || url === PH) return;\n    window.jmAllowPanelChange = true;\n    if (typeof window.syncPanelImages === 'function') {\n      window.syncPanelImages(url);\n    } else {\n      const d = document.getElementById('jm-desktop-preview-img');\n      const m = document.querySelector('#jm-mobile-form-popup img');\n      if (d) d.src = url;\n      if (m) m.src = url;\n    }\n    clearTimeout(setPanels._t);\n    setPanels._t = setTimeout(() =\u003e { window.jmAllowPanelChange = false; }, 700);\n    guardPanels();\n  }\n  \/* Wächter: setzt ein fremdes Skript ein anderes Bild, kommt sofort das Bild dieses Produkts zurück *\/\n  function panelWant() { return IMGS.preview || IMGS.primary || ''; }\n  function guardOne(img) {\n    if (!img || img._jmGuard) return;\n    img._jmGuard = true;\n    new MutationObserver(() =\u003e {\n      const want = panelWant();\n      if (!want || img._jmBusy) return;\n      const a = document.createElement('a'); a.href = want;\n      if (img.src === a.href) return;\n      img._jmBusy = true;\n      window.jmAllowPanelChange = true;\n      img.src = want;\n      setTimeout(() =\u003e { img._jmBusy = false; window.jmAllowPanelChange = false; }, 60);\n    }).observe(img, { attributes: true, attributeFilter: ['src'] });\n  }\n  function guardPanels() {\n    guardOne(document.getElementById('jm-desktop-preview-img'));\n    guardOne(document.querySelector('#jm-mobile-form-popup img'));\n  }\n\n  function applyImages() {\n    if (!IMGS.primary) return;\n    const set = (id, src) =\u003e { const el = document.getElementById(id); if (el \u0026\u0026 src) el.src = src; };\n    set('mhHeroPrimary', IMGS.primary);\n    set('mhHeroHover',   IMGS.hover || IMGS.primary);\n    set('mhCfgPrimary',  IMGS.primary);\n    set('mhCfgHover',    IMGS.hover || IMGS.primary);\n    applySideImage();\n    set('jm-cfg-s3-thumb', IMGS.primary);\n    setPanels(IMGS.preview || IMGS.primary);\n  }\n\n  \/* ════════════════════════════════════════════\n     FARBE (Silber \/ Vergoldet) ↔ Produktformular\n     ════════════════════════════════════════════ *\/\n  const productFormEl = document.querySelector('#product-form, form[action*=\"\/cart\/add\"]');\n  let lastVariantId = null;\n  function colorOfVariant(v) {\n    const opts = (v.options || [v.option1, v.option2, v.option3]).concat([v.title]);\n    return opts.some(isGold) ? 'vergoldet' : 'silber';\n  }\n  function currentVariantObj() {\n    if (!PRODUCT || !productFormEl) return null;\n    const f = productFormEl.querySelector('[name=\"id\"]');\n    return f ? (PRODUCT.variants || []).find(x =\u003e String(x.id) === String(f.value)) || null : null;\n  }\n  \/* Produktformular auf die Variante dieser Farbe stellen *\/\n  function selectVariantFor(color) {\n    if (!PRODUCT || !productFormEl) return;\n    const list = (PRODUCT.variants || []).filter(x =\u003e colorOfVariant(x) === color);\n    const v = list.find(x =\u003e x.available) || list[0];\n    if (!v) return;\n    const vals = (v.options || [v.option1, v.option2, v.option3]).filter(Boolean).map(String);\n    productFormEl.querySelectorAll('select').forEach(sel =\u003e {\n      if (sel.name === 'id') return;\n      Array.from(sel.options).forEach((o, i) =\u003e {\n        if (vals.indexOf(o.value) \u003e -1 \u0026\u0026 sel.selectedIndex !== i) {\n          sel.selectedIndex = i;\n          sel.dispatchEvent(new Event('change', { bubbles: true }));\n        }\n      });\n    });\n    productFormEl.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 productFormEl.querySelector('label[for=\"' + r.id + '\"]');\n        if (lab) lab.click();\n      }\n    });\n    const idSel = productFormEl.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    lastVariantId = String(v.id);\n  }\n  \/* Farbe anzeigen (Bilder, Texte, Buttons) – optional Produktformular mitziehen *\/\n  function setColor(color, pushForm) {\n    if (!COLORS[color]) color = 'silber';\n    curColor = color;\n    if (IMG_BY[color]) Object.assign(IMGS, IMG_BY[color]);\n    document.querySelectorAll('.jm-mh-color').forEach(b =\u003e b.classList.toggle('active', b.dataset.color === color));\n    document.querySelectorAll('.js-mh-material').forEach(el =\u003e { el.textContent = COLORS[color].material; });\n    const lb = document.getElementById('mhCfgLabel');\n    if (lb) lb.textContent = COLORS[color].label;\n    const sc = document.getElementById('jm-cfg-s3-color');\n    if (sc) sc.textContent = COLORS[color].label;\n    if (pushForm) selectVariantFor(color);\n    applyImages();\n  }\n  document.querySelectorAll('.jm-mh-color').forEach(b =\u003e b.addEventListener('click', () =\u003e {\n    if (b.classList.contains('unavailable')) return;\n    setColor(b.dataset.color, true);\n  }));\n  \/* Produktformular → Konfigurator (Farbe oben im Formular gewechselt) *\/\n  function syncColorFromForm() {\n    const v = currentVariantObj();\n    if (!v || String(v.id) === lastVariantId) return;\n    lastVariantId = String(v.id);\n    const c = colorOfVariant(v);\n    if (c !== curColor) setColor(c, false);\n  }\n  if (productFormEl) {\n    productFormEl.addEventListener('change', () =\u003e setTimeout(syncColorFromForm, 60));\n    setInterval(syncColorFromForm, 500);\n  }\n\n  function loadProduct() {\n    const el = document.querySelector('script[id^=\"ProductJson\"], script[data-product-json]');\n    if (el) { try { return Promise.resolve(JSON.parse(el.textContent)); } catch (e) {} }\n    return fetch(location.pathname.replace(\/\\\/$\/, '') + '.js').then(r =\u003e r.json());\n  }\n\n  loadProduct().then(p =\u003e {\n    PRODUCT = p;\n    const media = (p.media || [])\n      .filter(m =\u003e !m.media_type || m.media_type === 'image')\n      .map(m =\u003e ({ alt: String(m.alt || ''), src: m.src || (m.preview_image \u0026\u0026 m.preview_image.src) }))\n      .filter(m =\u003e m.src);\n    if (!media.length \u0026\u0026 p.images) p.images.forEach(src =\u003e media.push({ alt: '', src: src }));\n\n    const first   = imgUrl(p.featured_image || (media[0] \u0026\u0026 media[0].src));\n    const worn    = media.find(m =\u003e hasKey(m.alt, ['getragen', 'model', 'hals']));\n    const back    = media.find(m =\u003e hasKey(m.alt, ['rückseite', 'rueckseite', 'hinten']));\n    const preview = media.find(m =\u003e hasKey(m.alt, ['gravur', 'vorschau']) \u0026\u0026 m !== back);\n    const second  = media.find(m =\u003e imgUrl(m.src) !== first);\n\n    \/* Standard (eine Farbe \/ Fallback) *\/\n    const base = {\n      primary: first,\n      hover:   worn ? imgUrl(worn.src) : (second ? imgUrl(second.src) : first),\n      preview: preview ? imgUrl(preview.src) : first,\n      back:    back ? imgUrl(back.src) : ''\n    };\n    \/* Je Farbe: Variantenbild + Alt-Texte mit\/ohne „Vergoldet“\n       (z. B. „Gravur Vorschau Mini Herz“ = Silber, „Gravur Vorschau Mini Herz Vergoldet“ = Vergoldet) *\/\n    Object.keys(COLORS).forEach(c =\u003e {\n      const gold = c === 'vergoldet';\n      const mine = m =\u003e isGold(m.alt) === gold;\n      const v = (p.variants || []).find(x =\u003e colorOfVariant(x) === c \u0026\u0026 x.featured_image);\n      const pv = media.find(m =\u003e mine(m) \u0026\u0026 hasKey(m.alt, ['gravur', 'vorschau']) \u0026\u0026 !hasKey(m.alt, ['rückseite', 'rueckseite', 'hinten']));\n      const bk = media.find(m =\u003e mine(m) \u0026\u0026 hasKey(m.alt, ['rückseite', 'rueckseite', 'hinten']));\n      const wr = media.find(m =\u003e mine(m) \u0026\u0026 hasKey(m.alt, ['getragen', 'model', 'hals']));\n      const pr = v ? imgUrl(v.featured_image) : (gold ? (pv ? imgUrl(pv.src) : base.primary) : base.primary);\n      IMG_BY[c] = {\n        primary: pr,\n        hover:   wr ? imgUrl(wr.src) : (gold ? (pv ? imgUrl(pv.src) : pr) : base.hover),\n        preview: pv ? imgUrl(pv.src) : (gold ? pr : base.preview),\n        back:    bk ? imgUrl(bk.src) : (gold ? '' : base.back)\n      };\n    });\n    \/* Farbwahl nur zeigen, wenn es beide Farben als Variante gibt *\/\n    const hasGold   = (p.variants || []).some(x =\u003e colorOfVariant(x) === 'vergoldet');\n    const hasSilver = (p.variants || []).some(x =\u003e colorOfVariant(x) === 'silber');\n    const wrap = document.getElementById('jm-mh-color-wrap');\n    if (wrap) wrap.style.display = (hasGold \u0026\u0026 hasSilver) ? '' : 'none';\n    document.querySelectorAll('.jm-mh-color').forEach(b =\u003e {\n      const v = (p.variants || []).find(x =\u003e colorOfVariant(x) === b.dataset.color);\n      b.classList.toggle('unavailable', !!v \u0026\u0026 !v.available);\n    });\n    \/* Startfarbe = aktuell gewählte Variante im Produktformular *\/\n    const cur = currentVariantObj();\n    lastVariantId = cur ? String(cur.id) : null;\n    setColor(cur ? colorOfVariant(cur) : 'silber', false);\n  }).catch(err =\u003e { console.warn('[JM Mini-Herz] Produktdaten nicht geladen:', err); });\n\n\n  \/* ════════════════════════════════════════════\n     GRAVUR-POSITION anwenden\n     ════════════════════════════════════════════ *\/\n  const ARC_TARGETS = {\n    step2_desktop: { label: 'Schritt 2 · Desktop', el: 'engravingArcTextEl', path: 'ringArcPath' },\n    step2_mobile:  { label: 'Schritt 2 · Mobile',  el: 'engravingArcTextEl', path: 'ringArcPath' },\n    popup:         { label: 'Mobile-Popup (mit „Zur Bestätigung“)', el: 'popupArcTextEl', path: 'popupArcPath' },\n    panel:         { label: 'Live-Vorschau oben · Desktop', el: 'jm-desktop-arc-text', box: '#jm-desktop-preview-panel' },\n    mfp:           { label: 'Theme-Popup oben · Mobile',    el: 'jm-mfp-text',         box: '#jm-mobile-form-popup' }\n  };\n  const ARC_FALLBACK = { cx: 50, cy: 52, w: 30, tilt: 0, bulge: 0, rot: 0, size: 8, offset: 50, spacing: 0 };\n  const arcOverride = {};\n\n  function arcParts(name) {\n    const t = ARC_TARGETS[name];\n    if (!t) return null;\n    const box = t.box ? document.querySelector(t.box) : null;\n    let el = box ? box.querySelector('textPath, textpath') : null;\n    if (!el) el = document.getElementById(t.el);\n    if (!el) return null;\n    const svg = el.closest('svg');\n    if (!svg) return { html: true, el: el, box: box || el.parentElement };\n    const tp = el.tagName.toLowerCase() === 'textpath' ? el : el.querySelector('textPath, textpath');\n    const text = tp ? tp.closest('text') : (el.tagName.toLowerCase() === 'text' ? el : null);\n    if (!tp || !text) return null;\n    let path = t.path ? document.getElementById(t.path) : null;\n    if (!path) {\n      const ref = (tp.getAttribute('href') || tp.getAttribute('xlink:href') || '').replace('#', '');\n      path = (ref \u0026\u0026 document.getElementById(ref)) || svg.querySelector('path');\n    }\n    if (!path) return null;\n    const vb = svg.viewBox \u0026\u0026 svg.viewBox.baseVal;\n    return { svg, tp, text, path, vw: (vb \u0026\u0026 vb.width) || 100, vh: (vb \u0026\u0026 vb.height) || 100 };\n  }\n\n  function arcValues(name) {\n    if (arcOverride[name]) return arcOverride[name];\n    const cfg = (window.JM_ARC || {})[name] || {};\n    return cfg.default || null;\n  }\n\n  function applyArc(name, v) {\n    const p = arcParts(name);\n    if (!p || !v) return;\n    if (p.html) {\n      const W = (p.box \u0026\u0026 p.box.getBoundingClientRect().width) || window.innerWidth * 0.9;\n      p.el.style.position = 'absolute';\n      p.el.style.left = v.cx + '%';\n      p.el.style.top = v.cy + '%';\n      p.el.style.transform = 'translate(-50%, -50%) rotate(' + v.rot + 'deg)';\n      p.el.style.fontSize = (v.size * W \/ 100).toFixed(2) + 'px';\n      p.el.style.letterSpacing = (v.spacing * W \/ 100).toFixed(2) + 'px';\n      p.el.style.whiteSpace = 'nowrap';\n      return;\n    }\n    const kx = p.vw \/ 100, ky = p.vh \/ 100;\n    const x1 = (v.cx - v.w \/ 2) * kx, x2 = (v.cx + v.w \/ 2) * kx;\n    const y1 = (v.cy + v.tilt \/ 2) * ky, y2 = (v.cy - v.tilt \/ 2) * ky;\n    const qx = (x1 + x2) \/ 2, qy = (y1 + y2) \/ 2 - v.bulge * ky;\n    p.path.setAttribute('d', 'M ' + x1.toFixed(2) + ',' + y1.toFixed(2) + ' Q ' + qx.toFixed(2) + ',' + qy.toFixed(2) + ' ' + x2.toFixed(2) + ',' + y2.toFixed(2));\n    p.text.style.transform = '';\n    p.text.setAttribute('transform', 'rotate(' + v.rot + ' ' + (v.cx * kx).toFixed(2) + ' ' + (v.cy * ky).toFixed(2) + ')');\n    p.text.style.fontSize = (v.size * kx).toFixed(2) + 'px';\n    p.text.style.letterSpacing = (v.spacing * kx).toFixed(2) + 'px';\n    p.tp.setAttribute('startOffset', v.offset + '%');\n    p.tp.setAttribute('text-anchor', 'middle');\n    \/* Text vertikal mittig auf der Linie (wirkt bei 2 Zeichen ruhiger) *\/\n    p.text.setAttribute('dominant-baseline', 'central');\n  }\n\n  function step2Mode() { return window.innerWidth \u003e 768 ? 'step2_desktop' : 'step2_mobile'; }\n  function applyAllArcs() {\n    applyArc(step2Mode(), arcValues(step2Mode()));\n    ['popup', 'panel', 'mfp'].forEach(n =\u003e applyArc(n, arcValues(n)));\n  }\n\n  window.addEventListener('resize', () =\u003e { clearTimeout(applyAllArcs._r); applyAllArcs._r = setTimeout(applyAllArcs, 150); });\n  const productForm = document.querySelector('#product-form, form[action*=\"\/cart\/add\"]');\n  if (productForm) productForm.addEventListener('input', () =\u003e setTimeout(applyAllArcs, 60));\n  document.addEventListener('DOMContentLoaded', () =\u003e setTimeout(applyAllArcs, 200));\n  window.addEventListener('load', () =\u003e setTimeout(applyAllArcs, 400));\n\n  \/* ── Tweak-Panel: ?jmtweak=1  (?jmtweak=0 schaltet es aus) ── *\/\n  let jmTweakOn = false;\n  try {\n    if (\/[?\u0026]jmtweak=0\/.test(location.search)) sessionStorage.removeItem('jmtweak');\n    else if (\/[?\u0026]jmtweak\/.test(location.search)) sessionStorage.setItem('jmtweak', '1');\n    jmTweakOn = sessionStorage.getItem('jmtweak') === '1';\n  } catch (e) { jmTweakOn = \/[?\u0026]jmtweak(?!=0)\/.test(location.search); }\n\n  if (jmTweakOn) {\n    const FIELDS = [\n      ['cx', 'Mitte horizontal %', 0, 100, 0.5], ['cy', 'Mitte vertikal %', 0, 100, 0.5],\n      ['w', 'Breite %', 5, 120, 0.5], ['tilt', 'Winkel', -40, 40, 0.5],\n      ['bulge', 'Wölbung', -80, 80, 0.5], ['rot', 'Drehung °', -60, 60, 1],\n      ['size', 'Schriftgröße', 0.5, 30, 0.1], ['offset', 'Position auf Linie %', 0, 100, 0.5],\n      ['spacing', 'Zeichenabstand', -1, 5, 0.05]\n    ];\n    const css = document.createElement('style');\n    css.textContent = '#jm-arc-tweak{position:fixed;right:20px;top:90px;z-index:2147483647;width:270px;max-width:calc(100vw - 20px);max-height:85vh;overflow:auto;background:rgba(17,17,17,.94);color:#eee;border:1px solid #c9a84c;border-radius:12px;padding:0 12px 12px;font:12px\/1.4 Inter,sans-serif;box-shadow:0 10px 30px rgba(0,0,0,.4)}'\n      + '#jm-at-head{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 -12px 4px;padding:10px 12px;background:#1b1b1b;border-bottom:1px solid #333;cursor:move;touch-action:none;user-select:none}'\n      + '#jm-at-head strong{color:#c9a84c}'\n      + '#jm-at-min,#jm-at-flip{width:auto!important;margin:0!important;padding:4px 12px!important;background:#333!important;color:#eee!important;font-size:14px!important}'\n      + '#jm-arc-tweak.jm-min{max-height:none;overflow:visible}#jm-arc-tweak.jm-min #jm-at-body{display:none}'\n      + '@media (max-width:768px){#jm-arc-tweak{width:230px;max-height:45vh;top:70px;right:8px;background:rgba(17,17,17,.85)}}'\n      + '#jm-arc-tweak select,#jm-arc-tweak button{width:100%;margin-top:6px;padding:5px;border-radius:6px;border:0;font:inherit}'\n      + '#jm-arc-tweak button{background:#c9a84c;color:#111;font-weight:600;cursor:pointer}'\n      + '#jm-arc-tweak label{display:flex;justify-content:space-between;margin-top:7px}'\n      + '#jm-arc-tweak input[type=range]{width:100%;cursor:pointer}'\n      + '#jm-arc-tweak code{display:block;margin-top:8px;padding:6px;background:#222;border-radius:6px;font-size:10.5px;white-space:pre-wrap;cursor:text;word-break:break-all}'\n      + '#jm-arc-tweak .jm-hint{color:#c9a84c;margin-top:6px;font-size:11px}';\n    document.head.appendChild(css);\n\n    const tw = document.createElement('div');\n    tw.id = 'jm-arc-tweak';\n    let html = '\u003cdiv id=\"jm-at-head\"\u003e\u003cstrong\u003e⠿ Gravur-Position\u003c\/strong\u003e\u003cspan\u003e\u003cbutton type=\"button\" id=\"jm-at-flip\" title=\"oben\/unten\"\u003e⇅\u003c\/button\u003e \u003cbutton type=\"button\" id=\"jm-at-min\" title=\"einklappen\"\u003e–\u003c\/button\u003e\u003c\/span\u003e\u003c\/div\u003e\u003cdiv id=\"jm-at-body\"\u003e'\n      + '\u003cselect id=\"jm-at-target\"\u003e' + Object.keys(ARC_TARGETS).map(k =\u003e '\u003coption value=\"' + k + '\"\u003e' + ARC_TARGETS[k].label + '\u003c\/option\u003e').join('') + '\u003c\/select\u003e'\n      + '\u003cdiv class=\"jm-hint\" id=\"jm-at-info\"\u003e\u003c\/div\u003e';\n    FIELDS.forEach(f =\u003e {\n      html += '\u003clabel\u003e' + f[1] + ' \u003cspan id=\"jm-at-v-' + f[0] + '\"\u003e\u003c\/span\u003e\u003c\/label\u003e'\n           +  '\u003cinput type=\"range\" data-k=\"' + f[0] + '\" min=\"' + f[2] + '\" max=\"' + f[3] + '\" step=\"' + f[4] + '\"\u003e';\n    });\n    html += '\u003ccode id=\"jm-at-out\"\u003e\u003c\/code\u003e\u003cbutton type=\"button\" id=\"jm-at-copy\"\u003eWerte kopieren\u003c\/button\u003e\u003c\/div\u003e';\n    tw.innerHTML = html;\n    document.body.appendChild(tw);\n\n    function keepVisible() {\n      const r = tw.getBoundingClientRect();\n      if (r.bottom \u003c 40 || r.top \u003e window.innerHeight - 40 || r.right \u003c 60 || r.left \u003e window.innerWidth - 60) {\n        tw.style.left = 'auto'; tw.style.right = '8px'; tw.style.top = '70px'; tw.style.bottom = 'auto';\n      }\n    }\n    setTimeout(keepVisible, 300);\n    window.addEventListener('resize', keepVisible);\n\n    const selT = tw.querySelector('#jm-at-target');\n    Array.from(selT.options).forEach(o =\u003e {\n      if (!arcParts(o.value)) o.textContent = ARC_TARGETS[o.value].label + ' – nicht auf dieser Seite';\n    });\n    let cur = {};\n\n    function keepOpen() {\n      if (selT.value !== 'mfp') return;\n      const pop = document.getElementById('jm-mobile-form-popup');\n      if (!pop) return;\n      clearTimeout(pop._t);\n      pop.style.display = 'block';\n    }\n    function loadTarget() {\n      const name = selT.value;\n      keepOpen();\n      cur = Object.assign({}, ARC_FALLBACK, arcValues(name) || {});\n      FIELDS.forEach(f =\u003e {\n        tw.querySelector('[data-k=\"' + f[0] + '\"]').value = cur[f[0]];\n        tw.querySelector('#jm-at-v-' + f[0]).textContent = cur[f[0]];\n      });\n      const parts = arcParts(name);\n      tw.querySelector('#jm-at-info').textContent = (parts ? (parts.html ? 'Text ohne SVG: Breite\/Winkel\/Wölbung\/Position wirken hier nicht · ' : '') : '⚠ Element nicht gefunden – ')\n        + (name.indexOf('step2') === 0 ? 'Schritt 2 öffnen \u0026 Text eingeben' : 'Gravurtext eingeben, damit es sichtbar ist');\n      writeOut();\n    }\n    function writeOut() {\n      const vals = FIELDS.map(f =\u003e f[0] + ': ' + cur[f[0]]).join(', ');\n      tw.querySelector('#jm-at-out').textContent = 'JM_ARC.' + selT.value + '.default = { ' + vals + ' };';\n    }\n    tw.addEventListener('input', e =\u003e {\n      const k = e.target.dataset \u0026\u0026 e.target.dataset.k;\n      if (!k) return;\n      cur[k] = parseFloat(e.target.value);\n      keepOpen();\n      tw.querySelector('#jm-at-v-' + k).textContent = cur[k];\n      arcOverride[selT.value] = Object.assign({}, cur);\n      applyArc(selT.value, cur);\n      writeOut();\n    });\n    selT.addEventListener('change', loadTarget);\n    tw.querySelector('#jm-at-copy').addEventListener('click', function () {\n      if (navigator.clipboard) navigator.clipboard.writeText(tw.querySelector('#jm-at-out').textContent);\n      const b = this; b.textContent = 'Kopiert ✓';\n      setTimeout(() =\u003e { b.textContent = 'Werte kopieren'; }, 1500);\n    });\n\n    \/* verschiebbar per Maus UND Finger – nur über die Kopfzeile *\/\n    const head = tw.querySelector('#jm-at-head');\n    let drag = false, ox = 0, oy = 0;\n    function dragStart(x, y) {\n      const r = tw.getBoundingClientRect();\n      tw.style.left = r.left + 'px'; tw.style.top = r.top + 'px';\n      tw.style.right = 'auto'; tw.style.bottom = 'auto';\n      drag = true; ox = x - r.left; oy = y - r.top;\n    }\n    function dragMove(x, y) {\n      if (!drag) return;\n      const maxX = window.innerWidth - 60, maxY = window.innerHeight - 40;\n      tw.style.left = Math.min(Math.max(x - ox, -tw.offsetWidth + 60), maxX) + 'px';\n      tw.style.top  = Math.min(Math.max(y - oy, 0), maxY) + 'px';\n    }\n    const isBtn = t =\u003e t.closest \u0026\u0026 t.closest('button');\n    head.addEventListener('mousedown', e =\u003e { if (isBtn(e.target)) return; dragStart(e.clientX, e.clientY); e.preventDefault(); });\n    document.addEventListener('mousemove', e =\u003e dragMove(e.clientX, e.clientY));\n    document.addEventListener('mouseup', () =\u003e { drag = false; });\n    head.addEventListener('touchstart', e =\u003e {\n      if (isBtn(e.target)) return;\n      const t = e.touches[0]; dragStart(t.clientX, t.clientY); e.preventDefault();\n    }, { passive: false });\n    document.addEventListener('touchmove', e =\u003e {\n      if (!drag) return;\n      const t = e.touches[0]; dragMove(t.clientX, t.clientY); e.preventDefault();\n    }, { passive: false });\n    document.addEventListener('touchend', () =\u003e { drag = false; });\n\n    tw.querySelector('#jm-at-flip').addEventListener('click', () =\u003e {\n      const r = tw.getBoundingClientRect();\n      const toTop = r.top \u003e window.innerHeight \/ 2;\n      tw.style.left = 'auto'; tw.style.right = '8px';\n      if (toTop) { tw.style.top = '10px'; tw.style.bottom = 'auto'; }\n      else { tw.style.top = 'auto'; tw.style.bottom = '10px'; }\n    });\n    tw.querySelector('#jm-at-min').addEventListener('click', function () {\n      const min = tw.classList.toggle('jm-min');\n      this.textContent = min ? '+' : '–';\n    });\n\n    loadTarget();\n  }\n\n  \/* ── Init ── *\/\n  document.addEventListener('DOMContentLoaded', () =\u003e setTimeout(applyImages, 150));\n  window.addEventListener('load', () =\u003e setTimeout(applyImages, 300));\n  updateCounter('');\n  jmSetStep(1, false);\n  applyAllArcs();\n\n})();\n\n\/* ── Scroll Reveal (Features + Specs) ── *\/\n(function () {\n  const revealObs = new IntersectionObserver(entries =\u003e {\n    entries.forEach(entry =\u003e {\n      if (entry.isIntersecting) { entry.target.classList.add('in'); revealObs.unobserve(entry.target); }\n    });\n  }, { threshold: 0.12 });\n  document.querySelectorAll('.reveal, .reveal-left, .reveal-right, .reveal-scale').forEach(el =\u003e revealObs.observe(el));\n})();\n\n\/* ── 3D Card Tilt (nur Desktop) ── *\/\nif (window.innerWidth \u003e 1024) {\n  document.querySelectorAll('.card-3d').forEach(card =\u003e {\n    card.addEventListener('mousemove', e =\u003e {\n      const rect = card.getBoundingClientRect();\n      const x = (e.clientX - rect.left - rect.width \/ 2) \/ (rect.width \/ 2);\n      const y = (e.clientY - rect.top - rect.height \/ 2) \/ (rect.height \/ 2);\n      card.style.transform = `translateY(-8px) rotateX(${ -y * 6 }deg) rotateY(${ x * 6 }deg)`;\n      card.style.transition = 'transform .08s ease';\n    });\n    card.addEventListener('mouseleave', () =\u003e {\n      card.style.transform = '';\n      card.style.transition = 'transform .5s cubic-bezier(.23,1,.32,1)';\n    });\n  });\n}\n\u003c\/script\u003e\n\n","brand":"Juwelier Milano","offers":[{"title":"Edelstahl \/ 38 cm + 4 cm","offer_id":57449967714569,"sku":null,"price":59.0,"currency_code":"EUR","in_stock":true},{"title":"Vergoldet \/ 38 cm + 4 cm","offer_id":57455097839881,"sku":null,"price":69.0,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0532\/9941\/3155\/files\/Herz_Halskette_fein.jpg?v=1792016101"}],"url":"https:\/\/shop.juwelier-milano.de\/collections\/neuheiten.oembed","provider":"Juwelier Milano","version":"1.0","type":"link"}