{"id":66612,"date":"2026-10-10T19:28:52","date_gmt":"2026-10-10T19:28:52","guid":{"rendered":"https:\/\/carmelcosmeticslabs.com\/?page_id=66612"},"modified":"2026-11-10T16:06:58","modified_gmt":"2026-11-10T16:06:58","slug":"kosmetik-preisrechner","status":"publish","type":"page","link":"https:\/\/carmelcosmeticslabs.com\/de\/kosmetik-preisrechner\/","title":{"rendered":"Kosmetik-Preisrechner"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"66612\" class=\"elementor elementor-66612 elementor-52935\" data-elementor-post-type=\"page\">\n\t\t\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-b437d6a0 e-flex e-con-full cm-calculator-page e-con e-parent\" data-id=\"b437d6a0\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0ee4c642 elementor-widget elementor-widget-html\" data-id=\"0ee4c642\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n\/* Layout: guided flow (one question per step) on the left, live answer card on the right; full analysis below. Carmel teal on mint. *\/\n.cm-px,.px-dock{\n  --bg:#f4f8f6; --paper:#ffffff; --mint:#e9f3ef; --mint-2:#d7e8e1;\n  --ink:#10292a; --muted:#566d6c; --line:#dbe7e3;\n  --teal:#2f7266; --teal-ink:#ffffff; --deep:#0f3a35; --deep-ink:#eaf5f2; --deep-muted:#a9c9c2; --deep-line:#25544d;\n  --c-fab:#00826b; --c-mkt:#8048c4; --c-marge:#d6941a; --c-canal:#3f6fd1; --c-tva:#c4502f;\n  --k-fab:#27a582; --k-mkt:#9a7fe0; --k-marge:#bd841a; --k-canal:#5d8ae3; --k-tva:#dd6c50;\n  --good:#1d7a46; --warn:#8a5d00; --bad:#b3261e;\n  --z-low:#c4502f; --z-ok:#2a9d6e; --z-high:#d6941a;\n  --shade:16 58 53;\n  --f-display:\"Proxima Nova\",\"Bricolage Grotesque\",system-ui,sans-serif;\n  --f-body:\"Lato\",\"Instrument Sans\",system-ui,sans-serif;\n  --r-panel:20px; --r-card:16px; --r-field:12px;\n  --ease-out:cubic-bezier(.23,1,.32,1);\n}\n.cm-px{font:400 16px\/1.55 var(--f-body);color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased;font-variant-numeric:tabular-nums;padding-block:clamp(32px,6vw,72px) 112px}\n.cm-px *{box-sizing:border-box}\n.cm-px [hidden]{display:none!important}\n.cm-px ::selection{background:var(--teal);color:var(--teal-ink)}\n.cm-px .wrap{max-width:1160px;margin-inline:auto;padding-inline:clamp(16px,4vw,40px)}\n.cm-px h1,.cm-px h2,.cm-px h3{font-family:var(--f-display);margin:0;text-wrap:balance;letter-spacing:-.015em;font-weight:700}\n.cm-px p{margin:0}\n.cm-px :focus-visible{outline:2px solid var(--teal);outline-offset:2px;border-radius:8px}\n.cm-px .ico{width:18px;height:18px;flex:none;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}\n\n.px-head{display:grid;gap:10px;max-width:720px;margin-bottom:clamp(24px,4vw,40px)}\n.px-head .px-h1{font-size:clamp(30px,4.4vw,48px);line-height:1.06}\n.px-lead{font-size:clamp(16px,1.6vw,18px);color:var(--muted);max-width:60ch}\n.px-eyebrow{font:600 13px\/1.2 var(--f-body);letter-spacing:.06em;text-transform:uppercase;color:var(--teal)}\n.px-proof{list-style:none;margin:6px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:8px 22px;font-size:14px;color:var(--ink)}\n.px-proof li{display:flex;align-items:center;gap:8px}\n.px-proof .ico{width:16px;height:16px;color:var(--teal);stroke-width:2.4}\n.px-kick{font-size:16px;color:var(--ink)!important;font-weight:500}\n.px-faq{margin-top:clamp(48px,7vw,80px);display:grid;gap:14px}\n.px-faq h2{font-size:clamp(24px,3vw,32px)}\n.px-faq .px-method{margin-top:0;border-bottom:0}\n.px-faq .px-method:last-child{border-bottom:1px solid var(--line)}\n.px-faq-a{font-size:15px!important;line-height:1.6;color:var(--muted)}\n.px-note{margin:clamp(40px,6vw,64px) 0 0;max-width:720px;display:grid;gap:18px;padding-left:clamp(16px,2.4vw,26px);border-left:3px solid var(--teal)}\n.px-note blockquote{margin:0;display:grid;gap:12px;font-size:clamp(16px,1.6vw,18px);line-height:1.6;color:var(--ink)}\n.px-note figcaption{display:flex;align-items:center;gap:12px;font-size:14px;color:var(--muted)}\n.px-note figcaption b{display:block;color:var(--ink);font-weight:600}\n.px-note-av{width:40px;height:40px;border-radius:50%;background:var(--deep);color:var(--deep-ink);display:grid;place-items:center;font:700 14px\/1 var(--f-display)}\n\n.px-grid{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:clamp(20px,3vw,32px);align-items:start}\n.px-panel{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-panel);padding:clamp(20px,2.6vw,30px);min-width:0}\n\n\/* flow *\/\n.px-flow{display:grid;gap:24px}\n.px-prog{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:6px}\n.px-prog button{appearance:none;border:0;background:none;padding:0;display:grid;gap:8px;text-align:left;font:500 12.5px\/1.2 var(--f-body);color:var(--muted);cursor:pointer;min-height:28px}\n.px-prog button::before{content:\"\";height:4px;border-radius:2px;background:var(--mint-2);transition:background-color .3s ease}\n.px-prog button.done::before,.px-prog button.cur::before{background:var(--teal)}\n.px-prog button.cur{color:var(--ink);font-weight:600}\n.px-prog button:disabled{cursor:default;opacity:.7}\n.px-steps{min-height:290px;display:grid;align-content:start}\n.px-step{display:grid;gap:20px;align-content:start}\n.px-step.in-r{animation:px-in-r .26s var(--ease-out)}\n.px-step.in-l{animation:px-in-l .26s var(--ease-out)}\n@keyframes px-in-r{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:none}}\n@keyframes px-in-l{from{opacity:0;transform:translateX(-16px)}to{opacity:1;transform:none}}\n.px-q{display:grid;gap:6px}\n.px-q h2{font-size:clamp(22px,2.6vw,28px);line-height:1.15;outline:none}\n.px-q p{color:var(--muted);font-size:15px;max-width:52ch}\n\n.px-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}\n.px-cards.tight{gap:8px}\n.px-co{position:relative;display:grid;gap:4px;align-content:start;padding:16px 44px 16px 16px;border:1px solid var(--line);border-radius:var(--r-card);background:var(--bg);cursor:pointer;transition:border-color .15s ease,background-color .15s ease,transform .16s var(--ease-out)}\n.px-co input{position:absolute;opacity:0;pointer-events:none}\n.px-co b{font:600 16px\/1.25 var(--f-body)}\n.px-co small{font-size:13.5px;line-height:1.4;color:var(--muted)}\n.px-co .meta{font-size:13px;font-weight:600;color:var(--teal);margin-top:4px}\n.px-co .tick{position:absolute;top:14px;right:14px;width:22px;height:22px;border-radius:50%;border:1.5px solid var(--line);display:grid;place-items:center;transition:background-color .15s ease,border-color .15s ease}\n.px-co .tick svg{width:13px;height:13px;stroke:var(--teal-ink);stroke-width:2.6;fill:none;opacity:0;transform:scale(.8);transition:opacity .15s ease,transform .2s var(--ease-out)}\n.px-co:active{transform:scale(.98)}\n.px-co:has(input:checked){border-color:var(--teal);background:var(--mint);box-shadow:inset 0 0 0 1px var(--teal)}\n.px-co:has(input:checked) .tick{background:var(--teal);border-color:var(--teal)}\n.px-co:has(input:checked) .tick svg{opacity:1;transform:none}\n.px-co:has(input:focus-visible){outline:2px solid var(--teal);outline-offset:2px}\n.px-co.small{padding:13px 40px 13px 14px}\n.px-co.small b{font-size:15px}\n.px-co.small .tick{top:12px;right:12px}\n.px-stair{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;align-items:stretch}\n.px-tier{position:relative;display:flex;flex-direction:column;justify-content:flex-start;gap:6px;padding:16px 12px 14px;border:1px solid var(--line);border-radius:var(--r-card);background:color-mix(in srgb,var(--teal) var(--tint),var(--paper));color:var(--ink);cursor:pointer;transition:background-color .22s ease,border-color .22s ease,color .22s ease,transform .18s var(--ease-out),box-shadow .22s ease}\n.px-tier input{position:absolute;opacity:0;pointer-events:none}\n.px-tier b{font:700 15px\/1.15 var(--f-display);letter-spacing:-.015em}\n.px-tier small{font-size:12.5px;line-height:1.4;color:var(--muted);transition:color .22s ease}\n.px-tier .px-lvl{margin-bottom:10px}\n.px-tier:has(input:checked) .px-lvl i{background:var(--deep-line)}\n.px-tier:has(input:checked) .px-lvl i.on{background:var(--deep-ink)}\n.px-tier .where{font-size:12px;line-height:1.35;color:var(--muted);margin-top:auto;padding-top:9px;border-top:1px solid color-mix(in srgb,var(--ink) 10%,transparent);transition:color .22s ease,border-color .22s ease}\n.px-tier .tick{position:absolute;top:12px;right:12px;width:22px;height:22px;border-radius:50%;border:1.5px solid color-mix(in srgb,var(--ink) 18%,transparent);display:grid;place-items:center;transition:background-color .2s ease,border-color .2s ease}\n.px-tier .tick svg{width:13px;height:13px;stroke:var(--deep);stroke-width:2.6;fill:none;opacity:0;transform:scale(.8);transition:opacity .15s ease,transform .2s var(--ease-out)}\n.px-tier:active{transform:scale(.98)}\n.px-tier:has(input:checked){background:var(--deep);border-color:var(--deep);color:var(--deep-ink);box-shadow:0 14px 30px -18px rgb(var(--shade)\/.7)}\n.px-tier:has(input:checked) small,.px-tier:has(input:checked) .where{color:var(--deep-muted)}\n.px-tier:has(input:checked) .where{border-color:var(--deep-line)}\n.px-tier:has(input:checked) .tick{background:var(--deep-ink);border-color:var(--deep-ink)}\n.px-tier:has(input:checked) .tick svg{opacity:1;transform:none}\n.px-tier:has(input:focus-visible){outline:2px solid var(--teal);outline-offset:2px}\n.px-lvl{display:inline-flex;align-items:flex-end;gap:2px;height:12px;margin-bottom:6px}\n.px-lvl i{width:4px;border-radius:1px;background:var(--mint-2)}\n.px-lvl i:nth-child(1){height:4px}.px-lvl i:nth-child(2){height:6.5px}.px-lvl i:nth-child(3){height:9px}.px-lvl i:nth-child(4){height:12px}\n.px-lvl i.on{background:var(--teal)}\n\n.px-fields{display:grid;gap:18px}\n.px-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;align-items:end}\n.px-row.three{grid-template-columns:repeat(3,minmax(0,1fr))}\n.px-field{display:grid;gap:7px;min-width:0;align-content:start}\n.px-field > label,.px-lab{font:500 14px\/1.3 var(--f-body);color:var(--ink)}\n.px-in{position:relative;display:flex;align-items:center}\n.px-in input,.px-in select{width:100%;height:48px;border:1px solid var(--line);border-radius:var(--r-field);background:var(--bg);color:var(--ink);font:500 16px\/1 var(--f-body);font-variant-numeric:tabular-nums;padding:0 64px 0 14px;transition:border-color .15s ease,box-shadow .15s ease,background-color .15s ease}\n.px-in select{padding-right:40px;appearance:none;cursor:pointer;background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),linear-gradient(135deg,var(--muted) 50%,transparent 50%);background-position:calc(100% - 20px) 50%,calc(100% - 15px) 50%;background-size:5px 5px;background-repeat:no-repeat}\n.px-in input:focus,.px-in select:focus{outline:none;border-color:var(--teal);background:var(--paper);box-shadow:0 0 0 3px color-mix(in srgb,var(--teal) 20%,transparent)}\n.px-in .unit{position:absolute;right:14px;font-size:13.5px;color:var(--muted);pointer-events:none}\n.px-in.big input{height:64px;font:600 28px\/1 var(--f-display);letter-spacing:-.01em;padding-right:72px}\n.px-in.bad input{border-color:var(--bad);box-shadow:0 0 0 3px color-mix(in srgb,var(--bad) 15%,transparent)}\n.px-hint{font-size:13.5px;line-height:1.45;color:var(--muted)}\n.px-msg{font-size:13.5px;color:var(--bad)}\n.px-pills{display:flex;flex-wrap:wrap;gap:6px}\n.px-pill{appearance:none;border:1px solid var(--line);background:var(--bg);color:var(--ink);border-radius:999px;min-height:36px;padding:0 13px;font:500 13.5px\/1 var(--f-body);cursor:pointer;transition:border-color .15s ease,background-color .15s ease,transform .16s var(--ease-out)}\n.px-pill:active{transform:scale(.96)}\n.px-pill[aria-pressed=\"true\"]{background:var(--teal);border-color:var(--teal);color:var(--teal-ink)}\n\n.px-range{display:grid;grid-template-columns:1fr auto;gap:18px;align-items:center}\n.px-range input[type=range]{width:100%;accent-color:var(--teal);height:32px;cursor:pointer}\n.px-gfield{gap:10px}\n#px-g-range{-webkit-appearance:none;appearance:none;height:12px;border-radius:999px;background:var(--track,var(--mint-2));cursor:pointer;margin:12px 0}\n#px-g-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:28px;height:28px;border-radius:50%;background:var(--paper);border:3px solid var(--ink);box-shadow:0 2px 8px rgb(var(--shade)\/.3);transition:transform .15s var(--ease-out)}\n#px-g-range:active::-webkit-slider-thumb{transform:scale(1.12)}\n#px-g-range::-moz-range-thumb{width:22px;height:22px;border-radius:50%;background:var(--paper);border:3px solid var(--ink);box-shadow:0 2px 8px rgb(var(--shade)\/.3)}\n#px-g-range::-moz-range-track{height:12px;border-radius:999px;background:var(--track,var(--mint-2))}\n#px-g-range:focus-visible{outline:2px solid var(--teal);outline-offset:6px}\n.px-zone{display:flex;flex-wrap:wrap;gap:6px 18px;font-size:12.5px;color:var(--muted)}\n.px-zone span{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}\n.px-zone span::before{content:\"\";width:10px;height:10px;border-radius:3px;background:var(--c)}\n.px-zone .lo{--c:var(--z-low)}.px-zone .mid{--c:var(--z-ok);font-weight:600;color:var(--ink)}.px-zone .hi{--c:var(--z-high)}\n.px-zone-msg{display:flex;gap:8px;align-items:flex-start;font-size:13.5px;line-height:1.5;color:var(--muted)}\n.px-zone-msg .ico{margin-top:2px}\n.px-zone-msg[data-z=\"ok\"] .ico{color:var(--good)}\n.px-zone-msg[data-z=\"low\"] .ico{color:var(--bad)}\n.px-zone-msg[data-z=\"high\"] .ico{color:var(--warn)}\n#px-g-out[data-z=\"ok\"]{color:var(--good)}\n#px-g-out[data-z=\"low\"]{color:var(--bad)}\n#px-g-out[data-z=\"high\"]{color:var(--warn)}\n.px-range output{font:700 34px\/1 var(--f-display);min-width:3em;text-align:right;letter-spacing:-.02em}\n\n.px-adv{border:1px solid var(--line);border-radius:var(--r-card);background:var(--bg)}\n.px-adv > summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:60px;padding:12px 16px;font:600 15px\/1.3 var(--f-body)}\n.px-adv-h{display:grid;gap:3px;min-width:0}\n.px-adv-h small{font:400 13px\/1.4 var(--f-body);color:var(--muted)}\n.px-tabs{display:flex;gap:4px;padding:4px;background:var(--mint);border-radius:12px;overflow-x:auto}\n.px-tabs button{appearance:none;border:0;background:none;border-radius:9px;min-height:38px;padding:0 14px;font:600 13.5px\/1 var(--f-body);color:var(--muted);cursor:pointer;white-space:nowrap;transition:background-color .15s ease,color .15s ease}\n.px-tabs button[aria-selected=\"true\"]{background:var(--paper);color:var(--ink);box-shadow:0 1px 2px rgb(var(--shade)\/.12),0 2px 8px rgb(var(--shade)\/.06)}\n.px-chnote{font-size:13px;line-height:1.5;color:var(--muted)}\n.px-hyp{display:grid;gap:20px}\n.px-hg{display:grid}\n.px-hg header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding-bottom:8px;border-bottom:1px solid var(--line)}\n.px-hg h4{margin:0;display:flex;align-items:center;gap:8px;font:600 14.5px\/1.2 var(--f-body)}\n.px-hg h4::before{content:\"\";width:10px;height:10px;border-radius:3px;background:var(--sw)}\n.px-hg-t{font-size:13px;color:var(--muted)}\n.px-hg-t b{color:var(--ink);font-weight:600}\n.px-h{display:grid;grid-template-columns:minmax(0,.85fr) minmax(0,1.4fr) minmax(76px,auto);gap:6px 16px;align-items:center;padding:14px 0;border-bottom:1px dashed var(--line)}\n.px-h:last-child{border-bottom:0;padding-bottom:4px}\n.px-h-l label{font:600 14px\/1.3 var(--f-body);color:var(--ink)}\n.px-h-l p{font-size:12.5px;line-height:1.4;color:var(--muted);margin-top:3px}\n.px-h-c{display:flex;align-items:center;gap:10px;min-width:0}\n.px-h-c input[type=range]{flex:1;min-width:0;height:28px;accent-color:var(--sw);cursor:pointer}\n.px-h-v{flex:none;width:92px;justify-content:flex-end;display:inline-flex;align-items:center;gap:3px;height:36px;padding:0 9px;border:1px solid var(--line);border-radius:9px;background:var(--paper);transition:border-color .15s ease,box-shadow .15s ease}\n.px-h-v:focus-within{border-color:var(--teal);box-shadow:0 0 0 3px color-mix(in srgb,var(--teal) 20%,transparent)}\n.px-h-v input{width:100%;min-width:0;border:0;background:none;padding:0;font:600 14.5px\/1 var(--f-body);font-variant-numeric:tabular-nums;color:var(--ink);text-align:right}\n.px-h-v input:focus{outline:none}\n.px-h-v i{font-style:normal;font-size:12.5px;color:var(--muted)}\n.px-h-a{text-align:right;font-size:12.5px;line-height:1.3;color:var(--muted);white-space:nowrap}\n.px-h-a b{display:block;font-size:14.5px;font-weight:600;color:var(--ink)}\n.px-link{appearance:none;border:0;background:none;padding:6px 0;min-height:36px;font:600 13.5px\/1.3 var(--f-body);color:var(--teal);cursor:pointer;text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}\n.px-link:hover{color:var(--ink)}\n.px-bm-for{font:600 13.5px\/1.3 var(--f-body);color:var(--good)}\n.px-h-b{grid-column:1 \/ -1;display:flex;gap:7px;align-items:flex-start;margin:2px 0 0;padding:9px 11px;border-radius:10px;background:var(--paper);font-size:12.5px;line-height:1.4;color:var(--muted)}\n.px-h-b .ico{width:15px;height:15px;margin-top:1px;flex:none}\n.px-h-b[data-in=\"1\"] .ico{color:var(--good)}\n.px-h-b[data-in=\"0\"] .ico{color:var(--warn)}\n.px-h-b b{font-weight:600;color:var(--ink)}\n.px-h-b[data-in=\"0\"] b{color:var(--warn)}\n.px-h-b small{display:block;font-size:12px;color:var(--muted);margin-top:2px}\n.px-b-none{font-style:normal;color:var(--muted)}\n.px-h-c input.px-hr{-webkit-appearance:none;appearance:none;height:8px;border-radius:999px;background:var(--track,var(--mint-2));margin:10px 0}\n.px-hr::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:22px;height:22px;border-radius:50%;background:var(--paper);border:3px solid var(--sw);box-shadow:0 1px 5px rgb(var(--shade)\/.25)}\n.px-hr::-moz-range-thumb{width:16px;height:16px;border-radius:50%;background:var(--paper);border:3px solid var(--sw)}\n.px-hr::-moz-range-track{height:8px;border-radius:999px;background:var(--track,var(--mint-2))}\n.px-hg header{padding-bottom:6px}\n.px-r{border-bottom:1px solid var(--line)}\n.px-r:last-child{border-bottom:0}\n.px-r-head{appearance:none;border:0;background:none;width:100%;display:grid;grid-template-columns:minmax(0,1fr) auto auto minmax(80px,auto) 16px;grid-template-areas:\"name val pill amt chev\";align-items:center;gap:12px;min-height:52px;padding:10px 4px;margin:0;text-align:left;font:inherit;color:var(--ink);cursor:pointer;border-radius:10px;transition:background-color .15s ease}\n.px-r-name{grid-area:name;font:500 14.5px\/1.3 var(--f-body)}\n.px-r-val{grid-area:val;font:600 15px\/1 var(--f-body);font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}\n.px-r-pill{grid-area:pill;justify-self:start;display:inline-flex;align-items:center;gap:5px;height:26px;padding:0 10px;border-radius:999px;font:500 12px\/1 var(--f-body);white-space:nowrap;border:1px solid var(--line);background:var(--paper);color:var(--muted)}\n.px-r-pill .ico{width:13px;height:13px}\n.px-r-pill[data-s=\"in\"]{color:var(--good);border-color:color-mix(in srgb,var(--good) 30%,transparent);background:color-mix(in srgb,var(--good) 8%,var(--paper))}\n.px-r-pill[data-s=\"out\"]{color:var(--warn);border-color:color-mix(in srgb,var(--warn) 40%,transparent);background:color-mix(in srgb,var(--warn) 12%,var(--paper))}\n.px-r-amt{grid-area:amt;font-size:13.5px;color:var(--muted);text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}\n.px-r-chev{grid-area:chev;width:16px;height:16px;color:var(--muted);transition:transform .22s var(--ease-out)}\n.px-r.is-open .px-r-chev{transform:rotate(180deg)}\n.px-r.is-open .px-r-head{background:var(--paper)}\n.px-r-body{display:grid;grid-template-rows:0fr;transition:grid-template-rows .24s var(--ease-out)}\n.px-r.is-open .px-r-body{grid-template-rows:1fr}\n.px-r-inner{min-height:0;overflow:hidden}\n.px-r-pad{display:grid;gap:10px;padding:8px 4px 16px}\n.px-r-help{font-size:13px;line-height:1.45;color:var(--muted)}\n.px-r-src{font-size:12.5px;line-height:1.5;color:var(--muted)}\n.px-r-src b{font-weight:600;color:var(--ink)}\n@media (hover:hover) and (pointer:fine){ .px-r-head:hover{background:var(--paper)} }\n.px-hyp{gap:12px}\n.px-hg{background:var(--paper);border:1px solid var(--line);border-radius:14px;overflow:hidden;box-shadow:0 1px 2px rgb(var(--shade)\/.05),0 4px 14px -8px rgb(var(--shade)\/.12)}\n.px-hg header{padding:11px 14px;border-bottom:1px solid var(--line);background:color-mix(in srgb,var(--sw) 8%,var(--paper))}\n.px-hg h4{font-size:14px}\n.px-hg .px-r-head{padding:10px 14px;border-radius:0}\n.px-hg .px-r.is-open .px-r-head{background:color-mix(in srgb,var(--sw) 5%,var(--paper))}\n.px-hg .px-r.is-open .px-r-body{background:color-mix(in srgb,var(--sw) 5%,var(--paper))}\n.px-hg .px-r-pad{padding:2px 14px 16px}\n.px-hg .px-r-pill[data-s=\"na\"]{background:var(--bg)}\n.px-hg .px-h-v{background:var(--bg)}\n.px-bm-for{padding-top:2px}\n.px-hg-t{white-space:nowrap}\n.px-hg header{flex-wrap:wrap;row-gap:2px}\n.px-adv{border:0;background:none;border-radius:0}\n.px-adv > summary{border:1px solid var(--line);border-radius:14px;background:var(--bg)}\n.px-adv[open] > summary{margin-bottom:14px}\n.px-adv .px-adv-body{padding:0}\n@media (hover:hover) and (pointer:fine){ .px-hg .px-r-head:hover{background:color-mix(in srgb,var(--sw) 5%,var(--paper))} }\n.px-adv-foot{display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px 16px;padding-top:4px}\n.px-adv > summary::-webkit-details-marker{display:none}\n.px-adv > summary .ico{transition:transform .2s var(--ease-out);color:var(--muted)}\n.px-adv[open] > summary .ico{transform:rotate(180deg)}\n.px-adv-body{display:grid;gap:22px;padding:6px 16px 18px}\n.px-sub{display:grid;gap:12px}\n.px-sub h3{font:600 13.5px\/1.3 var(--f-body);color:var(--muted)}\n.px-co.multi .tick{border-radius:7px}\n.px-strat{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:4px;border-radius:14px;background:color-mix(in srgb,var(--deep-ink) 8%,transparent)}\n.px-strat button{appearance:none;border:0;border-radius:10px;min-height:46px;padding:6px 10px;background:transparent;color:var(--deep-muted);font:600 14px\/1.2 var(--f-body);cursor:pointer;transition:background-color .2s ease,color .2s ease,transform .16s var(--ease-out)}\n.px-strat button small{display:block;font-weight:400;font-size:12px;margin-top:2px;opacity:.85}\n.px-strat button:active{transform:scale(.97)}\n.px-strat button[aria-pressed=\"true\"]{background:var(--deep-ink);color:var(--deep)}\n.px-chlist{list-style:none;margin:4px 0 0;padding:0;display:grid}\n.px-chlist li{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:12px 0;border-top:1px solid var(--deep-line)}\n.px-chlist li:first-child{border-top:0;padding-top:4px}\n.px-chlist li > span:first-child{font-size:15px}\n.px-chlist li > span:last-child{text-align:right}\n.px-chlist b{display:block;font:700 28px\/1 var(--f-display);letter-spacing:-.015em}\n.px-chlist small{display:block;font-size:12.5px;color:var(--deep-muted);margin-top:4px}\n.px-ctable{width:100%;min-width:560px;border-collapse:collapse;font-size:14.5px}\n.px-ctable th{font:500 12.5px\/1.3 var(--f-body);color:var(--muted);text-align:right;padding:0 10px 10px;border-bottom:1px solid var(--line);vertical-align:bottom}\n.px-ctable th:first-child,.px-ctable td:first-child{text-align:left;padding-left:12px}\n.px-ctable td{padding:12px 10px;text-align:right;border-bottom:1px solid var(--line);white-space:nowrap;font-weight:500}\n.px-ctable td small{display:block;font-weight:400;font-size:12.5px;color:var(--muted);margin-top:2px}\n.px-ctable tr.cur td{background:var(--mint)}\n.px-ctable tr.cur td:first-child{border-radius:10px 0 0 10px}\n.px-ctable tr.cur td:last-child{border-radius:0 10px 10px 0}\n.px-ctable td.gain{color:var(--good);font-weight:600}\n.px-adv .px-in input,.px-adv .px-in select{background:var(--paper)}\n\n.px-nav{display:flex;align-items:center;justify-content:space-between;gap:12px;padding-top:18px;border-top:1px solid var(--line)}\n.px-nav .count{font-size:13.5px;color:var(--muted)}\n.px-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:48px;padding:0 22px;border-radius:999px;font:600 15px\/1 var(--f-body);text-decoration:none;cursor:pointer;border:0;background:var(--teal);color:var(--teal-ink);transition:transform .16s var(--ease-out),background-color .2s ease,opacity .2s ease;white-space:nowrap}\n.px-btn:active{transform:scale(.97)}\n.px-btn .ico{width:16px;height:16px;transition:transform .2s var(--ease-out)}\n.px-back{appearance:none;border:0;background:none;display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 4px;font:600 14.5px\/1 var(--f-body);color:var(--muted);cursor:pointer}\n.px-back .ico{width:16px;height:16px;transform:rotate(180deg)}\n.px-back[disabled]{visibility:hidden}\n\n\/* answer card *\/\n.px-aside{position:static;display:grid;gap:14px;min-width:0}\n.px-answer{background:var(--deep);color:var(--deep-ink);border-radius:var(--r-panel);padding:clamp(22px,2.8vw,30px);display:grid;gap:20px;box-shadow:0 18px 40px -24px rgb(var(--shade)\/.55)}\n.px-recap{display:flex;flex-wrap:wrap;gap:6px}\n.px-tok{appearance:none;border:1px solid var(--deep-line);background:transparent;color:var(--deep-ink);border-radius:999px;min-height:30px;padding:0 11px;font:500 12.5px\/1 var(--f-body);cursor:pointer;transition:background-color .15s ease,border-color .15s ease}\n.px-ans-top{display:grid;gap:6px}\n.px-ans-label{display:flex;justify-content:space-between;align-items:center;gap:12px;font:500 14.5px\/1.3 var(--f-body);color:var(--deep-muted)}\n.px-big{font:700 clamp(46px,6.4vw,64px)\/1 var(--f-display);letter-spacing:-.025em;font-variant-numeric:tabular-nums}\n.px-ans-note{font-size:14px;color:var(--deep-muted)}\n.px-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:13px;color:var(--deep-muted);white-space:nowrap}\n.px-switch input{appearance:none;width:30px;height:18px;border-radius:999px;background:var(--deep-line);position:relative;cursor:pointer;margin:0;transition:background-color .2s ease}\n.px-switch input::after{content:\"\";position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--deep-ink);transition:transform .2s var(--ease-out)}\n.px-switch input:checked{background:#5aa898}\n.px-switch input:checked::after{transform:translateX(12px)}\n.px-figs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:0;padding-top:18px;border-top:1px solid var(--deep-line)}\n.px-figs div{display:grid;gap:3px;min-width:0}\n.px-figs dt{font-size:13px;color:var(--deep-muted);line-height:1.3}\n.px-figs dd{margin:0;font:600 18px\/1.2 var(--f-body);overflow-wrap:anywhere}\n.px-figs dd small{display:block;font:400 12.5px\/1.3 var(--f-body);color:var(--deep-muted);margin-top:2px}\n.px-figs.one{grid-template-columns:1fr}\n.px-figs.one div{display:flex;align-items:baseline;justify-content:space-between;gap:12px}\n.px-figs.one dt{font-size:14.5px}\n.px-figs.one dd{font:700 26px\/1.1 var(--f-display);letter-spacing:-.01em;text-align:right}\n.px-figs.one dd small{display:inline;font:500 15px\/1 var(--f-body);color:var(--deep-muted);margin:0 0 0 8px;letter-spacing:0}\n.px-quote{display:grid;gap:8px;padding-top:18px;border-top:1px solid var(--deep-line)}\n.px-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n.px-answer{position:relative;overflow:hidden}\n.px-answer.is-locked > :not(.px-wait):not(.px-sr){display:none!important}\n.px-answer:not(.is-locked) .px-wait{display:none}\n.px-wait{display:grid;gap:22px}\n.px-wait-h{display:grid;gap:8px}\n.px-wait-h h3{font:700 24px\/1.15 var(--f-display);color:var(--deep-ink);letter-spacing:-.01em}\n.px-wait-h p{font-size:14.5px;line-height:1.5;color:var(--deep-muted);max-width:42ch}\n.px-wait-list{list-style:none;margin:0;padding:0;display:grid;gap:2px}\n.px-wait-list li{display:grid;grid-template-columns:26px minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px 0;border-top:1px solid var(--deep-line);font-size:14px;color:var(--deep-muted);transition:color .3s ease}\n.px-wait-list li:first-child{border-top:0}\n.px-wait-list .dot{width:22px;height:22px;border-radius:50%;border:1.5px solid var(--deep-line);display:grid;place-items:center;transition:background-color .3s ease,border-color .3s ease}\n.px-wait-list .dot svg{width:12px;height:12px;stroke:var(--deep);stroke-width:2.8;fill:none;opacity:0;transform:scale(.6);transition:opacity .25s ease,transform .3s var(--ease-out)}\n.px-wait-list li.done{color:var(--deep-ink)}\n.px-wait-list li.done .dot{background:#7fdcaa;border-color:#7fdcaa}\n.px-wait-list li.done .dot svg{opacity:1;transform:none}\n.px-wait-list li.cur .dot{border-color:var(--deep-ink);box-shadow:0 0 0 4px color-mix(in srgb,var(--deep-ink) 12%,transparent)}\n.px-wait-list li.cur{color:var(--deep-ink);font-weight:600}\n.px-wait-list li em{font-style:normal;font-size:13px;color:var(--deep-muted);text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:170px}\n.px-ghost-rib{display:flex;gap:3px;height:26px;opacity:.5}\n.px-ghost-rib span{border-radius:6px;background:linear-gradient(90deg,color-mix(in srgb,var(--deep-ink) 8%,transparent),color-mix(in srgb,var(--deep-ink) 16%,transparent),color-mix(in srgb,var(--deep-ink) 8%,transparent));background-size:200% 100%;animation:px-shim 2.4s ease-in-out infinite}\n.px-ghost-rib span:nth-child(1){flex:16}.px-ghost-rib span:nth-child(2){flex:13}.px-ghost-rib span:nth-child(3){flex:24}.px-ghost-rib span:nth-child(4){flex:29}.px-ghost-rib span:nth-child(5){flex:16}\n@keyframes px-shim{0%{background-position:100% 0}100%{background-position:-100% 0}}\n\/* r\u00e9v\u00e9lation : balayage lumineux, contenus en cascade, ruban qui se d\u00e9ploie, rep\u00e8re qui se pose *\/\n.px-answer.px-reveal::after{content:\"\";position:absolute;inset:0;pointer-events:none;background:linear-gradient(105deg,transparent 35%,rgb(255 255 255\/.10) 50%,transparent 65%);transform:translateX(-110%);animation:px-sweep 1.1s .1s var(--ease-out) forwards}\n@keyframes px-sweep{to{transform:translateX(110%)}}\n.px-answer.px-reveal #px-recap,.px-answer.px-reveal #px-ans > *{animation:px-rise .6s var(--ease-out) both}\n.px-answer.px-reveal #px-ans > :nth-child(1){animation-delay:.05s}\n.px-answer.px-reveal #px-ans > :nth-child(2){animation-delay:.15s}\n.px-answer.px-reveal #px-ans > :nth-child(3){animation-delay:.25s}\n.px-answer.px-reveal #px-ans > :nth-child(4){animation-delay:.35s}\n.px-answer.px-reveal #px-ans > :nth-child(5){animation-delay:.45s}\n@keyframes px-rise{from{opacity:0;transform:translateY(12px);filter:blur(4px)}to{opacity:1;transform:none;filter:none}}\n.px-answer.px-reveal .px-rseg{transform-origin:left center;animation:px-grow .7s var(--ease-out) both;animation-delay:calc(.35s + var(--d,0) * 70ms)}\n@keyframes px-grow{from{transform:scaleX(0);opacity:0}to{transform:none;opacity:1}}\n.px-answer.px-reveal .px-lad-pin{animation:px-drop .6s .7s var(--ease-out) both}\n@keyframes px-drop{from{opacity:0;translate:0 -10px}to{opacity:1;translate:0 0}}\n@media (prefers-reduced-motion:reduce){.px-answer.px-reveal *,.px-answer.px-reveal::after,.px-ghost-rib span{animation:none!important}}\n.px-a-sec{display:grid;gap:14px;padding-top:20px;border-top:1px solid var(--deep-line)}\n.px-a-h{display:flex;align-items:baseline;justify-content:space-between;gap:12px}\n.px-a-h h3{font:600 15px\/1.3 var(--f-body);color:var(--deep-ink);letter-spacing:0}\n.px-a-total{font-size:12.5px;color:var(--deep-muted);white-space:nowrap}\n.px-a-ch{display:flex;flex-wrap:wrap;gap:6px}\n.px-a-ch .px-pill{background:transparent;border-color:var(--deep-line);color:var(--deep-muted);min-height:30px;font-size:12.5px}\n.px-a-ch .px-pill[aria-pressed=\"true\"]{background:var(--deep-ink);border-color:var(--deep-ink);color:var(--deep)}\n.px-ribbon{position:relative;display:flex;gap:3px;height:34px}\n.px-rseg{position:relative;display:flex;align-items:center;justify-content:center;min-width:4px;height:100%;padding:0;border:0;border-radius:6px;background:var(--c);color:#0b1f1c;font:700 11.5px\/1 var(--f-body);font-variant-numeric:tabular-nums;cursor:default;overflow:hidden;white-space:nowrap;transition:flex-grow .5s var(--ease-out),opacity .15s ease,transform .2s var(--ease-out)}\n.px-rseg:first-child{border-radius:10px 6px 6px 10px}\n.px-rseg:last-of-type{border-radius:6px 10px 10px 6px}\n.px-rseg.is-you{box-shadow:inset 0 0 0 2px #fff6dc;z-index:1}\n.px-ribbon:hover .px-rseg{opacity:.55}\n.px-ribbon .px-rseg:hover,.px-ribbon .px-rseg:focus-visible{opacity:1;transform:translateY(-2px)}\n.px-ribbon .px-tip{background:var(--deep-ink);color:var(--deep)}\n.px-rleg{list-style:none;margin:0;padding:0;display:grid;gap:7px}\n.px-rleg li{display:grid;grid-template-columns:9px minmax(0,1fr) auto 52px;align-items:center;gap:10px;font-size:13.5px;color:var(--deep-muted)}\n.px-rleg li::before{content:\"\";width:9px;height:9px;border-radius:3px;background:var(--c)}\n.px-rleg li span{min-width:0}\n.px-rleg li b{font-weight:600;color:var(--deep-ink);font-variant-numeric:tabular-nums;white-space:nowrap}\n.px-rleg li small{font-size:12px;color:var(--deep-muted);text-align:right;font-variant-numeric:tabular-nums}\n.px-rleg li.is-you span,.px-rleg li.is-you b{color:#f6d58a}\n.px-rleg li.neg b{color:#f59a90}\n.px-a-more summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:6px;min-height:32px;font:600 13px\/1.3 var(--f-body);color:var(--deep-muted)}\n.px-a-more summary::-webkit-details-marker{display:none}\n.px-a-more summary .ico{width:14px;height:14px;transition:transform .2s var(--ease-out)}\n.px-a-more[open] summary .ico{transform:rotate(180deg)}\n.px-a-more summary:hover{color:var(--deep-ink)}\n.px-a-table{width:100%;border-collapse:collapse;font-size:13px;margin-top:6px;color:var(--deep-ink)}\n.px-a-table td{padding:7px 0;border-top:1px solid var(--deep-line)}\n.px-a-table td:nth-child(2),.px-a-table td:nth-child(3){text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}\n.px-a-table td:nth-child(3){color:var(--deep-muted);width:56px}\n.px-a-table td:first-child{display:flex;align-items:center;gap:8px}\n.px-a-table td:first-child::before{content:\"\";width:7px;height:7px;border-radius:2px;background:var(--c);flex:none}\n.px-a-table tr.total td{font-weight:600;border-top:1px solid var(--deep-muted)}\n.px-a-table tr.total td:first-child::before{background:transparent}\n.px-a-table tr.neg td:nth-child(2){color:#f59a90}\n.px-ladder{position:relative;padding-top:34px}\n.px-lad-track{display:flex;gap:3px;height:10px}\n.px-lad-track span{flex:1;border-radius:4px;background:color-mix(in srgb,var(--deep-ink) 12%,transparent);transition:background-color .3s ease}\n.px-lad-track span:first-child{flex:.6;background:color-mix(in srgb,var(--deep-ink) 6%,transparent)}\n.px-lad-track span.sel{background:color-mix(in srgb,var(--deep-ink) 38%,transparent)}\n.px-lad-labels{display:flex;gap:3px;margin-top:8px;font-size:11.5px;color:var(--deep-muted)}\n.px-lad-labels span{flex:1;text-align:center;line-height:1.25}\n.px-lad-labels span:first-child{flex:.6}\n.px-lad-labels span.sel{color:var(--deep-ink);font-weight:600}\n.px-lad-pin{position:absolute;top:0;transform:translateX(-50%);display:grid;justify-items:center;transition:left .55s var(--ease-out)}\n.px-lad-pin b{display:block;padding:4px 9px;border-radius:999px;background:var(--deep-ink);color:var(--deep);font:700 11.5px\/1.2 var(--f-body);white-space:nowrap}\n.px-lad-pin i{display:block;width:2px;height:10px;background:var(--deep-ink)}\n.px-lad-pin::after{content:\"\";width:12px;height:12px;border-radius:50%;background:var(--deep-ink);box-shadow:0 0 0 3px var(--deep);margin-top:-1px}\n.px-lad-pin[data-tone=\"warn\"] b,.px-lad-pin[data-tone=\"warn\"] i,.px-lad-pin[data-tone=\"warn\"]::after{background:#f3c867}\n.px-lad-pin[data-tone=\"warn\"] b{color:#3a2a00}\n.px-a-verdict{display:grid;gap:4px;font-size:13.5px;line-height:1.5;color:var(--deep-muted)}\n.px-a-verdict b{color:var(--deep-ink);font-weight:600}\n.px-a-verdict .tag{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;color:var(--deep-ink)}\n.px-a-verdict .tag[data-tone=\"good\"] .ico{color:#7fdcaa}\n.px-a-verdict .tag[data-tone=\"warn\"] .ico{color:#f3c867}\n@media (prefers-reduced-motion:reduce){.px-lad-pin,.px-rseg{transition:none}}\n.px-nego{display:flex;flex-wrap:wrap;gap:6px 20px;font-size:13.5px;line-height:1.5;color:var(--deep-muted)}\n.px-nego b{color:var(--deep-ink);font-weight:600}\n.px-quote label{font:500 14px\/1.3 var(--f-body);color:var(--deep-ink)}\n.px-quote .px-in input{background:color-mix(in srgb,var(--deep-ink) 8%,transparent);border-color:var(--deep-line);color:var(--deep-ink)}\n.px-quote .px-in input::placeholder{color:var(--deep-muted)}\n.px-quote .px-in .unit{color:var(--deep-muted)}\n.px-status{display:flex;gap:8px;align-items:flex-start;font-size:14px;line-height:1.45;color:var(--deep-ink)}\n.px-status .ico{margin-top:1px}\n.px-status[data-tone=\"good\"] .ico{color:#7fdcaa}\n.px-status[data-tone=\"warn\"] .ico{color:#f3c867}\n.px-status[data-tone=\"bad\"] .ico{color:#f59a90}\n.px-err{display:flex;gap:10px;font-size:15px;line-height:1.5;color:var(--deep-ink)}\n.px-err .ico{color:#f3c867;margin-top:2px}\n.px-act{display:grid;gap:12px;padding-top:20px;border-top:1px solid rgb(255 255 255\/.08)}\n.px-act p{font-size:14px;color:var(--deep-muted)}\n.px-act-row{display:flex;gap:10px}\n.px-act-btn{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:10px;height:50px;border-radius:999px;background:var(--deep-ink);color:var(--deep);font:700 15px\/1 var(--f-body);text-decoration:none;transition:transform .16s var(--ease-out),background-color .15s ease}\n.px-act-btn .ico{width:17px;height:17px;transition:transform .2s var(--ease-out)}\n.px-act-copy{appearance:none;display:inline-flex;align-items:center;gap:8px;height:50px;padding:0 18px;border-radius:999px;border:1px solid rgb(255 255 255\/.16);background:transparent;color:var(--deep-ink);font:600 14px\/1 var(--f-body);cursor:pointer;transition:transform .16s var(--ease-out),background-color .15s ease}\n.px-act-copy .ico{width:16px;height:16px}\n.px-act-btn:active,.px-act-copy:active{transform:scale(.97)}\n@media (hover:hover) and (pointer:fine){ .px-act-btn:hover{background:#fff} .px-act-btn:hover .ico{transform:translateX(3px)} .px-act-copy:hover{background:rgb(255 255 255\/.06)} }\n.px-disc{display:flex;gap:8px;align-items:flex-start;margin-top:14px;font-size:12.5px;line-height:1.5;color:var(--muted)}\n.px-disc .ico{width:15px;height:15px;margin-top:2px;flex:none}\n.px-answer.is-locked ~ .px-disc{display:none}\n.px-legal{margin-top:clamp(28px,4vw,40px)!important;font-size:12.5px;line-height:1.6;color:var(--muted);max-width:90ch}\n.px-legal b{color:var(--ink);font-weight:600}\n.px-ghost{appearance:none;border:0;background:none;display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0;font:600 14.5px\/1 var(--f-body);color:var(--teal);cursor:pointer}\n.px-ghost .ico{width:16px;height:16px}\n@media (hover:hover) and (pointer:fine){\n  .px-co:hover,.px-pill:hover{border-color:var(--teal)}\n  .px-tier:hover{transform:translateY(-3px);box-shadow:0 12px 26px -16px rgb(var(--shade)\/.5);border-color:var(--teal)}\n  .px-tier:has(input:checked):hover{border-color:var(--deep)}\n  .px-btn:hover{background:color-mix(in srgb,var(--teal) 86%,var(--ink))}\n  .px-btn:hover .ico{transform:translateX(3px)}\n  .px-back:hover{color:var(--ink)}\n  .px-ghost:hover{text-decoration:underline;text-underline-offset:3px}\n  .px-tok:hover{background:color-mix(in srgb,var(--deep-ink) 10%,transparent);border-color:var(--deep-muted)}\n  .px-prog button:not(:disabled):hover{color:var(--ink)}\n}\n\n\/* analysis *\/\n.px-detail{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:clamp(16px,2.4vw,24px);margin-top:clamp(28px,4vw,44px)}\n.px-detail .px-panel{display:grid;gap:18px;align-content:start}\n.px-detail h2{font-size:20px}\n.px-wide{grid-column:1 \/ -1}\n.px-bar{display:flex;gap:2px;height:40px;position:relative}\n.px-seg-b{height:100%;min-width:3px;cursor:pointer;border:none;padding:0;transition:flex-grow .45s var(--ease-out),opacity .15s ease}\n.px-seg-b:first-child{border-radius:10px 0 0 10px}\n.px-seg-b:last-of-type{border-radius:0 10px 10px 0}\n.px-bar:hover .px-seg-b{opacity:.5}\n.px-bar .px-seg-b:hover,.px-bar .px-seg-b:focus-visible{opacity:1}\n.px-tip{position:absolute;bottom:calc(100% + 8px);transform:translateX(-50%);background:var(--ink);color:var(--paper);padding:7px 10px;border-radius:8px;font-size:13px;line-height:1.35;white-space:nowrap;pointer-events:none;z-index:2}\n.px-legend{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:14px 12px;margin:0}\n.px-legend div{display:grid;gap:2px;min-width:0}\n.px-legend dt{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--muted);line-height:1.25}\n.px-legend dt::before{content:\"\";width:9px;height:9px;border-radius:3px;background:var(--sw);flex:none}\n.px-legend dd{margin:0;font:600 15.5px\/1.25 var(--f-body)}\n.px-legend dd small{font-weight:400;font-size:12.5px;color:var(--muted);margin-left:4px}\n.px-more summary{cursor:pointer;list-style:none;display:inline-flex;align-items:center;gap:6px;min-height:36px;font:600 14px\/1.3 var(--f-body);color:var(--teal)}\n.px-more summary::-webkit-details-marker{display:none}\n.px-more summary .ico{width:16px;height:16px;transition:transform .2s var(--ease-out)}\n.px-more[open] summary .ico{transform:rotate(90deg)}\n.px-table{width:100%;border-collapse:collapse;font-size:14px;margin-top:6px}\n.px-table td{padding:9px 0;border-top:1px solid var(--line)}\n.px-table td:nth-child(2),.px-table td:nth-child(3){text-align:right;white-space:nowrap}\n.px-table td:nth-child(3){color:var(--muted);width:64px;font-size:13px}\n.px-table td:first-child{display:flex;align-items:center;gap:8px}\n.px-table td:first-child::before{content:\"\";width:8px;height:8px;border-radius:2px;background:var(--sw);flex:none}\n.px-table tr.total td{font-weight:600;border-top:1.5px solid var(--ink)}\n.px-table tr.total td:first-child::before{background:transparent}\n.px-table tr.neg td:nth-child(2){color:var(--bad)}\n.px-scale{display:grid;gap:8px}\n.px-track{position:relative;height:28px}\n.px-zones{position:absolute;inset:9px 0;display:flex;gap:2px;border-radius:6px;overflow:hidden}\n.px-zones div{flex:1}\n.px-mark{position:absolute;top:0;width:4px;height:28px;margin-left:-2px;border-radius:3px;background:var(--ink);box-shadow:0 0 0 2px var(--paper);transition:left .45s var(--ease-out)}\n.px-zlabels{display:grid;grid-template-columns:repeat(5,1fr);font-size:12px;color:var(--muted);text-align:center}\n.px-zlabels .sel{color:var(--teal);font-weight:600}\n.px-verdict{font-size:14.5px;line-height:1.55;display:grid;gap:4px}\n.px-verdict b{font-weight:600}\n.px-verdict .tag{display:flex;align-items:center;gap:8px;font-weight:600}\n.px-verdict .tag[data-tone=\"good\"] .ico{color:var(--good)}\n.px-verdict .tag[data-tone=\"warn\"] .ico{color:var(--warn)}\n.px-tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch}\n\n\/* benchmarks *\/\n.px-bench{margin-top:clamp(48px,7vw,80px);display:grid;gap:18px}\n.px-bench h2,.px-levers-sec h2{font-size:clamp(24px,3vw,32px)}\n.px-bnotes{display:grid;gap:8px;font-size:14px;line-height:1.55;max-width:80ch}\n\n.px-levers-sec{margin-top:clamp(48px,7vw,80px);display:grid;gap:22px}\n.px-levers{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:26px 32px}\n.px-levers li{display:grid;gap:6px;align-content:start;padding-top:16px;border-top:2px solid var(--mint-2)}\n.px-levers b{font:600 16px\/1.3 var(--f-body)}\n.px-levers p{font-size:14.5px;color:var(--muted);line-height:1.55}\n.px-method{margin-top:8px;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}\n.px-method summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;min-height:60px;font:600 16px\/1.3 var(--f-body)}\n.px-method summary::-webkit-details-marker{display:none}\n.px-method summary .ico{color:var(--muted);transition:transform .2s var(--ease-out)}\n.px-method[open] summary .ico{transform:rotate(180deg)}\n.px-method ol{margin:0 0 20px;padding-left:20px;display:grid;gap:8px;font-size:14.5px;line-height:1.55;max-width:72ch}\n.px-method p{font-size:13.5px;color:var(--muted);margin-bottom:22px;max-width:72ch}\n.px-cta{margin-top:clamp(36px,5vw,56px);background:var(--deep);color:var(--deep-ink);border-radius:var(--r-panel);padding:clamp(24px,3.4vw,40px);display:grid;grid-template-columns:minmax(0,1fr) auto;gap:20px 32px;align-items:center}\n.px-cta h2{font-size:clamp(22px,2.6vw,28px)}\n.px-cta p{color:var(--deep-muted);margin-top:8px;max-width:56ch}\n.px-cta .px-btn{background:var(--deep-ink);color:var(--deep)}\n\n.px-dock{position:fixed;left:0;right:0;bottom:0;z-index:20;display:none;font-family:var(--f-body);font-variant-numeric:tabular-nums;padding:10px 16px calc(10px + env(safe-area-inset-bottom,0px));background:var(--deep);color:var(--deep-ink);box-shadow:0 -8px 24px rgb(0 0 0\/.18);align-items:center;justify-content:space-between;gap:12px;transition:transform .3s var(--ease-out)}\n.px-dock.hide{transform:translateY(110%)}\n.px-dock span{display:block;font-size:12.5px;color:var(--deep-muted)}\n.px-dock b{font:700 22px\/1.15 var(--f-display)}\n.px-dock a{color:var(--deep-ink);font:600 14px\/1 var(--f-body);text-decoration:none;display:inline-flex;align-items:center;min-height:44px;padding:0 16px;border-radius:999px;border:1px solid var(--deep-line)}\n\n@media (max-width:960px){\n  .px-grid,.px-detail{grid-template-columns:1fr}\n  .px-aside{position:static}\n  .px-levers{grid-template-columns:1fr 1fr}\n  .px-dock{display:flex}\n  .px-steps{min-height:0}\n}\n@media (max-width:620px){\n  .px-r-head{grid-template-columns:minmax(0,1fr) auto 16px;grid-template-areas:\"name val chev\" \"pill amt chev\";row-gap:6px}\n  .px-r-amt{text-align:right}\n  .px-h{grid-template-columns:minmax(0,1fr) auto;gap:8px 12px}\n  .px-h-l{grid-column:1 \/ -1}\n  .px-stair{grid-template-columns:1fr;align-items:stretch;gap:8px}\n  .px-tier{padding:14px 44px 14px 16px}\n  .px-tier b{font-size:17px}\n  .px-tier .where{margin-top:2px;padding-top:7px}\n  .px-prog button{font-size:0;gap:0}\n  .px-row.three{grid-template-columns:1fr 1fr}\n  .px-levers{grid-template-columns:1fr}\n  .px-cta{grid-template-columns:1fr}\n  .px-cta .px-btn{width:100%}\n  .px-figs{grid-template-columns:1fr 1fr}\n  .px-figs .is-key{grid-column:1 \/ -1;order:-1}\n}\n@media (max-width:440px){\n  .px-zone{font-size:11.5px}\n  .px-cards{grid-template-columns:1fr}\n  .px-cards.tight{grid-template-columns:1fr 1fr}\n  .px-row,.px-row.three{grid-template-columns:1fr}\n  .px-range output{font-size:28px}\n}\n@media (prefers-reduced-motion:reduce){.cm-px *,.cm-px *::before,.cm-px *::after,.px-dock{transition:none!important;animation:none!important}}\n\n\/* ===== Carte r\u00e9sultat : \u00e9tiquette de prix premium ===== *\/\n.px-answer{--pad:clamp(22px,2.8vw,32px);padding:var(--pad);border-radius:26px;border:1px solid rgb(255 255 255\/.07);\n  background:radial-gradient(120% 60% at 100% 0%,rgb(108 191 174\/.22),transparent 62%),radial-gradient(90% 50% at 0% 100%,rgb(189 132 26\/.10),transparent 60%),linear-gradient(180deg,#13463f 0%,#0c302b 100%);\n  box-shadow:0 40px 70px -38px rgb(16 58 53\/.65),0 2px 6px rgb(16 58 53\/.14),inset 0 1px 0 rgb(255 255 255\/.07)}\n.px-ans-top{position:relative;gap:10px}\n.px-ans-top::before{content:\"\";position:absolute;left:-8%;top:18%;width:70%;height:95%;background:radial-gradient(closest-side,rgb(127 220 170\/.16),transparent);pointer-events:none}\n.px-ans-top > *{position:relative}\n.px-ans-label{font-size:14px;color:var(--deep-muted)}\n.px-big{display:flex;align-items:baseline;font:700 clamp(58px,7.4vw,84px)\/.92 var(--f-display);letter-spacing:-.04em;color:#f3fbf8;font-variant-numeric:tabular-nums;margin-top:4px}\n.px-big .dec{font-size:.46em;letter-spacing:-.02em;color:#d7ece6}\n.px-big .cur{font:600 .24em\/1 var(--f-body);letter-spacing:.04em;color:var(--deep-muted);margin-left:.45em;align-self:flex-start;margin-top:.55em}\n.px-figs.one{border-top:0;padding-top:0}\n.px-figs.one div{display:inline-flex;align-items:center;gap:14px;width:fit-content;max-width:100%;padding:10px 16px 10px 14px;border-radius:999px;background:linear-gradient(90deg,rgb(240 189 79\/.16),rgb(240 189 79\/.06));border:1px solid rgb(240 189 79\/.32)}\n.px-figs.one dt{display:flex;align-items:center;gap:8px;font-size:13.5px;color:#f6d58a}\n.px-figs.one dt::before{content:\"\";width:8px;height:8px;border-radius:50%;background:#f0bd4f;box-shadow:0 0 0 3px rgb(240 189 79\/.18)}\n.px-figs.one dd{font:700 20px\/1 var(--f-display);color:#fff4d6;text-align:left;letter-spacing:-.01em;white-space:nowrap}\n.px-figs.one dd small{display:inline;font:500 13px\/1 var(--f-body);color:#e9cf8d;margin-left:6px}\n.px-perf{position:relative;height:30px;margin:2px calc(var(--pad) * -1) -6px;\n  background:radial-gradient(circle at 0 50%,var(--bg) 13px,transparent 13.5px),radial-gradient(circle at 100% 50%,var(--bg) 13px,transparent 13.5px)}\n.px-perf::before{content:\"\";position:absolute;left:calc(var(--pad) - 4px);right:calc(var(--pad) - 4px);top:50%;border-top:2px dashed rgb(255 255 255\/.13)}\n.px-a-sec.px-a-first{border-top:0;padding-top:0}\n.px-a-sec + .px-a-sec{border-top:1px solid rgb(255 255 255\/.07)}\n.px-a-h h3{font:600 15.5px\/1.3 var(--f-display);letter-spacing:-.005em}\n.px-ribbon{height:46px;gap:3px;padding:4px;border-radius:14px;background:rgb(0 0 0\/.18);box-shadow:inset 0 1px 2px rgb(0 0 0\/.25)}\n.px-rseg{border-radius:9px;font-size:12px;box-shadow:inset 0 1px 0 rgb(255 255 255\/.28),inset 0 -1px 0 rgb(0 0 0\/.12)}\n.px-rseg:first-child{border-radius:10px 6px 6px 10px}\n.px-rseg:last-of-type{border-radius:6px 10px 10px 6px}\n.px-rseg.is-you{box-shadow:inset 0 0 0 2px #fff1c7,0 0 18px rgb(240 189 79\/.35)}\n.px-raxis{display:flex;justify-content:space-between;margin-top:-6px;font-size:11.5px;color:var(--deep-muted);font-variant-numeric:tabular-nums}\n.px-rleg{gap:4px}\n.px-rleg li{padding:6px 10px;border-radius:10px;margin-inline:-10px}\n.px-rleg li.is-you{background:rgb(240 189 79\/.10)}\n.px-lad-track{height:12px;gap:4px}\n.px-lad-track span{border-radius:6px}\n.px-lad-track span.sel{background:linear-gradient(90deg,rgb(127 220 170\/.55),rgb(127 220 170\/.85));box-shadow:0 0 16px rgb(127 220 170\/.30)}\n.px-lad-labels span.sel{color:#bff0d6}\n.px-lad-pin b{padding:5px 11px;box-shadow:0 6px 16px -6px rgb(0 0 0\/.45)}\n.px-lad-pin::after{width:14px;height:14px;box-shadow:0 0 0 3px #0f3a35,0 0 14px rgb(234 245 242\/.45)}\n.px-a-verdict{padding:14px 16px;border-radius:14px;background:rgb(255 255 255\/.04);border:1px solid rgb(255 255 255\/.06)}\n.px-answers{display:grid;gap:10px;padding-top:18px;border-top:1px solid rgb(255 255 255\/.07)}\n.px-answers > p{font-size:12.5px;color:var(--deep-muted)}\n.px-tok{background:rgb(255 255 255\/.04)}\n.px-strat{margin-bottom:6px}\n\n\/* ===== Carte r\u00e9sultat : version minimaliste ===== *\/\n#px-ans{gap:18px!important}\n.px-perf{height:22px;margin:0 calc(var(--pad) * -1)}\n.px-a-sec{gap:12px}\n.px-a-sec + .px-a-sec{border-top:0;padding-top:4px}\n.px-a-h h3{font:600 14px\/1.3 var(--f-body);color:var(--deep-muted);letter-spacing:0}\n.px-ribbon{height:40px}\n.px-rleg{grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 18px}\n.px-rleg li{grid-template-columns:8px minmax(0,1fr) auto;gap:8px;padding:0;margin:0;font-size:13px;background:none!important}\n.px-rleg li::before{width:8px;height:8px}\n.px-rleg li b{font-weight:600}\n.px-ladder{padding-top:30px}\n.px-a-verdict{padding:0;background:none;border:0;gap:2px}\n.px-a-verdict .tag{font-size:14.5px}\n.px-a-verdict p:last-child{padding-left:26px;font-size:13px}\n.px-quote{gap:10px}\n.px-quote label{font-size:13.5px;color:var(--deep-muted)}\n\n\/* ===== \u00c9tapes de saisie : finitions ===== *\/\n.px-flowline{display:flex;flex-wrap:wrap;row-gap:6px;align-items:center;gap:6px;margin-top:12px;font-size:12px;color:var(--muted)}\n.px-flowline i{font-style:normal;white-space:nowrap;padding:3px 8px;border-radius:999px;background:var(--paper);border:1px solid var(--line)}\n.px-flowline i.on{color:var(--teal);border-color:color-mix(in srgb,var(--teal) 40%,transparent);font-weight:600}\n.px-flowline .ico{width:14px;height:14px;color:var(--muted)}\n.px-co:has(input:checked) .px-flowline i{background:var(--paper)}\n.px-cards{align-items:stretch}\n.px-sel{position:relative}\n.px-sel select{background-image:none!important;height:52px;padding-right:44px;font-weight:500}\n.px-sel .ico{position:absolute;right:16px;width:16px;height:16px;color:var(--muted);pointer-events:none}\n.px-tier{gap:4px}\n.px-tier b{margin-bottom:auto}\n.px-tier .where{margin-top:14px}\n.px-chgroups{display:grid;gap:16px}\n.px-chgroup{display:grid;gap:8px}\n.px-chgroup-t{font:600 12.5px\/1.3 var(--f-body);color:var(--muted)}\n.px-chcount{font-size:13px;color:var(--teal);font-weight:600}\n.px-nav{justify-content:space-between}\n\n.px-co.small small{white-space:nowrap}\n@media (max-width:620px){ .px-chgroup .px-cards.tight{grid-template-columns:1fr} .px-co.small{padding:12px 44px 12px 14px} .px-co.small b{font-size:14.5px} }\n\n.px-figs.px-chm{display:grid;grid-template-columns:1fr;gap:8px;border-top:0;padding-top:0;margin:0}\n.px-figs.px-chm dt{font-size:13px;color:#f6d58a}\n.px-figs.px-chm dd{margin:0;display:flex;flex-wrap:wrap;gap:6px}\n.px-chm-i{appearance:none;white-space:nowrap;display:inline-flex;align-items:baseline;gap:8px;padding:8px 12px;border-radius:999px;border:1px solid rgb(240 189 79\/.28);background:rgb(240 189 79\/.08);color:var(--deep-ink);font:500 13px\/1 var(--f-body);cursor:pointer;transition:background-color .15s ease,border-color .15s ease,transform .16s var(--ease-out)}\n.px-chm-i span{color:var(--deep-muted)}\n.px-chm-i b{font:700 15px\/1 var(--f-display);color:#fff4d6}\n.px-chm-i:active{transform:scale(.97)}\n.px-chm-i.on{background:rgb(240 189 79\/.18);border-color:#f0bd4f}\n.px-chm-i.low b{color:#f3c867}\n.px-chm-i.low::before{content:\"\";width:6px;height:6px;border-radius:50%;background:#f3c867;align-self:center}\n@media (hover:hover) and (pointer:fine){ .px-chm-i:hover{border-color:#f0bd4f} }\n@media (max-width:440px){ .px-rleg{grid-template-columns:1fr} }\n\n.px-hp{position:absolute;left:-9999px;width:1px;height:1px;opacity:0}\n\n\/* rep\u00e8res v32 *\/\n.px-bench{gap:clamp(28px,4vw,44px)!important}\n.px-bench-head{display:grid;grid-template-columns:minmax(0,1fr) 240px;gap:24px 48px;align-items:end}\n.px-bench-hl{display:grid;gap:10px}\n.px-bench-hl .px-kick{color:var(--muted)!important;font-weight:400;max-width:58ch}\n.px-stat{display:grid;gap:2px;padding:20px 22px;border-radius:var(--r-card);background:var(--deep);color:var(--deep-ink);text-decoration:none;transition:transform .16s var(--ease-out)}\n.px-stat:active{transform:scale(.98)}\n.px-stat b{font:700 44px\/1 var(--f-display);letter-spacing:-.02em}\n.px-stat > span{font-size:14px;color:var(--deep-muted)}\n.px-stat em{display:inline-flex;align-items:center;gap:6px;margin-top:14px;padding-top:12px;border-top:1px solid var(--deep-line);font:600 13.5px\/1 var(--f-body);font-style:normal}\n.px-stat em .ico{width:15px;height:15px;transform:rotate(90deg);transition:transform .2s var(--ease-out)}\n.px-stat:hover em .ico{transform:rotate(90deg) translateX(2px)}\n.px-coef{background:var(--paper);border:1px solid var(--line);border-radius:var(--r-panel);padding:clamp(20px,3vw,32px);display:grid;gap:18px}\n.px-coef-h{display:grid;gap:6px}\n.px-coef-h h3{font-size:18px}\n.px-coef-h p{font-size:13.5px;line-height:1.55;color:var(--muted);max-width:80ch}\n.px-coef-axis,.px-coef-row{display:grid;grid-template-columns:140px minmax(0,1fr) 104px;column-gap:20px;align-items:center}\n.px-axis{position:relative;height:16px;font:500 11.5px\/1 var(--f-body);color:var(--muted);font-variant-numeric:tabular-nums}\n.px-axis i{position:absolute;top:0;font-style:normal;transform:translateX(-50%)}\n.px-axis i:first-child{transform:none}.px-axis i:last-child{transform:translateX(-100%)}\n.px-coef-rows{list-style:none;margin:0;padding:0;display:grid}\n.px-coef-row{row-gap:8px;padding:16px 0;border-top:1px solid var(--line)}\n.px-coef-n{font-weight:600;font-size:15px}\n.px-track{position:relative;height:10px;border-radius:5px;background:var(--mint)}\n.px-track span{position:absolute;top:0;bottom:0;border-radius:5px;background:var(--lc)}\n.px-coef-row:nth-child(1){--lc:#8fc3b6}.px-coef-row:nth-child(2){--lc:#4f9a89}.px-coef-row:nth-child(3){--lc:#2f7266}.px-coef-row:nth-child(4){--lc:#0f3a35}\n.px-coef-k{font:700 17px\/1.2 var(--f-display);text-align:right;white-space:nowrap}\n.px-coef-why{grid-column:2 \/ 4;font-size:13.5px;line-height:1.55;color:var(--muted)}\n.px-cites{display:inline-flex;flex-wrap:wrap;gap:4px;vertical-align:1px;margin-left:2px}\n.px-cite{display:inline-grid;place-items:center;min-width:22px;height:18px;padding:0 5px;border-radius:9px;background:var(--mint);color:var(--teal);font:600 10.5px\/1 var(--f-body);text-decoration:none;font-variant-numeric:tabular-nums;transition:background-color .15s ease,color .15s ease}\n.px-cite:hover{background:var(--teal);color:var(--teal-ink)}\n.px-bnotes{display:grid!important;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px!important;max-width:none!important}\n.px-bnote{display:grid;gap:8px;align-content:start;padding:18px 20px;border-radius:var(--r-card);background:var(--paper);border:1px solid var(--line)}\n.px-bnote h3{font:600 14.5px\/1.3 var(--f-body);letter-spacing:0}\n.px-bnote p{font-size:13.5px;line-height:1.55;color:var(--muted)}\n.px-bnote.is-limit{background:transparent;border-style:dashed}\n.px-bnote:nth-child(1),.px-bnote:nth-child(4),.px-bnote:nth-child(6){grid-column:span 2}\n.px-bench-foot{display:grid}\n.px-bench-foot .px-method + .px-method{margin-top:0;border-top:0}\n.px-srcs summary > span{display:inline}\n.px-src-cols{columns:2 340px;column-gap:40px;padding-bottom:24px}\n.px-src-g{break-inside:avoid;margin-bottom:22px}\n.px-src-g h4{margin:0 0 8px;font:600 11.5px\/1.3 var(--f-body);letter-spacing:.06em;text-transform:uppercase;color:var(--teal)}\n.px-src-g ul{list-style:none;margin:0;padding:0;display:grid}\n.px-src-g li{display:grid;grid-template-columns:26px minmax(0,1fr);gap:8px;padding:7px 8px 7px 0;border-top:1px solid var(--line);font-size:13px;line-height:1.45;color:var(--ink);border-radius:6px;scroll-margin:120px}\n.px-src-g li:first-child{border-top:0}\n.px-src-i{font:600 11.5px\/1.6 var(--f-body);color:var(--muted);font-variant-numeric:tabular-nums}\n.px-src-t a{display:inline-flex;align-items:center;gap:3px;margin-left:8px;color:var(--teal);font-size:12px;text-decoration:none;white-space:nowrap}\n.px-src-t a:hover{text-decoration:underline}\n.px-src-t a .ico{width:11px;height:11px;transform:rotate(-45deg)}\n.px-src-g li.is-hit{animation:px-hit 1.6s ease-out}\n@keyframes px-hit{0%,30%{background:var(--mint-2)}100%{background:transparent}}\n.px-lev-n{font:600 12px\/1 var(--f-body);color:var(--teal);font-variant-numeric:tabular-nums;letter-spacing:.04em}\n.px-faq{grid-template-columns:minmax(0,1fr) minmax(0,2fr);gap:20px 48px!important;align-items:start}\n.px-faq-h{display:grid;gap:10px;position:sticky;top:96px}\n.px-faq-list{display:grid}\n.px-faq script{display:none}\n@media (max-width:860px){\n  .px-bench-head{grid-template-columns:1fr}\n  .px-bnotes{grid-template-columns:1fr}\n  .px-bnote:nth-child(1),.px-bnote:nth-child(4),.px-bnote:nth-child(6){grid-column:auto}\n  .px-faq{grid-template-columns:1fr}\n  .px-faq-h{position:static}\n}\n@media (max-width:620px){\n  .px-coef-axis{display:none}\n  .px-coef-row{grid-template-columns:minmax(0,1fr) auto;row-gap:10px}\n  .px-coef-n{grid-column:1}.px-coef-k{grid-column:2}\n  .px-track{grid-column:1 \/ 3;grid-row:2}\n  .px-coef-why{grid-column:1 \/ 3}\n}\n@media (prefers-reduced-motion:reduce){.px-src-g li.is-hit{animation:none;background:var(--mint-2)}}\n\/* Consultation native : une seule section, jamais de formulaire imbriqu\u00e9. *\/\n.cm-calculator-form-source{display:none!important;padding:0!important;margin:0!important}\n.cm-px .px-consultation{width:100%;max-width:720px;margin:clamp(28px,4vw,44px) auto 0;padding:clamp(22px,3vw,34px);border:1px solid var(--line);border-radius:var(--r-panel);background:var(--paper);display:grid;gap:22px;scroll-margin-top:110px;min-width:0}\n.cm-px .px-consult-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}\n.cm-px .px-consult-head > div{display:grid;gap:8px;min-width:0}\n.cm-px .px-consult-head h2{font-size:clamp(24px,3vw,30px);line-height:1.2}\n.cm-px .px-consult-head p{font-size:15px;line-height:1.5;color:var(--muted);max-width:52ch}\n.cm-px .px-consult-head .px-link{flex:none}\n.cm-px .px-consult-details{border-top:1px solid var(--line);min-width:0}\n.cm-px .px-consult-details summary{display:flex;align-items:center;justify-content:space-between;gap:12px;list-style:none;font:600 14px\/1.4 var(--f-body);color:var(--teal);cursor:pointer;min-height:44px}\n.cm-px .px-consult-details summary::-webkit-details-marker{display:none}\n.cm-px .px-consult-details pre{margin:0;padding:8px 0 16px;white-space:pre-wrap;overflow-wrap:anywhere;font:400 13.5px\/1.65 var(--f-body);color:var(--muted)}\n.cm-px .px-consult-privacy{font-size:12.5px;line-height:1.5;color:var(--muted)}\n.cm-px .px-consult-privacy a{color:var(--teal);text-underline-offset:3px}\n#px-dock[hidden]{display:none!important}\n.cm-px .px-act-btn{border:0;cursor:pointer}\n#px-consult-form-host,#px-consult-form-host .elementor-widget-container,#px-consult-form-host .eael-contact-form,#px-consult-form-host .eael-wpforms,#px-consult-form-host .wpforms-container{width:100%!important;max-width:100%!important;margin:0!important;padding:0!important;background:transparent!important;border:0!important;box-shadow:none!important}\n#px-consult-form-host form{margin:0!important}\n#px-consult-form-host .wpforms-head-container{display:none!important}\n#px-consult-form-host .wpforms-field-container{display:grid;grid-template-columns:1fr 1fr;gap:18px}\n#px-consult-form-host .wpforms-field{min-width:0;max-width:100%!important;width:100%!important;padding:0!important;margin:0!important;float:none!important}\n#px-consult-form-host #wpforms-52853-field_1-container,#px-consult-form-host #wpforms-52853-field_4-container,#px-consult-form-host #wpforms-52853-field_5-container{grid-column:1\/-1}\n\/* Optional snapshot must be submitted natively, never disabled\/required. *\/\n#wpforms-52853-field_6-container{display:none!important}\n#px-consult-form-host .wpforms-field-label{font:600 14px\/1.3 var(--f-body)!important;color:var(--ink)!important;margin:0 0 8px!important}\n#px-consult-form-host input[type=text],#px-consult-form-host input[type=email],#px-consult-form-host input[type=tel]{width:100%!important;max-width:100%!important;min-height:48px;border:1px solid var(--line)!important;border-radius:var(--r-field)!important;background:var(--paper)!important;color:var(--ink)!important;font:400 16px\/1.4 var(--f-body)!important;padding:12px 14px!important;box-shadow:none!important}\n#px-consult-form-host input:focus-visible,#px-consult-form-host button:focus-visible{outline:2px solid var(--teal)!important;outline-offset:3px!important}\n#px-consult-form-host input[type=checkbox]{accent-color:var(--teal);width:18px;height:18px}\n#px-consult-form-host .wpforms-field-checkbox ul{margin:0!important;padding:0!important}\n#px-consult-form-host .wpforms-field-checkbox li{display:flex;gap:10px;align-items:flex-start;list-style:none!important}\n#px-consult-form-host .wpforms-field-label-inline{font:400 14px\/1.5 var(--f-body)!important;color:var(--ink)!important}\n#px-consult-form-host .wpforms-submit-container{padding:0!important;margin-top:22px!important}\n#px-consult-form-host button.wpforms-submit{min-height:48px!important;border:0!important;border-radius:999px!important;padding:14px 22px!important;background:var(--teal)!important;color:var(--teal-ink)!important;font:600 14px\/1.3 var(--f-body)!important;white-space:normal!important;max-width:100%}\n#px-consult-form-host button.wpforms-submit:disabled{opacity:.6;cursor:not-allowed}\n#px-consult-form-host .wpforms-error{color:var(--bad)!important;font-size:13px!important}\n#px-consult-form-host .wpforms-confirmation-container-full{background:var(--mint)!important;color:var(--ink)!important;border:0!important;border-radius:var(--r-card);padding:20px!important}\n@media(max-width:520px){#px-consult-form-host .wpforms-field-container{grid-template-columns:1fr}}\n<\/style>\n\n<div lang=\"de\"><svg width=\"0\" height=\"0\" style=\"position:absolute\" aria-hidden=\"true\">\n  <symbol id=\"i-check\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M8 12.5l2.8 2.8L16 10\"\/><\/symbol>\n  <symbol id=\"i-tick\" viewBox=\"0 0 24 24\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"\/><\/symbol>\n  <symbol id=\"i-alert\" viewBox=\"0 0 24 24\"><path d=\"M12 4l9 16H3z\"\/><path d=\"M12 10v4M12 17h.01\"\/><\/symbol>\n  <symbol id=\"i-x\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M9 9l6 6M15 9l-6 6\"\/><\/symbol>\n  <symbol id=\"i-chev\" viewBox=\"0 0 24 24\"><path d=\"M9 6l6 6-6 6\"\/><\/symbol>\n  <symbol id=\"i-down\" viewBox=\"0 0 24 24\"><path d=\"M6 9l6 6 6-6\"\/><\/symbol>\n  <symbol id=\"i-copy\" viewBox=\"0 0 24 24\"><rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"\/><path d=\"M5 15V5a1 1 0 0 1 1-1h10\"\/><\/symbol>\n  <symbol id=\"i-arrow\" viewBox=\"0 0 24 24\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/symbol>\n<\/svg>\n\n<div class=\"cm-px\" id=\"px-root\">\n <div class=\"wrap\">\n\n  <header class=\"px-head\">\n    <p class=\"px-eyebrow\">Kostenloser Rechner, ohne Anmeldung<\/p>\n    <h1 class=\"px-h1\">Zu welchem Preis Sie Ihre Kosmetik verkaufen und beim Hersteller einkaufen sollten<\/h1>\n    <p class=\"px-lead\">F\u00fcnf Fragen und Annahmen zur Marge je Vertriebskanal: Sie erhalten Ihren Endkundenpreis, Ihre Marge und den Einkaufspreis, den Sie nicht \u00fcberschreiten sollten.<\/p>\n    <ul class=\"px-proof\">\n      <li><svg class=\"ico\"><use href=\"#i-check\"\/><\/svg>47 zitierte \u00f6ffentliche Quellen<\/li>\n      <li><svg class=\"ico\"><use href=\"#i-check\"\/><\/svg>8 Vertriebskan\u00e4le<\/li>\n      <li><svg class=\"ico\"><use href=\"#i-check\"\/><\/svg>Entwickelt vom Hersteller f\u00fcr 500+ Marken<\/li>\n    <\/ul>\n  <\/header>\n\n  <div class=\"px-grid\">\n   <section class=\"px-panel px-flow\" aria-label=\"Rechner\">\n    <nav class=\"px-prog\" id=\"px-prog\" aria-label=\"Schritte\"><\/nav>\n\n    <form class=\"px-steps\" id=\"px-form\" autocomplete=\"off\" onsubmit=\"return false\">\n\n     <div class=\"px-step\" data-step=\"1\">\n      <div class=\"px-q\"><h2 tabindex=\"-1\">Was m\u00f6chten Sie berechnen?<\/h2><\/div>\n      <div class=\"px-cards\" role=\"radiogroup\" aria-label=\"Ziel\">\n        <label class=\"px-co\"><input type=\"radio\" name=\"px-mode\" value=\"sell\" checked><span class=\"tick\"><svg><use href=\"#i-tick\"\/><\/svg><\/span><b>Mein Verkaufspreis<\/b><small>Ich habe ein Angebot und suche den passenden Endkundenpreis.<\/small><span class=\"px-flowline\"><i>Angebot<\/i><svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><i class=\"on\">Endkundenpreis<\/i><\/span><\/label>\n        <label class=\"px-co\"><input type=\"radio\" name=\"px-mode\" value=\"buy\"><span class=\"tick\"><svg><use href=\"#i-tick\"\/><\/svg><\/span><b>Mein maximaler Einkaufspreis<\/b><small>Ich habe einen Zielpreis f\u00fcr Endkunden und suche meine Verhandlungsgrenze.<\/small><span class=\"px-flowline\"><i>Endkundenpreis<\/i><svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><i class=\"on\">Maximaler Angebotspreis<\/i><\/span><\/label>\n      <\/div>\n     <\/div>\n\n     <div class=\"px-step\" data-step=\"2\" hidden>\n      <div class=\"px-q\">\n        <h2 tabindex=\"-1\" data-show=\"sell\">Was kostet Sie eine Einheit?<\/h2>\n        <h2 tabindex=\"-1\" data-show=\"buy\" hidden>Zu welchem Preis m\u00f6chten Sie das Produkt verkaufen?<\/h2>\n        <p data-show=\"sell\">Der St\u00fcckpreis aus Ihrem Angebot, einschlie\u00dflich Verpackung und Abf\u00fcllung.<\/p>\n        <p data-show=\"buy\" hidden>Der Preis im Regal oder auf Ihrer Website, einschlie\u00dflich Steuern.<\/p>\n      <\/div>\n      <div class=\"px-fields\">\n        <div class=\"px-field\">\n          <label for=\"px-market\">Verkaufsland<\/label>\n          <div class=\"px-in px-sel\"><select id=\"px-market\">\n            <option value=\"ma\">Marokko (MAD)<\/option>\n            <option value=\"fr\">Frankreich (EUR)<\/option>\n            <option value=\"be\">Belgien (EUR)<\/option>\n            <option value=\"es\">Spanien (EUR)<\/option>\n            <option value=\"de\">Deutschland (EUR)<\/option>\n            <option value=\"uk\">Vereinigtes K\u00f6nigreich (GBP)<\/option>\n            <option value=\"ae\">Vereinigte Arabische Emirate (AED)<\/option>\n            <option value=\"sa\">Saudi-Arabien (SAR)<\/option>\n            <option value=\"us\">USA (USD)<\/option>\n          <\/select><svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/div>\n        <\/div>\n        <div class=\"px-field\" data-show=\"sell\">\n          <label for=\"px-A\">Einkaufspreis pro St\u00fcck (netto)<\/label>\n          <div class=\"px-in big\" id=\"px-A-box\"><input id=\"px-A\" inputmode=\"decimal\" value=\"32\"><span class=\"unit\" data-cur>MAD<\/span><\/div>\n        <\/div>\n        <div class=\"px-field\" data-show=\"buy\" hidden>\n          <label for=\"px-P\" id=\"px-P-lab\">Angestrebter Endkundenpreis (brutto)<\/label>\n          <div class=\"px-in big\" id=\"px-P-box\"><input id=\"px-P\" inputmode=\"decimal\" value=\"199\"><span class=\"unit\" data-cur>MAD<\/span><\/div>\n        <\/div>\n        <p class=\"px-msg\" id=\"px-step2-msg\" hidden><\/p>\n      <\/div>\n     <\/div>\n\n     <div class=\"px-step\" data-step=\"3\" hidden>\n      <div class=\"px-q\"><h2 tabindex=\"-1\">Wie positionieren Sie Ihr Produkt?<\/h2><p>Die Positionierung bestimmt Ihr Marketingbudget, Ihre Marge und die Preisrundung.<\/p><\/div>\n      <div class=\"px-stair\" id=\"px-pos\" role=\"radiogroup\" aria-label=\"Positionierung\"><\/div>\n     <\/div>\n\n     <div class=\"px-step\" data-step=\"4\" hidden>\n      <div class=\"px-q\"><h2 tabindex=\"-1\">Wo werden Sie es verkaufen?<\/h2><p>Ein oder mehrere Kan\u00e4le: Sie erhalten einen einheitlichen Preis oder einen Preis je Kanal.<\/p><\/div>\n      <div class=\"px-chgroups\" id=\"px-channels\" role=\"group\" aria-label=\"Vertriebskan\u00e4le\"><\/div>\n      <p class=\"px-chcount\" id=\"px-chcount\" aria-live=\"polite\"><\/p>\n      <p class=\"px-msg\" id=\"px-step4-msg\" hidden>Lassen Sie mindestens einen Kanal ausgew\u00e4hlt.<\/p>\n     <\/div>\n\n     <div class=\"px-step\" data-step=\"5\" hidden>\n      <div class=\"px-q\"><h2 tabindex=\"-1\">Welche Marge m\u00f6chten Sie erzielen?<\/h2><p>Was Ihnen bleibt, wenn alles bezahlt ist. Orientieren Sie sich am gr\u00fcnen Bereich.<\/p><\/div>\n      <div class=\"px-field px-gfield\">\n        <div class=\"px-range\">\n          <input type=\"range\" id=\"px-g-range\" min=\"0\" max=\"70\" step=\"1\" value=\"45\" aria-label=\"Zielmarge\" aria-describedby=\"px-zone-msg\">\n          <output id=\"px-g-out\" for=\"px-g-range\">45 %<\/output>\n        <\/div>\n        <div class=\"px-zone\" aria-hidden=\"true\"><span class=\"lo\">Knappe Marge<\/span><span class=\"mid\" id=\"px-zone-mid\">\u00dcblicher Bereich<\/span><span class=\"hi\">Au\u00dferhalb der Richtwerte<\/span><\/div>\n        <p class=\"px-zone-msg\" id=\"px-zone-msg\"><\/p>\n      <\/div>\n      <details class=\"px-adv\" id=\"px-adv\">\n        <summary><span class=\"px-adv-h\"><b>Unsere Annahmen pr\u00fcfen<\/b><small id=\"px-adv-sum\"><\/small><\/span><svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary>\n        <div class=\"px-adv-body\">\n          <p class=\"px-hint\">Jeder Wert entspricht dem Richtwert f\u00fcr Ihre Positionierung und Ihren Vertriebskanal. Tippen Sie auf eine Zeile, um den Wert zu \u00e4ndern: Das Ergebnis aktualisiert sich sofort. Betr\u00e4ge pro Einheit.<\/p>\n          <div class=\"px-tabs\" id=\"px-edit\" role=\"tablist\" aria-label=\"Kanal anpassen\" hidden><\/div>\n          <p class=\"px-bm-for\" id=\"px-bm-for\"><\/p>\n          <p class=\"px-chnote\" id=\"px-ch-note\"><\/p>\n          <div class=\"px-hyp\" id=\"px-hyp\"><\/div>\n          <div class=\"px-adv-foot\">\n            <button type=\"button\" class=\"px-link\" id=\"px-reset\">Richtwerte \u00fcbernehmen<\/button>\n            <button type=\"button\" class=\"px-link\" id=\"px-showall\"><\/button>\n          <\/div>\n        <\/div>\n      <\/details>\n     <\/div>\n    <\/form>\n\n    <div class=\"px-nav\">\n      <button type=\"button\" class=\"px-back\" id=\"px-back\" disabled><svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg>Zur\u00fcck<\/button>\n      <span class=\"count px-sr\" id=\"px-count\" aria-live=\"polite\">Schritt 1 von 5<\/span>\n      <button type=\"button\" class=\"px-btn\" id=\"px-next\">Weiter<svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><\/button>\n    <\/div>\n   <\/section>\n\n   <aside class=\"px-aside\">\n    <section class=\"px-answer is-locked\" id=\"px-answer\">\n      <div class=\"px-wait\" id=\"px-wait\">\n        <div class=\"px-wait-h\"><h3>Ihre Preis\u00fcbersicht erscheint hier<\/h3><p>Empfohlener Endkundenpreis, Marge, Preisaufteilung und Marktpositionierung ab Ihrer 5<sup>.<\/sup> Antwort.<\/p><\/div>\n        <ol class=\"px-wait-list\" id=\"px-wait-list\"><\/ol>\n        <div class=\"px-ghost-rib\" aria-hidden=\"true\"><span><\/span><span><\/span><span><\/span><span><\/span><span><\/span><\/div>\n      <\/div>\n      <p class=\"px-sr\" id=\"px-reveal-live\" aria-live=\"polite\"><\/p>\n      <div class=\"px-strat\" id=\"px-strat\" role=\"group\" aria-label=\"Preisstrategie\" hidden>\n        <button type=\"button\" data-s=\"unique\" aria-pressed=\"true\">Einheitlicher Preis<small>empfohlen<\/small><\/button>\n        <button type=\"button\" data-s=\"per\" aria-pressed=\"false\">Preis je Kanal<small>f\u00fcr jeden ein eigener Preis<\/small><\/button>\n      <\/div>\n      <div class=\"px-err\" id=\"px-err\" hidden><svg class=\"ico\"><use href=\"#i-alert\"\/><\/svg><span id=\"px-err-t\"><\/span><\/div>\n      <div id=\"px-ans\" style=\"display:grid;gap:22px\">\n        <div class=\"px-ans-top\">\n          <div class=\"px-ans-label\"><span id=\"px-ans-label\">Empfohlener Endkundenpreis (brutto)<\/span>\n            <label class=\"px-switch\" data-show=\"sell\"><input type=\"checkbox\" id=\"px-round\" checked>Rundung<\/label><\/div>\n          <div class=\"px-big\" id=\"px-big\">\u2026<\/div>\n          <p class=\"px-sr\" id=\"px-live\" aria-live=\"polite\"><\/p>\n          <ul class=\"px-chlist\" id=\"px-chlist\" hidden><\/ul>\n          <p class=\"px-ans-note\" id=\"px-ans-note\"><\/p>\n        <\/div>\n        <dl class=\"px-figs\" id=\"px-figs\"><\/dl>\n        <div class=\"px-quote\" data-show=\"buy\" hidden>\n          <p class=\"px-nego\" id=\"px-nego\"><\/p>\n          <label for=\"px-quote\">Haben Sie bereits ein Angebot?<\/label>\n          <div class=\"px-in\"><input id=\"px-quote\" inputmode=\"decimal\" placeholder=\"Vorgeschlagener St\u00fcckpreis\"><span class=\"unit\" data-cur>MAD<\/span><\/div>\n          <p class=\"px-status\" id=\"px-quote-v\" hidden><\/p>\n        <\/div>\n        <div class=\"px-perf\" aria-hidden=\"true\"><\/div>\n        <section class=\"px-a-sec px-a-first\" aria-labelledby=\"px-bd-t\">\n          <div class=\"px-a-h\"><h3 id=\"px-bd-t\">So setzt sich der Preis zusammen<\/h3><span class=\"px-a-total\" id=\"px-a-total\"><\/span><\/div>\n          <div class=\"px-a-ch\" id=\"px-bd-ch\" role=\"group\" hidden><\/div>\n          <div class=\"px-ribbon\" id=\"px-bar\" role=\"img\"><\/div>\n          <ul class=\"px-rleg\" id=\"px-legend\"><\/ul>\n        <\/section>\n        <section class=\"px-a-sec\" aria-labelledby=\"px-pos-t\">\n          <div class=\"px-a-h\"><h3 id=\"px-pos-t\">Positionierung<\/h3><\/div>\n          <div class=\"px-ladder\" id=\"px-scale\"><\/div>\n          <div class=\"px-a-verdict\" id=\"px-verdict\"><\/div>\n        <\/section>\n        <p class=\"px-status\" id=\"px-pos-line\" hidden><\/p>\n        <div class=\"px-recap\" id=\"px-recap\" hidden><\/div>\n        <div class=\"px-act\" id=\"px-actions\">\n          <p>Pr\u00fcfen wir die Machbarkeit Ihres Produkts.<\/p>\n          <div class=\"px-act-row\">\n            <button type=\"button\" class=\"px-act-btn\" data-consult-placement=\"resultat\" aria-controls=\"px-consultation\" aria-expanded=\"false\">Kostenlose Beratung<svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><\/button>\n            <button type=\"button\" class=\"px-act-copy\" id=\"px-copy\"><svg class=\"ico\"><use href=\"#i-copy\"\/><\/svg><span>Kopieren<\/span><\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/section>\n    <p class=\"px-disc\" id=\"px-disc\"><svg class=\"ico\"><use href=\"#i-alert\"\/><\/svg><span>Unverbindlicher Richtpreis auf Grundlage Ihrer Antworten und \u00f6ffentlich verf\u00fcgbarer Durchschnittswerte. Er ersetzt weder eine Marktanalyse noch ein Angebot: Vergleichen Sie die Preise Ihrer Wettbewerber, die Konditionen Ihrer Wiederverk\u00e4ufer und Ihre tats\u00e4chlichen Kosten, bevor Sie Ihren Preis festlegen.<\/span><\/p>\n   <\/aside>\n  <\/div>\n\n  <section class=\"px-consultation\" id=\"px-consultation\" hidden aria-labelledby=\"px-consult-title\">\n    <div class=\"px-consult-head\">\n      <div><h2 id=\"px-consult-title\" tabindex=\"-1\">Sprechen wir \u00fcber Ihr Produkt<\/h2><p>Ein Projektleiter pr\u00fcft Ihre Anfrage. Sie k\u00f6nnen Ihre Berechnung beif\u00fcgen, um Ihr Preisziel zu erl\u00e4utern.<\/p><\/div>\n      <button type=\"button\" class=\"px-link\" id=\"px-consult-close\">Schlie\u00dfen<\/button>\n    <\/div>\n    <div id=\"px-consult-form-host\"><\/div>\n    <p id=\"px-consult-fallback\" class=\"px-consult-privacy\" role=\"status\">Falls das Formular nicht angezeigt wird, <a href=\"\/demande-de-devis\/\">fordern Sie Ihre kostenlose Beratung \u00fcber unsere Kontaktseite an<\/a>.<\/p>\n    <details id=\"px-consult-simulation\" class=\"px-consult-details\" hidden>\n      <summary>Beigef\u00fcgte Berechnung ansehen<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary>\n      <pre id=\"px-consult-summary\"><\/pre>\n    <\/details>\n    <p class=\"px-consult-privacy\">Unverbindlich. Diese Berechnung ist kein Angebot. Ihre Kontaktdaten dienen der Bearbeitung Ihrer Anfrage. <a href=\"\/politique-de-confidentialite\/\">Datenschutzerkl\u00e4rung<\/a>.<\/p>\n  <\/section>\n\n  <div class=\"px-detail\" id=\"px-detail\">\n    <section class=\"px-panel px-wide\" id=\"px-multi\" aria-labelledby=\"px-multi-t\" hidden>\n      <h2 id=\"px-multi-t\">Kanal f\u00fcr Kanal<\/h2>\n      <div class=\"px-tablewrap\"><table class=\"px-ctable\"><thead id=\"px-ct-head\"><\/thead><tbody id=\"px-ct-body\"><\/tbody><\/table><\/div>\n      <p class=\"px-hint\" id=\"px-ct-foot\"><\/p>\n    <\/section>\n  <\/div>\n\n  <section class=\"px-bench\" id=\"px-bench\" aria-labelledby=\"px-bench-t\">\n    <div class=\"px-bench-head\">\n      <div class=\"px-bench-hl\">\n        <p class=\"px-eyebrow\">Unsere Richtwerte<\/p>\n        <h2 id=\"px-bench-t\">Reale Margen statt Vermutungen<\/h2>\n        <p class=\"px-kick\">Jeder Satz stammt aus einem Gesch\u00e4ftsbericht, einer Stellungnahme einer Wettbewerbsbeh\u00f6rde, einer Preisliste oder einer Preiserhebung. Alles ist mit Quellen belegt und \u00fcberpr\u00fcfbar.<\/p>\n      <\/div>\n      <a class=\"px-stat\" href=\"#px-srcs\" id=\"px-stat\"><b id=\"px-stat-n\">47<\/b><span>zitierte \u00f6ffentliche Quellen<\/span><em>Liste ansehen<svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><\/em><\/a>\n    <\/div>\n\n    <div class=\"px-coef\">\n      <div class=\"px-coef-h\"><h3>Kalkulationsfaktor nach Positionierung<\/h3><p id=\"px-bench-intro\"><\/p><\/div>\n      <div class=\"px-coef-axis\" aria-hidden=\"true\"><span><\/span><div class=\"px-axis\"><i style=\"left:0\">\u00d71<\/i><i style=\"left:22.22%\">\u00d73<\/i><i style=\"left:44.44%\">\u00d75<\/i><i style=\"left:66.67%\">\u00d77<\/i><i style=\"left:100%\">\u00d710<\/i><\/div><\/div>\n      <ol class=\"px-coef-rows\" id=\"px-bench-rows\"><\/ol>\n    <\/div>\n\n    <div class=\"px-bnotes\" id=\"px-bench-notes\"><\/div>\n\n    <div class=\"px-bench-foot\">\n    <details class=\"px-method\">\n      <summary>So funktioniert die Berechnung<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary>\n      <ol>\n        <li>Endkundenpreis netto = Bruttopreis \u00f7 (1 + MwSt.).<\/li>\n        <li>Der Wiederverk\u00e4ufer kauft zum Nettopreis \u00d7 (1 \u2212 seine Marge) ein. Ein zwischengeschalteter Distributor berechnet seine Marge auf diesen Preis.<\/li>\n        <li>\u00dcbrig bleibt Ihr Nettoverkaufspreis. Davon werden Provisionen, Marketing, Verkaufsf\u00f6rderung, Einkaufspreis und Logistik abgezogen: Der Rest ist Ihre Marge.<\/li>\n        <li>Maximaler Einkaufspreis = Nettoverkaufspreis \u00d7 (1 \u2212 Provisionen \u2212 Marketing \u2212 Verkaufsf\u00f6rderung \u2212 Zielmarge) \u2212 Logistik.<\/li>\n        <li>Kalkulationsfaktor = Nettoendkundenpreis \u00f7 Einkaufspreis. Er ist unabh\u00e4ngig vom Mehrwertsteuersatz und erm\u00f6glicht so den Vergleich zwischen L\u00e4ndern.<\/li>\n        <li>\u00dcblicher Margenbereich: die Marge, die Sie erzielen, wenn Ihr Endkundenpreis innerhalb der Faktorenspanne Ihrer Positionierung liegt (siehe unsere Richtwerte), unter Ber\u00fccksichtigung der Margen und Kosten Ihres Vertriebskanals.<\/li>\n      <\/ol>\n      <p>Unverbindliche Ergebnisse. Die Margen der Zwischenh\u00e4ndler variieren je nach Handelskette, Land und Ihren Vereinbarungen.<\/p>\n    <\/details>\n      <details class=\"px-method px-srcs\" id=\"px-srcs\">\n        <summary><span>Die <span id=\"px-srcs-n\">47<\/span> Quellen mit Links<\/span><svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary>\n        <div class=\"px-src-cols\" id=\"px-sources\"><\/div>\n      <\/details>\n    <\/div>\n  <\/section>\n\n  <section class=\"px-levers-sec\" aria-labelledby=\"px-lev-t\">\n    <h2 id=\"px-lev-t\">Das Angebot \u00fcbersteigt Ihren maximalen Einkaufspreis? Sechs M\u00f6glichkeiten, ihn zu senken<\/h2>\n    <ul class=\"px-levers\">\n      <li><span class=\"px-lev-n\">01<\/span><b>Ein Standardflakon<\/b><p>Ein Flakon, den der Hersteller bereits im Sortiment hat, vermeidet Formkosten und kostet weniger als eine Sonderanfertigung.<\/p><\/li>\n      <li><span class=\"px-lev-n\">02<\/span><b>Eine angepasste bestehende Rezeptur<\/b><p>Eine bereits validierte Rezeptur als Ausgangspunkt reduziert den Entwicklungsaufwand und die Anzahl der kostenpflichtigen Stabilit\u00e4tstests.<\/p><\/li>\n      <li><span class=\"px-lev-n\">03<\/span><b>Eine einfachere Gestaltung<\/b><p>Ein gut gestaltetes Etikett kostet weniger als mehrfarbiger Siebdruck oder eine Hei\u00dffolienpr\u00e4gung.<\/p><\/li>\n      <li><span class=\"px-lev-n\">04<\/span><b>Eine Faltschachtel nur bei Bedarf<\/b><p>Apotheken und Parf\u00fcmerien erwarten sie h\u00e4ufig. Im Onlinehandel verzichten viele Marken darauf.<\/p><\/li>\n      <li><span class=\"px-lev-n\">05<\/span><b>Gemeinsame Komponenten<\/b><p>Derselbe Flakon und dieselbe Pumpe f\u00fcr mehrere Produkte: Sie kaufen gr\u00f6\u00dfere Mengen jeder Komponente und damit g\u00fcnstiger ein.<\/p><\/li>\n      <li><span class=\"px-lev-n\">06<\/span><b>Vergleichbare Angebote<\/b><p>Pr\u00fcfen Sie den Umfang jedes Angebots: Abf\u00fcllung, Qualit\u00e4tskontrolle, Produktinformationsdatei (PIF), Sicherheitsbewertung.<\/p><\/li>\n    <\/ul>\n  <\/section>\n\n  <section class=\"px-faq\" aria-labelledby=\"px-faq-t\">\n    <div class=\"px-faq-h\"><p class=\"px-eyebrow\">FAQ<\/p><h2 id=\"px-faq-t\">H\u00e4ufige Fragen<\/h2><\/div>\n    <div class=\"px-faq-list\">\n      <details class=\"px-method\"><summary>Ist der Rechner wirklich kostenlos?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">Ja. Sie beantworten die f\u00fcnf Fragen und sehen sofort das Ergebnis, ohne Registrierung und ohne E-Mail-Adresse. Kostenlos und unverbindlich.<\/p><\/details>\n      <details class=\"px-method\"><summary>Muss ich bei Carmel produzieren lassen, um ihn zu nutzen?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">Nein. Die Berechnung gilt f\u00fcr jeden Hersteller. Nutzen Sie Ihren maximalen Einkaufspreis, um alle Angebote zu vergleichen und zu verhandeln.<\/p><\/details>\n      <details class=\"px-method\"><summary>Woher stammen die Margen der Wiederverk\u00e4ufer?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">Aus Gesch\u00e4ftsberichten von Kosmetikkonzernen und H\u00e4ndlern, Stellungnahmen von Wettbewerbsbeh\u00f6rden und \u00f6ffentlich zug\u00e4nglichen Provisionstabellen. Die 47 Quellen sind oben mit Links aufgef\u00fchrt.<\/p><\/details>\n      <details class=\"px-method\"><summary>Ich verkaufe \u00fcber mehrere Kan\u00e4le: Welchen Preis soll ich angeben?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">W\u00e4hlen Sie alle Ihre Vertriebskan\u00e4le aus. Der Rechner schl\u00e4gt einen einheitlichen Endkundenpreis vor, der sich am anspruchsvollsten Kanal orientiert. So kostet Ihr Produkt \u00fcberall gleich viel. Sie k\u00f6nnen auch einen Preis je Kanal anzeigen lassen.<\/p><\/details>\n      <details class=\"px-method\"><summary>Kann ich die Ergebnisse als Grundlage f\u00fcr Verhandlungen nutzen?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">Es handelt sich um fundierte Richtwerte, kein Angebot. Die Margen variieren je nach H\u00e4ndler, Land und Vereinbarung. Wenn Sie Ihre eigenen Margen kennen, passen Sie sie unter \u201eUnsere Annahmen pr\u00fcfen\u201c an.<\/p><\/details>\n      <details class=\"px-method\"><summary>Mein maximaler Einkaufspreis ist zu niedrig: Was kann ich tun?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">\u00c4ndern Sie den Vertriebskanal oder die Positionierung, nutzen Sie die sechs oben genannten Stellschrauben oder nehmen Sie eine kostenlose Beratung in Anspruch. Ein Projektleiter pr\u00fcft mit Ihnen die Machbarkeit des Produkts, die Rezeptur- und Verpackungsoptionen sowie Ihr Preisziel. Die Simulation ist kein Angebot und garantiert keinen Herstellungspreis.<\/p><\/details>\n      <details class=\"px-method\"><summary>Was passiert, wenn ich eine Beratung anfrage?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">Sie geben Ihr Produkt und Ihre Kontaktdaten im Formular an. Das Feld \u201eMeine Simulation beif\u00fcgen\u201c ist optional: Ist es nicht aktiviert, wird keine Simulation beigef\u00fcgt. Ein Projektleiter pr\u00fcft Ihre Anfrage unverbindlich. Der Herstellungspreis wird im Angebot festgelegt.<\/p><\/details>\n    <\/div>\n    <script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"Was passiert, wenn ich eine Beratung anfrage?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Sie geben Ihr Produkt und Ihre Kontaktdaten im Formular an. Das Feld \u201eMeine Simulation beif\u00fcgen\u201c ist optional: Ist es nicht aktiviert, wird keine Simulation beigef\u00fcgt. Ein Projektleiter pr\u00fcft Ihre Anfrage unverbindlich. Der Herstellungspreis wird im Angebot festgelegt.\"}}, {\"@type\": \"Question\", \"name\": \"Ist der Rechner wirklich kostenlos?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Ja. Sie beantworten die f\u00fcnf Fragen und sehen sofort das Ergebnis, ohne Registrierung und ohne E-Mail-Adresse. Kostenlos und unverbindlich.\"}}, {\"@type\": \"Question\", \"name\": \"Muss ich bei Carmel produzieren lassen, um ihn zu nutzen?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Nein. Die Berechnung gilt f\u00fcr jeden Hersteller. Nutzen Sie Ihren maximalen Einkaufspreis, um alle Angebote zu vergleichen und zu verhandeln.\"}}, {\"@type\": \"Question\", \"name\": \"Woher stammen die Margen der Wiederverk\u00e4ufer?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Aus Gesch\u00e4ftsberichten von Kosmetikkonzernen und H\u00e4ndlern, Stellungnahmen von Wettbewerbsbeh\u00f6rden und \u00f6ffentlich zug\u00e4nglichen Provisionstabellen. Die 47 Quellen sind oben mit Links aufgef\u00fchrt.\"}}, {\"@type\": \"Question\", \"name\": \"Ich verkaufe \u00fcber mehrere Kan\u00e4le: Welchen Preis soll ich angeben?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"W\u00e4hlen Sie alle Ihre Vertriebskan\u00e4le aus. Der Rechner schl\u00e4gt einen einheitlichen Endkundenpreis vor, der sich am anspruchsvollsten Kanal orientiert. So kostet Ihr Produkt \u00fcberall gleich viel. Sie k\u00f6nnen auch einen Preis je Kanal anzeigen lassen.\"}}, {\"@type\": \"Question\", \"name\": \"Kann ich die Ergebnisse als Grundlage f\u00fcr Verhandlungen nutzen?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Es handelt sich um fundierte Richtwerte, kein Angebot. Die Margen variieren je nach H\u00e4ndler, Land und Vereinbarung. Wenn Sie Ihre eigenen Margen kennen, passen Sie sie unter \u201eUnsere Annahmen pr\u00fcfen\u201c an.\"}}, {\"@type\": \"Question\", \"name\": \"Mein maximaler Einkaufspreis ist zu niedrig: Was kann ich tun?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"\u00c4ndern Sie den Vertriebskanal oder die Positionierung, nutzen Sie die sechs oben genannten Stellschrauben oder nehmen Sie eine kostenlose Beratung in Anspruch. Ein Projektleiter pr\u00fcft mit Ihnen die Machbarkeit des Produkts, die Rezeptur- und Verpackungsoptionen sowie Ihr Preisziel. Die Simulation ist kein Angebot und garantiert keinen Herstellungspreis.\"}}]}<\/script>\n  <\/section>\n\n  <figure class=\"px-note\">\n    <blockquote>\n      <p>Die erste Frage, die uns gestellt wird, lautet fast immer: Was kostet ein Flakon? Diese Frage kommt zu fr\u00fch. Zun\u00e4chst m\u00fcssen Sie wissen, was Ihr Kunde bezahlen wird, welchen Anteil die Apotheke, der Distributor oder der Marktplatz beh\u00e4lt und was Ihnen bleibt.<\/p>\n      <p>Ohne diese Zahl verhandeln Sie im Blindflug und stellen zu sp\u00e4t fest, dass ein Produkt keine Marge l\u00e4sst. Wir haben diesen Rechner entwickelt, damit Sie Ihren maximalen Einkaufspreis bereits beim ersten Herstellergespr\u00e4ch kennen, ob bei uns oder anderswo.<\/p>\n    <\/blockquote>\n    <figcaption><span class=\"px-note-av\" aria-hidden=\"true\">MH<\/span><span><b>Mohamed El Hjouji<\/b>Gr\u00fcnder, Carmel Cosmetics Labs<\/span><\/figcaption>\n  <\/figure>\n\n  <section class=\"px-cta\">\n    <div>\n      <h2>Sie kennen Ihren maximalen Einkaufspreis. Pr\u00fcfen wir Ihr Projekt<\/h2>\n      <p>Besprechen Sie Ihr Produkt mit einem Projektleiter von Carmel. Er pr\u00fcft die Machbarkeit, Ihr Preisziel sowie die M\u00f6glichkeiten bei Rezeptur und Verpackung. Der Herstellungspreis wird im Angebot festgelegt; eine \u00dcbereinstimmung mit der Berechnung ist nicht garantiert. Mehr als 500 Marken in \u00fcber 35 L\u00e4ndern haben uns bereits ihre Herstellung anvertraut.<\/p>\n    <\/div>\n    <button type=\"button\" class=\"px-btn\" data-consult-placement=\"bas-page\" aria-controls=\"px-consultation\" aria-expanded=\"false\">Kostenlose Beratung<svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><\/button>\n  <\/section>\n\n  <p class=\"px-legal\"><b>Hinweis.<\/b> Dieser Rechner liefert unverbindliche Orientierungswerte. Die Ergebnisse h\u00e4ngen von den eingegebenen Annahmen und Durchschnittswerten aus \u00f6ffentlichen Quellen ab. Sie stellen weder eine Finanz-, Rechts- oder Steuerberatung noch ein Preisangebot von Carmel Cosmetics Labs dar. Margen der Wiederverk\u00e4ufer, Provisionen, Steuern und Logistikkosten variieren je nach Land, Handelskette und Ihren Vereinbarungen. Recherchieren Sie selbst, bevor Sie Ihren Preis festlegen: Wettbewerbspreise im Handel und online, tats\u00e4chliche Konditionen Ihrer Distributoren, Angebote Ihrer Lieferanten und bei Bedarf die Einsch\u00e4tzung eines Steuerberaters. \u00dcber den Verkaufspreis entscheiden Sie.<\/p>\n <\/div>\n<\/div>\n\n<div class=\"px-dock\" id=\"px-dock\" aria-hidden=\"true\">\n  <div><span id=\"px-dock-k\">Empfohlener Endkundenpreis<\/span><b id=\"px-dock-v\">\u2026<\/b><\/div>\n  <a href=\"#px-answer\">Ergebnis ansehen<\/a>\n<\/div>\n\n<script>\n(function(){\n  const $ = id => document.getElementById(id);\n\n  const MARKETS = {\n    ma:{name:'Marokko',cur:'MAD',vat:20,rate:10.8,help:'MwSt.: Normalsatz in Marokko.'},\n    fr:{name:'Frankreich',cur:'EUR',vat:20,rate:1,help:'MwSt.: Normalsatz in Frankreich.'},\n    be:{name:'Belgien',cur:'EUR',vat:21,rate:1,help:'MwSt.: Normalsatz in Belgien.'},\n    es:{name:'Spanien',cur:'EUR',vat:21,rate:1,help:'IVA: Normalsatz in Spanien.'},\n    de:{name:'Deutschland',cur:'EUR',vat:19,rate:1,help:'MwSt.: Normalsatz in Deutschland.'},\n    uk:{name:'Vereinigtes K\u00f6nigreich',cur:'GBP',vat:20,rate:0.86,help:'VAT: Normalsatz im Vereinigten K\u00f6nigreich.'},\n    ae:{name:'VAE',cur:'AED',vat:5,rate:4.0,help:'MwSt. in den Vereinigten Arabischen Emiraten.'},\n    sa:{name:'Saudi-Arabien',cur:'SAR',vat:15,rate:4.1,help:'MwSt. in Saudi-Arabien.'},\n    us:{name:'USA',cur:'USD',vat:0,rate:1.1,help:'In den USA werden Endkundenpreise ohne Sales Tax angegeben.'}\n  };\n  \/\/ r = marge revendeur, d = distributeur, f = commissions\/remises (% du prix HT de la marque),\n  \/\/ am\/ap = ajustement publicit\u00e9\/promotion par rapport au positionnement, L2 = livraison par unit\u00e9 en EUR\n  const CHANNELS = [\n    {k:'dtc',name:'Ihr Onlineshop',short:'Onlineshop',r:0,d:0,f:3,am:8,ap:-4,L2:2.5,note:'Beim Direktverkauf zahlen Sie die Zahlungsgeb\u00fchren und den Versand jeder Bestellung selbst.'},\n    {k:'mkp',name:'Marktplatz',short:'Marktplatz',r:0,d:0,f:15,am:3,ap:-4,L2:3,note:'Amazon erhebt bei Beauty-Produkten 8\u202f% bis 10 \u20ac, dar\u00fcber 15\u202f%, ohne Versandkosten (Verk\u00e4ufertarif von Amazon).'},\n    {k:'pha',name:'Apotheke',short:'Apotheke',r:35,d:0,f:0,am:0,ap:1,L2:0.3,note:'Die Preise f\u00fcr Parapharmazie sind frei. Die durchschnittliche Handelsspanne franz\u00f6sischer Apotheken lag 2022 bei 27,6\u202f%, \u00fcber alle Produkte hinweg (Insee). F\u00fcr Marokko gibt es keine \u00f6ffentliche Zahl.'},\n    {k:'sel',name:'Parf\u00fcmerie',short:'Parf\u00fcmerie',r:40,d:0,f:0,am:0,ap:4,L2:0.3,note:'In Frankreich stellte die Wettbewerbsbeh\u00f6rde einen empfohlenen Preis von rund 1,97 \u00d7 Gro\u00dfhandelspreis netto fest, also knapp 40\u202f% vom Nettopreis f\u00fcr den Parf\u00fcmeur. In den USA behalten die Ketten 50 bis 60\u202f%.'},\n    {k:'gms',name:'Lebensmittel- und Drogeriehandel',short:'Handelsketten',r:30,d:0,f:8,am:0,ap:3,L2:0.3,note:'Bruttomarge von Walmart: 24\u202f%, \u00fcber alle Kategorien. Die Handelsketten verlangen oft zus\u00e4tzlich Jahresendrabatte und Werbekostenzusch\u00fcsse.'},\n    {k:'disc',name:'Discounter',short:'Discounter',r:22,d:0,f:2,am:0,ap:2,L2:0.3,note:'Bruttomarge 2025: 19\u202f% bei BIM, 41\u202f% bei Action. Discounter verlangen die niedrigsten Preise am Markt.'},\n    {k:'spa',name:'Kosmetikinstitute und Spas',short:'Institute',r:50,d:0,f:0,am:-5,ap:0,L2:0.3,note:'Institute und Spas verkaufen in der Regel zum doppelten Einkaufspreis weiter (\u201eKeystone\u201c-Regel).'},\n    {k:'exp',name:'Export',short:'Export',r:40,d:25,f:0,am:-5,ap:-1,L2:0.2,note:'Der Distributor schl\u00e4gt seine Spanne auf, danach der lokale Wiederverk\u00e4ufer seine.'}\n  ];\n  const CH = Object.fromEntries(CHANNELS.map(c=>[c.k,c]));\n  \/\/ lo\/hi = coefficient prix public HT \u00f7 prix d'achat (voir BENCH, sources publi\u00e9es) ; m\/p\/g = publicit\u00e9, promotion, marge vis\u00e9e par d\u00e9faut\n  const POS = [\n    {k:'hd',name:'Discount',of:'Einstiegspreis',who:'Discount-Marken',lvl:1,lo:1.5,hi:3,m:2,p:5,g:25,round:'low',desc:'Der niedrigste Preis im Regal, einfache Verpackung.',where:'Discounter, Einstiegspreise'},\n    {k:'mass',name:'Massenmarkt',of:'Massenmarkt',who:'Massenmarken',lvl:2,lo:3,hi:5,m:9,p:7,g:35,round:'low',desc:'Erschwinglich und \u00fcberall erh\u00e4ltlich.',where:'Superm\u00e4rkte, E-Commerce'},\n    {k:'hdg',name:'Premium',of:'Premium',who:'Premium-Marken',lvl:3,lo:5,hi:7,m:16,p:8,g:45,round:'mid',desc:'Ausgew\u00e4hlte Wirkstoffe, eine sorgf\u00e4ltig gestaltete Marke.',where:'Apotheken, Kosmetikinstitute, digitale Marken'},\n    {k:'lux',name:'Luxus',of:'Luxus',who:'Luxusmarken',lvl:4,lo:7,hi:10,m:22,p:6,g:55,round:'lux',desc:'Ein Objekt und ein Markenerlebnis.',where:'Selektive Parf\u00fcmerien, Kaufh\u00e4user'}\n  ];\n  const BENCH = {\"intro\": \"Der Faktor vergleicht den Endkundenpreis ohne Steuern mit dem Einkaufspreis einer Einheit. Wir haben ihn aus den ver\u00f6ffentlichten Bruttomargen der Kosmetikkonzerne und den Margen der H\u00e4ndler rekonstruiert und mit Einsch\u00e4tzungen von Branchenexperten abgeglichen. Diese Richtwerte beziehen sich auf etablierte Marken: Eine junge Marke kauft in der Regel teurer ein und sollte sich am oberen Ende der Spanne orientieren.\", \"rows\": [{\"pos\": \"Discount\", \"k\": \"\u00d71,5 bis \u00d73\", \"why\": \"Oft ist die Handelskette selbst die Marke: Bei 19 % Bruttomarge bei BIM und 41 % bei Action entspricht der Verkaufspreis dem 1,2- bis 1,7-Fachen der Kosten. Eine Marke, die an einen Discounter verkauft, schl\u00e4gt ihre eigene Marge obendrauf.\", \"src\": [1, 2]}, {\"pos\": \"Massenmarkt\", \"k\": \"\u00d73 bis \u00d75\", \"why\": \"Bruttomarge der Massenmarkt-Konzerne: 47 % bei Unilever, 51 % bei P&G, 58 % bei Beiersdorf, 71 % bei e.l.f. Marge der H\u00e4ndler: 24 % bei Walmart, 39 % bei Ulta Beauty.\", \"src\": [3, 4, 5, 6, 7, 8]}, {\"pos\": \"Premium\", \"k\": \"\u00d75 bis \u00d77\", \"why\": \"Bruttomarge von 71 bis 74 % (e.l.f., L\u2019Or\u00e9al Gruppe), also das 3,4- bis 3,9-Fache der Kosten, danach die Spanne der Apotheke oder der Beauty-Kette.\", \"src\": [6, 9, 10, 8]}, {\"pos\": \"Luxus\", \"k\": \"\u00d77 bis \u00d710\", \"why\": \"Bruttomarge von 74 bis 77 % (Est\u00e9e Lauder, Puig, Shiseido), also das 3,9- bis 4,3-Fache der Kosten, danach selektiver Vertrieb. Die von Beauty Independent befragten Experten sprechen vom 8- bis 10-Fachen der Kosten.\", \"src\": [11, 12, 13, 14, 15]}], \"notes\": [{\"t\": \"Regalpreis einer Gesichtspflege mit 50 ml (Erhebung vom 9. Oktober 2026) : In Marokko 30 bis 90 MAD im Einstiegspreissegment, 65 bis 180 MAD im Massenmarkt, 190 bis 370 MAD in Apotheke und Premiumsegment, 1 100 bis 1 700 MAD im Luxussegment (Lanc\u00f4me, Clarins, Est\u00e9e Lauder bei Marionnaud). In Frankreich: 2 bis 6 \u20ac, 4 bis 15 \u20ac, 16 bis 40 \u20ac und 85 bis 140 \u20ac. Der Rechner vergleicht Ihren Preis mit diesen Spannen.\", \"src\": [42, 43, 44, 45, 46, 47]}, {\"t\": \"Marketing : Werbung und Verkaufsf\u00f6rderung machen 12 % (P&G) bis 24 % (e.l.f. Beauty) des Umsatzes der Massenmarkt-Marken aus, 22 % (Beiersdorf) bis 32 % (L\u2019Or\u00e9al) bei den Premium-Konzernen und 25 % bis 30 % (Est\u00e9e Lauder 25 %, Coty Prestige 28 %, Shiseido 29 %) im Luxussegment. Die Richtwerte des Rechners leiten sich daraus ab.\", \"src\": [18, 19, 20, 21, 22, 3, 23, 13]}, {\"t\": \"Online-Zahlung : Stripe berechnet 1,5 % + 0,25 \u20ac pro Standardkarte aus Europa. F\u00fcr die Margen der Distributoren im Export und f\u00fcr die Rabatte im Lebensmittel- und Drogeriehandel gibt es keinen verl\u00e4sslichen \u00f6ffentlichen Richtwert: Der Rechner weist darauf hin.\", \"src\": [24]}, {\"t\": \"Lieferung : F\u00fcr Ihren Onlineshop stammen die Kosten pro Bestellung (Kommissionierung und Versand) aus Studien europ\u00e4ischer und amerikanischer Logistikdienstleister von 2025 und 2026, umgerechnet auf die Einheit bei 1,3 Produkten pro Bestellung. Keine aktuelle unabh\u00e4ngige Studie ver\u00f6ffentlicht diese Kosten. Laut FEVAD liegt der durchschnittliche Warenkorb in Frankreich bei rund 60 \u20ac. F\u00fcr den Marktplatz \u00fcbernehmen wir die Versandgeb\u00fchren von Amazon. In Marokko verwenden wir die bei Carmel ermittelten Kosten: 40 MAD pro Sendung. In den Vereinigten Arabischen Emiraten und in Saudi-Arabien gibt es keine verifizierte Studie: Wir verwenden den Posttarif und weisen darauf hin.\", \"src\": [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]}, {\"t\": \"Kan\u00e4le : Amazon erhebt bei Beauty-Produkten zuerst 8 %, danach 15 %; Kosmetikinstitute verkaufen zum doppelten Einkaufspreis weiter.\", \"src\": [16, 17]}, {\"t\": \"Grenzen : Die Margen der Gro\u00dfkonzerne schlie\u00dfen ihre eigenen Gesch\u00e4fte und Eink\u00e4ufe in sehr gro\u00dfem Umfang ein. F\u00fcr die Handelsmargen in Marokko gibt es keine \u00f6ffentlichen Daten.\", \"src\": []}], \"sources\": [{\"t\": \"BIM, Ergebnisse des 4. Quartals 2025, S. 15\", \"u\": \"https:\/\/english.bim.com.tr\/investorPresentations\/2025\/BIM%204Q25%20Results%20Presentation.pdf\"}, {\"t\": \"3i Group, Pr\u00e4sentation zu Action 2026, S. 47\", \"u\": \"https:\/\/www.3i.com\/media\/0hkffvm0\/2026-action-cms-presentation_vfinal.pdf\"}, {\"t\": \"Unilever, Jahresergebnisse 2025\", \"u\": \"https:\/\/data.fca.org.uk\/artefacts\/NSM\/RNS\/b82e96e8-7680-4ddf-8c41-f0bb2a051dd5.html\"}, {\"t\": \"Procter & Gamble, Jahresbericht 10-K, Gesch\u00e4ftsjahr 2025\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/80424\/000008042425000076\/pg-20250630.htm\"}, {\"t\": \"Beiersdorf, Gesch\u00e4ftsbericht 2025, Gewinn- und Verlustrechnung\", \"u\": \"https:\/\/reports.beiersdorf.com\/annual-report\/2025\/consolidated-financial-statements\/consolidated-financial-statements\/income-statement.html\"}, {\"t\": \"e.l.f. Beauty, Ergebnisse Gesch\u00e4ftsjahr 2026\", \"u\": \"https:\/\/investor.elfbeauty.com\/stock-and-financial\/press-releases\/landing-news\/2026\/05-20-2026-210538723\"}, {\"t\": \"Walmart, Jahresbericht 10-K, Gesch\u00e4ftsjahr 2026\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/104169\/000010416926000055\/wmt-20260131.htm\"}, {\"t\": \"Ulta Beauty, Ergebnisse Gesch\u00e4ftsjahr 2025\", \"u\": \"https:\/\/www.ulta.com\/investor\/news-events\/press-releases\/detail\/224\/ulta-beauty-announces-fourth-quarter-and-fiscal-2025\"}, {\"t\": \"L\u2019Or\u00e9al, Jahresergebnisse 2025\", \"u\": \"https:\/\/www.loreal-finance.com\/eng\/press-release\/2025-annual-results\"}, {\"t\": \"Insee Premi\u00e8re Nr. 2036, Apotheken, Januar 2025\", \"u\": \"https:\/\/www.insee.fr\/fr\/statistiques\/fichier\/8341260\/ip2036.pdf\"}, {\"t\": \"Est\u00e9e Lauder Companies, Ergebnisse Gesch\u00e4ftsjahr 2025\", \"u\": \"https:\/\/www.elcompanies.com\/en\/news-and-media\/newsroom\/press-releases\/2025\/08-20-2025-110025649\"}, {\"t\": \"Moodie Davitt Report, Ergebnisse 2025 von Puig, Februar 2026\", \"u\": \"https:\/\/moodiedavittreport.com\/puig-records-7-8-revenue-growth-in-fy2025-outperforming-premium-beauty-market\/\"}, {\"t\": \"Shiseido, Ergebnisse 2025, S. 10\", \"u\": \"https:\/\/corp.shiseido.com\/en\/ir\/pdf\/ir20260210_244.pdf\"}, {\"t\": \"Franz\u00f6sische Wettbewerbsbeh\u00f6rde (Autorit\u00e9 de la concurrence), Entscheidung 06-D-04 zur Luxusparf\u00fcmerie, 2006\", \"u\": \"https:\/\/autoritedelaconcurrence.fr\/sites\/default\/files\/commitments\/06d04.pdf\"}, {\"t\": \"Beauty Independent, \u201eIs A 700% Retail Markup Too Much For A Beauty Product?\u201c, Rachel Brown, M\u00e4rz 2020\", \"u\": \"https:\/\/www.beautyindependent.com\/retail-markup-beauty-product-fur-oil-shark-tank\/\"}, {\"t\": \"Amazon, Verk\u00e4ufertarife (Kategorie Beauty)\", \"u\": \"https:\/\/sell.amazon.fr\/tarifs\"}, {\"t\": \"American Spa, \u201eLaunching your line\u201c, Juli 2009\", \"u\": \"https:\/\/www.americanspa.com\/business\/launching-your-line\"}, {\"t\": \"L\u2019Or\u00e9al, Universal Registration Document 2025, Werbe- und Verkaufsf\u00f6rderungskosten\", \"u\": \"https:\/\/www.loreal-finance.com\/eng\/2025-universal-registration-document\/en\/article\/43\/\"}, {\"t\": \"Est\u00e9e Lauder Companies, Jahresbericht 10-K, Gesch\u00e4ftsjahr 2026\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/0001001250\/000100125026000041\/el-20260630.htm\"}, {\"t\": \"Coty, Jahresbericht 10-K, Gesch\u00e4ftsjahr 2025\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/1024305\/000102430525000030\/coty-20250630.htm\"}, {\"t\": \"e.l.f. Beauty, Jahresbericht 10-K, Gesch\u00e4ftsjahr 2026\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/0001600033\/000160003326000020\/elf-20260331.htm\"}, {\"t\": \"Beiersdorf, Konzernlagebericht 2025, Konzernergebnis\", \"u\": \"https:\/\/reports.beiersdorf.com\/annual-report\/2025\/combined-management-report\/economic-report\/results-of-operations\/results-of-operations-group.html\"}, {\"t\": \"Procter & Gamble, Jahresbericht 10-K, Gesch\u00e4ftsjahr 2026\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/0000080424\/000008042426000103\/pg-20260630.htm\"}, {\"t\": \"Stripe, Preise Frankreich\", \"u\": \"https:\/\/stripe.com\/fr\/pricing\"}, {\"t\": \"La Poste, Colissimo-Tarife 2026\", \"u\": \"https:\/\/www.laposte.fr\/tarif-colissimo\"}, {\"t\": \"bpost, Versandratgeber 2026\", \"u\": \"https:\/\/www.bpost.be\/sites\/default\/files\/pricing\/2026\/Praktische_gids_voor_particuliere_zendingen_2026_FR.pdf\"}, {\"t\": \"Correos, Tarife 2026 Festland und Balearen\", \"u\": \"https:\/\/www.correos.es\/\"}, {\"t\": \"DHL, Inlandstarife 2026\", \"u\": \"https:\/\/www.dhl.de\/en\/privatkunden\/pakete-versenden\/deutschlandweit-versenden\/preise-national.html\"}, {\"t\": \"Royal Mail, Online-Paketpreise 2026\", \"u\": \"https:\/\/www.royalmail.com\/current-postage-prices\/online-parcel-price-reduction\"}, {\"t\": \"Emirates Post, Inlandstarife 2026\", \"u\": \"https:\/\/www.emiratespost.ae\/all-services\/domestic-rates\"}, {\"t\": \"SPL, Economy-Paket\", \"u\": \"https:\/\/splonline.com.sa\/en\/economy\/\"}, {\"t\": \"USPS, Notice 123, Tarife zum 4. Oktober 2026\", \"u\": \"https:\/\/pe.usps.com\/text\/dmm300\/Notice123.htm\"}, {\"t\": \"Amazon, FBA-Geb\u00fchrentabelle Europa und Vereinigtes K\u00f6nigreich, Juli 2026\", \"u\": \"https:\/\/m.media-amazon.com\/images\/G\/02\/sell\/images\/260630-FBA-Rate-Card-EN1.pdf\"}, {\"t\": \"Amazon.com, FBA-Versandgeb\u00fchren\", \"u\": \"https:\/\/sellercentral.amazon.com\/help\/hub\/reference\/external\/GABBX6GZPA8MSZGW\"}, {\"t\": \"Amazon.ae, Verk\u00e4ufertarife\", \"u\": \"https:\/\/sell.amazon.ae\/pricing\"}, {\"t\": \"Amazon.sa, Verk\u00e4ufertarife\", \"u\": \"https:\/\/sell.amazon.sa\/pricing\"}, {\"t\": \"Masson International, 3PL-Logistikkosten in Europa, Juni 2025\", \"u\": \"https:\/\/www.massoninternational.com\/blog\/third-party-logistics-costs-europe\"}, {\"t\": \"Euroship Fulfillment, Fulfillment-Kosten in Europa, September 2026\", \"u\": \"https:\/\/euroshipfulfillment.com\/blog\/fulfillment-cost-europe-breakdown\"}, {\"t\": \"UK Pre Fulfilment, Kommissioniertarife 2025\", \"u\": \"https:\/\/ukprefulfillment.com\/pick-pack-pricing-uk-2025-cost-breakdown\/\"}, {\"t\": \"Red Stag Fulfillment, 3PL-Preise erkl\u00e4rt, August 2026\", \"u\": \"https:\/\/redstagfulfillment.com\/3pl-pricing-explained\/\"}, {\"t\": \"FEVAD, Kennzahlen des E-Commerce 2026\", \"u\": \"https:\/\/www.fevad.com\/ledition-2026-des-chiffres-cles-du-e-commerce\/\"}, {\"t\": \"Marjane Mall, Nivea Creme 50 ml und Pflege im Einstiegssegment, Erhebung Oktober 2026\", \"u\": \"https:\/\/www.marjanemall.ma\/p\/NIV4005900573209\"}, {\"t\": \"Parachezvous.ma, La Roche-Posay, Av\u00e8ne, Bioderma, Vichy, Erhebung Oktober 2026\", \"u\": \"https:\/\/parachezvous.ma\/\"}, {\"t\": \"Marionnaud Marokko, Lanc\u00f4me R\u00e9nergie, Clarins, Est\u00e9e Lauder, Erhebung Oktober 2026\", \"u\": \"https:\/\/marionnaud.ma\/products\/lancome-renergie-hpn-300-peptide\"}, {\"t\": \"Carrefour.fr, Gesichtscremes der Handelsmarke, Nivea, Garnier, L\u2019Or\u00e9al, Erhebung Oktober 2026\", \"u\": \"https:\/\/www.carrefour.fr\/\"}, {\"t\": \"Redcare Pharmacie, La Roche-Posay, Av\u00e8ne, Vichy, Erhebung Oktober 2026\", \"u\": \"https:\/\/www.redcare-pharmacie.fr\/\"}, {\"t\": \"Sephora.fr, Lanc\u00f4me R\u00e9nergie, Clarins, Est\u00e9e Lauder, Listenpreis, Erhebung Oktober 2026\", \"u\": \"https:\/\/www.sephora.fr\/p\/renergie---creme-jour-2158.html\"}]};\n\n  \/\/ Prix en rayon d'un soin visage de 50 ml, TTC, relev\u00e9s le 9 octobre 2026 (voir nos rep\u00e8res)\n  const SHELF = {ma:{where:'in Marokko',hd:[30,90],mass:[65,180],hdg:[190,370],lux:[1100,1700]},\n                 eur:{where:'in Frankreich',hd:[2,6],mass:[4,15],hdg:[16,40],lux:[85,140]}};\n  function shelfBand(k){ const m=state.market, B = m==='ma' ? SHELF.ma : ['fr','be','es','de'].includes(m) ? SHELF.eur : null; return B&&B[k] ? {lo:B[k][0],hi:B[k][1],where:B.where} : null; }\n  const STEPS = ['Ziel','Produkt','Positionierung','Kan\u00e4le','Gewinnmarge'];\n  const state = {mode:'sell', market:'ma', channels:['pha'], edit:'pha', strategy:'unique', pos:'hdg', step:1, reached:1, g:.45, vat:20, L1:3, L1e:0.28, showAll:false, open:null, gTouched:false, base:{A:32\/10.8,P:199\/10.8,quote:null}, revealed:false};\n  const cv = {};   \/\/ hypoth\u00e8ses par canal : r, d, f, m, p (%) et L2 (montant par unit\u00e9)\n  const posOf = () => POS.find(x=>x.k===state.pos);\n  const sel = () => CHANNELS.filter(c=>state.channels.includes(c.k));\n  const tickSvg = '<span class=\"tick\"><svg><use href=\"#i-tick\"\/><\/svg><\/span>';\n\n  POS.forEach(x=>{\n    const l=document.createElement('label'); l.className='px-tier';\n    l.style.cssText=`--lvl:${x.lvl};--tint:${2+x.lvl*3}%`;\n    l.innerHTML=`<input type=\"radio\" name=\"px-pos\" value=\"${x.k}\"${x.k===state.pos?' checked':''}>${tickSvg}<span class=\"px-lvl\" aria-hidden=\"true\">${[1,2,3,4].map(n=>`<i class=\"${n<=x.lvl?'on':''}\"><\/i>`).join('')}<\/span><b>${x.name}<\/b><span class=\"where\">${x.where}<\/span>`;\n    $('px-pos').appendChild(l);\n  });\n  \/\/ canaux regroup\u00e9s : vente directe, puis via des revendeurs\n  [['Direktvertrieb',['dtc','mkp']],['\u00dcber Wiederverk\u00e4ufer',['pha','sel','gms','disc','spa','exp']]].forEach(([title,keys])=>{\n    const g=document.createElement('div'); g.className='px-chgroup';\n    g.innerHTML=`<p class=\"px-chgroup-t\">${title}<\/p><div class=\"px-cards tight\"><\/div>`;\n    keys.forEach(k=>{ const c=CH[k];\n      const sub = c.d>0 ? `${c.d}\u202f% + ${c.r}\u202f%` : c.r>0 ? `${c.r}\u202f% an den Wiederverk\u00e4ufer` : `Provision ${c.f}\u202f%`;\n      const l=document.createElement('label'); l.className='px-co small multi';\n      l.innerHTML=`<input type=\"checkbox\" name=\"px-ch\" value=\"${c.k}\"${state.channels.includes(c.k)?' checked':''}>${tickSvg}<b>${c.name}<\/b><small>${sub}<\/small>`;\n      g.lastChild.appendChild(l); });\n    $('px-channels').appendChild(g);\n  });\n  STEPS.forEach((s,i)=>{ const b=document.createElement('button'); b.type='button'; b.dataset.step=i+1; b.textContent=s; $('px-prog').appendChild(b); });\n\n  const num = id => { const v=parseFloat(String($(id).value).replace(\/\\s\/g,'').replace(',','.')); return isFinite(v)?v:NaN; };\n  const fmt = (v,dec=2) => (Math.round(v*10**dec)\/10**dec).toString().replace('.',',');\n  const setNum = (id,v,dec=2) => { $(id).value=fmt(v,dec); };\n  const cur = () => MARKETS[state.market].cur;\n  const nf = {};\n  function money(v, forceDec){\n    const c=cur(), dec = forceDec!=null ? forceDec : (Math.abs(v)>=1000 ? 0 : (Math.abs(v-Math.round(v))<0.005 ? 0 : 2));\n    const key=c+dec;\n    nf[key]=nf[key]||new Intl.NumberFormat('fr-FR',{style:'currency',currency:c,currencyDisplay:'narrowSymbol',minimumFractionDigits:dec,maximumFractionDigits:dec});\n    return nf[key].format(v);\n  }\n  const pct = v => (Math.round(v*1000)\/10).toString().replace('.',',')+'\u202f%';\n  const coef = v => '\u00d7\u202f'+(Math.round(v*10)\/10).toString().replace('.',',');\n  const plain = s => s.replace('\u2011','-');\n\n  \/\/ arrondi au palier psychologique le plus proche (au-dessus ou en dessous), \u00e9cart plafonn\u00e9 \u00e0 5 %\n  function psych(x){\n    const c=cur(), eur=(c==='EUR'||c==='GBP'||c==='USD'), r=posOf().round;\n    let cand;\n    if (r==='lux'){ const step = eur ? (x<100?5:10) : (x<500?10:50); cand=[Math.floor(x\/step)*step, Math.ceil(x\/step)*step]; }\n    else if (eur && x<100){ const e = r==='low'?0.99:0.9, up=Math.ceil(x-e)+e; cand=[up-1, up]; }\n    else { const up=Math.ceil((x+1)\/10)*10-1; cand=[up-10, up]; }\n    cand=cand.filter(v=>v>0);\n    let best=cand.reduce((a,b)=>Math.abs(b-x)<Math.abs(a-x)?b:a, cand[cand.length-1]);\n    if (!cand.length || Math.abs(best-x)\/x>0.05) best = x<20 ? Math.round(x*10)\/10 : Math.round(x);\n    return best;\n  }\n\n  \/* ---------- hypoth\u00e8ses par canal ---------- *\/\n  \/\/ Livraison par d\u00e9faut : tarif public du pays (colis \u00e0 domicile pour le site en ligne, Amazon pour la marketplace)\n  const SHIP = {\"fr\": {\"p\": [4.85, 7.85, 4.85, \"Kosten pro Bestellung in Frankreich: Kommissionierung 1,80 \u20ac und Versand 4,50 \u20ac (Masson International, 2025), bis zu 10,20 \u20ac ab einem Lager in den Niederlanden (Euroship, 2026). Umgerechnet auf die Einheit bei 1,3 Produkten pro Bestellung (Euroship). Studien von Logistikdienstleistern: Richtwerte.\"], \"f\": [3.33, 5.07, 5.07, \"Amazon.fr, FBA-Versandgeb\u00fchren Juli 2026: 3,33 \u20ac (Umschlag) bis 5,07 \u20ac (kleines Paket bis 400 g).\"]}, \"be\": {\"p\": [4.77, 5.92, 5.12, \"Kosten pro Bestellung in Belgien: Kommissionierung 1,95 \u20ac und Versand 4,70 \u20ac (Masson International, 2025), 6,20 bis 7,70 \u20ac ab den Niederlanden (Euroship, 2026). Umgerechnet auf die Einheit bei 1,3 Produkten pro Bestellung (Euroship). Studien von Logistikdienstleistern: Richtwerte.\"], \"f\": [2.47, 3.67, 3.67, \"Amazon.com.be, FBA-Versandgeb\u00fchren Juli 2026: 2,47 \u20ac (Umschlag) bis 3,67 \u20ac (kleines Paket).\"]}, \"es\": {\"p\": [6.5, 9.38, 6.5, \"Kosten pro Bestellung in Spanien: Kommissionierung 2,20 \u20ac (Euroship, 2026) und Versand mit Correos 6,25 \u20ac netto, bis zu 12,20 \u20ac ab den Niederlanden. Umgerechnet auf die Einheit bei 1,3 Produkten pro Bestellung (Euroship). Studien von Logistikdienstleistern: Richtwerte.\"], \"f\": [3.26, 3.74, 3.74, \"Amazon.es, FBA-Versandgeb\u00fchren Juli 2026: 3,26 \u20ac (Umschlag) bis 3,74 \u20ac (kleines Paket).\"]}, \"de\": {\"p\": [5.15, 7.08, 6.12, \"Kosten pro Bestellung in Deutschland: Kommissionierung 2,20 \u20ac und Versand 4,50 bis 7,00 \u20ac (Euroship, 2026). Umgerechnet auf die Einheit bei 1,3 Produkten pro Bestellung (Euroship). Studien von Logistikdienstleistern: Richtwerte.\"], \"f\": [2.57, 3.39, 3.39, \"Amazon.de, FBA-Versandgeb\u00fchren Juli 2026: 2,57 \u20ac (Umschlag) bis 3,39 \u20ac (kleines Paket).\"]}, \"uk\": {\"p\": [3.96, 4.5, 4.23, \"Kosten pro Bestellung im Vereinigten K\u00f6nigreich: Kommissionierung 1,50 bis 2,20 \u00a3 (UK Pre Fulfilment, 2025) und Paket mit Sendungsverfolgung von Royal Mail 3,65 \u00a3. Umgerechnet auf die Einheit bei 1,3 Produkten pro Bestellung (Euroship). Studien von Logistikdienstleistern: Richtwerte.\"], \"f\": [2.1, 3.0, 3.0, \"Amazon.co.uk, FBA-Versandgeb\u00fchren Juli 2026: 2,10 \u00a3 (Umschlag) bis 3,00 \u00a3 (kleines Paket).\"]}, \"ae\": {\"p\": [9.2, 9.5, 9.2, \"Sch\u00e4tzung: In den Vereinigten Arabischen Emiraten gibt es keine \u00f6ffentliche Studie. Wir \u00fcbernehmen die Versandgeb\u00fchren von Amazon.ae (Kommissionierung und Lieferung inbegriffen), 9,2 bis 9,5 AED netto pro Produkt (August 2025).\"], \"f\": [9.2, 9.5, 9.2, \"Amazon.ae, FBA-Versandgeb\u00fchren August 2025: 9,2 bis 9,5 AED netto.\"]}, \"sa\": {\"p\": [9.2, 9.5, 9.2, \"Sch\u00e4tzung: In Saudi-Arabien gibt es keine \u00f6ffentliche Studie. Wir \u00fcbernehmen die Versandgeb\u00fchren von Amazon.sa (Kommissionierung und Lieferung inbegriffen), 9,2 bis 9,5 SAR netto pro Produkt (August 2025).\"], \"f\": [9.2, 9.5, 9.2, \"Amazon.sa, FBA-Versandgeb\u00fchren August 2025: 9,2 bis 9,5 SAR netto.\"]}, \"us\": {\"p\": [8.15, 9.42, 8.15, \"Kosten pro Bestellung in den USA: Kommissionierung 3,25 $ (Red Stag Fulfillment, 2026) und Versand mit USPS 7,34 $, bis zu 12,25 $ mit einem Bodenspediteur (8 bis 9 $). Umgerechnet auf die Einheit bei 1,3 Produkten pro Bestellung (Euroship). Studien von Logistikdienstleistern: Richtwerte.\"], \"f\": [3.54, 4.2, 3.95, \"Amazon.com, FBA-Versandgeb\u00fchren 2026: 3,54 bis 4,20 $ je nach Gewicht (au\u00dferhalb der Weihnachtssaison).\"]}, \"ma\": {\"p\": [30.77, 30.77, 30.77, \"Bei Carmel Cosmetics Labs in Marokko ermittelte Kosten: 40 MAD pro Sendung, Kommissionierung und Versand inbegriffen, also 30,77 MAD pro Einheit bei 1,3 Produkten pro Bestellung.\"]}};\n  function shipRef(k){ const s=SHIP[state.market]; if(!s) return null; return k==='dtc'?s.p : k==='mkp'?s.f : null; }\n  function defaultL2(k){ const ref=shipRef(k), rate=MARKETS[state.market].rate, dec=rate>3?1:2; return ref ? ref[2] : Math.round(CH[k].L2*rate*10**dec)\/10**dec; }\n  function initChannel(k){\n    const c=CH[k], x=posOf(), rate=MARKETS[state.market].rate;\n    cv[k]=fitMkt({r:c.r,d:c.d,f:c.f,m:Math.max(0,x.m+c.am),p:Math.max(0,x.p+c.ap),L2:defaultL2(k)});\n  }\n  function applyMix(){ const x=posOf(); Object.keys(cv).forEach(k=>{ if(cv[k].mTouched) return; const c=CH[k]; cv[k].m=Math.max(0,x.m+c.am); cv[k].p=Math.max(0,x.p+c.ap); fitMkt(cv[k]); }); }\n  \/\/ Hypoth\u00e8ses lisibles : group\u00e9es par destinataire de l'argent, m\u00eames couleurs que le graphique\n  const getV=(k,id)=> id==='L1'?state.L1 : id==='vat'?state.vat : cv[k][id];\n  const setV=(k,id,v)=>{ if(isFinite(v)&&v<0) v=0; if(id==='L1'){ state.L1=v; state.L1e=v\/MARKETS[state.market].rate; } else if(id==='vat') state.vat=v; else { cv[k][id]=v; if(id==='m'||id==='p') cv[k].mTouched=true; } };\n  \/* Rep\u00e8res par combinaison positionnement x canal. [min, max, source]. Rempli \u00e0 partir de la recherche documentaire. *\/\n  const BMK = {\"r\": {\"pha\": [25, 35, \"Durchschnittliche Handelsspanne franz\u00f6sischer Apotheken: 27,6 % im Jahr 2022, \u00fcber alle Produkte, einschlie\u00dflich Arzneimittel (Insee). Parapharmazie mit freien Preisen liegt in der Regel dar\u00fcber.\"], \"sel\": [39, 60, \"Frankreich: rund 39 % (Wettbewerbsbeh\u00f6rde, Daten 1999 bis 2005). USA: 50 bis 60 % (Beauty Independent, 2020).\"], \"gms\": [24, 39, \"Es gibt keine \u00f6ffentliche Zahl speziell f\u00fcr Beauty im Lebensmittel- und Drogeriehandel. Richtwerte: Bruttomarge von Walmart, alle Kategorien, 24 %; von Ulta Beauty, Fachkette, 39 %.\"], \"disc\": [19, 41, \"Bruttomarge 2025 von BIM: 19 %; von Action: 41 %.\"], \"spa\": [45, 50, \"\u201eKeystone\u201c-Regel: Weiterverkauf zum doppelten Einkaufspreis (American Spa).\"]}, \"f\": {\"mkp\": [8, 15, \"Verk\u00e4ufertarif von Amazon, Kategorie Beauty: 8 % bis 10 \u20ac, dar\u00fcber 15 %, berechnet auf den vom K\u00e4ufer gezahlten Preis (inklusive MwSt.).\"], \"dtc\": [1.5, 3.2, \"Stripe: 1,5 % pro Standardkarte aus Europa, bis zu 3,15 % bei einer internationalen Karte. Die festen 0,25 \u20ac pro Bestellung kommen zur Logistik hinzu.\"]}, \"m\": {\"pos\": {\"mass\": [12, 24], \"hdg\": [22, 32], \"lux\": [25, 30]}, \"src\": {\"mass\": \"Ausgaben f\u00fcr Werbung und Verkaufsf\u00f6rderung als Anteil am Umsatz: P&G 12 %, Unilever 16 %, e.l.f. Beauty 24 %.\", \"hdg\": \"Ausgaben f\u00fcr Werbung und Verkaufsf\u00f6rderung als Anteil am Umsatz: Beiersdorf 22 %, Est\u00e9e Lauder 25 % (inklusive Produktentwicklung), Coty 27 %, L\u2019Or\u00e9al 32 %.\", \"lux\": \"Ausgaben f\u00fcr Werbung und Verkaufsf\u00f6rderung als Anteil am Umsatz: Est\u00e9e Lauder 25 % (inklusive Produktentwicklung), Coty Prestige 28 %, Shiseido 29 %.\"}}};\n  function noneText(k,id){\n    if (id==='L2'){\n      if (k==='dtc'&&state.market==='ma') return 'Sch\u00e4tzung: F\u00fcr Marokko gibt es keine verifizierte \u00f6ffentliche Studie oder Preisliste (Amana ver\u00f6ffentlicht keine E-Commerce-Tarife). Ersetzen Sie sie durch das Angebot Ihres Transportunternehmens.';\n      if (k==='mkp') return 'Sch\u00e4tzung: F\u00fcr dieses Land gibt es keine \u00f6ffentliche Preisliste der Plattform. Ersetzen Sie sie durch deren Angebot.';\n      return 'Sch\u00e4tzung: F\u00fcr die Lieferung an den Handel gibt es keinen \u00f6ffentlichen Tarif. Ersetzen Sie sie durch das Angebot Ihres Transportunternehmens.';\n    }\n    return NONE[id]||'Kein \u00f6ffentlicher Richtwert.';\n  }\n  const NONE = {r:'Kein verl\u00e4sslicher \u00f6ffentlicher Richtwert f\u00fcr diesen Kanal.',d:'Kein verl\u00e4sslicher \u00f6ffentlicher Richtwert f\u00fcr Kosmetikdistributoren.',f:'Kein verifizierter \u00f6ffentlicher Richtwert f\u00fcr diesen Kanal.',m:'Kein \u00f6ffentlicher Richtwert: Marken im Einstiegspreissegment investieren wenig in Werbung.',L1:'Kein Richtwert: h\u00e4ngt von Ihrem Transportunternehmen und vom Herkunftsland ab.',L2:'Kein Richtwert: h\u00e4ngt von Ihrer Logistikorganisation ab.'};\n  function bench(k,id){\n    const x=posOf();\n    if (id==='L2'){ const ref=shipRef(k); return ref ? {lo:ref[0],hi:ref[1],src:ref[3],money:true} : null; }\n    if (id==='vat') return {lo:MARKETS[state.market].vat,hi:MARKETS[state.market].vat,src:'Gesetzlicher Satz im Verkaufsland.'};\n    if (id==='p') return BMK.m.pos[x.k] ? {ref:true} : null;\n    if (id==='m'){ const r=BMK.m.pos[x.k]; return r ? {lo:r[0],hi:r[1],src:BMK.m.src[x.k],total:true} : null; }\n    const v=BMK[id]&&BMK[id][k]; return v ? {lo:v[0],hi:v[1],src:v[2]} : null;\n  }\n  \/\/ garde le budget marketing par d\u00e9faut (publicit\u00e9 + promotion) dans le rep\u00e8re du positionnement\n  function fitMkt(o){ const r=BMK.m.pos[posOf().k]; if(!r) return o; const t=o.m+o.p; if(t<r[0]) o.m+=r[0]-t; if(t>r[1]) o.m=Math.max(0,o.m-(t-r[1])); return o; }\n  const benchLabel = k => `${plain(posOf().name)}, ${CH[k].short}`;\n  function hypDefs(k){\n    const c=CH[k], cu=MARKETS[state.market].cur, rate=MARKETS[state.market].rate;\n    const fHelp={dtc:'Online-Zahlungsgeb\u00fchren und Abo-Kosten Ihres Shops.',mkp:'Provision, die die Plattform auf jeden Verkauf erhebt.',gms:'Jahresendrabatte und Werbekostenzusch\u00fcsse, die die Handelskette verlangt.',disc:'Rabatte, die der Discounter verlangt.'}[k]||'Rabatte oder Provisionen, die der Kanal verlangt.';\n    const mMax=Math.max(Math.ceil(20*rate), Math.ceil((state.L1||0)*2), Math.ceil((cv[k].L2||0)*2));\n    return [\n      {g:'Vertrieb',sw:'var(--c-canal)',rows:[\n        {id:'r',lab:'H\u00e4ndlermarge',help:'Das beh\u00e4lt der Wiederverk\u00e4ufer von seinem Verkaufspreis (netto).',unit:'%',max:70,show:c.r>0},\n        {id:'d',lab:'Distributormarge',help:'Das beh\u00e4lt der Importeur oder Gro\u00dfh\u00e4ndler, noch vor dem Gesch\u00e4ft.',unit:'%',max:50,show:c.d>0},\n        {id:'f',lab:'Provisionen und Rabatte',help:fHelp,unit:'%',max:30,show:c.f>0}]},\n      {g:'Marketing',sw:'var(--c-mkt)',rows:[\n        {id:'m',lab:'Werbung und Influencer',help:'Online-Werbung, Influencer, Inhalte, als Anteil an Ihrem Rechnungsbetrag.',unit:'%',max:40,show:true},\n        {id:'p',lab:'Verkaufsf\u00f6rderung',help:'Aktionen, Tester, Muster, POS-Material.',unit:'%',max:30,show:true}]},\n      {g:'Logistik',sw:'var(--c-fab)',rows:[\n        {id:'L1',lab:'Transport und Zoll',help:'Vom Werk bis zu Ihrem Lager. Gleicher Betrag f\u00fcr alle Ihre Kan\u00e4le.',unit:cu,max:mMax,show:true},\n        {id:'L2',lab:'Lieferung',help:k==='dtc'?'Kommissionierung der Bestellung und Lieferung an den Kunden, umgerechnet auf ein Produkt.':k==='mkp'?'Versandkosten der Plattform, pro Produkt.':'Lieferung Ihrer Kartons an das Gesch\u00e4ft, umgerechnet auf die Einheit.',unit:cu,max:mMax,show:true}]},\n      {g:'Steuern',sw:'var(--c-tva)',rows:[\n        {id:'vat',lab:'MwSt.',help:MARKETS[state.market].help+' Gleicher Satz f\u00fcr alle Ihre Kan\u00e4le.',unit:'%',max:25,show:true}]}\n    ];\n  }\n  \/\/ Une ligne compacte par poste (nom, valeur, rep\u00e8re, montant) ; un clic ouvre le r\u00e9glage\n  function buildHyp(){\n    const k=state.edit, multi=state.channels.length>1, rate=MARKETS[state.market].rate;\n    $('px-edit').hidden=!multi;\n    $('px-edit').innerHTML=sel().map(c=>`<button type=\"button\" role=\"tab\" aria-selected=\"${c.k===k}\" data-k=\"${c.k}\">${c.short}<\/button>`).join('');\n    $('px-ch-note').hidden=true;\n    $('px-bm-for').textContent=`Richtwerte f\u00fcr: ${plain(posOf().name)}, ${CH[k].name}`;\n    let hiddenN=0;\n    $('px-hyp').innerHTML=hypDefs(k).map(G=>{\n      const rows=G.rows.filter(r=>{ const on=r.show||state.showAll||getV(k,r.id)>0; if(!on) hiddenN++; return on; });\n      if (!rows.length) return '';\n      return `<section class=\"px-hg\" style=\"--sw:${G.sw}\"><header><h4>${G.g}<\/h4><span class=\"px-hg-t\" data-gt=\"${G.g}\"><\/span><\/header>${rows.map(r=>{\n        const v=getV(k,r.id), isM=r.unit!=='%', step=isM?(rate>3?0.5:0.05):0.5, dec=isM?(rate>3?1:2):1;\n        const bm0=bench(k,r.id), bm=bm0&&!bm0.total&&!bm0.ref?bm0:null, P=x=>Math.min(100,Math.max(0,x\/r.max*100));\n        const track = bm ? `--track:linear-gradient(90deg,var(--mint-2) 0%,var(--mint-2) ${P(bm.lo)}%,var(--z-ok) ${P(bm.lo)}%,var(--z-ok) ${Math.max(P(bm.hi),P(bm.lo)+1.5)}%,var(--mint-2) ${Math.max(P(bm.hi),P(bm.lo)+1.5)}%,var(--mint-2) 100%)` : '';\n        const open = state.open===r.id;\n        return `<div class=\"px-r${open?' is-open':''}\" data-row=\"${r.id}\">\n          <button type=\"button\" class=\"px-r-head\" aria-expanded=\"${open}\" aria-controls=\"hb-${r.id}\">\n            <span class=\"px-r-name\">${r.lab}<\/span>\n            <span class=\"px-r-val\" data-v=\"${r.id}\" data-unit=\"${isM?'m':'%'}\" data-dec=\"${dec}\"><\/span>\n            <span class=\"px-r-pill\" data-pill=\"${r.id}\"><\/span>\n            <span class=\"px-r-amt\" data-a=\"${r.id}\"><\/span>\n            <svg class=\"ico px-r-chev\"><use href=\"#i-down\"\/><\/svg>\n          <\/button>\n          <div class=\"px-r-body\" id=\"hb-${r.id}\"${open?'':' inert'}><div class=\"px-r-inner\"><div class=\"px-r-pad\">\n            <p class=\"px-r-help\">${r.help}<\/p>\n            <div class=\"px-h-c\"><input type=\"range\" class=\"px-hr\" id=\"h-${r.id}\" data-id=\"${r.id}\" min=\"0\" max=\"${r.max}\" step=\"${step}\" value=\"${v}\" style=\"${track}\" aria-label=\"${r.lab}\">\n            <span class=\"px-h-v\"><input type=\"text\" inputmode=\"decimal\" data-id=\"${r.id}\" data-dec=\"${dec}\" aria-label=\"${r.lab}, valeur\" value=\"${fmt(v,dec)}\"><i>${isM?r.unit:'%'}<\/i><\/span><\/div>\n            <p class=\"px-r-src\" data-src=\"${r.id}\"><\/p>\n          <\/div><\/div><\/div>\n        <\/div>`; }).join('')}<\/section>`;\n    }).join('');\n    const sa=$('px-showall'); sa.hidden = hiddenN===0 && !state.showAll;\n    sa.textContent = state.showAll ? 'Nicht relevante Posten ausblenden' : `Weitere Posten anzeigen (${hiddenN})`;\n  }\n  function toggleRow(id){\n    state.open = state.open===id ? null : id;\n    document.querySelectorAll('#px-hyp .px-r').forEach(r=>{\n      const on=r.dataset.row===state.open; r.classList.toggle('is-open',on);\n      r.querySelector('.px-r-head').setAttribute('aria-expanded',String(on));\n      const body=r.querySelector('.px-r-body'); if(on) body.removeAttribute('inert'); else body.setAttribute('inert','');\n    });\n  }\n  function updateHyp(o){\n    const k=state.edit, c=CH[k], v=cv[k];\n    const parts=[];\n    if (c.r>0||v.r>0) parts.push(`Gesch\u00e4ft ${fmt(v.r,1)}\u202f%`);\n    if (c.d>0||v.d>0) parts.push(`Distributor ${fmt(v.d,1)}\u202f%`);\n    if (c.f>0||v.f>0) parts.push(`Provisionen ${fmt(v.f,1)}\u202f%`);\n    parts.push(`Marketing ${fmt(v.m+v.p,1)}\u202f%`, isFinite(state.vat)?`MwSt. ${fmt(state.vat,1)}\u202f%`:'MwSt. angeben');\n    $('px-adv-sum').textContent = state.channels.length>1 ? `${state.channels.length} Kan\u00e4le, einzeln anpassbar. ${c.short}: ${parts.join(', ')}.` : `${c.name}: ${parts.join(', ')}.`;\n    const row = o && !o.err ? o.rows.find(r=>r.k===k) : null;\n    const amt = row ? {r:row.HT-row.W, d:row.W-row.R, f:row.f*row.R, m:row.m*row.R, p:row.pr*row.R, L1:state.L1, L2:row.L-state.L1, vat:row.P-row.HT} : {};\n    document.querySelectorAll('#px-hyp [data-a]').forEach(el=>{ const id=el.dataset.a, a=amt[id]; el.textContent = (id==='L1'||id==='L2') ? '' : a!=null&&isFinite(a) ? money(a,2) : ''; });\n    document.querySelectorAll('#px-hyp [data-v]').forEach(el=>{ const val=getV(k,el.dataset.v); el.textContent = !isFinite(val) ? '?' : el.dataset.unit==='m' ? money(val,Number(el.dataset.dec)) : `${fmt(val,1)}\u202f%`; });\n    let off=0;\n    document.querySelectorAll('#px-hyp [data-pill]').forEach(el=>{\n      const id=el.dataset.pill, bm=bench(k,id), src=document.querySelector(`#px-hyp [data-src=\"${id}\"]`);\n      if (bm && bm.ref){ el.dataset.s='na'; el.textContent='Mit der Werbung'; src.innerHTML='Gemeinsam mit der Werbung im Marketing-Richtwert erfasst.'; return; }\n      if (!bm){ el.dataset.s='na'; el.textContent='Ohne Richtwert'; src.innerHTML=noneText(k,id); return; }\n      const val = bm.total ? getV(k,'m')+getV(k,'p') : getV(k,id);\n      const range = bm.money ? (bm.lo===bm.hi ? money(bm.lo,2) : `${money(bm.lo,2)} bis ${money(bm.hi,2)}`) : bm.lo===bm.hi ? `${fmt(bm.lo,1)}\u202f%` : `${fmt(bm.lo,1)}-${fmt(bm.hi,1)}\u202f%`;\n      const inside = val>=bm.lo-1e-6 && val<=bm.hi+1e-6; if(!inside) off++;\n      el.dataset.s = inside ? 'in' : 'out';\n      el.innerHTML = `${icon(inside?'check':'alert')}${id==='vat'?'Gesetzlicher Satz':bm.total?`Marketing ${range}`:bm.money?'Richtwert':`Richtwert ${range}`}`;\n      const lbl = bm.total ? `Richtwert Marketing gesamt (Werbung + Verkaufsf\u00f6rderung), ${plain(posOf().name)}: ${range}` : id==='vat' ? `Gesetzlicher Satz: ${range}` : bm.money ? `Richtwert ${MARKETS[state.market].name}, ${CH[k].short}: ${range} pro Produkt` : `Richtwert ${benchLabel(k)}: ${range}`;\n      src.innerHTML = `<b>${lbl}<\/b>${inside?'':` \u00b7 Sie liegen bei ${bm.money?money(val,2):fmt(val,1)+'\u202f%'}`}<br>${bm.src}`;\n    });\n    $('px-adv-sum').textContent += off ? ` ${off} Wert${off>1?'e':''} au\u00dferhalb der Richtwerte.` : ' Alle erfassten Werte liegen innerhalb der Richtwerte.';\n    const tot={'Vertrieb':['r','d','f'],'Marketing':['m','p'],'Logistik':['L1','L2'],'Steuern':['vat']};\n    document.querySelectorAll('#px-hyp [data-gt]').forEach(el=>{ const s=tot[el.dataset.gt].reduce((x,id)=>x+(amt[id]||0),0); el.innerHTML = row ? `<b>${money(s,2)}<\/b> von ${money(row.P)}` : ''; });\n  }\n  \/\/ Zone d'usage de la marge : la marge obtenue quand le prix public reste dans la fourchette\n  \/\/ de coefficients du positionnement (rep\u00e8res sourc\u00e9s), avec les marges du canal le plus exigeant\n  function marginZone(o){\n    const b=o.rows[o.bind], x=posOf();\n    const gAt = K => { const A = o.mode==='sell' ? o.A : o.HT\/K, HT = o.mode==='sell' ? K*A : o.HT, R=HT*(1-b.r)*(1-b.d); return 1-b.f-b.mp-(A+b.L)\/R; };\n    return [gAt(x.lo)*100, gAt(x.hi)*100];\n  }\n  function snapMargin(){\n    if (state.gTouched) return;   \/\/ la marge choisie par l'utilisateur n'est jamais \u00e9cras\u00e9e\n    const o=compute(); let v=posOf().g;\n    if (!o.err){ const [lo,hi]=marginZone(o); if (hi>lo && hi>0){ if (v<lo) v=Math.ceil(lo); if (v>hi) v=Math.floor(hi); } }\n    setMargin(Math.min(70,Math.max(0,v)));\n  }\n  function renderZone(o){\n    const el=$('px-g-range'), out=$('px-g-out'), msg=$('px-zone-msg'), MIN=0, MAX=70;\n    const P = v => Math.min(100,Math.max(0,(v-MIN)\/(MAX-MIN)*100));\n    if (!o || o.err){ el.style.removeProperty('--track'); msg.hidden=true; $('px-zone-mid').textContent='\u00dcblicher Bereich'; out.removeAttribute('data-z'); return; }\n    const [lo,hi]=marginZone(o), x=posOf(), nm=plain(x.name), real=o.rows[o.bind].gReal*100, g=real;\n    const gap = Math.abs(real-state.g*100)>0.5 ? ` Mit ${o.mode==='sell'?'dem gerundeten Preis':'diesem Angebot'} betr\u00e4gt Ihre tats\u00e4chliche Gewinnmarge ${fmt(real,1)}\u202f%.` : '';\n    const where = o.multi ? `, im anspruchsvollsten Kanal (${o.rows[o.bind].name})` : `, Kanal ${o.rows[0].name}`;\n    msg.hidden=false;\n    if (!(hi>MIN && hi>lo)){\n      el.style.setProperty('--track','linear-gradient(90deg,var(--z-low),var(--z-high))');\n      $('px-zone-mid').textContent='\u00dcblicher Bereich';\n      out.dataset.z='low'; msg.dataset.z='low';\n      msg.innerHTML=`${icon('alert')}<span>Mit diesen Kosten ist keine Gewinnmarge m\u00f6glich, die die \u00fcblichen Preise im Segment ${nm} erreicht. Pr\u00fcfen Sie Einkaufspreis, Kanal oder Positionierung noch einmal.<\/span>`;\n      return;\n    }\n    const zl=P(lo), zh=P(hi);\n    el.style.setProperty('--track',`linear-gradient(90deg,var(--z-low) 0%,var(--z-low) ${Math.max(0,zl-10)}%,var(--z-ok) ${zl}%,var(--z-ok) ${zh}%,var(--z-high) ${Math.min(100,zh+10)}%,var(--z-high) 100%)`);\n    const mid=$('px-zone-mid');\n    mid.textContent = lo<MIN ? `\u00dcblicher Bereich: bis ${Math.min(MAX,Math.round(hi))}\u202f%` : `\u00dcblicher Bereich: ${Math.round(lo)} bis ${Math.min(MAX,Math.round(hi))}\u202f%`;\n    const z = g<lo-0.5 ? 'low' : g>hi+0.5 ? 'high' : 'ok';\n    out.dataset.z=z; msg.dataset.z=z;\n    const sellM = o.mode==='sell';\n    msg.innerHTML = z==='ok'\n      ? `${icon('check')}<span>Im \u00fcblichen Bereich f\u00fcr ${nm}${where}.${gap}<\/span>`\n      : z==='low'\n      ? `${icon('alert')}<span>Knappe Gewinnmarge: Sie deckt wom\u00f6glich Ihre Fixkosten nicht.${gap}<\/span>`\n      : `${icon('alert')}<span>Au\u00dferhalb der Richtwerte: ${sellM?'Preis \u00fcber vergleichbaren Marken, durch Ihre Marke zu rechtfertigen.':'Produkt deutlich g\u00fcnstiger als bei vergleichbaren Marken: Pr\u00fcfen Sie die Qualit\u00e4t.'}${gap}<\/span>`;\n  }\n  function setMargin(v){ $('px-g-range').value=v; $('px-g-out').textContent=v+'\u202f%'; }\n  function applyMarket(k){\n    const nu=MARKETS[k], dec=nu.rate>3?1:2;\n    state.market=k;\n    \/\/ on repart toujours des valeurs saisies (stock\u00e9es en euros) : pas de d\u00e9rive apr\u00e8s plusieurs changements de pays\n    [['px-A','A',dec],['px-P','P',nu.rate>3?0:2],['px-quote','quote',dec]].forEach(([id,key,dd])=>{ const b=state.base[key]; if(b!=null&&isFinite(b)) setNum(id,b*nu.rate,dd); });\n    state.L1=Math.round(state.L1e*nu.rate*10**dec)\/10**dec;\n    state.vat=nu.vat;\n    Object.keys(cv).forEach(ck=>{ cv[ck].L2=defaultL2(ck); });\n    document.querySelectorAll('[data-cur]').forEach(e=>e.textContent=nu.cur);\n    $('px-P-lab').textContent = nu.vat>0 ? 'Angestrebter Endkundenpreis (brutto)' : 'Angestrebter Endkundenpreis (ohne Sales Tax)';\n  }\n\n  \/* ---------- calcul ---------- *\/\n  function chParams(k,L1,t,P){\n    const v=cv[k], r=v.r\/100, d=v.d\/100, cu=cur();\n    let fr=v.f\/100;\n    if (k==='mkp' && P!=null && (cu==='EUR'||cu==='GBP'||cu==='USD') && P<=10) fr=Math.min(fr,0.08);   \/\/ Amazon beaut\u00e9 : 8 % jusqu'\u00e0 10\n    \/\/ la commission Amazon porte sur le prix pay\u00e9 par l'acheteur (TTC) : on la ram\u00e8ne au prix HT de la marque\n    const f = k==='mkp' ? fr*(1+(t||0))\/((1-r)*(1-d)) : fr;\n    \/\/ frais fixe de paiement en ligne (Stripe : 0,25 \u20ac par commande, 1,3 produit par commande)\n    const fix = (k==='dtc' && state.market!=='ma') ? 0.25*MARKETS[state.market].rate\/1.3 : 0;\n    return {k,name:CH[k].name,short:CH[k].short,r,d,f,m:v.m\/100,pr:v.p\/100,mp:(v.m+v.p)\/100,L:L1+(v.L2||0)+fix,online:k==='dtc'||k==='mkp'};\n  }\n  function at(c,P,A,t){ const HT=P\/(1+t), W=HT*(1-c.r), R=W*(1-c.d), gross=R*(1-c.f)-A-c.L, mktU=c.mp*R, net=gross-mktU; return Object.assign({},c,{P,HT,W,R,A,gross,mktU,net,gReal:net\/R}); }\n\n  function compute(){\n    const t=state.vat\/100, L1=state.L1||0, g=Number($('px-g-range').value)\/100;\n    if (!isFinite(t)) return {err:'Geben Sie den MwSt.-Satz an.'};\n    const check = cs => { for (const c of cs){\n      if ([c.r,c.d,c.f,c.m,c.pr,c.L].some(v=>!isFinite(v))) return `Vervollst\u00e4ndigen Sie die Annahmen f\u00fcr den Kanal ${c.name}.`;\n      if (c.r>=1||c.d>=1) return `${c.name}: Die Spanne eines Zwischenh\u00e4ndlers muss unter 100\u202f% bleiben.`;\n      if (c.f+c.mp+g>=1) return `${c.name}: Provisionen, Marketing, Verkaufsf\u00f6rderung und Zielmarge ergeben mehr als 100\u202f% vom Verkaufspreis. Senken Sie einen dieser Prozents\u00e4tze.`;\n    } return null; };\n    const keys=sel().map(c=>c.k), multi=keys.length>1, round=$('px-round').checked;\n    \/\/ le prix unique et le prix d'achat maximum se calent sur les canaux de revente quand il y en a\n    const poolOf = (cs,ok) => { const idx=cs.map((c,i)=>i).filter(ok); const retail=idx.filter(i=>!cs[i].online); return retail.length?retail:idx; };\n    if (state.mode==='sell'){\n      const A=num('px-A');\n      if (!(A>0)) return {err:'Geben Sie den Einkaufspreis aus Ihrem Angebot an.'};\n      const solve = c => (A+c.L)\/((1-c.f-c.mp-g)*(1-c.d)*(1-c.r))*(1+t);\n      const cs=keys.map(k=>{ let c=chParams(k,L1,t); const e=check([c]); if(e) return {err:e}; c.Praw=solve(c); if(k==='mkp'){ const c2=chParams(k,L1,t,c.Praw); if(c2.f!==c.f){ c2.Praw=solve(c2); c=c2; } } c.Pr=round?psych(c.Praw):c.Praw; return c; });\n      const bad=cs.find(c=>c.err); if (bad) return {err:bad.err};\n      const pool=poolOf(cs,()=>true); let bind=pool[0]; pool.forEach(i=>{ if(cs[i].Praw>cs[bind].Praw) bind=i; });\n      const Praw=cs[bind].Praw, Puni=round?psych(Praw):Praw, per=multi && state.strategy==='per';\n      const rows=cs.map(c=>{ const Pu = per||!multi ? c.Pr : Puni; const cc = c.k==='mkp' ? chParams(c.k,L1,t,Pu) : c; return Object.assign(at(cc,Pu,A,t),{Praw:c.Praw,Pr:c.Pr}); });\n      const Pm=per?rows[bind].P:Puni;\n      return {mode:'sell',t,g,A,multi,per,rows,bind,P:Pm,Praw,HT:Pm\/(1+t)};\n    }\n    const P=num('px-P');\n    if (!(P>0)) return {err:'Geben Sie den angestrebten Endkundenpreis an.'};\n    const cs=keys.map(k=>chParams(k,L1,t,P)); const e=check(cs); if (e) return {err:e};\n    const lims=cs.map(c=>{ const R=P\/(1+t)*(1-c.r)*(1-c.d); return {Amax:R*(1-c.f-c.mp-g)-c.L, Aceil:R*(1-c.f-c.mp-Math.max(g-0.1,0))-c.L}; });\n    const pool=poolOf(cs,i=>lims[i].Amax>0);\n    if (!pool.length) return {err:`Bei diesem Preis verschlingen Vertrieb und Ihre Kosten alles${multi?' in allen Ihren Kan\u00e4len':''}. Erh\u00f6hen Sie den Zielpreis oder senken Sie die Zielmarge.`};\n    let bind=pool[0]; pool.forEach(i=>{ if(lims[i].Amax<lims[bind].Amax) bind=i; });\n    const quote=num('px-quote'), A = quote>0 ? quote : lims[bind].Amax;\n    const rows=cs.map((c,i)=>Object.assign(at(c,P,A,t),lims[i],{Aopen:lims[i].Amax*0.85,impossible:lims[i].Amax<=0}));\n    const b=rows[bind];\n    return {mode:'buy',t,g,A,multi,rows,bind,P,HT:P\/(1+t),quote,Amax:b.Amax,Aceil:b.Aceil,Aopen:b.Amax*0.85,gFloor:Math.max(g-0.1,0),impossible:rows.filter(r=>r.impossible).map(r=>r.name)};\n  }\n\n  const icon = n => `<svg class=\"ico\"><use href=\"#i-${n}\"\/><\/svg>`;\n  function setStatus(el,tone,html){ el.dataset.tone=tone; el.innerHTML=icon(tone==='good'?'check':tone==='bad'?'x':'alert')+`<span>${html}<\/span>`; el.hidden=false; }\n\n  \/* ---------- parcours ---------- *\/\n  const reduced = () => matchMedia('(prefers-reduced-motion: reduce)').matches;\n  function stepValid(n){\n    if (n===4){ const ok=state.channels.length>0; $('px-step4-msg').hidden=ok; return ok; }\n    if (n!==2) return true;\n    const okP = state.mode==='sell' ? num('px-A')>0 : num('px-P')>0;\n    $(state.mode==='sell'?'px-A-box':'px-P-box').classList.toggle('bad',!okP);\n    const msg=$('px-step2-msg');\n    msg.hidden = okP;\n    msg.textContent = state.mode==='sell'?'Geben Sie den St\u00fcckpreis aus Ihrem Angebot an.':'Geben Sie den angestrebten Endkundenpreis an.';\n    return okP;\n  }\n  function go(n){\n    if (n===state.step) return;\n    if (n>state.step) for (let i=state.step;i<n;i++) if(!stepValid(i)) { n=i; break; }\n    if (n===state.step) return;\n    const dir = n>state.step ? 'in-r' : 'in-l';\n    state.step=n; state.reached=Math.max(state.reached,n);\n    document.querySelectorAll('.px-step').forEach(s=>{\n      const on = Number(s.dataset.step)===n; s.hidden=!on; s.classList.remove('in-r','in-l');\n      if (on){ void s.offsetWidth; s.classList.add(dir); }\n    });\n    renderNav();\n    if (!state.revealed){ if (n===5) reveal(); else renderWait(); }\n    const h=document.querySelector(`.px-step[data-step=\"${n}\"] h2:not([hidden])`);\n    if (h) h.focus({preventScroll:true});\n    const flow=document.querySelector('.px-flow');\n    if (flow.getBoundingClientRect().top<0) flow.scrollIntoView({behavior:reduced()?'auto':'smooth',block:'start'});\n  }\n  function renderCount(){ const n=state.channels.length; $('px-chcount').textContent = `${n} ${n>1?'Kan\u00e4le':'Kanal'} ausgew\u00e4hlt`; }\n  function renderNav(){\n    [...$('px-prog').children].forEach(b=>{ const i=Number(b.dataset.step);\n      b.classList.toggle('cur',i===state.step); b.classList.toggle('done',i<state.step);\n      b.disabled = i>state.reached; if(i===state.step) b.setAttribute('aria-current','step'); else b.removeAttribute('aria-current'); });\n    $('px-back').disabled = state.step===1;\n    $('px-count').textContent=`Schritt ${state.step} von 5`;\n    $('px-next').firstChild.textContent = state.step===5 ? (state.revealed?'Analyse ansehen':'Ergebnis ansehen') : 'Weiter';\n  }\n\n  \/* ---------- affichage ---------- *\/\n  function chipsFor(el,label){\n    const cs=sel();\n    el.hidden = cs.length<2;\n    el.innerHTML = cs.map(c=>`<button type=\"button\" class=\"px-pill\" data-k=\"${c.k}\" aria-pressed=\"${c.k===state.edit}\">${c.short}<\/button>`).join('');\n    el.setAttribute('aria-label',label);\n  }\n  function recap(){\n    if ($('px-recap').hidden) return;\n    const x=posOf(), cs=sel();\n    const chs = cs.length<=2 ? cs.map(c=>c.short).join(' + ') : `${cs[0].short} + ${cs.length-1} Kan\u00e4le`;\n    const items=[\n      [state.mode==='sell'?`Angebot ${isFinite(num('px-A'))?money(num('px-A'),2):'?'}`:`Zielpreis ${isFinite(num('px-P'))?money(num('px-P')):'?'}`,2],\n      [plain(x.name),3],[chs,4],[MARKETS[state.market].name,2],[`Gewinnmarge ${Math.round(state.g*100)}\u202f%`,5]];\n    $('px-recap').innerHTML=items.map(([l,s])=>`<button type=\"button\" class=\"px-tok\" data-step=\"${s}\" aria-label=\"\u00c4ndern: ${l}\">${l}<\/button>`).join('');\n  }\n\n  let last=null;\n  \/\/ carte en attente tant que les cinq \u00e9tapes ne sont pas parcourues\n  function renderWait(){\n    const x=posOf(), A=num('px-A'), P=num('px-P');\n    const vals=[\n      state.mode==='sell'?'Mein Verkaufspreis':'Mein maximaler Einkaufspreis',\n      `${state.mode==='sell'?(A>0?'Angebot '+money(A,2):''):(P>0?'Zielpreis '+money(P):'')} \u00b7 ${MARKETS[state.market].name}`,\n      plain(x.name),\n      sel().map(c=>c.short).join(' + '),\n      `${Math.round(state.g*100)} %`];\n    $('px-wait-list').innerHTML=STEPS.map((l,i)=>{ const n=i+1, done=n<state.step, cur=n===state.step;\n      return `<li class=\"${done?'done':''}${cur?' cur':''}\"><span class=\"dot\"><svg viewBox=\"0 0 24 24\"><path d=\"M5 12.5l4.5 4.5L19 7.5\"\/><\/svg><\/span><span>${l}<\/span><em>${done?vals[i]:cur?'aktuell':''}<\/em><\/li>`; }).join('');\n  }\n  const decOf = v => Math.abs(v)>=1000 ? 0 : (Math.abs(v-Math.round(v))<0.005 ? 0 : 2);\n  function bigHTML(v,dec){\n    const parts=new Intl.NumberFormat('fr-FR',{style:'currency',currency:cur(),currencyDisplay:'narrowSymbol',minimumFractionDigits:dec,maximumFractionDigits:dec}).formatToParts(v);\n    let int='',frac='',cu='';\n    parts.forEach(p=>{ if(p.type==='currency') cu=p.value; else if(p.type==='decimal'||p.type==='fraction') frac+=p.value; else if(p.type==='integer'||p.type==='group'||p.type==='minusSign') int+=p.value; });\n    return `<span class=\"int\">${int}<\/span>${frac?`<span class=\"dec\">${frac}<\/span>`:''}<span class=\"cur\">${cu}<\/span>`;\n  }\n  function countUp(el, target, dec){\n    if (reduced() || !isFinite(target)) { el.innerHTML=bigHTML(target,dec); return; }\n    const t0=performance.now(), D=900;\n    const tick=t=>{ const k=Math.min(1,(t-t0)\/D), e=1-Math.pow(1-k,3); el.innerHTML=bigHTML(k<1?target*e:target,dec); if(k<1) requestAnimationFrame(tick); };\n    requestAnimationFrame(tick);\n  }\n  function countUpOld(el, target, txt){\n    if (reduced() || !isFinite(target)) { el.textContent=txt; return; }\n    const dec = \/,\\d\/.test(txt) ? 2 : 0, t0=performance.now(), D=900;\n    const tick=t=>{ const k=Math.min(1,(t-t0)\/D), e=1-Math.pow(1-k,3); el.textContent = k<1 ? money(target*e,dec) : txt; if(k<1) requestAnimationFrame(tick); };\n    requestAnimationFrame(tick);\n  }\n  function reveal(){\n    state.revealed=true;\n    const card=$('px-answer'); card.classList.remove('is-locked'); renderNav(); $('px-actions').classList.remove('is-locked');\n    render();\n    card.classList.remove('px-reveal'); void card.offsetWidth; card.classList.add('px-reveal');\n    [...document.querySelectorAll('#px-bar .px-rseg')].forEach((s,i)=>s.style.setProperty('--d',i));\n    const big=$('px-big'); if (!big.hidden && last && !last.err) countUp(big, last.mode==='sell'?last.P:last.Amax, last.mode==='sell'?decOf(last.P):2);\n    $('px-reveal-live').textContent='Ihr Ergebnis liegt vor.';\n    try{ (window.dataLayer=window.dataLayer||[]).push({event:'calculateur_resultat', calculateur_mode:state.mode, calculateur_canaux:state.channels.length}); }catch(e){}\n    setTimeout(()=>card.classList.remove('px-reveal'),1800);\n  }\n  function render(){\n    document.querySelectorAll('[data-show]').forEach(e=>e.hidden=e.dataset.show!==state.mode);\n    state.g=Number($('px-g-range').value)\/100;\n    if (!state.channels.includes(state.edit)) state.edit=state.channels[0];\n    chipsFor($('px-bd-ch'),'Angezeigter Kanal'); if (state.mode==='sell') $('px-bd-ch').hidden=true;\n    recap();\n    const o=compute(); last=o;\n    refreshConsultation();\n    if (!state.revealed){ renderWait(); $('px-detail').hidden=true; $('px-dock').classList.add('hide'); }\n    updateHyp(o);\n    renderZone(o);\n    if (o.err){\n      $('px-err').hidden=false; $('px-err-t').textContent=o.err; $('px-ans').hidden=true; $('px-strat').hidden=true;\n      $('px-detail').hidden=true; $('px-dock-v').textContent='\u2026';\n      return;\n    }\n    $('px-err').hidden=true; $('px-ans').hidden=false; $('px-detail').hidden=!o.multi||!state.revealed;\n    const x=posOf(), sell=o.mode==='sell', b=o.rows[o.bind];\n    $('px-strat').hidden = true;   \/\/ un seul prix public, align\u00e9 sur tous les canaux\n    [...$('px-strat').children].forEach(btn=>btn.setAttribute('aria-pressed',String(btn.dataset.s===state.strategy)));\n    \/\/ carte r\u00e9sultat : uniquement le prix et la marge\n    const list=$('px-chlist'); list.hidden=true; $('px-big').hidden=false; $('px-figs').hidden=false;\n    $('px-ans-note').hidden=true; $('px-pos-line').hidden=true; $('px-figs').className='px-figs one';\n    const marginFig = (val, sub) => `<div><dt>Gewinnmarge<\/dt><dd>${val}${sub?`<small>${sub}<\/small>`:''}<\/dd><\/div>`;\n    if (sell){\n      if (o.per){\n        $('px-ans-label').textContent='Empfohlener Endkundenpreis je Kanal';\n        $('px-big').hidden=true; $('px-figs').hidden=true; list.hidden=false;\n        list.innerHTML=o.rows.map(r=>`<li><span>${r.name}<\/span><span><b>${money(r.P)}<\/b><small>Gewinnmarge ${pct(r.gReal)}<\/small><\/span><\/li>`).join('');\n        const ps=o.rows.map(r=>r.P);\n        $('px-dock-k').textContent='Empfohlene Preise'; $('px-dock-v').textContent=`${money(Math.min(...ps))} bis ${money(Math.max(...ps))}`;\n      } else {\n        $('px-ans-label').textContent= o.multi ? `Empfohlener Endkundenpreis, abgestimmt auf Ihre ${o.rows.length} Kan\u00e4le` : 'Empfohlener Endkundenpreis';\n        $('px-big').innerHTML=bigHTML(o.P,decOf(o.P));\n        if (o.multi){\n          \/\/ marge par canal au prix align\u00e9 ; chaque pastille choisit aussi le canal d\u00e9taill\u00e9 plus bas\n          $('px-figs').className='px-figs px-chm';\n          $('px-figs').innerHTML=`<dt>Gewinnmarge je Kanal<\/dt><dd>${o.rows.map(r=>`<button type=\"button\" class=\"px-chm-i${r.k===state.edit?' on':''}${r.gReal<o.g-0.005?' low':''}\" data-k=\"${r.k}\" aria-pressed=\"${r.k===state.edit}\" title=\"${r.gReal<o.g-0.005?'Unter Ihrer Zielmarge bei diesem Preis':'Zielmarge erreicht'}\"><span>${r.short}<\/span><b>${pct(r.gReal)}<\/b><\/button>`).join('')}<\/dd>`;\n        } else {\n          $('px-figs').innerHTML=marginFig(money(b.net,2),pct(b.gReal));\n        }\n        $('px-dock-k').textContent='Empfohlener Endkundenpreis'; $('px-dock-v').textContent=money(o.P);\n      }\n    } else {\n      $('px-ans-label').textContent='Maximaler Einkaufspreis';\n      $('px-big').innerHTML=bigHTML(o.Amax,2);\n      const imp = o.impossible.length ? ` \u00b7 ${o.impossible.join(', ')}: bei diesem Preis nicht m\u00f6glich` : '';\n      $('px-figs').innerHTML = o.quote>0 ? marginFig(pct(b.gReal), 'mit diesem Angebot'+imp) : marginFig(pct(o.g), (o.multi?'mindestens, in Ihren Kan\u00e4len':'')+imp);\n      $('px-nego').innerHTML=`<span>Einstieg bei <b>${money(o.Aopen,2)}<\/b><\/span><span>Obergrenze <b>${money(o.Aceil,2)}<\/b><\/span>`;\n      $('px-nego').title=`Einstieg: 15\u202f% unter dem Zielpreis. Obergrenze: Ihre Gewinnmarge sinkt auf ${pct(o.gFloor)}.`;\n      const qv=$('px-quote-v');\n      if (o.quote>0){\n        const where = o.multi ? ` (${b.name})` : '';\n        if (o.quote<=o.Amax) setStatus(qv,'good',o.multi?'Im Rahmen Ihres Ziels, in allen Ihren Kan\u00e4len.':'Im Rahmen Ihres Ziels.');\n        else if (o.quote<=o.Aceil) setStatus(qv,'warn',`Machbar: neu verhandeln${where}.`);\n        else setStatus(qv,'bad',`\u00dcber dem Budget${where}.`);\n      } else qv.hidden=true;\n      $('px-dock-k').textContent='Maximaler Einkaufspreis'; $('px-dock-v').textContent=money(o.Amax,2);\n    }\n\n    \/\/ positionnement : une ligne d'\u00e9tat et une ligne de contexte (prix en rayon, sinon marge habituelle)\n    const Aref = sell ? o.A : (o.quote>0?o.quote:o.Amax), K=o.HT\/Aref, nm=plain(x.name);\n    const nf0=new Intl.NumberFormat('fr-FR',{maximumFractionDigits:0}), nf2=new Intl.NumberFormat('fr-FR',{minimumFractionDigits:2,maximumFractionDigits:2});\n    const rng=(a,z,d2)=> `${(d2?nf2:nf0).format(a)} bis ${money(z,d2?2:0)}`;\n    const mb=shelfBand(x.k), shelf = mb ? `Im Regal ${mb.where}: ${rng(mb.lo,mb.hi)}` : '';\n    const aLo = mb ? mb.lo\/(x.hi*(1+o.t)) : 0, aHi = mb ? mb.hi\/(x.lo*(1+o.t)) : 0;\n    let tone, short, long;\n    if (sell){\n      const coef = `\u00dcbliche Spanne im Segment: ${rng(o.A*x.lo*(1+o.t),o.A*x.hi*(1+o.t))}`;\n      if (mb && o.P<mb.lo*0.9){ tone='warn'; short=`Niedriger Preis f\u00fcr ${nm}`; long=`${shelf}. Diese Marken kaufen ihr Produkt f\u00fcr ${rng(aLo,aHi)} netto ein.`; }\n      else if (mb && o.P>mb.hi*1.1){ tone='warn'; short=`\u00dcber dem Markt`; long=`${shelf}.`; }\n      else if (K<x.lo){ tone='warn'; short=`Knappe Gewinnmarge f\u00fcr ${nm}`; long=`${coef}.`; }\n      else if (K>x.hi){ tone='warn'; short=`Hoher Preis f\u00fcr ${nm}`; long=`${coef}.`; }\n      else { tone='good'; short=`Passt zu ${nm}`; long= mb ? `${shelf}.` : `${coef}.`; }\n    } else {\n      const lo=o.HT\/x.hi, hi=o.HT\/x.lo, buyTxt=`\u00dcblicher Einkauf zu diesem Preis: ${rng(lo,hi,1)} netto`;\n      if (mb && (o.P<mb.lo*0.9 || o.P>mb.hi*1.1)){ tone='warn'; short = o.P<mb.lo*0.9 ? `Zielpreis niedrig f\u00fcr ${nm}` : `Zielpreis \u00fcber dem Markt`; long=`${shelf}.`; }\n      else if (o.quote>0){\n        if (Aref>hi){ tone='warn'; short=`Angebot hoch f\u00fcr ${nm}`; long=`${buyTxt}.`; }\n        else if (Aref<lo){ tone='good'; short=`Angebot niedrig f\u00fcr ${nm}`; long=`${buyTxt}. Pr\u00fcfen Sie die Qualit\u00e4t.`; }\n        else { tone='good'; short=`Angebot passt zu ${nm}`; long=`${buyTxt}.`; }\n      }\n      else if (Aref<lo){ tone='warn'; short=`Knappes Einkaufsbudget`; long=`${buyTxt}.`; }\n      else if (Aref>hi){ tone='good'; short=`Komfortables Einkaufsbudget`; long=`${buyTxt}.`; }\n      else { tone='good'; short=`Passt zu ${nm}`; long=`${buyTxt}.`; }\n    }\n    $('px-verdict').innerHTML=`<p class=\"tag\" data-tone=\"${tone}\">${icon(tone==='good'?'check':'alert')}${short}<\/p><p>${long}<\/p>`;\n    renderScale(K,tone);\n    renderBreakdown(o.rows.find(r=>r.k===state.edit)||b, o.multi);\n    renderMulti(o);\n    clearTimeout(render.t); render.t=setTimeout(()=>{ $('px-live').textContent=`${$('px-ans-label').textContent} : ${$('px-dock-v').textContent}`; },700);\n  }\n\n  const ZONES=[{a:0,b:1.5,l:'Zu knapp'},{a:1.5,b:3,l:'Discount',k:'hd'},{a:3,b:5,l:'Massenmarkt',k:'mass'},{a:5,b:7,l:'Premium',k:'hdg'},{a:7,b:10,l:'Luxus',k:'lux'}];\n  function renderScale(k,tone){\n    \/\/ \u00e9chelle de positionnement : paliers de m\u00eame largeur (le premier plus \u00e9troit), rep\u00e8re \u00ab Votre prix \u00bb interpol\u00e9 dans son palier\n    const W=ZONES.map((z,i)=>i===0?0.6:1), tot=W.reduce((a,b)=>a+b,0);\n    let i=ZONES.findIndex(z=>k<z.b), pos;\n    if (i<0) pos=100; else { const before=W.slice(0,i).reduce((a,b)=>a+b,0), frac=(Math.max(k,0)-ZONES[i].a)\/(ZONES[i].b-ZONES[i].a); pos=(before+frac*W[i])\/tot*100; }\n    pos=Math.min(97,Math.max(3,pos));\n    const el=$('px-scale');\n    if (!el.firstChild){ el.innerHTML=`<div class=\"px-lad-pin\" aria-hidden=\"true\"><b>Ihr Preis<\/b><i><\/i><\/div><div class=\"px-lad-track\" aria-hidden=\"true\">${ZONES.map(()=>'<span><\/span>').join('')}<\/div><div class=\"px-lad-labels\" aria-hidden=\"true\">${ZONES.map(z=>`<span>${z.l}<\/span>`).join('')}<\/div>`; }\n    const pin=el.querySelector('.px-lad-pin'); pin.style.left=pos+'%'; pin.dataset.tone=tone;\n    pin.querySelector('b').textContent = state.mode==='sell' ? 'Ihr Preis' : (num('px-quote')>0 ? 'Ihr Angebot' : 'Ihr Einkaufspreis');\n    [...el.querySelectorAll('.px-lad-track span')].forEach((sp,j)=>sp.classList.toggle('sel',ZONES[j].k===state.pos));\n    [...el.querySelectorAll('.px-lad-labels span')].forEach((sp,j)=>sp.classList.toggle('sel',ZONES[j].k===state.pos));\n  }\n\n  function renderBreakdown(o, multi){\n    $('px-a-total').textContent = multi ? o.name : '';\n    const rows=[\n      {g:0,l:'Einkaufspreis beim Hersteller',v:o.A},{g:0,l:'Logistik',v:o.L},\n      {g:1,l:'Werbung und Influencer',v:o.m*o.R},{g:1,l:'Verkaufsf\u00f6rderung',v:o.pr*o.R},\n      {g:2,l:'Markenmarge',v:o.net},\n      {g:3,l:'Provisionen und Rabatte',v:o.f*o.R},{g:3,l:'Distributormarge',v:o.W-o.R},{g:3,l:'H\u00e4ndlermarge',v:o.HT-o.W},\n      {g:4,l:'MwSt.',v:o.P-o.HT}\n    ];\n    const G=[{l:'Herstellung',c:'var(--k-fab)'},{l:'Marketing',c:'var(--k-mkt)'},{l:'Ihre Gewinnmarge',c:'var(--k-marge)',you:1},{l:'Vertrieb',c:'var(--k-canal)'},{l:'Steuern',c:'var(--k-tva)'}];\n    const gv=[0,0,0,0,0]; rows.forEach(r=>gv[r.g]+=r.v);\n    const bar=$('px-bar'); bar.innerHTML='';\n    const tip=document.createElement('div'); tip.className='px-tip'; tip.hidden=true;\n    gv.forEach((v,i)=>{\n      if (v<=0.0001) return;\n      const share=v\/o.P, s=document.createElement('div'); s.className='px-rseg'+(G[i].you?' is-you':''); s.tabIndex=0;\n      s.style.cssText=`flex:${v} 1 0;--c:${G[i].c}`;\n      s.textContent = share>=0.1 ? pct(share).replace(\/,\\d\/,'') : '';   \/\/ \u00e9tiquette directe sur les segments assez larges\n      s.setAttribute('aria-label',`${G[i].l}: ${money(v,2)}, ${pct(share)}`);\n      const show=()=>{ tip.innerHTML=`${G[i].l} \u00b7 ${money(v,2)} \u00b7 ${pct(share)}`; tip.hidden=false; const bb=bar.getBoundingClientRect(), sb=s.getBoundingClientRect(); tip.style.left=Math.max(80,Math.min(bb.width-80,sb.left+sb.width\/2-bb.left))+'px'; };\n      s.addEventListener('mouseenter',show); s.addEventListener('focus',show);\n      s.addEventListener('mouseleave',()=>tip.hidden=true); s.addEventListener('blur',()=>tip.hidden=true);\n      bar.appendChild(s);\n    });\n    bar.appendChild(tip);\n    bar.setAttribute('aria-label','Preisaufteilung: '+G.map((g,i)=>`${g.l} ${pct(gv[i]\/o.P)}`).join(', '));\n    $('px-legend').innerHTML=G.map((g,i)=>g.you?'':`<li class=\"${g.you?'is-you':''}${gv[i]<0?' neg':''}\" style=\"--c:${g.c}\"><span>${g.l}<\/span><b>${money(gv[i],decOf(gv[i])||2)}<\/b><\/li>`).join('');\n    \/\/ (le d\u00e9tail ligne par ligne vit dans \u00ab V\u00e9rifier nos hypoth\u00e8ses \u00bb)\n  }\n\n  function renderMulti(o){\n    const box=$('px-multi'); box.hidden=!o.multi;\n    if (!o.multi) return;\n    const tag = i => i===o.bind ? '<small>am anspruchsvollsten<\/small>' : '';\n    if (o.mode==='sell'){\n      $('px-ct-head').innerHTML=`<tr><th>Kanal<\/th><th>Empfohlener Preis nur f\u00fcr diesen Kanal<\/th><th>Abgestimmter Preis<\/th><th>Ihr Rechnungspreis (netto)<\/th><th>Ihre Gewinnmarge<\/th><\/tr>`;\n      $('px-ct-body').innerHTML=o.rows.map((r,i)=>`<tr class=\"${i===o.bind?'cur':''}\"><td>${r.name}${tag(i)}<\/td><td>${money(r.Pr)}<\/td><td>${money(r.P)}<\/td><td>${money(r.R,2)}<\/td><td class=\"${r.gReal>=o.g-1e-6?'gain':''}\">${pct(r.gReal)}<\/td><\/tr>`).join('');\n      $('px-ct-foot').textContent = o.per\n        ? 'Ein Preis je Kanal h\u00e4lt die Gewinnmarge \u00fcberall gleich, aber Ihre Wiederverk\u00e4ufer sehen die Unterschiede. Halten Sie diese zwischen sichtbaren Kan\u00e4len desselben Kunden gering.'\n        : `Ein einheitlicher Preis sch\u00fctzt Ihre Wiederverk\u00e4ufer und Ihr Image. Er richtet sich nach dem anspruchsvollsten Wiederverkaufskanal.${o.rows.some(r=>r.online&&r.gReal<o.g-0.005)?' Online ist die Gewinnmarge bei diesem Preis wegen der Lieferung niedriger: Lassen Sie einen Teil der Versandkosten zahlen oder akzeptieren Sie diese Gewinnmarge.':''}`;\n    } else {\n      $('px-ct-head').innerHTML=`<tr><th>Kanal<\/th><th>Maximaler Einkaufspreis<\/th><th>Ihr Rechnungspreis (netto)<\/th><th>${o.quote>0?'Gewinnmarge mit diesem Angebot':'Gewinnmarge zum Zielpreis'}<\/th><\/tr>`;\n      $('px-ct-body').innerHTML=o.rows.map((r,i)=>`<tr class=\"${i===o.bind?'cur':''}\"><td>${r.name}${tag(i)}<\/td><td>${r.impossible?'Bei diesem Preis nicht m\u00f6glich':money(r.Amax,2)}<\/td><td>${money(r.R,2)}<\/td><td class=\"${r.gReal>=o.g-1e-6?'gain':''}\">${pct(r.gReal)}<\/td><\/tr>`).join('');\n      $('px-ct-foot').textContent='Ihr Einkaufspreis muss zum anspruchsvollsten Kanal passen. Wenn ein Kanal zu teuer ist, k\u00f6nnen Sie dort teurer verkaufen oder ihn streichen.';\n    }\n  }\n\n  const SRC_GROUPS=[\n    {t:'Margen der Marken und H\u00e4ndler',ids:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]},\n    {t:'Marketing und Verkaufsf\u00f6rderung',ids:[18,19,20,21,22,23]},\n    {t:'Provisionen und Zahlung',ids:[16,17,24]},\n    {t:'Lieferung und Logistik',ids:[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]},\n    {t:'Regalpreise, Erhebung Oktober 2026',ids:[42,43,44,45,46,47]}];\n  const cite = ids => `<span class=\"px-cites\">${ids.map(n=>`<a class=\"px-cite\" href=\"#px-src-${n}\" title=\"${(BENCH.sources[n-1]||{}).t||''}\">${n}<\/a>`).join('')}<\/span>`;\n  function renderBench(){\n    if (!BENCH.rows.length){ $('px-bench').hidden=true; return; }\n    const S=BENCH.sources, x=v=>Math.max(0,Math.min(100,(v-1)\/9*100));\n    $('px-stat-n').textContent=S.length; $('px-srcs-n').textContent=S.length;\n    $('px-bench-intro').textContent=BENCH.intro;\n    $('px-bench-rows').innerHTML=BENCH.rows.map((r,i)=>{ const p=POS[i]||{lo:1,hi:2};\n      return `<li class=\"px-coef-row\" style=\"--lv:${i}\"><b class=\"px-coef-n\">${r.pos}<\/b><div class=\"px-track\" role=\"img\" aria-label=\"${r.pos}: Faktor ${r.k}\"><span style=\"left:${x(p.lo)}%;width:${x(p.hi)-x(p.lo)}%\"><\/span><\/div><span class=\"px-coef-k\">${r.k}<\/span><p class=\"px-coef-why\">${r.why} ${cite(r.src)}<\/p><\/li>`; }).join('');\n    $('px-bench-notes').innerHTML=BENCH.notes.map(n=>{\n      let k=n.t.indexOf(' : '), title=n.t.slice(0,k), body=n.t.slice(k+3), m=title.match(\/^(.*?)\\s*\\((.*)\\)$\/);\n      if (m){ title=m[1]; body=m[2].charAt(0).toUpperCase()+m[2].slice(1)+'. '+body.charAt(0).toUpperCase()+body.slice(1); }\n      else body=body.charAt(0).toUpperCase()+body.slice(1);\n      return `<article class=\"px-bnote${\/^Grenzen\/.test(title)?' is-limit':''}\"><h3>${title}<\/h3><p>${body}<\/p>${n.src.length?cite(n.src):''}<\/article>`; }).join('');\n    $('px-sources').innerHTML=SRC_GROUPS.map(g=>`<section class=\"px-src-g\"><h4>${g.t}<\/h4><ul>${g.ids.map(n=>{ const s=S[n-1]; if(!s) return '';\n      return `<li id=\"px-src-${n}\"><span class=\"px-src-i\">${n}<\/span><span class=\"px-src-t\">${s.t}<a href=\"${s.u}\" target=\"_blank\" rel=\"noopener nofollow\">${s.u.replace(\/^https?:\\\/\\\/\/,'').replace(\/\\\/.*$\/,'').replace(\/^www\\.\/,'')}<svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><\/a><\/span><\/li>`; }).join('')}<\/ul><\/section>`).join('');\n  }\n  \/\/ une citation ouvre la liste des sources et met la ligne en \u00e9vidence\n  document.addEventListener('click',e=>{\n    const a=e.target.closest('a[href^=\"#px-src\"]'); if(!a) return;\n    const det=$('px-srcs'); if(!det) return; e.preventDefault(); det.open=true;\n    const id=a.getAttribute('href').slice(1), el=$(id==='px-srcs'?'px-srcs':id); if(!el) return;\n    el.scrollIntoView({behavior:reduced()?'auto':'smooth',block:id==='px-srcs'?'start':'center'});\n    if(id!=='px-srcs'){ el.classList.remove('is-hit'); void el.offsetWidth; el.classList.add('is-hit'); }\n  });\n\n\n  function summary(){\n    const o=last; if(!o||o.err) return '';\n    const x=posOf();\n    const lines=['Preisrechner Kosmetik (Carmel Cosmetics Labs)',\n      `${plain(x.name)} \u00b7 ${MARKETS[state.market].name} \u00b7 Zielmarge ${pct(o.g)}`];\n    if (o.mode==='sell'){\n      lines.push(`Einkaufspreis: ${money(o.A,2)} netto`);\n      if (o.multi && !o.per) lines.push(`Empfohlener einheitlicher Endkundenpreis: ${money(o.P,2)} brutto`);\n      o.rows.forEach(r=>lines.push(`${r.name}: ${money(r.P,2)} brutto, Sie berechnen ${money(r.R,2)} netto, Gewinnmarge ${pct(r.gReal)}`));\n    } else {\n      lines.push(`Angestrebter Endkundenpreis: ${money(o.P,2)} brutto`,`Ziel-Einkaufspreis: ${money(o.Amax,2)} netto (Einstieg ${money(o.Aopen,2)}, Obergrenze ${money(o.Aceil,2)})`);\n      if (o.multi) o.rows.forEach(r=>lines.push(`${r.name}: maximaler Einkaufspreis ${money(r.Amax,2)} netto`));\n      if (o.quote>0) lines.push(`Gepr\u00fcftes Angebot: ${money(o.quote,2)}`);\n    }\n    lines.push('Unverbindlicher Richtpreis, bitte mit eigener Recherche pr\u00fcfen (Wettbewerb, Konditionen der Wiederverk\u00e4ufer, Angebote).','https:\/\/carmelcosmeticslabs.com\/de\/');\n    return lines.join('\\n');\n  }\n\n  \/* ---------- consultation WPForms native 52853 ---------- *\/\n  \/\/ No PII is read by this integration or sent to analytics\/storage\/URLs.\n  const consultation = {form:null,attach:null,snapshot:null,trigger:null,observer:null,timer:null};\n  function consultationSnapshot(){\n    const result=summary();\n    if(!state.revealed || !result) return '';\n    const lines=[result,'','Aktuelle Annahmen (unverbindlich)',\n      `W\u00e4hrung: ${cur()} \u00b7 MwSt.: ${fmt(state.vat,1)}\u202f% \u00b7 Zielmarge: ${pct(state.g)}`,\n      `Transport und Zoll pro Produkt: ${money(state.L1,2)} netto \u00b7 psychologische Rundung: ${$('px-round').checked?'ja':'nein'}`,\n      `Strategie: ${state.strategy==='per'?'Preis je Kanal':'einheitlicher Endkundenpreis'}`];\n    if(state.market==='us') lines.push('USA: Endkundenpreis ohne Sales Tax (MwSt. in der Berechnung: 0\u202f%).');\n    state.channels.forEach(k=>{\n      const v=cv[k],r=last.rows.find(row=>row.k===k);\n      lines.push(`${CH[k].short}: Wiederverk\u00e4ufer ${fmt(v.r,1)}\u202f%, Distributor ${fmt(v.d,1)}\u202f%, erfasste Provisionen\/Rabatte ${fmt(v.f,1)}\u202f%${r?', effektiv '+pct(r.f)+' vom Nettoumsatz der Marke':''}, Werbung ${fmt(v.m,1)}\u202f%, Verkaufsf\u00f6rderung ${fmt(v.p,1)}\u202f%, Lieferung ${money(v.L2,2)} netto\/Produkt.`);\n    });\n    return lines.join('\\n');\n  }\n  function refreshConsultation(){\n    if(!consultation.attach || !consultation.snapshot || successCounted) return;\n    const attached=consultation.attach.checked, text=attached?consultationSnapshot():'';\n    consultation.snapshot.value=text;\n    $('px-consult-simulation').hidden=!attached;\n    $('px-consult-summary').textContent=attached?(text||'Schlie\u00dfen Sie die f\u00fcnf Schritte mit g\u00fcltigen Werten ab, um Ihre Simulation beizuf\u00fcgen.'):'';\n    if(!attached) $('px-consult-simulation').open=false;\n  }\n  function consultationEvent(event, extra){\n    try{(window.dataLayer=window.dataLayer||[]).push(Object.assign({event},extra||{}));}catch(_){}\n  }\n  function openConsultation(trigger){\n    consultation.trigger=trigger;\n    $('px-consultation').hidden=false;\n    $('px-dock').hidden=true;\n    document.querySelectorAll('[data-consult-placement]').forEach(b=>b.setAttribute('aria-expanded','true'));\n    refreshConsultation();\n    consultationEvent('calculateur_consultation_clic',{placement:trigger.dataset.consultPlacement});\n    $('px-consult-title').focus({preventScroll:true});\n    $('px-consultation').scrollIntoView({behavior:reduced()?'auto':'smooth',block:'start'});\n  }\n  function closeConsultation(){\n    $('px-consultation').hidden=true;\n    $('px-dock').hidden=false;\n    document.querySelectorAll('[data-consult-placement]').forEach(b=>b.setAttribute('aria-expanded','false'));\n    if(consultation.trigger) consultation.trigger.focus({preventScroll:true});\n  }\n  document.querySelectorAll('[data-consult-placement]').forEach(b=>b.addEventListener('click',()=>openConsultation(b)));\n  $('px-consult-close').addEventListener('click',closeConsultation);\n  $('px-consultation').addEventListener('keydown',e=>{if(e.key==='Escape'){e.preventDefault();closeConsultation();}});\n  \/\/ Capture phase runs before WPForms' own validation\/AJAX serialization.\n  document.addEventListener('submit',e=>{if(e.target===consultation.form) refreshConsultation();},true);\n  let successBound=false,successCounted=false;\n  function bindConsultationSuccess(){\n    if(successBound || !window.jQuery) return;\n    successBound=true;\n    window.jQuery(document).on('wpformsAjaxSubmitSuccess.cmPx52853',(event,response)=>{\n      \/\/ Verified WPForms contract: triggered on the form, response is the sole extra argument.\n      const nativeForm=event.target && event.target.closest && event.target.closest('form');\n      if(nativeForm!==consultation.form || !nativeForm || nativeForm.id!=='wpforms-form-52853') return;\n      if(!response || response.success!==true) return;\n      if(successCounted) return;\n      successCounted=true;\n      $('px-consult-simulation').hidden=true;\n      $('px-consult-summary').textContent='';\n      \/\/ Native confirmation is left intact: acceptance is not proof of email\/CRM delivery.\n      consultationEvent('calculateur_demande_envoyee');\n    });\n  }\n  function mountConsultationForm(){\n    bindConsultationSuccess();\n    if(consultation.form) return true;\n    const source=document.querySelector('.cm-calculator-form-source');\n    const form=source && source.querySelector('#wpforms-form-52853');\n    if(!form) return false;\n    const attach=form.querySelector('#wpforms-52853-field_5_1');\n    const snapshot=form.querySelector('#wpforms-52853-field_6');\n    const wrapper=form.closest('.wpforms-container');\n    if(!attach || !snapshot || !wrapper || !source.contains(wrapper)) return false;\n    \/\/ Move only the native wrapper once; the hidden Elementor source stays in place.\n    \/\/ Retain listeners, security fields and nonce. No clone, innerHTML or new form.\n    consultation.form=form;consultation.attach=attach;consultation.snapshot=snapshot;\n    snapshot.required=false;\n    const field=snapshot.closest('.wpforms-field');if(field) field.hidden=true;\n    $('px-consult-form-host').appendChild(wrapper);\n    $('px-consult-fallback').hidden=true;\n    attach.addEventListener('change',refreshConsultation);\n    [['1','off'],['2','name'],['3','email'],['4','tel']].forEach(([id,autocomplete])=>{\n      const input=form.querySelector('#wpforms-52853-field_'+id);if(input) input.setAttribute('autocomplete',autocomplete);\n    });\n    refreshConsultation();\n    if(consultation.observer) consultation.observer.disconnect();\n    clearTimeout(consultation.timer);\n    return true;\n  }\n  function initConsultationForm(){\n    if(mountConsultationForm()) return;\n    \/\/ Wait for Elementor's deferred widget, but never watch the page forever.\n    consultation.observer=new MutationObserver(()=>mountConsultationForm());\n    consultation.observer.observe($('px-root').closest('.elementor')||document.body,{childList:true,subtree:true});\n    consultation.timer=setTimeout(()=>{\n      consultation.observer.disconnect();\n      mountConsultationForm();\n      \/\/ Missing\/invalid native markup leaves the honest contact-link fallback visible.\n    },20000);\n  }\n\n  \/* ---------- \u00e9v\u00e9nements ---------- *\/\n  document.querySelectorAll('input[name=\"px-mode\"]').forEach(i=>i.addEventListener('change',e=>{state.mode=e.target.value;snapMargin();render();}));\n  $('px-pos').addEventListener('change',e=>{state.pos=e.target.value;applyMix();buildHyp();snapMargin();render();});\n  $('px-channels').addEventListener('change',e=>{\n    const k=e.target.value;\n    if (e.target.checked){ if(!cv[k]) initChannel(k); state.channels.push(k); state.edit=k; }\n    else if (state.channels.length===1){ e.target.checked=true; $('px-step4-msg').hidden=false; return; }\n    else { state.channels=state.channels.filter(x=>x!==k); }\n    $('px-step4-msg').hidden=true;\n    renderCount(); buildHyp(); snapMargin(); render();\n  });\n  \/\/ aucune \u00e9tape n'avance seule : l'utilisateur choisit, puis clique sur Continuer\n  $('px-market').addEventListener('change',e=>{applyMarket(e.target.value);buildHyp();render();});\n  [['px-A','A'],['px-P','P'],['px-quote','quote']].forEach(([id,key])=>$(id).addEventListener('input',()=>{ const v=num(id); state.base[key]= v>0 ? v\/MARKETS[state.market].rate : null; if(!$('px-step2-msg').hidden) stepValid(2); render(); }));\n  $('px-hyp').addEventListener('input',e=>{\n    const el=e.target, id=el.dataset.id; if(!id) return;\n    if (el.type==='range'){ const v=Number(el.value); setV(state.edit,id,v); const t=el.parentNode.querySelector('input[type=text]'); t.value=fmt(v,Number(t.dataset.dec)); }\n    else { const v=parseFloat(el.value.replace(\/\\s\/g,'').replace(',','.')); setV(state.edit,id,isFinite(v)?v:NaN); if(isFinite(v)){ const r=el.closest('.px-h-c').querySelector('input[type=range]'); if(v>Number(r.max)) r.max=Math.ceil(v); r.value=v; } }\n    render();\n  });\n  $('px-hyp').addEventListener('click',e=>{ const h=e.target.closest('.px-r-head'); if(h) toggleRow(h.parentNode.dataset.row); });\n  $('px-reset').addEventListener('click',()=>{ initChannel(state.edit); state.vat=MARKETS[state.market].vat; buildHyp(); render(); });\n  $('px-showall').addEventListener('click',()=>{ state.showAll=!state.showAll; buildHyp(); render(); });\n  const pickEdit = e => { const b=e.target.closest('[data-k]'); if(!b) return; state.edit=b.dataset.k; buildHyp(); render(); };\n  $('px-edit').addEventListener('click',pickEdit);\n  $('px-bd-ch').addEventListener('click',pickEdit);\n  $('px-figs').addEventListener('click',pickEdit);\n  $('px-strat').addEventListener('click',e=>{ const b=e.target.closest('[data-s]'); if(!b) return; state.strategy=b.dataset.s; render(); });\n  $('px-g-range').addEventListener('input',e=>{state.gTouched=true;setMargin(e.target.value);render();});\n  $('px-round').addEventListener('change',render);\n  $('px-next').addEventListener('click',()=>{ if(state.step<5) go(state.step+1); else { $('px-answer').scrollIntoView({behavior:reduced()?'auto':'smooth',block:'start'}); } });\n  $('px-back').addEventListener('click',()=>go(state.step-1));\n  $('px-prog').addEventListener('click',e=>{ const b=e.target.closest('[data-step]'); if(b&&!b.disabled) go(Number(b.dataset.step)); });\n  $('px-recap').addEventListener('click',e=>{ const b=e.target.closest('[data-step]'); if(!b) return; state.reached=5; go(Number(b.dataset.step)); if(innerWidth<=960) document.querySelector('.px-flow').scrollIntoView({behavior:reduced()?'auto':'smooth',block:'start'}); });\n  $('px-form').addEventListener('keydown',e=>{ if(e.key==='Enter' && e.target.tagName==='INPUT' && e.target.type!=='radio' && e.target.type!=='checkbox'){ e.preventDefault(); $('px-next').click(); } });\n  $('px-copy').addEventListener('click',async()=>{\n    const txt=summary(), lab=$('px-copy').querySelector('span');\n    try{ await navigator.clipboard.writeText(txt); lab.textContent='Kopiert'; }\n    catch(e){ const ta=document.createElement('textarea'); ta.value=txt; ta.style.cssText='position:fixed;opacity:0'; document.body.appendChild(ta); ta.select(); try{document.execCommand('copy'); lab.textContent='Kopiert';}catch(_){lab.textContent='Kopieren nicht m\u00f6glich';} ta.remove(); }\n    setTimeout(()=>lab.textContent='Kopieren',2200);\n  });\n\n  const dock=$('px-dock');\n  if ('IntersectionObserver' in window) new IntersectionObserver(es=>es.forEach(en=>dock.classList.toggle('hide',en.isIntersecting||!state.revealed)),{threshold:0.2}).observe($('px-answer'));\n\n  state.L1=Math.round(state.L1e*MARKETS[state.market].rate*10)\/10;\n  initChannel('pha');\n  setMargin(posOf().g);\n  buildHyp();\n  snapMargin();\n  renderNav();\n  renderCount();\n  renderBench();\n  render();\n  if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',initConsultationForm,{once:true});\n  else initConsultationForm();\n})();\n<\/script>\n<\/div><script>document.querySelectorAll('[data-s]').forEach(function(e){e.setAttribute('data-s',(e.getAttribute('data-s')+' '+e.textContent).toLowerCase())});<\/script>\t\t\t\t<\/div>\n\t\t<div data-particle_enable=\"false\" data-particle-mobile-disabled=\"false\" class=\"elementor-element elementor-element-eeb85036 e-flex e-con-full cm-calculator-form-source e-con e-child\" data-id=\"eeb85036\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a38db15 cm-calculator-wpform eael-wpforms-labels-yes eael-wpforms-form-button-custom elementor-widget elementor-widget-eael-wpforms\" data-id=\"7a38db15\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"eael-wpforms.default\">\n\t\t\t\t\t            <div class=\"eael-contact-form eael-wpforms eael-wpforms-align-default\">\n                                <div class=\"wpforms-container wpforms-container-full cm-calculator-wpform wpforms-render-modern\" id=\"wpforms-52853\"><form id=\"wpforms-form-52853\" class=\"wpforms-validate wpforms-form wpforms-ajax-form\" data-formid=\"52853\" method=\"post\" enctype=\"multipart\/form-data\" action=\"\/de\/wp-json\/wp\/v2\/pages\/66612\" data-token=\"3c9a22d42aad869fcbeeb4c87d813b64\" data-token-time=\"1794438744\"><div class=\"wpforms-head-container\"><div class=\"wpforms-title\">Calculateur de prix \u2013 FR<\/div><div class=\"wpforms-description\">Votre simulation nous aidera \u00e0 comprendre votre objectif de prix.<\/div><\/div><noscript class=\"wpforms-error-noscript\">Bitte aktiviere JavaScript in deinem Browser, um dieses Formular fertigzustellen.<\/noscript><div id=\"wpforms-error-noscript\" style=\"display: none;\">Bitte aktiviere JavaScript in deinem Browser, um dieses Formular fertigzustellen.<\/div><div class=\"wpforms-field-container\"><div id=\"wpforms-52853-field_1-container\" class=\"wpforms-field wpforms-field-text\" data-field-type=\"text\" data-field-id=\"1\"><label class=\"wpforms-field-label\" for=\"wpforms-52853-field_1\">Produit envisag\u00e9 <span class=\"wpforms-required-label\" aria-hidden=\"true\">*<\/span><\/label><input type=\"text\" id=\"wpforms-52853-field_1\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][1]\" placeholder=\"Ex. : s\u00e9rum visage\" aria-errormessage=\"wpforms-52853-field_1-error\" required><\/div><div id=\"wpforms-52853-field_2-container\" class=\"wpforms-field wpforms-field-text\" data-field-type=\"text\" data-field-id=\"2\"><label class=\"wpforms-field-label\" for=\"wpforms-52853-field_2\">Nom <span class=\"wpforms-required-label\" aria-hidden=\"true\">*<\/span><\/label><input type=\"text\" id=\"wpforms-52853-field_2\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][2]\" aria-errormessage=\"wpforms-52853-field_2-error\" required><\/div><div id=\"wpforms-52853-field_3-container\" class=\"wpforms-field wpforms-field-email\" data-field-type=\"email\" data-field-id=\"3\"><label class=\"wpforms-field-label\" for=\"wpforms-52853-field_3\">Email <span class=\"wpforms-required-label\" aria-hidden=\"true\">*<\/span><\/label><input type=\"email\" id=\"wpforms-52853-field_3\" class=\"wpforms-field-large wpforms-field-required\" name=\"wpforms[fields][3]\" spellcheck=\"false\" aria-errormessage=\"wpforms-52853-field_3-error\" required><\/div><div id=\"wpforms-52853-field_4-container\" class=\"wpforms-field wpforms-field-text\" data-field-type=\"text\" data-field-id=\"4\"><label class=\"wpforms-field-label\" for=\"wpforms-52853-field_4\">T\u00e9l\u00e9phone<\/label><input type=\"text\" id=\"wpforms-52853-field_4\" class=\"wpforms-field-large\" name=\"wpforms[fields][4]\" aria-errormessage=\"wpforms-52853-field_4-error\" aria-describedby=\"wpforms-52853-field_4-description\" ><div id=\"wpforms-52853-field_4-description\" class=\"wpforms-field-description\">Facultatif<\/div><\/div><div id=\"wpforms-52853-field_5-container\" class=\"wpforms-field wpforms-field-checkbox\" data-field-type=\"checkbox\" data-field-id=\"5\"><fieldset><legend class=\"wpforms-field-label wpforms-label-hide\" aria-hidden=\"false\">Simulation<\/legend><ul id=\"wpforms-52853-field_5\"><li class=\"choice-1 depth-1\"><input type=\"checkbox\" id=\"wpforms-52853-field_5_1\" name=\"wpforms[fields][5][]\" value=\"Joindre ma simulation \u00e0 ma demande\" aria-errormessage=\"wpforms-52853-field_5_1-error\"  ><label class=\"wpforms-field-label-inline\" for=\"wpforms-52853-field_5_1\">Joindre ma simulation \u00e0 ma demande<\/label><\/li><\/ul><\/fieldset><\/div><div id=\"wpforms-52853-field_6-container\" class=\"wpforms-field wpforms-field-textarea cm-calculator-simulation-field\" data-field-type=\"textarea\" data-field-id=\"6\"><label class=\"wpforms-field-label wpforms-label-hide\" for=\"wpforms-52853-field_6\" aria-hidden=\"false\">Simulation de prix cosm\u00e9tique<\/label><textarea id=\"wpforms-52853-field_6\" class=\"wpforms-field-large\" name=\"wpforms[fields][6]\" aria-errormessage=\"wpforms-52853-field_6-error\" ><\/textarea><\/div><div id=\"wpforms-52853-field_7-container\" class=\"wpforms-field wpforms-field-hidden ccl-utm_source\" data-field-type=\"hidden\" data-field-id=\"7\"><input type=\"hidden\" id=\"wpforms-52853-field_7\" name=\"wpforms[fields][7]\"><\/div><div id=\"wpforms-52853-field_8-container\" class=\"wpforms-field wpforms-field-hidden ccl-utm_medium\" data-field-type=\"hidden\" data-field-id=\"8\"><input type=\"hidden\" id=\"wpforms-52853-field_8\" name=\"wpforms[fields][8]\"><\/div><div id=\"wpforms-52853-field_9-container\" class=\"wpforms-field wpforms-field-hidden ccl-utm_campaign\" data-field-type=\"hidden\" data-field-id=\"9\"><input type=\"hidden\" id=\"wpforms-52853-field_9\" name=\"wpforms[fields][9]\"><\/div><div id=\"wpforms-52853-field_10-container\" class=\"wpforms-field wpforms-field-hidden ccl-utm_term\" data-field-type=\"hidden\" data-field-id=\"10\"><input type=\"hidden\" id=\"wpforms-52853-field_10\" name=\"wpforms[fields][10]\"><\/div><div id=\"wpforms-52853-field_11-container\" class=\"wpforms-field wpforms-field-hidden ccl-utm_content\" data-field-type=\"hidden\" data-field-id=\"11\"><input type=\"hidden\" id=\"wpforms-52853-field_11\" name=\"wpforms[fields][11]\"><\/div><div id=\"wpforms-52853-field_12-container\" class=\"wpforms-field wpforms-field-hidden ccl-gclid\" data-field-type=\"hidden\" data-field-id=\"12\"><input type=\"hidden\" id=\"wpforms-52853-field_12\" name=\"wpforms[fields][12]\"><\/div><div id=\"wpforms-52853-field_13-container\" class=\"wpforms-field wpforms-field-hidden ccl-gbraid\" data-field-type=\"hidden\" data-field-id=\"13\"><input type=\"hidden\" id=\"wpforms-52853-field_13\" name=\"wpforms[fields][13]\"><\/div><div id=\"wpforms-52853-field_14-container\" class=\"wpforms-field wpforms-field-hidden ccl-wbraid\" data-field-type=\"hidden\" data-field-id=\"14\"><input type=\"hidden\" id=\"wpforms-52853-field_14\" name=\"wpforms[fields][14]\"><\/div><div id=\"wpforms-52853-field_15-container\" class=\"wpforms-field wpforms-field-hidden ccl-fbclid\" data-field-type=\"hidden\" data-field-id=\"15\"><input type=\"hidden\" id=\"wpforms-52853-field_15\" name=\"wpforms[fields][15]\"><\/div><div id=\"wpforms-52853-field_16-container\" class=\"wpforms-field wpforms-field-hidden ccl-landing\" data-field-type=\"hidden\" data-field-id=\"16\"><input type=\"hidden\" id=\"wpforms-52853-field_16\" name=\"wpforms[fields][16]\"><\/div><div id=\"wpforms-52853-field_17-container\" class=\"wpforms-field wpforms-field-hidden ccl-referrer\" data-field-type=\"hidden\" data-field-id=\"17\"><input type=\"hidden\" id=\"wpforms-52853-field_17\" name=\"wpforms[fields][17]\"><\/div><div id=\"wpforms-52853-field_18-container\" class=\"wpforms-field wpforms-field-hidden ccl-first_touch\" data-field-type=\"hidden\" data-field-id=\"18\"><input type=\"hidden\" id=\"wpforms-52853-field_18\" name=\"wpforms[fields][18]\"><\/div><div id=\"wpforms-52853-field_19-container\" class=\"wpforms-field wpforms-field-hidden ccl-canal\" data-field-type=\"hidden\" data-field-id=\"19\"><input type=\"hidden\" id=\"wpforms-52853-field_19\" name=\"wpforms[fields][19]\"><\/div><div id=\"wpforms-52853-field_20-container\" class=\"wpforms-field wpforms-field-hidden ccl-campagne\" data-field-type=\"hidden\" data-field-id=\"20\"><input type=\"hidden\" id=\"wpforms-52853-field_20\" name=\"wpforms[fields][20]\"><\/div><\/div><!-- .wpforms-field-container --><div class=\"wpforms-field wpforms-field-hp\"><label for=\"wpforms-52853-field-hp\" class=\"wpforms-field-label\">Comment<\/label><input type=\"text\" name=\"wpforms[hp]\" id=\"wpforms-52853-field-hp\" class=\"wpforms-field-medium\"><\/div><div class=\"wpforms-submit-container\" ><input type=\"hidden\" name=\"wpforms[id]\" value=\"52853\"><input type=\"hidden\" name=\"wpforms[time_token]\" value=\"1794438744.d18a6ae93ad385ec7a2da7881051e9acda3a6a4f8cb029c03b86dfafd650c304\"><input type=\"hidden\" name=\"page_title\" value=\"\"><input type=\"hidden\" name=\"page_url\" value=\"https:\/\/carmelcosmeticslabs.com\/de\/wp-json\/wp\/v2\/pages\/66612\"><input type=\"hidden\" name=\"url_referer\" value=\"\"><button type=\"submit\" name=\"wpforms[submit]\" id=\"wpforms-submit-52853\" class=\"wpforms-submit px-btn\" data-alt-text=\"Envoi en cours...\" data-submit-text=\"Demander ma consultation gratuite\" aria-live=\"assertive\" value=\"wpforms-submit\">Demander ma consultation gratuite<\/button><img decoding=\"async\" src=\"https:\/\/carmelcosmeticslabs.com\/wp-content\/plugins\/wpforms\/assets\/images\/submit-spin.svg\" class=\"wpforms-submit-spinner\" style=\"display: none;\" width=\"26\" height=\"26\" alt=\"Wird geladen\" title=\"| Carmel Cosmetics Labs\"><\/div><\/form><\/div>  <!-- .wpforms-container -->            <\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-66612","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/carmelcosmeticslabs.com\/de\/wp-json\/wp\/v2\/pages\/66612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/carmelcosmeticslabs.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/carmelcosmeticslabs.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/carmelcosmeticslabs.com\/de\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/carmelcosmeticslabs.com\/de\/wp-json\/wp\/v2\/comments?post=66612"}],"version-history":[{"count":3,"href":"https:\/\/carmelcosmeticslabs.com\/de\/wp-json\/wp\/v2\/pages\/66612\/revisions"}],"predecessor-version":[{"id":66908,"href":"https:\/\/carmelcosmeticslabs.com\/de\/wp-json\/wp\/v2\/pages\/66612\/revisions\/66908"}],"wp:attachment":[{"href":"https:\/\/carmelcosmeticslabs.com\/de\/wp-json\/wp\/v2\/media?parent=66612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}