{"id":1104,"date":"2026-08-24T07:37:47","date_gmt":"2026-08-24T07:37:47","guid":{"rendered":"https:\/\/spiritual-activity.org\/?page_id=1104"},"modified":"2026-08-24T08:20:36","modified_gmt":"2026-08-24T08:20:36","slug":"test","status":"publish","type":"page","link":"https:\/\/spiritual-activity.org\/ko\/test\/","title":{"rendered":"Test"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1104\" class=\"elementor elementor-1104\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d7b14e3 e-flex e-con-boxed e-con e-parent\" data-id=\"d7b14e3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bece78e elementor-widget elementor-widget-html\" data-id=\"bece78e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n  .ecwid-ProductBrowser,\n  .ecwid-productbrowser,\n  div[id^=\"my-store\"],\n  .ecwid:not(#sw-host-nl) {\n    visibility: hidden !important;\n    height: 0 !important;\n    max-height: 0 !important;\n    overflow: hidden !important;\n    padding: 0 !important;\n    margin: 0 !important;\n    position: absolute !important;\n    pointer-events: none !important;\n  }\n<\/style>\n<div id=\"sw-overlay-nl\" style=\"display:none; position:fixed; inset:0; background:rgba(245,250,246,0.92); z-index:99999; flex-direction:column; align-items:center; justify-content:center; gap:20px;\">\n  <div style=\"width:52px; height:52px; border:4px solid #B8DEC4; border-top-color:#0C1E14; border-radius:50%; animation:sw-spin-nl 0.8s linear infinite;\"><\/div>\n  <div style=\"font-family:'Tinos',Georgia,serif; font-size:22px; color:#27703F;\">Checkout wordt geladen\u2026<\/div>\n<\/div>\n<style>\n  @keyframes sw-spin-nl { to { transform: rotate(360deg); } }\n<\/style>\n<div id=\"sw-host-nl\"><\/div>\n<script>\n(function () {\n\n  \/\/ \u2500\u2500 Sprach-Guard: Skript bricht sofort ab, wenn die URL nicht zu NL passt \u2500\u2500\n  const _pathMatch = window.location.pathname.match(\/^\\\/([a-z]{2})(\\\/|$)\/);\n  const _pageLang = _pathMatch ? _pathMatch[1] : \"de\";\n  if (_pageLang !== \"nl\") return;\n\n  const OVERLAY_ID    = \"sw-overlay-nl\";\n  const SHOP_CART_URL = \"https:\/\/spiritual-activity.org\/nl\/store\/cart\";\n  const N8N_WEBHOOK_URL = \"https:\/\/n8n.spiritual-activity.org\/webhook\/registration-be\";\n\n  function getGroupRedirectUrl() {\n    const path = window.location.pathname;\n    \/\/ Erkennt Sprachpraefixe wie \/en\/, \/es\/, \/it\/, \/ru\/ am Anfang des Pfads.\n    \/\/ Deutsch ist die Standardsprache ohne Praefix.\n    const match = path.match(\/^\\\/([a-z]{2})(\\\/|$)\/);\n    const langPrefix = (match && match[1] !== \"de\") ? \"\/\" + match[1] : \"\";\n    return \"https:\/\/basic-exercises.com\" + langPrefix + \"\/gruppen\/\";\n  }\n\n  const PRODUCTS = {\n    cat1: 842750049,\n    cat2: 844860366,\n    cat3: 844907264,\n    cat4: 844907265\n  };\n\n  const RANGES = {\n    cat1: { min: 160, max: 800 },\n    cat2: { min: 105, max: 700 },\n    cat3: { min:  75, max: 600 },\n    cat4: { min:  45, max: 500 }\n  };\n\n  const ORIENTIERUNG = {\n    cat1: { reduced: 160, base: 360, support: 580 },\n    cat2: { reduced: 105, base: 240, support: 460 },\n    cat3: { reduced:  75, base: 160, support: 340 },\n    cat4: { reduced:  45, base: 105, support: 220 }\n  };\n\n  const DISCOUNT_WIEDERHOLER = 0.30;\n  const DISCOUNT_SCHUELER    = 0.50;\n  const DISCOUNT_STUDENT     = 0.25;\n  const DISCOUNT_PAAR_P2     = 0.50;\n  const DISCOUNT_APP_FIXED   = 35;\n\n  const APP_ONLY_LANGS = new Set([\"Portugiesisch\",\"Arabisch\",\"Hebr\u00e4isch\",\"Farsi\",\"Georgisch\",\"Ukrainisch\",\"Niederl\u00e4ndisch\",\"T\u00fcrkisch\",\"Norwegisch\"]);\n\n  const EU_PLUS_CH = new Set([\n    \"AT\",\"BE\",\"BG\",\"CY\",\"CZ\",\"DE\",\"DK\",\"EE\",\"ES\",\"FI\",\"FR\",\"GR\",\"HR\",\n    \"HU\",\"IE\",\"IT\",\"LT\",\"LU\",\"LV\",\"MT\",\"NL\",\"PL\",\"PT\",\"RO\",\"SE\",\"SI\",\"SK\",\"CH\"\n  ]);\n  function needsShipping(countryCode) {\n    return countryCode && !EU_PLUS_CH.has(countryCode);\n  }\n\n  const COUNTRY_NAME_OVERRIDES = {\n    \"HK\":\"Hongkong\",\"MO\":\"Macau\",\"TW\":\"Taiwan\",\"AE\":\"Verenigde Arabische Emiraten\",\n    \"US\":\"Verenigde Staten\",\"GB\":\"Verenigd Koninkrijk\",\"GB-SCT\":\"Schotland\",\n    \"KR\":\"Zuid-Korea\",\"SA\":\"Saoedi-Arabi\u00eb\",\n    \"MD\":\"Moldavi\u00eb\",\"PS\":\"Palestijnse gebieden\",\"CD\":\"Congo-Kinshasa\",\"CG\":\"Congo-Brazzaville\",\n    \"ST\":\"Sao Tom\u00e9 en Principe\",\"CI\":\"Ivoorkust\",\"TL\":\"Oost-Timor\",\n    \"CV\":\"Kaapverdi\u00eb\",\"SZ\":\"Eswatini\",\"FM\":\"Micronesia\",\"MH\":\"Marshalleilanden\",\n    \"VC\":\"Saint Vincent en de Grenadines\",\"LC\":\"Saint Lucia\",\"KN\":\"Saint Kitts en Nevis\",\n    \"AG\":\"Antigua en Barbuda\",\"TT\":\"Trinidad en Tobago\",\"BA\":\"Bosni\u00eb en Herzegovina\",\n    \"MK\":\"Noord-Macedoni\u00eb\",\"GQ\":\"Equatoriaal-Guinea\",\"GW\":\"Guinee-Bissau\",\n    \"CF\":\"Centraal-Afrikaanse Republiek\",\"SB\":\"Salomonseilanden\",\"PG\":\"Papoea-Nieuw-Guinea\",\n    \"DO\":\"Dominicaanse Republiek\",\"XK\":\"Kosovo\"\n  };\n\n  const COUNTRIES = {\n    cat1: [\"CY\",\"CA\",\"FR\",\"FI\",\"BH\",\"AU\",\"AD\",\"SE\",\"DE\",\"SA\",\"AT\",\"BE\",\"HK\",\"MT\",\"IS\",\"SM\",\"NL\",\"DK\",\"TW\",\"AE\",\"US\",\"BN\",\"CH\",\"NO\",\"GY\",\"QA\",\"MO\",\"IE\",\"LU\",\"SG\",\"LI\",\"GB\",\"GB-SCT\"],\n    cat2: [\"KR\",\"ME\",\"CL\",\"TT\",\"MV\",\"UY\",\"BS\",\"OM\",\"SC\",\"BG\",\"MY\",\"PA\",\"TR\",\"LV\",\"GR\",\"KZ\",\"SK\",\"HU\",\"RU\",\"RO\",\"EE\",\"AW\",\"PT\",\"PR\",\"HR\",\"KW\",\"JP\",\"NZ\",\"PL\",\"IL\",\"ES\",\"LT\",\"SI\",\"CZ\",\"IT\"],\n    cat3: [\"BZ\",\"TN\",\"GT\",\"IQ\",\"ZA\",\"FJ\",\"EC\",\"LY\",\"ID\",\"VN\",\"BT\",\"DZ\",\"PE\",\"PW\",\"BW\",\"DM\",\"PY\",\"MD\",\"GQ\",\"MN\",\"VC\",\"IR\",\"GD\",\"EG\",\"CO\",\"SR\",\"TM\",\"BA\",\"BB\",\"BR\",\"AL\",\"AM\",\"GA\",\"MX\",\"AZ\",\"TH\",\"LC\",\"CN\",\"MK\",\"DO\",\"AG\",\"AR\",\"GE\",\"CR\",\"MU\",\"RS\",\"BY\",\"KN\",\"XK\"],\n    cat4: [\"UA\",\"BI\",\"SS\",\"CF\",\"YE\",\"MZ\",\"MW\",\"SO\",\"CD\",\"LR\",\"MG\",\"NE\",\"AF\",\"SD\",\"SB\",\"ML\",\"HT\",\"VU\",\"BF\",\"LS\",\"TD\",\"GW\",\"TG\",\"GM\",\"KI\",\"SL\",\"PG\",\"UG\",\"KM\",\"PS\",\"RW\",\"TZ\",\"ET\",\"ZM\",\"FM\",\"BJ\",\"GN\",\"TL\",\"MM\",\"SN\",\"CM\",\"TJ\",\"TV\",\"NP\",\"CG\",\"ST\",\"PK\",\"KE\",\"ZW\",\"MH\",\"HN\",\"TO\",\"CI\",\"WS\",\"GH\",\"VE\",\"KH\",\"MR\",\"KG\",\"NI\",\"NG\",\"DJ\",\"AO\",\"LA\",\"BD\",\"BO\",\"MA\",\"JO\",\"LB\",\"NR\",\"IN\",\"NA\",\"CV\",\"UZ\",\"PH\",\"SZ\",\"JM\",\"SV\",\"LK\"]\n  };\n\n  const OPT_COMM_LANG = \"In welcher Sprache nimmst Du teil?\";\n  const OPT_STATUS    = \"Trifft etwas davon auf Dich zu?\";\n\n  \/\/ \u2500\u2500 Ecwid-Option-Werte (exakt wie im Shop-Screenshot) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const STATUS_LABEL = {\n    paar:        \"Zu zweit (gleicher Haushalt)\",\n    schueler:    \"Sch\u00fcler:innen\",     \/\/ Ecwid-Wert exakt: \"Sch\u00fcler:innen\"\n    student:     \"Student\",\n    wiederholer: \"Wiederholer\",\n    apponly:     \"Digitale Teilnahme (App)\"\n  };\n\n  \/\/ \u2500\u2500 Shadow DOM \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const host = document.getElementById(\"sw-host-nl\");\n  const shadow = host.attachShadow({ mode: \"open\" });\n\n  const styleEl = document.createElement(\"style\");\n  styleEl.textContent = `\n    :host {\n      display: block;\n      --bg:           #F5FAF6;\n      --card:         #FFFFFF;\n      --ink:          #0C1E14;\n      --ink-muted:    #27703F;\n      --accent:       #0C1E14;\n      --accent-light: #E6F2E8;\n      --border:       #C8E0CE;\n      --radius:       16px;\n      --radius-sm:    10px;\n    }\n    @keyframes wiz-spin { to { transform: rotate(360deg); } }\n\n    .sw-root {\n      font-family: 'Tinos', Georgia, serif;\n      font-size: 20px; font-weight: 400; color: var(--ink);\n      background: var(--bg); padding: 32px 20px;\n      display: flex; align-items: flex-start; justify-content: center;\n    }\n    .sw-card {\n      background: var(--card); border: 1px solid var(--border);\n      border-radius: 24px; padding: 36px 32px;\n      width: 100%; max-width: 780px;\n      box-shadow: 0 4px 24px rgba(12,30,20,0.08); box-sizing: border-box;\n    }\n    @media (max-width: 480px) {\n      .sw-root { padding: 16px 10px; }\n      .sw-card { padding: 24px 16px; border-radius: 16px; }\n    }\n\n    .sw-progress { display: flex; gap: 8px; margin-bottom: 32px; }\n    .sw-progress-step { flex: 1; height: 4px; background: var(--border); border-radius: 999px; transition: background 0.35s; }\n    .sw-progress-step.active { background: var(--accent); }\n    .sw-progress-step.done   { background: var(--accent); opacity: 0.4; }\n\n    .sw-step-label { font-size: 12px; font-weight: 400; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 10px; }\n    .sw-heading { font-size: 26px; font-weight: 500; line-height: 1.2; margin: 0 0 6px; color: var(--accent); letter-spacing: 0.01em; }\n    .sw-subtext { font-size: 18px; font-weight: 400; color: var(--ink-muted); margin: 0 0 28px; line-height: 1.6; }\n    .sw-label { display: block; font-size: 18px; font-weight: 700; margin-bottom: 6px; color: var(--ink); }\n\n    .sw-select, .sw-text-input {\n      width: 100%; padding: 13px 15px;\n      border: 1px solid var(--border); border-radius: var(--radius-sm);\n      background: var(--bg);\n      font-family: 'Tinos', Georgia, serif; font-size: 18px; font-weight: 400; color: var(--ink);\n      transition: border-color 0.2s; box-sizing: border-box;\n    }\n    .sw-select {\n      appearance: none;\n      background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%2327703F' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'\/%3E%3C\/svg%3E\");\n      background-repeat: no-repeat; background-position: right 15px center;\n      cursor: pointer;\n    }\n    .sw-select:focus, .sw-text-input:focus {\n      outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(12,30,20,0.1);\n    }\n    .sw-text-input { margin-bottom: 14px; }\n\n    .sw-infobox {\n      margin-top: 12px; padding: 15px 17px; border-radius: var(--radius-sm);\n      background: var(--accent-light); border: 1px solid rgba(12,30,20,0.15);\n      font-size: 18px; font-weight: 400; line-height: 1.5;\n    }\n    .sw-infobox-title {\n      font-weight: 700; font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase;\n      color: var(--accent); margin-bottom: 3px;\n    }\n\n    .sw-divider { border: 0; border-top: 1px solid var(--border); margin: 30px 0 24px; }\n\n    .sw-choice-row { display: flex; gap: 10px; flex-wrap: wrap; }\n.sw-choice-card {\n  flex: 1; min-width: 150px; padding: 16px 14px;\n  border: 1px solid var(--border); border-radius: var(--radius-sm);\n  text-align: center; cursor: pointer; font-size: 17px; line-height: 1.3;\n  transition: all 0.15s; background: var(--bg);\n  box-sizing: border-box;\n}\n    .sw-choice-card:hover { border-color: var(--accent); }\n    .sw-choice-card.active { background: var(--accent-light); border-color: var(--accent); font-weight: 700; color: var(--accent); }\n    @media (max-width: 480px) { .sw-choice-card { min-width: 100%; } }\n\n    .sw-person-block { margin-bottom: 8px; }\n    .sw-person-title { font-weight: 700; font-size: 21px; color: var(--accent); margin-bottom: 16px; }\n    .sw-field-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-bottom: 0; }\n    @media (max-width: 480px) { .sw-field-grid { grid-template-columns: 1fr; } }\n\n    .sw-range-header { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 22px; }\n    .sw-range-header-label { font-weight: 700; font-size: 18px; }\n    .sw-amount-display { display: flex; align-items: baseline; gap: 3px; }\n    .sw-amount-display span { font-size: 18px; font-weight: 400; }\n    .sw-amount-input {\n      font-family: 'Tinos', Georgia, serif;\n      font-size: 36px; font-weight: 700; color: var(--ink);\n      border: 2px solid var(--border); background: var(--bg);\n      text-align: right; width: 132px; padding: 4px 12px;\n      outline: none; border-radius: var(--radius-sm);\n      transition: background 0.15s, color 0.15s, border-color 0.15s, box-shadow 0.15s;\n    }\n    .sw-amount-input:hover { border-color: var(--accent); background: var(--accent-light); }\n    .sw-amount-input:focus { border-color: var(--accent); background: var(--accent-light); color: var(--accent); box-shadow: 0 0 0 3px rgba(12,30,20,0.1); }\n\n    input[type=range].sw-range {\n      -webkit-appearance: none; width: 100%; height: 6px;\n      border-radius: 999px; background: var(--border); outline: none; cursor: pointer;\n    }\n    input[type=range].sw-range::-webkit-slider-thumb {\n      -webkit-appearance: none; width: 40px; height: 40px; border-radius: 50%;\n      background-color: var(--accent);\n      background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 7l-5 5 5 5M16 7l5 5-5 5'\/%3E%3C\/svg%3E\");\n      background-repeat: no-repeat; background-position: center; background-size: 20px 20px;\n      box-shadow: 0 0 0 6px rgba(12,30,20,0.12), 0 3px 10px rgba(12,30,20,0.35);\n      cursor: pointer; transition: transform 0.15s, box-shadow 0.15s;\n    }\n    input[type=range].sw-range::-webkit-slider-thumb:hover { transform: scale(1.08); box-shadow: 0 0 0 9px rgba(12,30,20,0.18), 0 3px 12px rgba(12,30,20,0.4); }\n    input[type=range].sw-range::-webkit-slider-thumb:active { transform: scale(1.12); }\n    input[type=range].sw-range::-moz-range-thumb {\n      width: 40px; height: 40px; border-radius: 50%;\n      background-color: var(--accent);\n      background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M8 7l-5 5 5 5M16 7l5 5-5 5'\/%3E%3C\/svg%3E\");\n      background-repeat: no-repeat; background-position: center; background-size: 20px 20px;\n      border: none; box-shadow: 0 0 0 6px rgba(12,30,20,0.12), 0 3px 10px rgba(12,30,20,0.35); cursor: pointer;\n    }\n    input[type=range].sw-range.sw-pulse::-webkit-slider-thumb { animation: sw-thumb-pulse 1s ease-in-out 3; }\n    input[type=range].sw-range.sw-pulse::-moz-range-thumb    { animation: sw-thumb-pulse 1s ease-in-out 3; }\n    @keyframes sw-thumb-pulse {\n      0%, 100% { box-shadow: 0 0 0 6px rgba(12,30,20,0.12), 0 3px 10px rgba(12,30,20,0.35); }\n      50%      { box-shadow: 0 0 0 15px rgba(12,30,20,0.05), 0 3px 10px rgba(12,30,20,0.35); }\n    }\n\n    .sw-range-wrap { position: relative; }\n    .sw-markers { position: relative; height: 56px; margin-bottom: 8px; margin-left: 18px; margin-right: 18px; }\n    .sw-marker {\n      position: absolute; transform: translateX(-50%);\n      display: flex; flex-direction: column; align-items: center; gap: 2px;\n      justify-content: flex-end; height: 100%; pointer-events: auto; cursor: pointer;\n    }\n    .sw-marker-tick { width: 1px; height: 10px; background: var(--border); flex-shrink: 0; }\n    .sw-marker.active .sw-marker-tick { background: var(--accent); opacity: 0.5; }\n    .sw-marker-label { font-size: 11px; font-weight: 400; color: var(--ink-muted); white-space: nowrap; line-height: 1.2; text-align: center; order: -2; }\n    .sw-marker-amount { font-size: 13px; font-weight: 700; color: var(--ink-muted); order: -1; }\n    .sw-marker.active .sw-marker-label, .sw-marker.active .sw-marker-amount { color: var(--accent); }\n\n    @media (max-width: 540px) {\n      .sw-markers { display: none; }\n      .sw-markers-mobile { display: flex !important; }\n    }\n    .sw-markers-mobile {\n      display: none; flex-direction: column; gap: 0;\n      margin: 12px 0 4px; border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden;\n    }\n    .sw-marker-mobile {\n      display: flex; align-items: center; justify-content: space-between;\n      padding: 10px 14px; cursor: pointer; border-bottom: 1px solid var(--border);\n      transition: background 0.15s; font-family: 'Tinos', Georgia, serif;\n    }\n    .sw-marker-mobile:last-child { border-bottom: 0; }\n    .sw-marker-mobile:hover { background: var(--accent-light); }\n    .sw-marker-mobile.active { background: var(--accent-light); }\n    .sw-marker-mobile-label { font-size: 15px; font-weight: 400; color: var(--ink-muted); }\n    .sw-marker-mobile.active .sw-marker-mobile-label { color: var(--accent); font-weight: 700; }\n    .sw-marker-mobile-amount { font-size: 16px; font-weight: 700; color: var(--ink-muted); }\n    .sw-marker-mobile.active .sw-marker-mobile-amount { color: var(--accent); }\n\n    .sw-summary-box { padding: 18px 20px; background: var(--accent-light); border: 1px solid rgba(12,30,20,0.2); border-radius: var(--radius-sm); margin-top: 20px; }\n    .sw-summary-row { display: flex; justify-content: space-between; align-items: center; padding: 5px 0; font-size: 16px; color: var(--ink); }\n    .sw-summary-row.sw-summary-discount { color: #8A1F1F; }\n    .sw-summary-row.sw-summary-total { border-top: 1px solid rgba(12,30,20,0.25); margin-top: 8px; padding-top: 12px; font-weight: 700; font-size: 22px; color: var(--accent); }\n    .sw-summary-person-label { font-weight: 700; font-size: 13px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-muted); margin: 14px 0 2px; }\n    .sw-summary-person-label:first-child { margin-top: 0; }\n\n    .sw-btn-row { display: flex; gap: 10px; margin-top: 24px; flex-wrap: wrap; }\n    .sw-btn { flex: 1; min-width: 140px; padding: 15px 17px; border-radius: var(--radius-sm); font-family: 'Tinos', Georgia, serif; font-size: 18px; font-weight: 700; cursor: pointer; transition: all 0.2s; border: 0; }\n    .sw-btn-primary { background: var(--accent); color: #fff; }\n    .sw-btn-primary:hover { background: #27703F; transform: translateY(-1px); }\n    .sw-btn-primary:disabled { opacity: 0.4; cursor: not-allowed; transform: none; }\n    .sw-btn-secondary { background: transparent; color: var(--ink); border: 1px solid var(--border); }\n    .sw-btn-secondary:hover { background: var(--bg); }\n\n    .sw-error { display: none; margin-top: 15px; padding: 13px 15px; border-radius: var(--radius-sm); background: #FFF3F3; border: 1px solid rgba(220,30,30,0.2); color: #8A1F1F; font-size: 18px; font-weight: 400; line-height: 1.5; white-space: pre-wrap; }\n    .wiz-spinner { display: inline-block; width: 16px; height: 16px; border: 2px solid rgba(255,255,255,0.4); border-top-color: #fff; border-radius: 50%; animation: wiz-spin 0.7s linear infinite; vertical-align: middle; margin-right: 8px; }\n\n    .sw-country-search-wrap { position: relative; margin-bottom: 10px; }\n    .sw-country-search-icon { position: absolute; left: 18px; top: 50%; transform: translateY(-50%); color: var(--ink-muted); pointer-events: none; opacity: 0.5; }\n    .sw-country-search {\n      width: 100%; padding: 13px 15px 13px 54px;\n      border: 1px solid var(--border); border-radius: var(--radius-sm);\n      background: var(--bg); font-family: 'Tinos', Georgia, serif;\n      font-size: 18px; font-weight: 400; color: var(--ink);\n      transition: border-color 0.2s; box-sizing: border-box;\n    }\n    .sw-country-search:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(12,30,20,0.1); }\n    .sw-country-list { max-height: 240px; overflow-y: auto; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--bg); }\n    .sw-country-item { padding: 11px 15px; cursor: pointer; font-family: 'Tinos', Georgia, serif; font-size: 18px; font-weight: 400; display: flex; justify-content: space-between; align-items: center; transition: background 0.15s; border-bottom: 1px solid var(--border); }\n    .sw-country-item:last-child { border-bottom: 0; }\n    .sw-country-item:hover { background: var(--accent-light); }\n    .sw-country-item.selected { background: var(--accent-light); font-weight: 700; }\n    .sw-country-item-cat { font-size: 12px; color: var(--ink-muted); background: var(--border); padding: 2px 8px; border-radius: 999px; }\n    .sw-country-empty { padding: 15px; font-size: 18px; color: var(--ink-muted); text-align: center; }\n\n    .sw-step { display: none; }\n    .sw-step.active { display: block; }\n  `;\n  shadow.appendChild(styleEl);\n\n  const wrapper = document.createElement(\"div\");\n  wrapper.innerHTML = `\n    <div class=\"sw-root\">\n      <div class=\"sw-card\">\n\n        <div class=\"sw-progress\">\n          <div class=\"sw-progress-step\" id=\"sw-prog-1\"><\/div>\n          <div class=\"sw-progress-step\" id=\"sw-prog-2\"><\/div>\n          <div class=\"sw-progress-step\" id=\"sw-prog-3\"><\/div>\n          <div class=\"sw-progress-step\" id=\"sw-prog-4\"><\/div>\n          <div class=\"sw-progress-step\" id=\"sw-prog-5\"><\/div>\n        <\/div>\n\n        <!-- STEP 1: WELKOM -->\n        <div class=\"sw-step active\" id=\"sw-step-welcome\">\n          <div class=\"sw-step-label\">Stap 1 van 5<\/div>\n          <h2 class=\"sw-heading\">Welkom<\/h2>\n          <p class=\"sw-subtext\">In een paar stappen kies je land, taal, aanmeldtype en bijdrage \u2013 en ga je daarna direct naar de checkout.<\/p>\n          <button class=\"sw-btn sw-btn-primary\" id=\"sw-btn-welcome-next\" style=\"width:100%;\">Prijzen & Aanmelding<\/button>\n        <\/div>\n\n        <!-- STEP 2: LAND -->\n        <div class=\"sw-step\" id=\"sw-step-country\">\n          <div class=\"sw-step-label\">Stap 2 van 5<\/div>\n          <h2 class=\"sw-heading\">Waar woon je?<\/h2>\n          <label class=\"sw-label\">Land<\/label>\n          <div class=\"sw-country-search-wrap\">\n            <svg class=\"sw-country-search-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"\/><path d=\"m21 21-4.35-4.35\"\/><\/svg>\n            <input type=\"text\" class=\"sw-country-search\" id=\"sw-country-search\" placeholder=\"Land zoeken\u2026\" autocomplete=\"off\">\n          <\/div>\n          <div class=\"sw-country-list\" id=\"sw-country-list\"><\/div>\n          <input type=\"hidden\" id=\"sw-country\">\n          <div class=\"sw-infobox\" id=\"sw-catInfo\">\n            <div class=\"sw-infobox-title\">Prijscategorie<\/div>\n            <div id=\"sw-catText\">Kies eerst een land.<\/div>\n          <\/div>\n          <div class=\"sw-btn-row\">\n            <button class=\"sw-btn sw-btn-secondary\" id=\"sw-btn-country-back\">Terug<\/button>\n            <button class=\"sw-btn sw-btn-primary\" id=\"sw-btn-country-next\" disabled>Verder<\/button>\n          <\/div>\n        <\/div>\n\n        <!-- STEP 3: TAAL + AANMELDVORM -->\n        <div class=\"sw-step\" id=\"sw-step-langform\">\n          <div class=\"sw-step-label\">Stap 3 van 5<\/div>\n          <h2 class=\"sw-heading\">Taal & Aanmeldtype<\/h2>\n\n          <label class=\"sw-label\" for=\"sw-commLang\">In welke taal neem je deel?<\/label>\n          <select class=\"sw-select\" id=\"sw-commLang\">\n            <option value=\"\" selected disabled>Kies\u2026<\/option>\n            <option value=\"Deutsch\">Duits<\/option>\n            <option value=\"Englisch\">Engels<\/option>\n            <option value=\"Spanisch\">Spaans<\/option>\n            <option value=\"Franz\u00f6sisch\">Frans<\/option>\n            <option value=\"Italienisch\">Italiaans<\/option>\n            <option value=\"Portugiesisch\">Portugees<\/option>\n            <option value=\"Arabisch\">Arabisch<\/option>\n            <option value=\"Hebr\u00e4isch\">Hebreeuws<\/option>\n            <option value=\"Farsi\">Perzisch<\/option>\n            <option value=\"Georgisch\">Georgisch<\/option>\n            <option value=\"Ukrainisch\">Oekra\u00efens<\/option>\n            <option value=\"Niederl\u00e4ndisch\">Nederlands<\/option>\n            <option value=\"T\u00fcrkisch\">Turks<\/option>\n            <option value=\"Norwegisch\">Noors<\/option>\n            <option value=\"Russisch\">Russisch<\/option>\n            <option value=\"Chinesisch\">Chinees<\/option>\n            <option value=\"Japanisch\">Japans<\/option>\n            <option value=\"Koreanisch\">Koreaans<\/option>\n          <\/select>\n\n          <div class=\"sw-infobox\" id=\"sw-apponly-note\" style=\"display:none; margin-top:14px;\">\n            <div class=\"sw-infobox-title\">DIGITALE DEELNAME \u00b7 \u221235\u20ac<\/div>\n            <div id=\"sw-apponly-note-text\">Je neemt digitaal deel. De korting wordt automatisch in de samenvatting verrekend.<\/div>\n          <\/div>\n\n          <label class=\"sw-label\" style=\"margin-top:26px;\">Hoe wil je je aanmelden?<\/label>\n          <div class=\"sw-choice-row\" id=\"sw-form-choices\">\n            <div class=\"sw-choice-card\" data-form=\"einzeln\">Individueel<\/div>\n            <div class=\"sw-choice-card\" data-form=\"paar\">Met z'n twee\u00ebn<br><span style=\"font-size:13px; font-weight:400;\">(zelfde huishouden)<\/span><\/div>\n            <div class=\"sw-choice-card\" data-form=\"gruppe\">Groep<br><span style=\"font-size:13px; font-weight:400;\">(vanaf 4 personen)<\/span><\/div>\n          <\/div>\n\n          <div class=\"sw-infobox\" id=\"sw-gruppe-note\" style=\"display:none; margin-top:18px;\">\n            <div class=\"sw-infobox-title\">Groepsaanmelding<\/div>\n            <div>Voor groepen bespreken we de voorwaarden graag persoonlijk met je. Je wordt doorgestuurd naar onze groepenpagina.<\/div>\n          <\/div>\n\n          <div class=\"sw-error\" id=\"sw-error-langform\"><\/div>\n\n          <div class=\"sw-btn-row\">\n            <button class=\"sw-btn sw-btn-secondary\" id=\"sw-btn-langform-back\">Terug<\/button>\n            <button class=\"sw-btn sw-btn-primary\" id=\"sw-btn-langform-next\" disabled>Verder<\/button>\n            <button class=\"sw-btn sw-btn-primary\" id=\"sw-btn-gruppe-redirect\" style=\"display:none;\">Verder naar groepsaanmelding<\/button>\n          <\/div>\n        <\/div>\n\n        <!-- STEP 4A: GEGEVENS \u2013 INDIVIDUEEL -->\n        <div class=\"sw-step\" id=\"sw-step-details-solo\">\n          <div class=\"sw-step-label\">Stap 4 van 5<\/div>\n          <h2 class=\"sw-heading\">Een paar gegevens over jou<\/h2>\n          <p class=\"sw-subtext\">Is iets hiervan op jou van toepassing? Dit helpt ons om je de juiste bijdrage voor te stellen.<\/p>\n\n          <div class=\"sw-infobox\" id=\"sw-apponly-note-step4\" style=\"display:none; margin-bottom:20px;\">\n            <div class=\"sw-infobox-title\">DIGITALE DEELNAME \u00b7 \u221235\u20ac<\/div>\n            <div>Je neemt digitaal deel. De korting wordt automatisch in de samenvatting verrekend.<\/div>\n          <\/div>\n\n          <label class=\"sw-label\">Kies alsjeblieft<\/label>\n          <!-- Reihenfolge: Normal \u2192 Sch\u00fcler \u2192 Ausbildung\/Studium \u2192 Wiederholer -->\n          <select class=\"sw-select\" id=\"sw-solo-status\">\n            <option value=\"\" disabled selected>Kies\u2026<\/option>\n            <option value=\"normal\">Normale aanmelding<\/option>\n            <option value=\"schueler\">Scholier (\u221250%)<\/option>\n            <option value=\"student\">In opleiding\/studie (\u221225%)<\/option>\n            <option value=\"wiederholer\">Ik herhaal de cursus met de zielenoefeningen (geen nieuwe kaartenset \u2212 30%)<\/option>\n          <\/select>\n\n          <div class=\"sw-error\" id=\"sw-error-details-solo\"><\/div>\n\n          <div class=\"sw-btn-row\">\n            <button class=\"sw-btn sw-btn-secondary\" id=\"sw-btn-details-solo-back\">Terug<\/button>\n            <button class=\"sw-btn sw-btn-primary\" id=\"sw-btn-details-solo-next\" disabled>Verder<\/button>\n          <\/div>\n        <\/div>\n\n        <!-- STEP 4B: GEGEVENS \u2013 PAAR -->\n        <div class=\"sw-step\" id=\"sw-step-details-paar\">\n          <div class=\"sw-step-label\">Stap 4 van 5<\/div>\n          <h2 class=\"sw-heading\">Gegevens over jullie beiden<\/h2>\n          <p class=\"sw-subtext\">Vul de gegevens voor beide personen in. De tweede persoon krijgt automatisch 50% korting.<\/p>\n\n          <div class=\"sw-infobox\" id=\"sw-apponly-note-paar-step4\" style=\"display:none; margin-bottom:20px;\">\n            <div class=\"sw-infobox-title\">DIGITALE DEELNAME \u00b7 \u221235\u20ac<\/div>\n            <div>Jullie nemen digitaal deel. De korting wordt automatisch in de samenvatting verrekend.<\/div>\n          <\/div>\n\n          <div class=\"sw-person-block\">\n            <div class=\"sw-person-title\">Persoon 1<\/div>\n            <div class=\"sw-field-grid\">\n              <div><label class=\"sw-label\">Voornaam<\/label><input class=\"sw-text-input\" type=\"text\" id=\"sw-p1-vorname\"><\/div>\n              <div><label class=\"sw-label\">Achternaam<\/label><input class=\"sw-text-input\" type=\"text\" id=\"sw-p1-nachname\"><\/div>\n            <\/div>\n            <label class=\"sw-label\">E-mail<\/label>\n            <input class=\"sw-text-input\" type=\"email\" id=\"sw-p1-email\">\n          <\/div>\n\n          <hr class=\"sw-divider\">\n\n          <div class=\"sw-person-block\">\n            <div class=\"sw-person-title\">Persoon 2 <span style=\"font-size:21px; font-weight:700; color:var(--ink-muted);\">(\u221250%)<\/span><\/div>\n            <div class=\"sw-field-grid\">\n              <div><label class=\"sw-label\">Voornaam<\/label><input class=\"sw-text-input\" type=\"text\" id=\"sw-p2-vorname\"><\/div>\n              <div><label class=\"sw-label\">Achternaam<\/label><input class=\"sw-text-input\" type=\"text\" id=\"sw-p2-nachname\"><\/div>\n            <\/div>\n            <label class=\"sw-label\">E-mail<\/label>\n            <input class=\"sw-text-input\" type=\"email\" id=\"sw-p2-email\">\n          <\/div>\n\n          <div class=\"sw-error\" id=\"sw-error-details-paar\"><\/div>\n\n          <div class=\"sw-btn-row\">\n            <button class=\"sw-btn sw-btn-secondary\" id=\"sw-btn-details-paar-back\">Terug<\/button>\n            <button class=\"sw-btn sw-btn-primary\" id=\"sw-btn-details-paar-next\" disabled>Verder<\/button>\n          <\/div>\n        <\/div>\n\n        <!-- STEP 5A: BIJDRAGE \u2013 INDIVIDUEEL -->\n        <div class=\"sw-step\" id=\"sw-step-amount-solo\">\n          <div class=\"sw-step-label\">Stap 5 van 5<\/div>\n          <h2 class=\"sw-heading\">Bijdrage kiezen<\/h2>\n          <p class=\"sw-subtext\" id=\"sw-rangeHint-solo\">Hier kun je de bijdrage kiezen die voor jou passend is.<\/p>\n\n          <div class=\"sw-infobox\" id=\"sw-apponly-note-step5-solo\" style=\"display:none; margin-bottom:20px;\">\n            <div class=\"sw-infobox-title\">DIGITALE DEELNAME \u00b7 \u221235\u20ac<\/div>\n            <div>Je neemt digitaal deel. De korting wordt automatisch in de samenvatting verrekend.<\/div>\n          <\/div>\n\n          <div class=\"sw-range-header\">\n            <div class=\"sw-range-header-label\">Jouw bedrag<\/div>\n            <div class=\"sw-amount-display\">\n              <input type=\"number\" class=\"sw-amount-input\" id=\"sw-amountInput-solo\" value=\"360\">\n              <span>\u20ac<\/span>\n            <\/div>\n          <\/div>\n          <div class=\"sw-range-wrap\">\n            <div class=\"sw-markers\" id=\"sw-markers-solo\"><\/div>\n            <input type=\"range\" class=\"sw-range\" id=\"sw-amount-solo\" min=\"0\" max=\"100\" step=\"0.5\" value=\"50\">\n            <div class=\"sw-markers-mobile\" id=\"sw-markers-mobile-solo\"><\/div>\n          <\/div>\n\n          <p style=\"margin-top:18px; font-size:16px; color:#27703F; line-height:1.5; font-family:'Tinos',Georgia,serif;\">\n            Als je een verdere financi\u00eble korting nodig hebt, schrijf ons dan gerust naar:\n            <a href=\"mailto:info@basic-exercises.com\" style=\"color:#27703F; text-decoration:underline;\">info@basic-exercises.com<\/a>\n          <\/p>\n\n          <div class=\"sw-summary-box\" id=\"sw-summary-solo\">\n            <div class=\"sw-summary-row\"><span>Gekozen bijdrage<\/span><span id=\"sw-solo-chosen\">360\u20ac<\/span><\/div>\n            <div id=\"sw-solo-discounts\"><\/div>\n            <div class=\"sw-summary-row\" id=\"sw-shipping-line-solo\" style=\"display:none;\"><span>Verzending<\/span><span>plus 15\u20ac<\/span><\/div>\n            <div class=\"sw-summary-row sw-summary-total\"><span>Totaal<\/span><span><span id=\"sw-solo-total\">360<\/span>\u20ac<\/span><\/div>\n          <\/div>\n\n          <div class=\"sw-error\" id=\"sw-error-amount-solo\"><\/div>\n          <div class=\"sw-btn-row\">\n            <button class=\"sw-btn sw-btn-secondary\" id=\"sw-btn-amount-solo-back\">Terug<\/button>\n            <button class=\"sw-btn sw-btn-primary\" id=\"sw-btn-checkout-solo\">Aanmelden<\/button>\n          <\/div>\n        <\/div>\n\n        <!-- STEP 5B: BIJDRAGE \u2013 PAAR -->\n        <div class=\"sw-step\" id=\"sw-step-amount-paar\">\n          <div class=\"sw-step-label\">Stap 5 van 5<\/div>\n          <h2 class=\"sw-heading\">Bijdragen kiezen<\/h2>\n          <p class=\"sw-subtext\" id=\"sw-rangeHint-paar\">Elke persoon kiest zijn eigen bijdrage. Persoon 2 krijgt automatisch 50% korting.<\/p>\n\n          <div class=\"sw-infobox\" id=\"sw-apponly-note-step5-paar\" style=\"display:none; margin-bottom:20px;\">\n            <div class=\"sw-infobox-title\">DIGITALE DEELNAME \u00b7 \u221235\u20ac<\/div>\n            <div>Jullie nemen digitaal deel. De korting wordt automatisch in de samenvatting verrekend.<\/div>\n          <\/div>\n\n          <div class=\"sw-person-block\">\n            <div class=\"sw-person-title\" id=\"sw-amount-p1-title\">Persoon 1<\/div>\n            <div class=\"sw-range-header\">\n              <div class=\"sw-range-header-label\">Bijdrage<\/div>\n              <div class=\"sw-amount-display\">\n                <input type=\"number\" class=\"sw-amount-input\" id=\"sw-amountInput-p1\" value=\"360\">\n                <span>\u20ac<\/span>\n              <\/div>\n            <\/div>\n            <div class=\"sw-range-wrap\">\n              <div class=\"sw-markers\" id=\"sw-markers-p1\"><\/div>\n              <input type=\"range\" class=\"sw-range\" id=\"sw-amount-p1\" min=\"0\" max=\"100\" step=\"0.5\" value=\"50\">\n              <div class=\"sw-markers-mobile\" id=\"sw-markers-mobile-p1\"><\/div>\n            <\/div>\n          <\/div>\n\n          <hr class=\"sw-divider\">\n\n          <div class=\"sw-person-block\">\n            <div class=\"sw-person-title\" id=\"sw-amount-p2-title\">Persoon 2 <span style=\"font-size:21px; font-weight:700; color:var(--ink-muted);\">(\u221250%)<\/span><\/div>\n            <div class=\"sw-range-header\">\n              <div class=\"sw-range-header-label\">Bijdrage<\/div>\n              <div class=\"sw-amount-display\">\n                <input type=\"number\" class=\"sw-amount-input\" id=\"sw-amountInput-p2\" value=\"360\">\n                <span>\u20ac<\/span>\n              <\/div>\n            <\/div>\n            <div class=\"sw-range-wrap\">\n              <div class=\"sw-markers\" id=\"sw-markers-p2\"><\/div>\n              <input type=\"range\" class=\"sw-range\" id=\"sw-amount-p2\" min=\"0\" max=\"100\" step=\"0.5\" value=\"50\">\n              <div class=\"sw-markers-mobile\" id=\"sw-markers-mobile-p2\"><\/div>\n            <\/div>\n          <\/div>\n\n          <p style=\"margin-top:8px; font-size:16px; color:#27703F; line-height:1.5; font-family:'Tinos',Georgia,serif;\">\n            Als jullie een verdere financi\u00eble korting nodig hebben, schrijf ons dan gerust naar:\n            <a href=\"mailto:info@basic-exercises.com\" style=\"color:#27703F; text-decoration:underline;\">info@basic-exercises.com<\/a>\n          <\/p>\n\n          <div class=\"sw-summary-box\" id=\"sw-summary-paar\">\n            <div class=\"sw-summary-person-label\" id=\"sw-summary-p1-label\">Persoon 1<\/div>\n            <div class=\"sw-summary-row\"><span>Gekozen bijdrage<\/span><span id=\"sw-p1-chosen\">0\u20ac<\/span><\/div>\n            <div id=\"sw-p1-discounts\"><\/div>\n            <div class=\"sw-summary-row\"><span>Subtotaal<\/span><span id=\"sw-p1-subtotal\">0\u20ac<\/span><\/div>\n\n            <div class=\"sw-summary-person-label\" id=\"sw-summary-p2-label\">Persoon 2<\/div>\n            <div class=\"sw-summary-row\"><span>Gekozen bijdrage<\/span><span id=\"sw-p2-chosen\">0\u20ac<\/span><\/div>\n            <div id=\"sw-p2-discounts\"><\/div>\n            <div class=\"sw-summary-row\"><span>Subtotaal<\/span><span id=\"sw-p2-subtotal\">0\u20ac<\/span><\/div>\n\n            <div class=\"sw-summary-row\" id=\"sw-shipping-line-paar\" style=\"display:none;\"><span>Verzending<\/span><span>plus 15\u20ac<\/span><\/div>\n            <div class=\"sw-summary-row sw-summary-total\"><span>Totaal<\/span><span><span id=\"sw-paar-total\">0<\/span>\u20ac<\/span><\/div>\n          <\/div>\n\n          <div class=\"sw-error\" id=\"sw-error-amount-paar\"><\/div>\n          <div class=\"sw-btn-row\">\n            <button class=\"sw-btn sw-btn-secondary\" id=\"sw-btn-amount-paar-back\">Terug<\/button>\n            <button class=\"sw-btn sw-btn-primary\" id=\"sw-btn-checkout-paar\">Naar checkout<\/button>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/div>\n  `;\n  shadow.appendChild(wrapper);\n\n  const $ = (id) => shadow.getElementById(id);\n\n  const COUNTRY_TO_CAT = {};\n  Object.keys(COUNTRIES).forEach(cat => COUNTRIES[cat].forEach(code => COUNTRY_TO_CAT[code] = cat));\n\n  function getCountryName(code) {\n    if (COUNTRY_NAME_OVERRIDES[code]) return COUNTRY_NAME_OVERRIDES[code];\n    try { return new Intl.DisplayNames([\"nl\"], { type: \"region\" }).of(code) || code; }\n    catch { return code; }\n  }\n\n  function getAllCountriesSorted() {\n    const all = [];\n    [\"cat1\",\"cat2\",\"cat3\",\"cat4\"].forEach(cat => {\n      COUNTRIES[cat]\n        .map(code => ({ code, name: getCountryName(code), cat }))\n        .sort((a, b) => a.name.localeCompare(b.name, \"nl\"))\n        .forEach(c => all.push(c));\n    });\n    return all;\n  }\n\n  function emptyPerson() {\n    return { vorname: \"\", nachname: \"\", email: \"\", wiederholer: false, statusType: \"\", amount: 0 };\n  }\n  const state = {\n    country: \"\", category: \"cat1\",\n    commLang: \"\", form: \"\",\n    persons: { solo: emptyPerson(), p1: emptyPerson(), p2: emptyPerson() }\n  };\n  function getPerson(key) { return state.persons[key] || state.persons.solo; }\n\n  const APP_ONLY_CATEGORY_EXCEPTION_LANG = { CN: \"Chinesisch\" };\n\n  function isAppOnly() {\n    const { category: cat, commLang: lang, country } = state;\n    if (cat === \"cat3\" || cat === \"cat4\") {\n      const exceptionLang = APP_ONLY_CATEGORY_EXCEPTION_LANG[country];\n      \/\/ Ausnahme (z.B. China) gilt nur, wenn auch die passende Sprache gew\u00e4hlt ist \u2013\n      \/\/ sonst kann kein physisches Kartenset verschickt werden.\n      if (!exceptionLang || lang !== exceptionLang) return true;\n    }\n    if (APP_ONLY_LANGS.has(lang)) return true;\n    if (lang === \"Russisch\" && country && country !== \"RU\") return true;\n    return false;\n  }\n\n  function updateAppOnlyUI() {\n    const appOnly = state.commLang ? isAppOnly() : false;\n    let reason = \"\";\n    if (appOnly) {\n      const exceptionLang = APP_ONLY_CATEGORY_EXCEPTION_LANG[state.country];\n      if ((state.category === \"cat3\" || state.category === \"cat4\") && exceptionLang) {\n        reason = `Verzending is in jouw regio alleen mogelijk bij deelnametaal ${exceptionLang}. Je neemt digitaal deel. De korting wordt automatisch in de samenvatting verrekend.`;\n      } else if (state.category === \"cat3\" || state.category === \"cat4\") {\n        reason = \"Verzending is niet mogelijk in jouw regio. Je neemt digitaal deel. De korting wordt automatisch in de samenvatting verrekend.\";\n      } else if (state.commLang === \"Russisch\") {\n        reason = \"Voor Russischtaligen buiten Rusland is er alleen een digitale versie. De korting wordt automatisch in de samenvatting verrekend.\";\n      } else {\n        reason = \"In deze taal is er alleen een digitale versie. De korting wordt automatisch in de samenvatting verrekend.\";\n      }\n    }\n    const noteIds = [\"sw-apponly-note\",\"sw-apponly-note-step4\",\"sw-apponly-note-paar-step4\",\"sw-apponly-note-step5-solo\",\"sw-apponly-note-step5-paar\"];\n    noteIds.forEach(id => {\n      const el = $(id);\n      if (!el) return;\n      el.style.display = appOnly ? \"block\" : \"none\";\n      const textDiv = el.querySelector(\"div:not(.sw-infobox-title)\");\n      if (textDiv && reason) textDiv.textContent = reason;\n    });\n  }\n\n  const STEP_CONTAINER = {\n    1: () => \"sw-step-welcome\",\n    2: () => \"sw-step-country\",\n    3: () => \"sw-step-langform\",\n    4: () => state.form === \"paar\" ? \"sw-step-details-paar\" : \"sw-step-details-solo\",\n    5: () => state.form === \"paar\" ? \"sw-step-amount-paar\" : \"sw-step-amount-solo\"\n  };\n\n  function showStep(n) {\n    shadow.querySelectorAll(\".sw-step\").forEach(el => el.classList.remove(\"active\"));\n    $(STEP_CONTAINER[n]()).classList.add(\"active\");\n    for (let i = 1; i <= 5; i++) {\n      const prog = $(\"sw-prog-\" + i);\n      if (!prog) continue;\n      if (i < n) prog.className = \"sw-progress-step done\";\n      else if (i === n) prog.className = \"sw-progress-step active\";\n      else prog.className = \"sw-progress-step\";\n    }\n    if (n === 5) {\n      const sliderIds = state.form === \"paar\" ? [\"sw-amount-p1\",\"sw-amount-p2\"] : [\"sw-amount-solo\"];\n      sliderIds.forEach(sid => { const el = $(sid); if (el) el.classList.add(\"sw-pulse\"); });\n      refreshSummary();\n    }\n  }\n\n  function setNextEnabled(id, enabled) {\n    const b = $(id);\n    if (!b) return;\n    b.disabled = !enabled;\n    b.style.opacity = enabled ? \"1\" : \".4\";\n    b.style.cursor  = enabled ? \"pointer\" : \"not-allowed\";\n  }\n\n  function showErrorIn(id, msg) { const el=$(id); el.style.display=\"block\"; el.textContent=msg; }\n  function clearErrorIn(id)     { const el=$(id); el.style.display=\"none\";  el.textContent=\"\"; }\n\n  function setCheckoutLoading(btnId, loading) {\n    const btn = $(btnId);\n    const overlay = document.getElementById(OVERLAY_ID);\n    if (!btn.dataset.defaultLabel) btn.dataset.defaultLabel = btn.textContent;\n    if (loading) {\n      btn.disabled = true;\n      btn.innerHTML = '<span class=\"wiz-spinner\"><\/span> Wordt voorbereid\u2026';\n      btn.style.opacity = \".8\";\n      if (overlay) overlay.style.display = \"flex\";\n    } else {\n      btn.disabled = false;\n      btn.textContent = btn.dataset.defaultLabel;\n      btn.style.opacity = \"1\";\n      if (overlay) overlay.style.display = \"none\";\n    }\n  }\n\n  function showThankYou() {\n    const card = shadow.querySelector(\".sw-card\");\n    if (!card) return;\n    card.innerHTML = `\n      <div style=\"text-align:center; padding:20px 0;\">\n        <div style=\"font-size:56px; margin-bottom:16px; color:#27703F;\">\u2713<\/div>\n        <h2 style=\"font-family:'Tinos',Georgia,serif; font-size:26px; font-weight:500; margin:0 0 12px; color:#0C1E14;\">Hartelijk dank!<\/h2>\n        <p style=\"font-family:'Tinos',Georgia,serif; font-size:18px; color:#27703F; line-height:1.6; margin:0 0 24px;\">Checkout wordt geladen\u2026<br>Je wordt zo doorgestuurd\u2026<\/p>\n        <div style=\"display:flex; justify-content:center;\">\n          <div style=\"width:36px; height:36px; border:4px solid #B8DEC4; border-top-color:#0C1E14; border-radius:50%; animation:wiz-spin 0.8s linear infinite;\"><\/div>\n        <\/div>\n      <\/div>`;\n  }\n\n  function getAnchors(cat) {\n    const r = RANGES[cat], o = ORIENTIERUNG[cat];\n    return [[0,r.min],[25,o.reduced],[50,o.base],[75,o.support],[100,r.max]];\n  }\n  function normToEuro(norm, cat) {\n    const a = getAnchors(cat);\n    for (let i = 0; i < a.length - 1; i++) {\n      if (norm <= a[i+1][0]) {\n        const t = (norm - a[i][0]) \/ (a[i+1][0] - a[i][0]);\n        return Math.round(a[i][1] + t * (a[i+1][1] - a[i][1]));\n      }\n    }\n    return a[a.length-1][1];\n  }\n  function euroToNorm(euro, cat) {\n    const a = getAnchors(cat);\n    for (let i = 0; i < a.length - 1; i++) {\n      const lo = a[i][1], hi = a[i+1][1];\n      if (euro <= hi) {\n        if (hi === lo) return a[i+1][0];\n        return a[i][0] + (euro - lo) \/ (hi - lo) * (a[i+1][0] - a[i][0]);\n      }\n    }\n    return 100;\n  }\n  function getMarkerDefs(cat) {\n    const o = ORIENTIERUNG[cat];\n    return [\n      { value: o.reduced, label: \"Verlaagde bijdrage\", normPct: 25 },\n      { value: o.base,    label: \"Basisbijdrage\",       normPct: 50 },\n      { value: o.support, label: \"Steunbijdrage\",       normPct: 75 }\n    ];\n  }\n\n  function renderMarkers(personKey) {\n    const cat = state.category;\n    const person = getPerson(personKey);\n    const markers = getMarkerDefs(cat);\n    const container = $(`sw-markers-${personKey}`);\n    container.innerHTML = \"\";\n    markers.forEach(m => {\n      const div = document.createElement(\"div\");\n      div.className = \"sw-marker\" + (person.amount === m.value ? \" active\" : \"\");\n      div.style.left = m.normPct + \"%\";\n      div.innerHTML = `<div class=\"sw-marker-tick\"><\/div><div class=\"sw-marker-amount\">${m.value}\u20ac<\/div><div class=\"sw-marker-label\">${m.label}<\/div>`;\n      div.addEventListener(\"click\", () => selectMarkerValue(personKey, m.value));\n      container.appendChild(div);\n    });\n    const mobileContainer = $(`sw-markers-mobile-${personKey}`);\n    mobileContainer.innerHTML = \"\";\n    markers.forEach(m => {\n      const div = document.createElement(\"div\");\n      div.className = \"sw-marker-mobile\" + (person.amount === m.value ? \" active\" : \"\");\n      div.innerHTML = `<span class=\"sw-marker-mobile-label\">${m.label}<\/span><span class=\"sw-marker-mobile-amount\">${m.value}\u20ac<\/span>`;\n      div.addEventListener(\"click\", () => selectMarkerValue(personKey, m.value));\n      mobileContainer.appendChild(div);\n    });\n  }\n\n  function selectMarkerValue(personKey, value) {\n    const person = getPerson(personKey);\n    $(`sw-amount-${personKey}`).value = euroToNorm(value, state.category);\n    person.amount = value;\n    $(`sw-amountInput-${personKey}`).value = value;\n    renderMarkers(personKey);\n    refreshSummary();\n  }\n\n  function updateAmountFromSlider(personKey) {\n    const person = getPerson(personKey);\n    const norm = Number($(`sw-amount-${personKey}`).value);\n    person.amount = normToEuro(norm, state.category);\n    $(`sw-amountInput-${personKey}`).value = person.amount;\n    renderMarkers(personKey);\n    refreshSummary();\n  }\n\n  function updateAmountFromInput(personKey) {\n    const person = getPerson(personKey);\n    const r = RANGES[state.category];\n    let val = Number($(`sw-amountInput-${personKey}`).value);\n    if (isNaN(val)) val = r.min;\n    val = Math.min(r.max, Math.max(r.min, val));\n    person.amount = val;\n    $(`sw-amountInput-${personKey}`).value = val;\n    $(`sw-amount-${personKey}`).value = euroToNorm(val, state.category);\n    renderMarkers(personKey);\n    refreshSummary();\n  }\n\n  function wireAmountControl(personKey) {\n    $(`sw-amount-${personKey}`).addEventListener(\"input\", () => updateAmountFromSlider(personKey));\n    $(`sw-amountInput-${personKey}`).addEventListener(\"input\", () => {\n      const v = Number($(`sw-amountInput-${personKey}`).value);\n      if (!isNaN(v)) { getPerson(personKey).amount = v; refreshSummary(); }\n    });\n    $(`sw-amountInput-${personKey}`).addEventListener(\"change\", () => updateAmountFromInput(personKey));\n  }\n\n  function applyRangeForForm() {\n    const cat = state.category;\n    const ori = ORIENTIERUNG[cat];\n    const hint = \"Hier kun je de bijdrage kiezen die voor jou passend is. Met een steunbijdrage maak je het voor mensen met beperkte financi\u00eble mogelijkheden mogelijk om deel te nemen, en help je ons het project verder de wereld in te dragen.\";\n    if (state.form === \"paar\") {\n      [\"p1\",\"p2\"].forEach(key => {\n        const person = getPerson(key);\n        person.amount = ori.base;\n        $(`sw-amount-${key}`).value = 50;\n        $(`sw-amountInput-${key}`).value = ori.base;\n      });\n      const p1name = state.persons.p1.vorname;\n      const p2name = state.persons.p2.vorname;\n      $(\"sw-amount-p1-title\").innerHTML = p1name ? `Persoon 1 \u2013 ${p1name}` : \"Persoon 1\";\n      $(\"sw-amount-p2-title\").innerHTML = (p2name ? `Persoon 2 \u2013 ${p2name}` : \"Persoon 2\") +\n        ' <span style=\"font-size:21px; font-weight:700; color:var(--ink-muted);\">(\u221250%)<\/span>';\n      $(\"sw-summary-p1-label\").textContent = p1name ? `Persoon 1 \u2013 ${p1name}` : \"Persoon 1\";\n      $(\"sw-summary-p2-label\").textContent = (p2name ? `Persoon 2 \u2013 ${p2name}` : \"Persoon 2\") + \" (\u221250%)\";\n      $(\"sw-rangeHint-paar\").textContent = hint;\n      renderMarkers(\"p1\"); renderMarkers(\"p2\");\n    } else {\n      const person = state.persons.solo;\n      person.amount = ori.base;\n      $(\"sw-amount-solo\").value = 50;\n      $(\"sw-amountInput-solo\").value = ori.base;\n      $(\"sw-rangeHint-solo\").textContent = hint;\n      renderMarkers(\"solo\");\n    }\n    refreshSummary();\n  }\n\n  \/\/ \u2500\u2500 Rabattlogik \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \/\/ Neue Regel: Wenn mehrere Rabatte greifen, wird zuerst der fixe App-Rabatt vom\n  \/\/ gew\u00e4hlten Betrag abgezogen. Der prozentuale Rabatt (Sch\u00fcler\/Student\/Wiederholer\n  \/\/ bzw. die 50%-Erm\u00e4\u00dfigung f\u00fcr Person 2) wird danach auf den verbleibenden Betrag\n  \/\/ angewendet. Beide Rabatte werden separat ausgewiesen.\n  function getPercentDiscountCandidate(person, isPaarP2) {\n    if (isPaarP2) return { value: DISCOUNT_PAAR_P2, label: \"Korting persoon 2\" };\n    const candidates = [];\n    if (person.wiederholer || person.statusType === \"wiederholer\") candidates.push({ value: DISCOUNT_WIEDERHOLER, label: \"Herhaler\" });\n    if (person.statusType === \"schueler\") candidates.push({ value: DISCOUNT_SCHUELER, label: \"Scholier\" });\n    if (person.statusType === \"student\")  candidates.push({ value: DISCOUNT_STUDENT,  label: \"Opleiding\/studie\" });\n    if (!candidates.length) return null;\n    \/\/ falls theoretisch mehrere Status zutreffen, z\u00e4hlt der h\u00f6chste Prozentsatz\n    return candidates.reduce((best, c) => c.value > best.value ? c : best, candidates[0]);\n  }\n\n  function getDiscounts(person, isPaarP2) {\n    const discounts = [];\n    let remaining = Math.round(person.amount);\n\n    if (isAppOnly()) {\n      const appDisc = Math.min(DISCOUNT_APP_FIXED, remaining);\n      discounts.push({ type: \"fixed\", value: DISCOUNT_APP_FIXED, label: \"Digitale deelname\", amountEuro: appDisc });\n      remaining -= appDisc;\n    }\n\n    const pct = getPercentDiscountCandidate(person, isPaarP2);\n    if (pct) {\n      const pctDisc = Math.round(remaining * pct.value);\n      discounts.push({ type: \"pct\", value: pct.value, label: pct.label, amountEuro: pctDisc });\n      remaining -= pctDisc;\n    }\n\n    return { discounts, finalAmount: Math.max(0, remaining) };\n  }\n\n  function buildStatusOptionValue(person, isPaar) {\n    const vals = [];\n    if (isPaar) vals.push(STATUS_LABEL.paar);\n    if (isAppOnly()) vals.push(STATUS_LABEL.apponly);\n    if (person.wiederholer || person.statusType === \"wiederholer\") vals.push(STATUS_LABEL.wiederholer);\n    if (person.statusType === \"schueler\") vals.push(STATUS_LABEL.schueler);\n    if (person.statusType === \"student\")  vals.push(STATUS_LABEL.student);\n    \/\/ Ecwid erwartet f\u00fcr Checkbox-Optionen ein Array, nicht einen kommaseparierten String\n    return vals;\n  }\n\n  \/\/ \u2500\u2500 Zusammenfassung \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function refreshSummary() {\n    if (state.form === \"paar\") refreshSummaryPaar();\n    else refreshSummarySolo();\n  }\n\n  function renderDiscountRows(containerId, discounts) {\n    const container = $(containerId);\n    container.innerHTML = \"\";\n    discounts.forEach(d => {\n      const row = document.createElement(\"div\");\n      row.className = \"sw-summary-row sw-summary-discount\";\n      const pctStr = d.type === \"fixed\" ? `\u2212${d.amountEuro}\u20ac` : `\u2212${Math.round(d.value * 100)}%`;\n      row.innerHTML = `<span>${d.label} (${pctStr})<\/span><span>\u2212${d.amountEuro}\u20ac<\/span>`;\n      container.appendChild(row);\n    });\n  }\n\n  function refreshSummarySolo() {\n    const p = state.persons.solo;\n    const { discounts, finalAmount } = getDiscounts(p, false);\n\n    $(\"sw-solo-chosen\").textContent = Math.round(p.amount) + \"\u20ac\";\n    renderDiscountRows(\"sw-solo-discounts\", discounts);\n    $(\"sw-solo-total\").textContent = finalAmount;\n\n    const isWiederholer = p.wiederholer || p.statusType === \"wiederholer\";\n    const shipLine = $(\"sw-shipping-line-solo\");\n    shipLine.style.display = (!isAppOnly() && needsShipping(state.country) && !isWiederholer) ? \"flex\" : \"none\";\n  }\n\n  function refreshSummaryPaar() {\n    const p1 = state.persons.p1, p2 = state.persons.p2;\n\n    function fill(prefix, person, isPaarP2) {\n      const { discounts, finalAmount } = getDiscounts(person, isPaarP2);\n      $(`sw-${prefix}-chosen`).textContent = Math.round(person.amount) + \"\u20ac\";\n      renderDiscountRows(`sw-${prefix}-discounts`, discounts);\n      $(`sw-${prefix}-subtotal`).textContent = finalAmount + \"\u20ac\";\n      return finalAmount;\n    }\n\n    const f1 = fill(\"p1\", p1, false);\n    const f2 = fill(\"p2\", p2, true);\n    $(\"sw-paar-total\").textContent = f1 + f2;\n\n    const shipLine = $(\"sw-shipping-line-paar\");\n    shipLine.style.display = (!isAppOnly() && needsShipping(state.country)) ? \"flex\" : \"none\";\n  }\n\n  function renderCountryList(filter) {\n    const list = $(\"sw-country-list\");\n    const q = (filter || \"\").toLowerCase().trim();\n    const filtered = q\n      ? getAllCountriesSorted().filter(c => c.name.toLowerCase().includes(q))\n      : getAllCountriesSorted();\n    list.innerHTML = \"\";\n    if (!filtered.length) { list.innerHTML = '<div class=\"sw-country-empty\">Geen land gevonden<\/div>'; return; }\n    filtered.forEach(c => {\n      const div = document.createElement(\"div\");\n      div.className = \"sw-country-item\" + (state.country === c.code ? \" selected\" : \"\");\n      div.dataset.code = c.code;\n      div.innerHTML = `<span>${c.name}<\/span><span class=\"sw-country-item-cat\">Cat. ${c.cat.replace(\"cat\",\"\")}<\/span>`;\n      div.addEventListener(\"click\", () => selectCountry(c.code, c.cat, c.name));\n      list.appendChild(div);\n    });\n  }\n\n  function selectCountry(code, cat, name) {\n    state.country  = code;\n    state.category = cat;\n    $(\"sw-country\").value = code;\n    $(\"sw-country-search\").value = name;\n    $(\"sw-country-list\").innerHTML = \"\";\n    const catLabels = {\n      cat1:\"Prijscategorie 1\", cat2:\"Prijscategorie 2\",\n      cat3:\"Prijscategorie 3\", cat4:\"Prijscategorie 4\"\n    };\n    const exceptionLang = APP_ONLY_CATEGORY_EXCEPTION_LANG[code];\n    let suffix = \"\";\n    if (cat === \"cat3\" || cat === \"cat4\") {\n      suffix = exceptionLang\n        ? ` \u2013 Verzending alleen bij deelnametaal ${exceptionLang}, anders alleen digitale deelname mogelijk`\n        : \" \u2013 Alleen digitale deelname mogelijk\";\n    }\n    $(\"sw-catText\").textContent = (catLabels[cat] || cat) + suffix;\n    setNextEnabled(\"sw-btn-country-next\", true);\n    updateAppOnlyUI();\n  }\n\n  function ensureEcwidReady(timeoutMs = 12000) {\n    return new Promise((resolve, reject) => {\n      function isReady() {\n        return window.Ecwid && window.Ecwid.Cart &&\n               typeof window.Ecwid.Cart.addProduct === \"function\" &&\n               typeof window.Ecwid.Cart.clear === \"function\";\n      }\n      if (isReady()) return resolve(true);\n      let resolved = false;\n      function done() { if (!resolved) { resolved = true; setTimeout(() => resolve(true), 200); } }\n      if (window.Ecwid) { try { window.Ecwid.OnAPILoaded.add(done); } catch(e) {} }\n      const start = Date.now();\n      const t = setInterval(() => {\n        if (isReady()) { clearInterval(t); done(); }\n        else if (Date.now() - start > timeoutMs) {\n          clearInterval(t);\n          if (!resolved) { resolved = true; reject(new Error(\"Ecwid Cart API niet beschikbaar na \" + (timeoutMs\/1000) + \"s.\")); }\n        }\n      }, 200);\n    });\n  }\n\n  function clearCartAsync() { return new Promise(r => Ecwid.Cart.clear(() => r(true))); }\n\n  function addProductAsync(payload, timeoutMs = 4000) {\n    return new Promise((resolve, reject) => {\n      let done = false;\n      const t = setTimeout(() => { if (!done) { done = true; resolve({ product:null, cart:null, timedOut:true }); } }, timeoutMs);\n      Ecwid.Cart.addProduct(payload, function(success, product, cart, error) {\n        if (done) return;\n        done = true; clearTimeout(t);\n        if (success) resolve({ product, cart, timedOut:false });\n        else reject(new Error((error || \"Product kon niet worden toegevoegd\") + \" | Payload: \" + JSON.stringify(payload)));\n      });\n    });\n  }\n\n  function goToCart() { window.location.href = SHOP_CART_URL; }\n\n  function buildN8nPayload() {\n    const p1 = state.persons.p1, p2 = state.persons.p2;\n    const d1 = getDiscounts(p1, false);\n    const d2 = getDiscounts(p2, true);\n    return {\n      sprache: state.commLang, land: state.country, kategorie: state.category, appOnly: isAppOnly(),\n      person1: { vorname: p1.vorname, nachname: p1.nachname, email: p1.email },\n      person2: { vorname: p2.vorname, nachname: p2.nachname, email: p2.email },\n      betraege: {\n        person1: { gewaehlt: Math.round(p1.amount), rabatte: d1.discounts, endbetrag: d1.finalAmount },\n        person2: { gewaehlt: Math.round(p2.amount), rabatte: d2.discounts, endbetrag: d2.finalAmount },\n        gesamt: d1.finalAmount + d2.finalAmount\n      },\n      timestamp: new Date().toISOString()\n    };\n  }\n\n  async function sendToN8n(payload) {\n    if (!N8N_WEBHOOK_URL || N8N_WEBHOOK_URL.indexOf(\"HIER_\") === 0) {\n      throw new Error(\"Die n8n-Webhook-URL ist im Code noch nicht eingetragen.\");\n    }\n    let res;\n    try {\n      res = await fetch(N8N_WEBHOOK_URL, { method:\"POST\", headers:{\"Content-Type\":\"application\/json\"}, body:JSON.stringify(payload) });\n    } catch (e) {\n      throw new Error(\"Gegevens konden niet worden verzonden. Controleer je internetverbinding.\");\n    }\n    if (!res.ok) throw new Error(\"Verzenden mislukt (fout \" + res.status + \"). Probeer het opnieuw.\");\n    return true;\n  }\n\n  async function goCheckoutSolo() {\n    clearErrorIn(\"sw-error-amount-solo\");\n    if (!state.country)  return showErrorIn(\"sw-error-amount-solo\", \"Kies eerst een land.\");\n    if (!state.commLang) return showErrorIn(\"sw-error-amount-solo\", \"Kies een deelnametaal.\");\n    const p = state.persons.solo;\n    const finalAmount = getDiscounts(p, false).finalAmount;\n    const participationProductId = PRODUCTS[state.category];\n    setCheckoutLoading(\"sw-btn-checkout-solo\", true);\n    try {\n      await ensureEcwidReady();\n      await clearCartAsync();\n      await new Promise(r => setTimeout(r, 1500));\n      const statusValue = buildStatusOptionValue(p, false);\n      const options = { [OPT_COMM_LANG]: state.commLang };\n      if (statusValue.length > 0) options[OPT_STATUS] = statusValue; \/\/ Array f\u00fcr Checkbox-Option\n      const result = await addProductAsync({ id: participationProductId, quantity: 1, selectedPrice: finalAmount, options });\n      if (result.timedOut) console.warn(\"[Wizard] addProduct timed out \u2013 proceeding to cart anyway\");\n      showThankYou();\n      setTimeout(goToCart, 2500);\n    } catch (e) {\n      showErrorIn(\"sw-error-amount-solo\", e.message || String(e));\n    } finally {\n      setCheckoutLoading(\"sw-btn-checkout-solo\", false);\n    }\n  }\n\n  async function goCheckoutPaar() {\n    clearErrorIn(\"sw-error-amount-paar\");\n    if (!state.country)  return showErrorIn(\"sw-error-amount-paar\", \"Kies eerst een land.\");\n    if (!state.commLang) return showErrorIn(\"sw-error-amount-paar\", \"Kies een deelnametaal.\");\n    if (!validateDetailsPaar()) return showErrorIn(\"sw-error-amount-paar\", \"Ga terug en vul alle velden voor beide personen in.\");\n    const p1 = state.persons.p1, p2 = state.persons.p2;\n    const participationProductId = PRODUCTS[state.category];\n    setCheckoutLoading(\"sw-btn-checkout-paar\", true);\n    try {\n      const payload = buildN8nPayload();\n      await sendToN8n(payload);\n      await ensureEcwidReady();\n      await clearCartAsync();\n      await new Promise(r => setTimeout(r, 1500));\n      const total = getDiscounts(p1, false).finalAmount + getDiscounts(p2, true).finalAmount;\n      const statusValue = buildStatusOptionValue(p1, true);\n      const options = { [OPT_COMM_LANG]: state.commLang };\n      if (statusValue.length > 0) options[OPT_STATUS] = statusValue; \/\/ Array f\u00fcr Checkbox-Option\n      const result = await addProductAsync({ id: participationProductId, quantity: 1, selectedPrice: total, options });\n      if (result.timedOut) console.warn(\"[Wizard] addProduct timed out \u2013 proceeding to cart anyway\");\n      showThankYou();\n      setTimeout(goToCart, 2500);\n    } catch (e) {\n      showErrorIn(\"sw-error-amount-paar\", e.message || String(e));\n    } finally {\n      setCheckoutLoading(\"sw-btn-checkout-paar\", false);\n    }\n  }\n\n  function validateLangform() {\n    const ok = !!state.commLang && !!state.form && state.form !== \"gruppe\";\n    setNextEnabled(\"sw-btn-langform-next\", ok);\n  }\n\n  function validateDetailsSolo() {\n    const ok = !!$(\"sw-solo-status\").value;\n    setNextEnabled(\"sw-btn-details-solo-next\", ok);\n    return ok;\n  }\n\n  function validateDetailsPaar() {\n    const p1 = state.persons.p1, p2 = state.persons.p2;\n    const emailOk = s => \/\\S+@\\S+\\.\\S+\/.test(s || \"\");\n    const ok = !!(p1.vorname && p1.vorname.trim()) && !!(p1.nachname && p1.nachname.trim()) && emailOk(p1.email) &&\n               !!(p2.vorname && p2.vorname.trim()) && !!(p2.nachname && p2.nachname.trim()) && emailOk(p2.email);\n    setNextEnabled(\"sw-btn-details-paar-next\", ok);\n    return ok;\n  }\n\n  function bindNameFields(key) {\n    [\"vorname\",\"nachname\",\"email\"].forEach(f => {\n      $(`sw-${key}-${f}`).addEventListener(\"input\", e => {\n        getPerson(key)[f] = e.target.value;\n        validateDetailsPaar();\n      });\n    });\n  }\n\n  $(\"sw-btn-welcome-next\").addEventListener(\"click\", () => showStep(2));\n  $(\"sw-btn-country-back\").addEventListener(\"click\", () => showStep(1));\n  $(\"sw-btn-country-next\").addEventListener(\"click\", () => showStep(3));\n\n  $(\"sw-country-search\").addEventListener(\"input\",  e => renderCountryList(e.target.value));\n  $(\"sw-country-search\").addEventListener(\"focus\",  () => renderCountryList($(\"sw-country-search\").value));\n  shadow.addEventListener(\"click\", e => {\n    if (!e.target.closest(\"#sw-country-list\") && !e.target.closest(\"#sw-country-search\")) {\n      $(\"sw-country-list\").innerHTML = \"\";\n    }\n  });\n\n  $(\"sw-commLang\").addEventListener(\"change\", e => {\n    state.commLang = e.target.value;\n    validateLangform();\n    updateAppOnlyUI();\n    refreshSummary();\n  });\n\n  shadow.querySelectorAll(\".sw-choice-card\").forEach(card => {\n    card.addEventListener(\"click\", () => {\n      state.form = card.dataset.form;\n      shadow.querySelectorAll(\".sw-choice-card\").forEach(c => c.classList.toggle(\"active\", c === card));\n      const isGruppe = state.form === \"gruppe\";\n      $(\"sw-gruppe-note\").style.display = isGruppe ? \"block\" : \"none\";\n      $(\"sw-btn-langform-next\").style.display   = isGruppe ? \"none\" : \"inline-block\";\n      $(\"sw-btn-gruppe-redirect\").style.display = isGruppe ? \"inline-block\" : \"none\";\n      clearErrorIn(\"sw-error-langform\");\n      validateLangform();\n    });\n  });\n\n  $(\"sw-btn-gruppe-redirect\").addEventListener(\"click\", () => { window.location.href = getGroupRedirectUrl(); });\n  $(\"sw-btn-langform-back\").addEventListener(\"click\", () => showStep(2));\n  $(\"sw-btn-langform-next\").addEventListener(\"click\", () => showStep(4));\n\n  $(\"sw-btn-details-solo-back\").addEventListener(\"click\", () => showStep(3));\n  $(\"sw-solo-status\").addEventListener(\"change\", e => {\n    const val = e.target.value;\n    const person = state.persons.solo;\n    person.statusType  = val;\n    person.wiederholer = val === \"wiederholer\";\n    clearErrorIn(\"sw-error-details-solo\");\n    validateDetailsSolo();\n  });\n  $(\"sw-btn-details-solo-next\").addEventListener(\"click\", () => {\n    if (validateDetailsSolo()) { applyRangeForForm(); showStep(5); }\n    else showErrorIn(\"sw-error-details-solo\", \"Maak eerst een keuze.\");\n  });\n\n  $(\"sw-btn-details-paar-back\").addEventListener(\"click\", () => showStep(3));\n  $(\"sw-btn-details-paar-next\").addEventListener(\"click\", () => {\n    if (validateDetailsPaar()) { applyRangeForForm(); showStep(5); }\n  });\n\n  $(\"sw-btn-amount-solo-back\").addEventListener(\"click\", () => showStep(4));\n  $(\"sw-btn-amount-paar-back\").addEventListener(\"click\", () => showStep(4));\n  $(\"sw-btn-checkout-solo\").addEventListener(\"click\", goCheckoutSolo);\n  $(\"sw-btn-checkout-paar\").addEventListener(\"click\", goCheckoutPaar);\n\n  bindNameFields(\"p1\");\n  bindNameFields(\"p2\");\n  wireAmountControl(\"solo\");\n  wireAmountControl(\"p1\");\n  wireAmountControl(\"p2\");\n\n  showStep(1);\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-cc89a14 e-flex e-con-boxed e-con e-parent\" data-id=\"cc89a14\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c6e766f elementor-widget elementor-widget-text-editor\" data-id=\"c6e766f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<div id=\"dynamic-ec-store-container\" class=\"\"><!-- Ecwid shopping cart plugin v 7.0.10 --><!--noptimize--><script data-cfasync=\"false\" data-no-optimize=\"1\" src=\"https:\/\/app.ecwid.com\/script.js?89632828&data_platform=wporg&lang=ko\"><\/script><script data-cfasync=\"false\" data-no-optimize=\"1\">if (typeof jQuery !== undefined && jQuery.mobile) { jQuery.mobile.hashListeningEnabled = false; jQuery.mobile.pushStateEnabled=false; }<\/script><!--\/noptimize--><div id=\"ecwid-store-89632828\" class=\"ecwid-shopping-cart-product-browser\" data-ecwid-default-category-id=\"0\"><\/div><script data-cfasync=\"false\" data-no-optimize=\"1\" type=\"text\/javascript\">xProductBrowser(\"id=ecwid-store-89632828\",\"views=grid(20,3) list(60) table(60)\",\"default_page=\");<\/script><!-- END Ecwid Shopping Cart v 7.0.10 --><\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Checkout wordt geladen\u2026<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-1104","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/spiritual-activity.org\/ko\/wp-json\/wp\/v2\/pages\/1104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spiritual-activity.org\/ko\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spiritual-activity.org\/ko\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spiritual-activity.org\/ko\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/spiritual-activity.org\/ko\/wp-json\/wp\/v2\/comments?post=1104"}],"version-history":[{"count":31,"href":"https:\/\/spiritual-activity.org\/ko\/wp-json\/wp\/v2\/pages\/1104\/revisions"}],"predecessor-version":[{"id":1135,"href":"https:\/\/spiritual-activity.org\/ko\/wp-json\/wp\/v2\/pages\/1104\/revisions\/1135"}],"wp:attachment":[{"href":"https:\/\/spiritual-activity.org\/ko\/wp-json\/wp\/v2\/media?parent=1104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}