{"id":66635,"date":"2026-10-10T19:28:52","date_gmt":"2026-10-10T19:28:52","guid":{"rendered":"https:\/\/carmelcosmeticslabs.com\/?page_id=66635"},"modified":"2026-11-10T16:05:42","modified_gmt":"2026-11-10T16:05:42","slug":"calculadora-precios-cosmeticos","status":"publish","type":"page","link":"https:\/\/carmelcosmeticslabs.com\/es\/calculadora-precios-cosmeticos\/","title":{"rendered":"Calculadora de precios de cosm\u00e9ticos"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"66635\" class=\"elementor elementor-66635 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=\"es\"><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\">Calculadora gratuita, sin registro<\/p>\n    <h1 class=\"px-h1\">A qu\u00e9 precio vender su cosm\u00e9tico y cu\u00e1nto pagar al fabricante<\/h1>\n    <p class=\"px-lead\">Cinco preguntas y unas estimaciones de margen por canal le permiten conocer su precio al p\u00fablico, su margen y el precio de compra que no debe superar.<\/p>\n    <ul class=\"px-proof\">\n      <li><svg class=\"ico\"><use href=\"#i-check\"\/><\/svg>47 fuentes p\u00fablicas citadas<\/li>\n      <li><svg class=\"ico\"><use href=\"#i-check\"\/><\/svg>8 canales de venta<\/li>\n      <li><svg class=\"ico\"><use href=\"#i-check\"\/><\/svg>Dise\u00f1ada por el fabricante de 500+ marcas<\/li>\n    <\/ul>\n  <\/header>\n\n  <div class=\"px-grid\">\n   <section class=\"px-panel px-flow\" aria-label=\"Calculadora\">\n    <nav class=\"px-prog\" id=\"px-prog\" aria-label=\"Etapas\"><\/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\">\u00bfQu\u00e9 desea calcular?<\/h2><\/div>\n      <div class=\"px-cards\" role=\"radiogroup\" aria-label=\"Objetivo\">\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>Mi precio de venta<\/b><small>Tengo una cotizaci\u00f3n y busco el precio al p\u00fablico adecuado.<\/small><span class=\"px-flowline\"><i>Cotizaci\u00f3n<\/i><svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><i class=\"on\">Precio al p\u00fablico<\/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>Mi precio m\u00e1ximo de compra<\/b><small>Tengo un precio al p\u00fablico objetivo y quiero saber qu\u00e9 precio negociar.<\/small><span class=\"px-flowline\"><i>Precio al p\u00fablico<\/i><svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><i class=\"on\">Cotizaci\u00f3n m\u00e1xima<\/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\">\u00bfCu\u00e1nto le cuesta una unidad?<\/h2>\n        <h2 tabindex=\"-1\" data-show=\"buy\" hidden>\u00bfA qu\u00e9 precio quiere venderlo?<\/h2>\n        <p data-show=\"sell\">El precio unitario de su cotizaci\u00f3n, con envase y llenado incluidos.<\/p>\n        <p data-show=\"buy\" hidden>El precio mostrado en tienda o en su sitio web, con impuestos incluidos.<\/p>\n      <\/div>\n      <div class=\"px-fields\">\n        <div class=\"px-field\">\n          <label for=\"px-market\">Pa\u00eds de venta<\/label>\n          <div class=\"px-in px-sel\"><select id=\"px-market\">\n            <option value=\"ma\">Marruecos (MAD)<\/option>\n            <option value=\"fr\">Francia (EUR)<\/option>\n            <option value=\"be\">B\u00e9lgica (EUR)<\/option>\n            <option value=\"es\">Espa\u00f1a (EUR)<\/option>\n            <option value=\"de\">Alemania (EUR)<\/option>\n            <option value=\"uk\">Reino Unido (GBP)<\/option>\n            <option value=\"ae\">Emiratos \u00c1rabes Unidos (AED)<\/option>\n            <option value=\"sa\">Arabia Saudita (SAR)<\/option>\n            <option value=\"us\">Estados Unidos (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\">Precio de compra unitario (sin impuestos)<\/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\">Precio al p\u00fablico objetivo (con impuestos)<\/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\">\u00bfCu\u00e1l es su posicionamiento?<\/h2><p>Orienta su presupuesto de marketing, su margen y el redondeo del precio.<\/p><\/div>\n      <div class=\"px-stair\" id=\"px-pos\" role=\"radiogroup\" aria-label=\"Posicionamiento\"><\/div>\n     <\/div>\n\n     <div class=\"px-step\" data-step=\"4\" hidden>\n      <div class=\"px-q\"><h2 tabindex=\"-1\">\u00bfD\u00f3nde va a venderlo?<\/h2><p>Uno o varios: obtendr\u00e1 un precio \u00fanico o un precio por canal.<\/p><\/div>\n      <div class=\"px-chgroups\" id=\"px-channels\" role=\"group\" aria-label=\"Canales de venta\"><\/div>\n      <p class=\"px-chcount\" id=\"px-chcount\" aria-live=\"polite\"><\/p>\n      <p class=\"px-msg\" id=\"px-step4-msg\" hidden>Mantenga al menos un canal.<\/p>\n     <\/div>\n\n     <div class=\"px-step\" data-step=\"5\" hidden>\n      <div class=\"px-q\"><h2 tabindex=\"-1\">\u00bfQu\u00e9 margen desea conservar?<\/h2><p>Lo que le queda una vez pagados todos los gastos. Apunte a la zona verde.<\/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=\"Margen objetivo\" 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\">Margen fr\u00e1gil<\/span><span class=\"mid\" id=\"px-zone-mid\">Rango habitual<\/span><span class=\"hi\">Fuera de las referencias<\/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>Revisar nuestras estimaciones<\/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\">Cada valor se ajusta a la referencia de su posicionamiento y su canal. Pulse una fila para modificarla: el resultado se actualiza al instante. Importes por unidad.<\/p>\n          <div class=\"px-tabs\" id=\"px-edit\" role=\"tablist\" aria-label=\"Canal que desea ajustar\" 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\">Aplicar los valores de referencia<\/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>Volver<\/button>\n      <span class=\"count px-sr\" id=\"px-count\" aria-live=\"polite\">Paso 1 de 5<\/span>\n      <button type=\"button\" class=\"px-btn\" id=\"px-next\">Continuar<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>Su ficha de precios aparecer\u00e1 aqu\u00ed<\/h3><p>Precio al p\u00fablico recomendado, margen, desglose del precio y posicionamiento frente al mercado, a partir de su 5<sup>\u00aa<\/sup> respuesta.<\/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=\"Estrategia de precios\" hidden>\n        <button type=\"button\" data-s=\"unique\" aria-pressed=\"true\">Precio \u00fanico<small>recomendado<\/small><\/button>\n        <button type=\"button\" data-s=\"per\" aria-pressed=\"false\">Precio por canal<small>un precio para cada uno<\/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\">Precio al p\u00fablico recomendado (con impuestos)<\/span>\n            <label class=\"px-switch\" data-show=\"sell\"><input type=\"checkbox\" id=\"px-round\" checked>Redondeo<\/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\">\u00bfYa tiene una cotizaci\u00f3n?<\/label>\n          <div class=\"px-in\"><input id=\"px-quote\" inputmode=\"decimal\" placeholder=\"Precio unitario propuesto\"><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\">C\u00f3mo se reparte el precio<\/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\">Posicionamiento<\/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>Estudiemos la viabilidad de su producto.<\/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\">Consulta gratuita<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>Copiar<\/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>Precio orientativo, calculado a partir de sus respuestas y de promedios p\u00fablicos. No sustituye un estudio de su mercado ni una cotizaci\u00f3n: compare los precios de sus competidores, las condiciones de sus revendedores y sus costos reales antes de fijar el suyo.<\/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\">Consulta gratuita<\/h2><p>Un responsable de proyecto estudia su solicitud. Puede adjuntar su simulaci\u00f3n para explicar su objetivo de precio.<\/p><\/div>\n      <button type=\"button\" class=\"px-link\" id=\"px-consult-close\">Cerrar<\/button>\n    <\/div>\n    <div id=\"px-consult-form-host\"><\/div>\n    <p id=\"px-consult-fallback\" class=\"px-consult-privacy\" role=\"status\">Si el formulario no aparece, <a href=\"\/demande-de-devis\/\">solicite su consulta gratuita en nuestra p\u00e1gina de contacto<\/a>.<\/p>\n    <details id=\"px-consult-simulation\" class=\"px-consult-details\" hidden>\n      <summary>Ver la simulaci\u00f3n adjunta<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary>\n      <pre id=\"px-consult-summary\"><\/pre>\n    <\/details>\n    <p class=\"px-consult-privacy\">Sin compromiso. Esta simulaci\u00f3n no es una cotizaci\u00f3n. Sus datos de contacto se utilizan para gestionar su solicitud. <a href=\"\/politique-de-confidentialite\/\">Pol\u00edtica de privacidad<\/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\">Canal por canal<\/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\">Nuestros valores de referencia<\/p>\n        <h2 id=\"px-bench-t\">M\u00e1rgenes reales, no suposiciones<\/h2>\n        <p class=\"px-kick\">Cada porcentaje procede de un informe anual, un dictamen de una autoridad de competencia, una tabla de tarifas o un registro de precios. Todas las fuentes est\u00e1n citadas y se pueden verificar.<\/p>\n      <\/div>\n      <a class=\"px-stat\" href=\"#px-srcs\" id=\"px-stat\"><b id=\"px-stat-n\">47<\/b><span>fuentes p\u00fablicas citadas<\/span><em>Ver la lista<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>Coeficiente por posicionamiento<\/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>C\u00f3mo funciona el c\u00e1lculo<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary>\n      <ol>\n        <li>Precio al p\u00fablico sin impuestos = precio con impuestos \u00f7 (1 + IVA).<\/li>\n        <li>El revendedor compra al precio sin impuestos \u00d7 (1 \u2212 su margen). El distribuidor, si lo hay, aplica su margen sobre ese precio.<\/li>\n        <li>El resultado es su precio de venta sin impuestos. Se restan las comisiones, el marketing, la promoci\u00f3n, el precio de compra y la log\u00edstica: lo que queda es su margen.<\/li>\n        <li>Precio m\u00e1ximo de compra = precio de venta sin impuestos \u00d7 (1 \u2212 comisiones \u2212 marketing \u2212 promoci\u00f3n \u2212 margen objetivo) \u2212 log\u00edstica.<\/li>\n        <li>Coeficiente = precio al p\u00fablico sin impuestos \u00f7 precio de compra. No depende del tipo de IVA, lo que permite comparar pa\u00edses.<\/li>\n        <li>Rango habitual del margen: el margen que obtiene cuando su precio al p\u00fablico se mantiene dentro del intervalo de coeficientes de su posicionamiento (consulte nuestros valores de referencia), con los m\u00e1rgenes y costos de su canal.<\/li>\n      <\/ol>\n      <p>Resultados orientativos. Los m\u00e1rgenes de los intermediarios var\u00edan seg\u00fan las cadenas comerciales, los pa\u00edses y sus acuerdos.<\/p>\n    <\/details>\n      <details class=\"px-method px-srcs\" id=\"px-srcs\">\n        <summary><span>Las <span id=\"px-srcs-n\">47<\/span> fuentes, con sus enlaces<\/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\">\u00bfLa cotizaci\u00f3n supera su precio m\u00e1ximo de compra? Seis formas de reducirla<\/h2>\n    <ul class=\"px-levers\">\n      <li><span class=\"px-lev-n\">01<\/span><b>Un frasco est\u00e1ndar<\/b><p>Un frasco que ya forma parte del cat\u00e1logo del fabricante evita los gastos de molde y cuesta menos que un modelo a medida.<\/p><\/li>\n      <li><span class=\"px-lev-n\">02<\/span><b>Una f\u00f3rmula existente adaptada<\/b><p>Partir de una f\u00f3rmula ya validada reduce el desarrollo y el n\u00famero de pruebas de estabilidad que debe pagar.<\/p><\/li>\n      <li><span class=\"px-lev-n\">03<\/span><b>Una decoraci\u00f3n m\u00e1s sencilla<\/b><p>Una etiqueta bien dise\u00f1ada cuesta menos que una serigraf\u00eda de varios colores o un estampado en caliente.<\/p><\/li>\n      <li><span class=\"px-lev-n\">04<\/span><b>El estuche, solo si es \u00fatil<\/b><p>Las farmacias y perfumer\u00edas suelen esperarlo. En la venta en l\u00ednea, muchas marcas prescinden de \u00e9l.<\/p><\/li>\n      <li><span class=\"px-lev-n\">05<\/span><b>Componentes compartidos<\/b><p>El mismo frasco y el mismo dosificador en varias referencias: compra m\u00e1s unidades de cada componente y, por tanto, a menor precio.<\/p><\/li>\n      <li><span class=\"px-lev-n\">06<\/span><b>Cotizaciones comparables<\/b><p>Compruebe qu\u00e9 incluye cada cotizaci\u00f3n: llenado, control de calidad, expediente de informaci\u00f3n del producto (PIF), evaluaci\u00f3n de seguridad.<\/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\">Preguntas frecuentes<\/h2><\/div>\n    <div class=\"px-faq-list\">\n      <details class=\"px-method\"><summary>\u00bfLa calculadora es realmente gratuita?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">S\u00ed. Responda a las cinco preguntas y el resultado aparecer\u00e1 al instante, sin registro ni correo electr\u00f3nico. Sin pagos ni compromiso.<\/p><\/details>\n      <details class=\"px-method\"><summary>\u00bfEs necesario fabricar con Carmel para usarla?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">No. El c\u00e1lculo es v\u00e1lido para cualquier fabricante. Utilice su precio m\u00e1ximo de compra para comparar y negociar todos sus presupuestos.<\/p><\/details>\n      <details class=\"px-method\"><summary>\u00bfDe d\u00f3nde proceden los m\u00e1rgenes de los revendedores?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">De informes anuales de grupos cosm\u00e9ticos y distribuidores, dict\u00e1menes de autoridades de competencia y tablas p\u00fablicas de comisiones. Las 47 fuentes figuran m\u00e1s arriba, con sus enlaces.<\/p><\/details>\n      <details class=\"px-method\"><summary>Vendo en varios canales: \u00bfqu\u00e9 precio debo mostrar?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">Marque todos sus canales. La calculadora propone un precio \u00fanico de venta al p\u00fablico, determinado por el canal m\u00e1s exigente, para que su producto cueste lo mismo en todos ellos. Tambi\u00e9n puede mostrar un precio por canal.<\/p><\/details>\n      <details class=\"px-method\"><summary>\u00bfPuedo basarme en los resultados para negociar?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">Son estimaciones orientativas fundamentadas, no un presupuesto. Los m\u00e1rgenes var\u00edan seg\u00fan las cadenas comerciales, los pa\u00edses y sus acuerdos. Si conoce los suyos, aj\u00fastelos en \u00abRevisar nuestros supuestos\u00bb.<\/p><\/details>\n      <details class=\"px-method\"><summary>Mi precio m\u00e1ximo de compra es demasiado bajo: \u00bfqu\u00e9 puedo hacer?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">Cambie de canal o de posicionamiento, aplique las seis medidas anteriores o solicite una consulta gratuita. Un responsable de proyecto estudia con usted la viabilidad del producto, las opciones de formulaci\u00f3n y envase y su objetivo de precio. La simulaci\u00f3n no es un presupuesto ni garantiza un precio de fabricaci\u00f3n.<\/p><\/details>\n      <details class=\"px-method\"><summary>\u00bfQu\u00e9 ocurre si solicito una consulta?<svg class=\"ico\"><use href=\"#i-down\"\/><\/svg><\/summary><p class=\"px-faq-a\">Indique su producto y sus datos de contacto en el formulario. La casilla \u00abAdjuntar mi simulaci\u00f3n\u00bb es opcional: si no la marca, no se adjunta ninguna simulaci\u00f3n. Un responsable de proyecto estudia su solicitud, sin compromiso. El precio de fabricaci\u00f3n se definir\u00e1 en el presupuesto.<\/p><\/details>\n    <\/div>\n    <script type=\"application\/ld+json\">{\"@context\": \"https:\/\/schema.org\", \"@type\": \"FAQPage\", \"mainEntity\": [{\"@type\": \"Question\", \"name\": \"\u00bfQu\u00e9 ocurre si solicito una consulta?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Indique su producto y sus datos de contacto en el formulario. La casilla \u00abAdjuntar mi simulaci\u00f3n\u00bb es opcional: si no la marca, no se adjunta ninguna simulaci\u00f3n. Un responsable de proyecto estudia su solicitud, sin compromiso. El precio de fabricaci\u00f3n se definir\u00e1 en el presupuesto.\"}}, {\"@type\": \"Question\", \"name\": \"\u00bfLa calculadora es realmente gratuita?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"S\u00ed. Responda a las cinco preguntas y el resultado aparecer\u00e1 al instante, sin registro ni correo electr\u00f3nico. Sin pagos ni compromiso.\"}}, {\"@type\": \"Question\", \"name\": \"\u00bfEs necesario fabricar con Carmel para usarla?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"No. El c\u00e1lculo es v\u00e1lido para cualquier fabricante. Utilice su precio m\u00e1ximo de compra para comparar y negociar todos sus presupuestos.\"}}, {\"@type\": \"Question\", \"name\": \"\u00bfDe d\u00f3nde proceden los m\u00e1rgenes de los revendedores?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"De informes anuales de grupos cosm\u00e9ticos y distribuidores, dict\u00e1menes de autoridades de competencia y tablas p\u00fablicas de comisiones. Las 47 fuentes figuran m\u00e1s arriba, con sus enlaces.\"}}, {\"@type\": \"Question\", \"name\": \"Vendo en varios canales: \u00bfqu\u00e9 precio debo mostrar?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Marque todos sus canales. La calculadora propone un precio \u00fanico de venta al p\u00fablico, determinado por el canal m\u00e1s exigente, para que su producto cueste lo mismo en todos ellos. Tambi\u00e9n puede mostrar un precio por canal.\"}}, {\"@type\": \"Question\", \"name\": \"\u00bfPuedo basarme en los resultados para negociar?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Son estimaciones orientativas fundamentadas, no un presupuesto. Los m\u00e1rgenes var\u00edan seg\u00fan las cadenas comerciales, los pa\u00edses y sus acuerdos. Si conoce los suyos, aj\u00fastelos en \u00abRevisar nuestros supuestos\u00bb.\"}}, {\"@type\": \"Question\", \"name\": \"Mi precio m\u00e1ximo de compra es demasiado bajo: \u00bfqu\u00e9 puedo hacer?\", \"acceptedAnswer\": {\"@type\": \"Answer\", \"text\": \"Cambie de canal o de posicionamiento, aplique las seis medidas anteriores o solicite una consulta gratuita. Un responsable de proyecto estudia con usted la viabilidad del producto, las opciones de formulaci\u00f3n y envase y su objetivo de precio. La simulaci\u00f3n no es un presupuesto ni garantiza un precio de fabricaci\u00f3n.\"}}]}<\/script>\n  <\/section>\n\n  <figure class=\"px-note\">\n    <blockquote>\n      <p>La primera pregunta que nos hacen casi siempre es: \u00bfcu\u00e1nto cuesta un frasco? Se plantea demasiado pronto. Primero debe saber cu\u00e1nto pagar\u00e1 su cliente, qu\u00e9 parte se quedar\u00e1n la farmacia, el distribuidor o el marketplace, y cu\u00e1nto le quedar\u00e1 a usted.<\/p>\n      <p>Sin esa cifra, se negocia a ciegas y se descubre demasiado tarde que un producto no deja margen. Hemos creado esta calculadora para que llegue a su primera reuni\u00f3n con un fabricante con su precio m\u00e1ximo de compra definido, ya sea con nosotros o con otro fabricante.<\/p>\n    <\/blockquote>\n    <figcaption><span class=\"px-note-av\" aria-hidden=\"true\">MH<\/span><span><b>Mohamed El Hjouji<\/b>Fundador, Carmel Cosmetics Labs<\/span><\/figcaption>\n  <\/figure>\n\n  <section class=\"px-cta\">\n    <div>\n      <h2>Con su precio m\u00e1ximo de compra definido, estudiemos su proyecto<\/h2>\n      <p>Hable de su producto con un responsable de proyecto de Carmel. Estudiar\u00e1 su viabilidad, su objetivo de precio y las opciones de formulaci\u00f3n y envase. El precio de fabricaci\u00f3n se definir\u00e1 en la cotizaci\u00f3n, sin garant\u00eda de que coincida con la simulaci\u00f3n. M\u00e1s de 500 marcas, en m\u00e1s de 35 pa\u00edses, ya nos han confiado su fabricaci\u00f3n.<\/p>\n    <\/div>\n    <button type=\"button\" class=\"px-btn\" data-consult-placement=\"bas-page\" aria-controls=\"px-consultation\" aria-expanded=\"false\">Consulta gratuita<svg class=\"ico\"><use href=\"#i-arrow\"\/><\/svg><\/button>\n  <\/section>\n\n  <p class=\"px-legal\"><b>Advertencia.<\/b> Esta calculadora ofrece estimaciones orientativas con fines informativos. Los resultados dependen de los supuestos introducidos y de promedios obtenidos de fuentes p\u00fablicas; no constituyen asesoramiento financiero, jur\u00eddico o fiscal, ni una oferta de precios de Carmel Cosmetics Labs. Los m\u00e1rgenes de los revendedores, las comisiones, los impuestos y los costos log\u00edsticos var\u00edan seg\u00fan los pa\u00edses, las cadenas comerciales y sus acuerdos. Antes de fijar su precio, investigue por su cuenta: precios de la competencia en tienda y en l\u00ednea, condiciones reales de sus distribuidores, cotizaciones de sus proveedores y, si es necesario, asesoramiento de un experto contable. La decisi\u00f3n sobre el precio de venta es suya.<\/p>\n <\/div>\n<\/div>\n\n<div class=\"px-dock\" id=\"px-dock\" aria-hidden=\"true\">\n  <div><span id=\"px-dock-k\">Precio al p\u00fablico recomendado<\/span><b id=\"px-dock-v\">\u2026<\/b><\/div>\n  <a href=\"#px-answer\">Ver el resultado<\/a>\n<\/div>\n\n<script>\n(function(){\n  const $ = id => document.getElementById(id);\n\n  const MARKETS = {\n    ma:{name:'Marruecos',cur:'MAD',vat:20,rate:10.8,help:'IVA: tipo general en Marruecos.'},\n    fr:{name:'Francia',cur:'EUR',vat:20,rate:1,help:'IVA: tipo general en Francia.'},\n    be:{name:'B\u00e9lgica',cur:'EUR',vat:21,rate:1,help:'IVA: tipo general en B\u00e9lgica.'},\n    es:{name:'Espa\u00f1a',cur:'EUR',vat:21,rate:1,help:'IVA: tipo general en Espa\u00f1a.'},\n    de:{name:'Alemania',cur:'EUR',vat:19,rate:1,help:'IVA (MwSt): tipo general en Alemania.'},\n    uk:{name:'Reino Unido',cur:'GBP',vat:20,rate:0.86,help:'IVA (VAT): tipo general en el Reino Unido.'},\n    ae:{name:'Emiratos',cur:'AED',vat:5,rate:4.0,help:'IVA en los Emiratos \u00c1rabes Unidos.'},\n    sa:{name:'Arabia Saudita',cur:'SAR',vat:15,rate:4.1,help:'IVA en Arabia Saudita.'},\n    us:{name:'Estados Unidos',cur:'USD',vat:0,rate:1.1,help:'En Estados Unidos, los precios al p\u00fablico se muestran sin el impuesto sobre las ventas (sales tax).'}\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:'Su sitio en l\u00ednea',short:'Sitio en l\u00ednea',r:0,d:0,f:3,am:8,ap:-4,L2:2.5,note:'En venta directa, usted paga las comisiones de pago y el env\u00edo de cada pedido.'},\n    {k:'mkp',name:'Marketplace',short:'Marketplace',r:0,d:0,f:15,am:3,ap:-4,L2:3,note:'Amazon cobra un 8 % en productos de belleza hasta 10 \u20ac y un 15 % por encima, sin incluir los gastos de env\u00edo (tarifas de vendedor de Amazon).'},\n    {k:'pha',name:'Farmacia',short:'Farmacia',r:35,d:0,f:0,am:0,ap:1,L2:0.3,note:'Los precios de parafarmacia son libres. El margen comercial medio de las farmacias francesas fue del 27,6 % en 2022, para el conjunto de los productos (Insee). No existe una cifra p\u00fablica para Marruecos.'},\n    {k:'sel',name:'Perfumer\u00eda',short:'Perfumer\u00eda',r:40,d:0,f:0,am:0,ap:4,L2:0.3,note:'En Francia, la Autoridad de la Competencia constat\u00f3 un precio recomendado de aproximadamente 1,97 veces el precio mayorista sin impuestos, es decir, cerca del 40 % del precio sin impuestos para el perfumista. En Estados Unidos, las cadenas se quedan entre el 50 y el 60 %.'},\n    {k:'gms',name:'Gran distribuci\u00f3n',short:'Gran distribuci\u00f3n',r:30,d:0,f:8,am:0,ap:3,L2:0.3,note:'Margen bruto de Walmart: 24 %, todas las categor\u00edas. Las cadenas suelen a\u00f1adir descuentos de fin de a\u00f1o y cooperaci\u00f3n comercial.'},\n    {k:'disc',name:'Cadenas discount',short:'Discount',r:22,d:0,f:2,am:0,ap:2,L2:0.3,note:'Margen bruto 2025: 19 % en BIM, 41 % en Action. Las cadenas discount exigen los precios m\u00e1s bajos del mercado.'},\n    {k:'spa',name:'Centros de est\u00e9tica y spas',short:'Centros de est\u00e9tica',r:50,d:0,f:0,am:-5,ap:0,L2:0.3,note:'Los centros de est\u00e9tica y los spas suelen revender al doble de su precio de compra (regla del \u00abkeystone\u00bb).'},\n    {k:'exp',name:'Exportaci\u00f3n',short:'Exportaci\u00f3n',r:40,d:25,f:0,am:-5,ap:-1,L2:0.2,note:'El distribuidor se queda con su margen y, despu\u00e9s, el revendedor local con el suyo.'}\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:'Hard discount',of:'primer precio',who:'las marcas discount',lvl:1,lo:1.5,hi:3,m:2,p:5,g:25,round:'low',desc:'El precio m\u00e1s bajo del lineal, un envase sencillo.',where:'Cadenas discount, primeros precios'},\n    {k:'mass',name:'Gran consumo',of:'gran consumo',who:'las marcas de gran consumo',lvl:2,lo:3,hi:5,m:9,p:7,g:35,round:'low',desc:'Accesible y presente en todas partes.',where:'Supermercados, comercio electr\u00f3nico'},\n    {k:'hdg',name:'Gama alta',of:'gama alta',who:'las marcas de gama alta',lvl:3,lo:5,hi:7,m:16,p:8,g:45,round:'mid',desc:'Activos elegidos, una marca cuidada.',where:'Farmacia, centros de est\u00e9tica, marcas digitales'},\n    {k:'lux',name:'Lujo',of:'lujo',who:'las marcas de lujo',lvl:4,lo:7,hi:10,m:22,p:6,g:55,round:'lux',desc:'Un objeto y una experiencia de marca.',where:'Perfumer\u00eda selectiva, grandes almacenes'}\n  ];\n  const BENCH = {\"intro\": \"El coeficiente compara el precio al p\u00fablico sin impuestos con el precio de compra de una unidad. Lo hemos reconstruido a partir de los m\u00e1rgenes brutos publicados por los grupos cosm\u00e9ticos y de los m\u00e1rgenes de los distribuidores, y lo hemos contrastado con la opini\u00f3n de expertos del sector. Estas referencias corresponden a marcas consolidadas: una marca joven suele comprar m\u00e1s caro y debe apuntar a la parte alta del rango.\", \"rows\": [{\"pos\": \"Hard discount\", \"k\": \"\u00d71,5 a \u00d73\", \"why\": \"A menudo la cadena es la marca: con un 19 % de margen bruto en BIM y un 41 % en Action, el precio de venta equivale a entre 1,2 y 1,7 veces el costo. Una marca que vende a un discounter a\u00f1ade su propio margen.\", \"src\": [1, 2]}, {\"pos\": \"Gran consumo\", \"k\": \"\u00d73 a \u00d75\", \"why\": \"Margen bruto de los grupos de gran consumo: 47 % en Unilever, 51 % en P&G, 58 % en Beiersdorf, 71 % en e.l.f. Margen de los distribuidores: 24 % en Walmart, 39 % en Ulta Beauty.\", \"src\": [3, 4, 5, 6, 7, 8]}, {\"pos\": \"Gama alta\", \"k\": \"\u00d75 a \u00d77\", \"why\": \"Margen bruto del 71 al 74 % (e.l.f., grupo L'Or\u00e9al), es decir, de 3,4 a 3,9 veces el costo, seguido del margen de la farmacia o de la cadena de belleza.\", \"src\": [6, 9, 10, 8]}, {\"pos\": \"Lujo\", \"k\": \"\u00d77 a \u00d710\", \"why\": \"Margen bruto del 74 al 77 % (Est\u00e9e Lauder, Puig, Shiseido), es decir, de 3,9 a 4,3 veces el costo, seguido de la distribuci\u00f3n selectiva. Los expertos entrevistados por Beauty Independent hablan de 8 a 10 veces el costo.\", \"src\": [11, 12, 13, 14, 15]}], \"notes\": [{\"t\": \"Precios en tienda de un cuidado facial de 50 ml (registro del 9 de octubre de 2026) : en Marruecos, de 30 a 90 MAD en primer precio, de 65 a 180 MAD en gran consumo, de 190 a 370 MAD en farmacia y gama alta, de 1 100 a 1 700 MAD en lujo (Lanc\u00f4me, Clarins, Est\u00e9e Lauder en Marionnaud). En Francia: de 2 a 6 \u20ac, de 4 a 15 \u20ac, de 16 a 40 \u20ac y de 85 a 140 \u20ac. La calculadora compara su precio con estos rangos.\", \"src\": [42, 43, 44, 45, 46, 47]}, {\"t\": \"Marketing : la publicidad y la promoci\u00f3n representan del 12 % (P&G) al 24 % (e.l.f. Beauty) de la facturaci\u00f3n de las marcas de gran consumo, del 22 % (Beiersdorf) al 32 % (L'Or\u00e9al) en los grupos premium, y del 25 % al 30 % (Est\u00e9e Lauder 25 %, Coty Prestige 28 %, Shiseido 29 %) en el lujo. Las referencias de la calculadora se derivan de ello.\", \"src\": [18, 19, 20, 21, 22, 3, 23, 13]}, {\"t\": \"Pago en l\u00ednea : Stripe cobra un 1,5 % + 0,25 \u20ac por tarjeta europea est\u00e1ndar. No existe ninguna referencia p\u00fablica fiable sobre los m\u00e1rgenes de los distribuidores en exportaci\u00f3n ni sobre los descuentos de la gran distribuci\u00f3n: la calculadora lo indica.\", \"src\": [24]}, {\"t\": \"Entrega : para su sitio en l\u00ednea, el costo por pedido (preparaci\u00f3n y entrega) procede de estudios publicados en 2025 y 2026 por proveedores log\u00edsticos europeos y estadounidenses, calculado por unidad con 1,3 productos por pedido. Ning\u00fan estudio independiente reciente publica este costo. La FEVAD sit\u00faa la cesta media en Francia en torno a 60 \u20ac. Para el marketplace, utilizamos los gastos de env\u00edo de Amazon. En Marruecos, utilizamos el costo constatado por Carmel: 40 MAD por env\u00edo. En los Emiratos y en Arabia Saudita no existe ning\u00fan estudio verificado: utilizamos la tarifa postal, se\u00f1alada como tal.\", \"src\": [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]}, {\"t\": \"Canales : Amazon cobra un 8 % y luego un 15 % en belleza; los centros de est\u00e9tica revenden al doble de su precio de compra.\", \"src\": [16, 17]}, {\"t\": \"L\u00edmites : los m\u00e1rgenes de los grandes grupos incluyen sus propias tiendas y compras a muy gran escala. No existe ning\u00fan dato p\u00fablico sobre los m\u00e1rgenes de la distribuci\u00f3n en Marruecos.\", \"src\": []}], \"sources\": [{\"t\": \"BIM, resultados del 4.\u00ba trimestre de 2025, p. 15\", \"u\": \"https:\/\/english.bim.com.tr\/investorPresentations\/2025\/BIM%204Q25%20Results%20Presentation.pdf\"}, {\"t\": \"3i Group, presentaci\u00f3n de Action 2026, p. 47\", \"u\": \"https:\/\/www.3i.com\/media\/0hkffvm0\/2026-action-cms-presentation_vfinal.pdf\"}, {\"t\": \"Unilever, resultados anuales 2025\", \"u\": \"https:\/\/data.fca.org.uk\/artefacts\/NSM\/RNS\/b82e96e8-7680-4ddf-8c41-f0bb2a051dd5.html\"}, {\"t\": \"Procter & Gamble, informe anual 10-K, ejercicio 2025\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/80424\/000008042425000076\/pg-20250630.htm\"}, {\"t\": \"Beiersdorf, informe anual 2025, cuenta de resultados\", \"u\": \"https:\/\/reports.beiersdorf.com\/annual-report\/2025\/consolidated-financial-statements\/consolidated-financial-statements\/income-statement.html\"}, {\"t\": \"e.l.f. Beauty, resultados del ejercicio 2026\", \"u\": \"https:\/\/investor.elfbeauty.com\/stock-and-financial\/press-releases\/landing-news\/2026\/05-20-2026-210538723\"}, {\"t\": \"Walmart, informe anual 10-K, ejercicio 2026\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/104169\/000010416926000055\/wmt-20260131.htm\"}, {\"t\": \"Ulta Beauty, resultados del ejercicio 2025\", \"u\": \"https:\/\/www.ulta.com\/investor\/news-events\/press-releases\/detail\/224\/ulta-beauty-announces-fourth-quarter-and-fiscal-2025\"}, {\"t\": \"L'Or\u00e9al, resultados anuales 2025\", \"u\": \"https:\/\/www.loreal-finance.com\/eng\/press-release\/2025-annual-results\"}, {\"t\": \"Insee Premi\u00e8re n.\u00ba 2036, las farmacias, enero de 2025\", \"u\": \"https:\/\/www.insee.fr\/fr\/statistiques\/fichier\/8341260\/ip2036.pdf\"}, {\"t\": \"Est\u00e9e Lauder Companies, resultados del ejercicio 2025\", \"u\": \"https:\/\/www.elcompanies.com\/en\/news-and-media\/newsroom\/press-releases\/2025\/08-20-2025-110025649\"}, {\"t\": \"Moodie Davitt Report, resultados 2025 de Puig, febrero de 2026\", \"u\": \"https:\/\/moodiedavittreport.com\/puig-records-7-8-revenue-growth-in-fy2025-outperforming-premium-beauty-market\/\"}, {\"t\": \"Shiseido, resultados 2025, p. 10\", \"u\": \"https:\/\/corp.shiseido.com\/en\/ir\/pdf\/ir20260210_244.pdf\"}, {\"t\": \"Autorit\u00e9 de la concurrence (Francia), decisi\u00f3n 06-D-04 sobre la perfumer\u00eda de lujo, 2006\", \"u\": \"https:\/\/autoritedelaconcurrence.fr\/sites\/default\/files\/commitments\/06d04.pdf\"}, {\"t\": \"Beauty Independent, \u00ab Is A 700% Retail Markup Too Much For A Beauty Product? \u00bb, Rachel Brown, marzo de 2020\", \"u\": \"https:\/\/www.beautyindependent.com\/retail-markup-beauty-product-fur-oil-shark-tank\/\"}, {\"t\": \"Amazon, tarifas de vendedor (categor\u00eda belleza)\", \"u\": \"https:\/\/sell.amazon.fr\/tarifs\"}, {\"t\": \"American Spa, \u00ab Launching your line \u00bb, julio de 2009\", \"u\": \"https:\/\/www.americanspa.com\/business\/launching-your-line\"}, {\"t\": \"L'Or\u00e9al, documento de registro universal 2025, gastos de publicidad y promoci\u00f3n\", \"u\": \"https:\/\/www.loreal-finance.com\/eng\/2025-universal-registration-document\/en\/article\/43\/\"}, {\"t\": \"Est\u00e9e Lauder Companies, informe anual 10-K, ejercicio 2026\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/0001001250\/000100125026000041\/el-20260630.htm\"}, {\"t\": \"Coty, informe anual 10-K, ejercicio 2025\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/1024305\/000102430525000030\/coty-20250630.htm\"}, {\"t\": \"e.l.f. Beauty, informe anual 10-K, ejercicio 2026\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/0001600033\/000160003326000020\/elf-20260331.htm\"}, {\"t\": \"Beiersdorf, informe de gesti\u00f3n 2025, resultados del grupo\", \"u\": \"https:\/\/reports.beiersdorf.com\/annual-report\/2025\/combined-management-report\/economic-report\/results-of-operations\/results-of-operations-group.html\"}, {\"t\": \"Procter & Gamble, informe anual 10-K, ejercicio 2026\", \"u\": \"https:\/\/www.sec.gov\/Archives\/edgar\/data\/0000080424\/000008042426000103\/pg-20260630.htm\"}, {\"t\": \"Stripe, tarifas en Francia\", \"u\": \"https:\/\/stripe.com\/fr\/pricing\"}, {\"t\": \"La Poste, tarifas Colissimo 2026\", \"u\": \"https:\/\/www.laposte.fr\/tarif-colissimo\"}, {\"t\": \"bpost, gu\u00eda pr\u00e1ctica de env\u00edos 2026\", \"u\": \"https:\/\/www.bpost.be\/sites\/default\/files\/pricing\/2026\/Praktische_gids_voor_particuliere_zendingen_2026_FR.pdf\"}, {\"t\": \"Correos, tarifas 2026 Pen\u00ednsula y Baleares\", \"u\": \"https:\/\/www.correos.es\/\"}, {\"t\": \"DHL, tarifas nacionales 2026\", \"u\": \"https:\/\/www.dhl.de\/en\/privatkunden\/pakete-versenden\/deutschlandweit-versenden\/preise-national.html\"}, {\"t\": \"Royal Mail, tarifas de paquetes en l\u00ednea 2026\", \"u\": \"https:\/\/www.royalmail.com\/current-postage-prices\/online-parcel-price-reduction\"}, {\"t\": \"Emirates Post, tarifas nacionales 2026\", \"u\": \"https:\/\/www.emiratespost.ae\/all-services\/domestic-rates\"}, {\"t\": \"SPL, paquete econ\u00f3mico\", \"u\": \"https:\/\/splonline.com.sa\/en\/economy\/\"}, {\"t\": \"USPS, Notice 123, tarifas al 4 de octubre de 2026\", \"u\": \"https:\/\/pe.usps.com\/text\/dmm300\/Notice123.htm\"}, {\"t\": \"Amazon, tabla de tarifas FBA Europa y Reino Unido, julio de 2026\", \"u\": \"https:\/\/m.media-amazon.com\/images\/G\/02\/sell\/images\/260630-FBA-Rate-Card-EN1.pdf\"}, {\"t\": \"Amazon.com, gastos de env\u00edo FBA\", \"u\": \"https:\/\/sellercentral.amazon.com\/help\/hub\/reference\/external\/GABBX6GZPA8MSZGW\"}, {\"t\": \"Amazon.ae, tarifas de vendedor\", \"u\": \"https:\/\/sell.amazon.ae\/pricing\"}, {\"t\": \"Amazon.sa, tarifas de vendedor\", \"u\": \"https:\/\/sell.amazon.sa\/pricing\"}, {\"t\": \"Masson International, costos log\u00edsticos 3PL en Europa, junio de 2025\", \"u\": \"https:\/\/www.massoninternational.com\/blog\/third-party-logistics-costs-europe\"}, {\"t\": \"Euroship Fulfillment, costo del fulfillment en Europa, septiembre de 2026\", \"u\": \"https:\/\/euroshipfulfillment.com\/blog\/fulfillment-cost-europe-breakdown\"}, {\"t\": \"UK Pre Fulfilment, tarifas de preparaci\u00f3n 2025\", \"u\": \"https:\/\/ukprefulfillment.com\/pick-pack-pricing-uk-2025-cost-breakdown\/\"}, {\"t\": \"Red Stag Fulfillment, tarifas 3PL explicadas, agosto de 2026\", \"u\": \"https:\/\/redstagfulfillment.com\/3pl-pricing-explained\/\"}, {\"t\": \"FEVAD, cifras clave del comercio electr\u00f3nico 2026\", \"u\": \"https:\/\/www.fevad.com\/ledition-2026-des-chiffres-cles-du-e-commerce\/\"}, {\"t\": \"Marjane Mall, crema Nivea 50 ml y cuidados de entrada de gama, registro de octubre de 2026\", \"u\": \"https:\/\/www.marjanemall.ma\/p\/NIV4005900573209\"}, {\"t\": \"Parachezvous.ma, La Roche-Posay, Av\u00e8ne, Bioderma, Vichy, registro de octubre de 2026\", \"u\": \"https:\/\/parachezvous.ma\/\"}, {\"t\": \"Marionnaud Marruecos, Lanc\u00f4me R\u00e9nergie, Clarins, Est\u00e9e Lauder, registro de octubre de 2026\", \"u\": \"https:\/\/marionnaud.ma\/products\/lancome-renergie-hpn-300-peptide\"}, {\"t\": \"Carrefour.fr, cremas faciales de marca de distribuidor, Nivea, Garnier, L'Or\u00e9al, registro de octubre de 2026\", \"u\": \"https:\/\/www.carrefour.fr\/\"}, {\"t\": \"Redcare Pharmacie, La Roche-Posay, Av\u00e8ne, Vichy, registro de octubre de 2026\", \"u\": \"https:\/\/www.redcare-pharmacie.fr\/\"}, {\"t\": \"Sephora.fr, Lanc\u00f4me R\u00e9nergie, Clarins, Est\u00e9e Lauder, precios de cat\u00e1logo, registro de octubre de 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:'en Marruecos',hd:[30,90],mass:[65,180],hdg:[190,370],lux:[1100,1700]},\n                 eur:{where:'en Francia',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 = ['Objetivo','Producto','Posicionamiento','Canales','Margen'];\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  [['Venta directa',['dtc','mkp']],['A trav\u00e9s de revendedores',['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% para el revendedor` : `Comisi\u00f3n ${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, \"Costo por pedido en Francia: preparaci\u00f3n 1,80 \u20ac y entrega 4,50 \u20ac (Masson International, 2025), hasta 10,20 \u20ac desde un almac\u00e9n en los Pa\u00edses Bajos (Euroship, 2026). Calculado por unidad con 1,3 productos por pedido (Euroship). Estudios de proveedores log\u00edsticos: cifras orientativas.\"], \"f\": [3.33, 5.07, 5.07, \"Amazon.fr, gastos de env\u00edo FBA julio de 2026: 3,33 \u20ac (sobre) a 5,07 \u20ac (paquete peque\u00f1o de hasta 400 g).\"]}, \"be\": {\"p\": [4.77, 5.92, 5.12, \"Costo por pedido en B\u00e9lgica: preparaci\u00f3n 1,95 \u20ac y entrega 4,70 \u20ac (Masson International, 2025), de 6,20 a 7,70 \u20ac desde los Pa\u00edses Bajos (Euroship, 2026). Calculado por unidad con 1,3 productos por pedido (Euroship). Estudios de proveedores log\u00edsticos: cifras orientativas.\"], \"f\": [2.47, 3.67, 3.67, \"Amazon.com.be, gastos de env\u00edo FBA julio de 2026: 2,47 \u20ac (sobre) a 3,67 \u20ac (paquete peque\u00f1o).\"]}, \"es\": {\"p\": [6.5, 9.38, 6.5, \"Costo por pedido en Espa\u00f1a: preparaci\u00f3n 2,20 \u20ac (Euroship, 2026) y entrega Correos 6,25 \u20ac sin impuestos, hasta 12,20 \u20ac desde los Pa\u00edses Bajos. Calculado por unidad con 1,3 productos por pedido (Euroship). Estudios de proveedores log\u00edsticos: cifras orientativas.\"], \"f\": [3.26, 3.74, 3.74, \"Amazon.es, gastos de env\u00edo FBA julio de 2026: 3,26 \u20ac (sobre) a 3,74 \u20ac (paquete peque\u00f1o).\"]}, \"de\": {\"p\": [5.15, 7.08, 6.12, \"Costo por pedido en Alemania: preparaci\u00f3n 2,20 \u20ac y entrega de 4,50 a 7,00 \u20ac (Euroship, 2026). Calculado por unidad con 1,3 productos por pedido (Euroship). Estudios de proveedores log\u00edsticos: cifras orientativas.\"], \"f\": [2.57, 3.39, 3.39, \"Amazon.de, gastos de env\u00edo FBA julio de 2026: 2,57 \u20ac (sobre) a 3,39 \u20ac (paquete peque\u00f1o).\"]}, \"uk\": {\"p\": [3.96, 4.5, 4.23, \"Costo por pedido en el Reino Unido: preparaci\u00f3n de 1,50 a 2,20 \u00a3 (UK Pre Fulfilment, 2025) y paquete con seguimiento de Royal Mail 3,65 \u00a3. Calculado por unidad con 1,3 productos por pedido (Euroship). Estudios de proveedores log\u00edsticos: cifras orientativas.\"], \"f\": [2.1, 3.0, 3.0, \"Amazon.co.uk, gastos de env\u00edo FBA julio de 2026: 2,10 \u00a3 (sobre) a 3,00 \u00a3 (paquete peque\u00f1o).\"]}, \"ae\": {\"p\": [9.2, 9.5, 9.2, \"Estimaci\u00f3n: no existe ning\u00fan estudio p\u00fablico en los Emiratos. Utilizamos los gastos de env\u00edo de Amazon.ae (preparaci\u00f3n y entrega incluidas), de 9,2 a 9,5 AED sin impuestos por producto (agosto de 2025).\"], \"f\": [9.2, 9.5, 9.2, \"Amazon.ae, gastos de env\u00edo FBA agosto de 2025: de 9,2 a 9,5 AED sin impuestos.\"]}, \"sa\": {\"p\": [9.2, 9.5, 9.2, \"Estimaci\u00f3n: no existe ning\u00fan estudio p\u00fablico en Arabia Saudita. Utilizamos los gastos de env\u00edo de Amazon.sa (preparaci\u00f3n y entrega incluidas), de 9,2 a 9,5 SAR sin impuestos por producto (agosto de 2025).\"], \"f\": [9.2, 9.5, 9.2, \"Amazon.sa, gastos de env\u00edo FBA agosto de 2025: de 9,2 a 9,5 SAR sin impuestos.\"]}, \"us\": {\"p\": [8.15, 9.42, 8.15, \"Costo por pedido en Estados Unidos: preparaci\u00f3n 3,25 $ (Red Stag Fulfillment, 2026) y entrega USPS 7,34 $, hasta 12,25 $ con un transportista terrestre (8 a 9 $). Calculado por unidad con 1,3 productos por pedido (Euroship). Estudios de proveedores log\u00edsticos: cifras orientativas.\"], \"f\": [3.54, 4.2, 3.95, \"Amazon.com, gastos de env\u00edo FBA 2026: de 3,54 a 4,20 $ seg\u00fan el peso (fuera de la temporada de fiestas).\"]}, \"ma\": {\"p\": [30.77, 30.77, 30.77, \"Costo constatado por Carmel Cosmetics Labs en Marruecos: 40 MAD por env\u00edo, preparaci\u00f3n y entrega incluidas, es decir, 30,77 MAD por producto con 1,3 productos por pedido.\"]}};\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, \"Margen comercial medio de las farmacias francesas: 27,6 % en 2022, todos los productos, medicamentos incluidos (Insee). La parafarmacia, a precios libres, suele situarse por encima.\"], \"sel\": [39, 60, \"Francia: aproximadamente 39 % (Autoridad de la Competencia, datos de 1999 a 2005). Estados Unidos: del 50 al 60 % (Beauty Independent, 2020).\"], \"gms\": [24, 39, \"No existe una cifra p\u00fablica espec\u00edfica de belleza en la gran distribuci\u00f3n. Referencias: margen bruto de Walmart, todas las categor\u00edas, 24 %; de Ulta Beauty, cadena especializada, 39 %.\"], \"disc\": [19, 41, \"Margen bruto 2025 de BIM: 19 %; de Action: 41 %.\"], \"spa\": [45, 50, \"Regla del \u00abkeystone\u00bb: reventa al doble del precio de compra (American Spa).\"]}, \"f\": {\"mkp\": [8, 15, \"Tarifas de vendedor de Amazon, categor\u00eda belleza: 8 % hasta 10 \u20ac, 15 % por encima, calculados sobre el precio pagado por el comprador (IVA incluido).\"], \"dtc\": [1.5, 3.2, \"Stripe: 1,5 % por tarjeta europea est\u00e1ndar, hasta 3,15 % para una tarjeta internacional. Los 0,25 \u20ac fijos por pedido se a\u00f1aden a la log\u00edstica.\"]}, \"m\": {\"pos\": {\"mass\": [12, 24], \"hdg\": [22, 32], \"lux\": [25, 30]}, \"src\": {\"mass\": \"Gasto en publicidad y promoci\u00f3n como porcentaje de la facturaci\u00f3n: P&G 12 %, Unilever 16 %, e.l.f. Beauty 24 %.\", \"hdg\": \"Gasto en publicidad y promoci\u00f3n como porcentaje de la facturaci\u00f3n: Beiersdorf 22 %, Est\u00e9e Lauder 25 % (con el desarrollo de producto), Coty 27 %, L'Or\u00e9al 32 %.\", \"lux\": \"Gasto en publicidad y promoci\u00f3n como porcentaje de la facturaci\u00f3n: Est\u00e9e Lauder 25 % (con el desarrollo de producto), Coty Prestige 28 %, Shiseido 29 %.\"}}};\n  function noneText(k,id){\n    if (id==='L2'){\n      if (k==='dtc'&&state.market==='ma') return 'Estimaci\u00f3n: no existe ning\u00fan estudio ni tarifa p\u00fablica verificada en Marruecos (Amana no publica sus tarifas de comercio electr\u00f3nico). Sustit\u00fayala por la cotizaci\u00f3n de su transportista.';\n      if (k==='mkp') return 'Estimaci\u00f3n: no hay tarifa p\u00fablica de la plataforma para este pa\u00eds. Sustit\u00fayala por su cotizaci\u00f3n.';\n      return 'Estimaci\u00f3n: no existe una tarifa p\u00fablica para la entrega en tienda. Sustit\u00fayala por la cotizaci\u00f3n de su transportista.';\n    }\n    return NONE[id]||'Sin referencia p\u00fablica.';\n  }\n  const NONE = {r:'Sin referencia p\u00fablica fiable para este canal.',d:'Sin referencia p\u00fablica fiable para los distribuidores de cosm\u00e9tica.',f:'Sin referencia p\u00fablica verificada para este canal.',m:'Sin referencia p\u00fablica: las marcas de primer precio invierten poco en publicidad.',L1:'Sin referencia: depende de su transportista y del pa\u00eds de origen.',L2:'Sin referencia: depende de su organizaci\u00f3n log\u00edstica.'};\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:'Tipo legal del pa\u00eds de venta.'};\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).toLowerCase()}, ${CH[k].short.toLowerCase()}`;\n  function hypDefs(k){\n    const c=CH[k], cu=MARKETS[state.market].cur, rate=MARKETS[state.market].rate;\n    const fHelp={dtc:'Comisiones de pago en l\u00ednea y suscripci\u00f3n de su tienda.',mkp:'Comisi\u00f3n que cobra la plataforma por cada venta.',gms:'Descuentos de fin de a\u00f1o y cooperaci\u00f3n comercial que exige la cadena.',disc:'Descuentos que exige la cadena.'}[k]||'Descuentos o comisiones que exige el canal.';\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:'Distribuci\u00f3n',sw:'var(--c-canal)',rows:[\n        {id:'r',lab:'Margen de la tienda',help:'Lo que se queda el revendedor sobre su precio de venta sin impuestos.',unit:'%',max:70,show:c.r>0},\n        {id:'d',lab:'Margen del distribuidor',help:'Lo que se queda el importador o el mayorista, antes de la tienda.',unit:'%',max:50,show:c.d>0},\n        {id:'f',lab:'Comisiones y descuentos',help:fHelp,unit:'%',max:30,show:c.f>0}]},\n      {g:'Marketing',sw:'var(--c-mkt)',rows:[\n        {id:'m',lab:'Publicidad e influencia',help:'Publicidad en l\u00ednea, influencers y contenidos, como porcentaje de lo que usted factura.',unit:'%',max:40,show:true},\n        {id:'p',lab:'Promoci\u00f3n',help:'Ofertas, probadores, muestras, PLV.',unit:'%',max:30,show:true}]},\n      {g:'Log\u00edstica',sw:'var(--c-fab)',rows:[\n        {id:'L1',lab:'Transporte y aduanas',help:'De la f\u00e1brica a su stock. Mismo importe para todos sus canales.',unit:cu,max:mMax,show:true},\n        {id:'L2',lab:'Entrega',help:k==='dtc'?'Preparaci\u00f3n del pedido y entrega al cliente, calculadas por producto.':k==='mkp'?'Gastos de env\u00edo de la plataforma, por producto.':'Entrega de sus cajas a la tienda, calculada por unidad.',unit:cu,max:mMax,show:true}]},\n      {g:'Impuestos',sw:'var(--c-tva)',rows:[\n        {id:'vat',lab:'IVA',help:MARKETS[state.market].help+' Mismo tipo para todos sus canales.',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=`Referencias para: ${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 ? 'Ocultar las partidas que no aplican' : `Mostrar las dem\u00e1s partidas (${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(`tienda ${fmt(v.r,1)}\u202f%`);\n    if (c.d>0||v.d>0) parts.push(`distribuidor ${fmt(v.d,1)}\u202f%`);\n    if (c.f>0||v.f>0) parts.push(`comisiones ${fmt(v.f,1)}\u202f%`);\n    parts.push(`marketing ${fmt(v.m+v.p,1)}\u202f%`, isFinite(state.vat)?`IVA ${fmt(state.vat,1)}\u202f%`:'IVA por indicar');\n    $('px-adv-sum').textContent = state.channels.length>1 ? `${state.channels.length} canales, ajustables uno por uno. ${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='Con la publicidad'; src.innerHTML='Se cuenta junto con la publicidad en la referencia de marketing.'; return; }\n      if (!bm){ el.dataset.s='na'; el.textContent='Sin referencia'; 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)} a ${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'?'Tipo legal':bm.total?`Marketing ${range}`:bm.money?'Referencia':`Referencia ${range}`}`;\n      const lbl = bm.total ? `Referencia de marketing total (publicidad + promoci\u00f3n), ${plain(posOf().name).toLowerCase()}: ${range}` : id==='vat' ? `Tipo legal: ${range}` : bm.money ? `Referencia ${MARKETS[state.market].name}, ${CH[k].short.toLowerCase()}: ${range} por producto` : `Referencia ${benchLabel(k)}: ${range}`;\n      src.innerHTML = `<b>${lbl}<\/b>${inside?'':` \u00b7 usted est\u00e1 en ${bm.money?money(val,2):fmt(val,1)+'\u202f%'}`}<br>${bm.src}`;\n    });\n    $('px-adv-sum').textContent += off ? ` ${off} valor${off>1?'es':''} fuera de referencia.` : ' Todos los valores con referencia est\u00e1n dentro de las referencias.';\n    const tot={'Distribuci\u00f3n':['r','d','f'],'Marketing':['m','p'],'Log\u00edstica':['L1','L2'],'Impuestos':['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> de ${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='Rango habitual'; out.removeAttribute('data-z'); return; }\n    const [lo,hi]=marginZone(o), x=posOf(), nm=plain(x.name).toLowerCase(), real=o.rows[o.bind].gReal*100, g=real;\n    const gap = Math.abs(real-state.g*100)>0.5 ? ` Con ${o.mode==='sell'?'el precio redondeado':'esta cotizaci\u00f3n'}, su margen real es del ${fmt(real,1)}\u202f%.` : '';\n    const where = o.multi ? `, en el canal m\u00e1s exigente (${o.rows[o.bind].name})` : ` (${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='Rango habitual';\n      out.dataset.z='low'; msg.dataset.z='low';\n      msg.innerHTML=`${icon('alert')}<span>Con estos costos, ning\u00fan margen permite alcanzar los precios habituales del segmento ${nm}. Revise el precio de compra, el canal o el posicionamiento.<\/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 ? `Rango habitual: hasta ${Math.min(MAX,Math.round(hi))} %` : `Rango habitual: ${Math.round(lo)} a ${Math.min(MAX,Math.round(hi))} %`;\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>Dentro del rango habitual del segmento ${nm}${where}.${gap}<\/span>`\n      : z==='low'\n      ? `${icon('alert')}<span>Margen fr\u00e1gil: puede que no cubra sus gastos fijos.${gap}<\/span>`\n      : `${icon('alert')}<span>Fuera de las referencias: ${sellM?'precio superior al de las marcas comparables, que su marca deber\u00e1 justificar.':'producto mucho m\u00e1s barato que el de las marcas comparables: compruebe la calidad.'}${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 ? 'Precio al p\u00fablico objetivo (con impuestos)' : 'Precio al p\u00fablico objetivo (sin impuesto sobre las ventas)';\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:'Indique el tipo de IVA.'};\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 `Complete los supuestos del canal ${c.name}.`;\n      if (c.r>=1||c.d>=1) return `${c.name}: el margen de un intermediario debe ser inferior al 100 %.`;\n      if (c.f+c.mp+g>=1) return `${c.name}: las comisiones, el marketing, la promoci\u00f3n y el margen objetivo superan el 100 % del precio de venta. Reduzca uno de estos porcentajes.`;\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:'Indique el precio de compra de su cotizaci\u00f3n.'};\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:'Indique el precio al p\u00fablico que busca.'};\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:`A este precio, la distribuci\u00f3n y sus gastos lo absorben todo${multi?' en todos sus canales':''}. Aumente el precio objetivo o reduzca el margen objetivo.`};\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'?'Indique el precio unitario de su cotizaci\u00f3n.':'Indique el precio al p\u00fablico que busca.';\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} canal${n>1?'es':''} elegido${n>1?'s':''}`; }\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=`Paso ${state.step} de 5`;\n    $('px-next').firstChild.textContent = state.step===5 ? (state.revealed?'Ver el an\u00e1lisis':'Ver mi resultado') : 'Continuar';\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} canales`;\n    const items=[\n      [state.mode==='sell'?`Cotizaci\u00f3n ${isFinite(num('px-A'))?money(num('px-A'),2):'?'}`:`Precio objetivo ${isFinite(num('px-P'))?money(num('px-P')):'?'}`,2],\n      [plain(x.name),3],[chs,4],[MARKETS[state.market].name,2],[`Margen ${Math.round(state.g*100)} %`,5]];\n    $('px-recap').innerHTML=items.map(([l,s])=>`<button type=\"button\" class=\"px-tok\" data-step=\"${s}\" aria-label=\"Modificar: ${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'?'Mi precio de venta':'Mi precio m\u00e1ximo de compra',\n      `${state.mode==='sell'?(A>0?'Cotizaci\u00f3n '+money(A,2):''):(P>0?'Precio objetivo '+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?'en curso':''}<\/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='Su resultado est\u00e1 listo.';\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'),'Canal mostrado'); 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>Margen<\/dt><dd>${val}${sub?`<small>${sub}<\/small>`:''}<\/dd><\/div>`;\n    if (sell){\n      if (o.per){\n        $('px-ans-label').textContent='Precio al p\u00fablico recomendado por canal';\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>margen ${pct(r.gReal)}<\/small><\/span><\/li>`).join('');\n        const ps=o.rows.map(r=>r.P);\n        $('px-dock-k').textContent='Precios recomendados'; $('px-dock-v').textContent=`${money(Math.min(...ps))} a ${money(Math.max(...ps))}`;\n      } else {\n        $('px-ans-label').textContent= o.multi ? `Precio al p\u00fablico recomendado, alineado en sus ${o.rows.length} canales` : 'Precio al p\u00fablico recomendado';\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>Margen por canal<\/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?'Por debajo de su margen objetivo a este precio':'Margen objetivo alcanzado'}\"><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='Precio al p\u00fablico recomendado'; $('px-dock-v').textContent=money(o.P);\n      }\n    } else {\n      $('px-ans-label').textContent='Precio m\u00e1ximo de compra';\n      $('px-big').innerHTML=bigHTML(o.Amax,2);\n      const imp = o.impossible.length ? ` \u00b7 ${o.impossible.join(', ')}: imposible a este precio` : '';\n      $('px-figs').innerHTML = o.quote>0 ? marginFig(pct(b.gReal), 'con esta cotizaci\u00f3n'+imp) : marginFig(pct(o.g), (o.multi?'como m\u00ednimo, en sus canales':'')+imp);\n      $('px-nego').innerHTML=`<span>Abrir en <b>${money(o.Aopen,2)}<\/b><\/span><span>Tope <b>${money(o.Aceil,2)}<\/b><\/span>`;\n      $('px-nego').title=`Apertura: 15 % por debajo del precio objetivo. Tope: su margen baja al ${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?'Dentro de su objetivo, en todos sus canales.':'Dentro de su objetivo.');\n        else if (o.quote<=o.Aceil) setStatus(qv,'warn',`Viable: a renegociar${where}.`);\n        else setStatus(qv,'bad',`Fuera de presupuesto${where}.`);\n      } else qv.hidden=true;\n      $('px-dock-k').textContent='Precio m\u00e1ximo de compra'; $('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).toLowerCase();\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)} a ${money(z,d2?2:0)}`;\n    const mb=shelfBand(x.k), shelf = mb ? `Precios en tienda ${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 = `Rango habitual del segmento: ${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=`Precio bajo para el segmento ${nm}`; long=`${shelf}. Estas marcas compran su producto a ${rng(aLo,aHi)} sin impuestos.`; }\n      else if (mb && o.P>mb.hi*1.1){ tone='warn'; short=`Por encima del mercado`; long=`${shelf}.`; }\n      else if (K<x.lo){ tone='warn'; short=`Margen ajustado para el segmento ${nm}`; long=`${coef}.`; }\n      else if (K>x.hi){ tone='warn'; short=`Precio alto para el segmento ${nm}`; long=`${coef}.`; }\n      else { tone='good'; short=`Coherente con el segmento ${nm}`; long= mb ? `${shelf}.` : `${coef}.`; }\n    } else {\n      const lo=o.HT\/x.hi, hi=o.HT\/x.lo, buyTxt=`Compra habitual a este precio: ${rng(lo,hi,1)} sin impuestos`;\n      if (mb && (o.P<mb.lo*0.9 || o.P>mb.hi*1.1)){ tone='warn'; short = o.P<mb.lo*0.9 ? `Precio objetivo bajo para el segmento ${nm}` : `Precio objetivo por encima del mercado`; long=`${shelf}.`; }\n      else if (o.quote>0){\n        if (Aref>hi){ tone='warn'; short=`Cotizaci\u00f3n alta para el segmento ${nm}`; long=`${buyTxt}.`; }\n        else if (Aref<lo){ tone='good'; short=`Cotizaci\u00f3n baja para el segmento ${nm}`; long=`${buyTxt}. Compruebe la calidad.`; }\n        else { tone='good'; short=`Cotizaci\u00f3n coherente con el segmento ${nm}`; long=`${buyTxt}.`; }\n      }\n      else if (Aref<lo){ tone='warn'; short=`Presupuesto de compra ajustado`; long=`${buyTxt}.`; }\n      else if (Aref>hi){ tone='good'; short=`Presupuesto de compra holgado`; long=`${buyTxt}.`; }\n      else { tone='good'; short=`Coherente con el segmento ${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:'Demasiado ajustado'},{a:1.5,b:3,l:'Discount',k:'hd'},{a:3,b:5,l:'Gran consumo',k:'mass'},{a:5,b:7,l:'Gama alta',k:'hdg'},{a:7,b:10,l:'Lujo',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>Su precio<\/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' ? 'Su precio' : (num('px-quote')>0 ? 'Su cotizaci\u00f3n' : 'Su precio de compra');\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:'Precio de compra al fabricante',v:o.A},{g:0,l:'Log\u00edstica',v:o.L},\n      {g:1,l:'Publicidad e influencia',v:o.m*o.R},{g:1,l:'Promoci\u00f3n',v:o.pr*o.R},\n      {g:2,l:'Margen de la marca',v:o.net},\n      {g:3,l:'Comisiones y descuentos',v:o.f*o.R},{g:3,l:'Margen del distribuidor',v:o.W-o.R},{g:3,l:'Margen del revendedor',v:o.HT-o.W},\n      {g:4,l:'IVA',v:o.P-o.HT}\n    ];\n    const G=[{l:'Fabricaci\u00f3n',c:'var(--k-fab)'},{l:'Marketing',c:'var(--k-mkt)'},{l:'Su margen',c:'var(--k-marge)',you:1},{l:'Distribuci\u00f3n',c:'var(--k-canal)'},{l:'Impuestos',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','Reparto del precio al p\u00fablico: '+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>el m\u00e1s exigente<\/small>' : '';\n    if (o.mode==='sell'){\n      $('px-ct-head').innerHTML=`<tr><th>Canal<\/th><th>Precio recomendado solo para este canal<\/th><th>Precio alineado<\/th><th>Usted factura (sin impuestos)<\/th><th>Su margen<\/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        ? 'Un precio por canal mantiene el mismo margen en todas partes, pero sus revendedores ver\u00e1n las diferencias. Mant\u00e9ngalas reducidas entre canales visibles para un mismo cliente.'\n        : `Un precio \u00fanico protege a sus revendedores y su imagen. Lo fija el canal de reventa m\u00e1s exigente.${o.rows.some(r=>r.online&&r.gReal<o.g-0.005)?' En l\u00ednea, el margen es m\u00e1s bajo a este precio por la entrega: haga que el cliente pague una parte de los gastos de env\u00edo o acepte este margen.':''}`;\n    } else {\n      $('px-ct-head').innerHTML=`<tr><th>Canal<\/th><th>Precio m\u00e1ximo de compra<\/th><th>Usted factura (sin impuestos)<\/th><th>${o.quote>0?'Margen con esta cotizaci\u00f3n':'Margen al precio objetivo'}<\/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?'Imposible a este precio':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='Su precio de compra debe encajar en el canal m\u00e1s exigente. Si un canal resulta demasiado caro, puede vender m\u00e1s caro en \u00e9l o retirarlo.';\n    }\n  }\n\n  const SRC_GROUPS=[\n    {t:'M\u00e1rgenes de las marcas y de los distribuidores',ids:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]},\n    {t:'Marketing y promoci\u00f3n',ids:[18,19,20,21,22,23]},\n    {t:'Comisiones y pago',ids:[16,17,24]},\n    {t:'Entrega y log\u00edstica',ids:[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]},\n    {t:'Precios en tienda, registro de octubre de 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}: coeficiente ${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${\/^L\u00edmites\/.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=['Calculadora de precios cosm\u00e9ticos (Carmel Cosmetics Labs)',\n      `${plain(x.name)} \u00b7 ${MARKETS[state.market].name} \u00b7 margen objetivo ${pct(o.g)}`];\n    if (o.mode==='sell'){\n      lines.push(`Precio de compra: ${money(o.A,2)} sin impuestos`);\n      if (o.multi && !o.per) lines.push(`Precio al p\u00fablico \u00fanico recomendado: ${money(o.P,2)} con impuestos`);\n      o.rows.forEach(r=>lines.push(`${r.name}: ${money(r.P,2)} con impuestos, usted factura ${money(r.R,2)} sin impuestos, margen ${pct(r.gReal)}`));\n    } else {\n      lines.push(`Precio al p\u00fablico objetivo: ${money(o.P,2)} con impuestos`,`Precio de compra objetivo: ${money(o.Amax,2)} sin impuestos (apertura ${money(o.Aopen,2)}, tope ${money(o.Aceil,2)})`);\n      if (o.multi) o.rows.forEach(r=>lines.push(`${r.name}: precio m\u00e1ximo de compra ${money(r.Amax,2)} sin impuestos`));\n      if (o.quote>0) lines.push(`Cotizaci\u00f3n probada: ${money(o.quote,2)}`);\n    }\n    lines.push('Precio orientativo, que debe contrastar con su propia investigaci\u00f3n (competencia, condiciones de los revendedores, cotizaciones).','https:\/\/carmelcosmeticslabs.com\/es\/');\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,'','Supuestos actuales (orientativos)',\n      `Moneda: ${cur()} \u00b7 IVA: ${fmt(state.vat,1)} % \u00b7 margen objetivo: ${pct(state.g)}`,\n      `Transporte y aduanas por producto: ${money(state.L1,2)} sin impuestos \u00b7 redondeo psicol\u00f3gico: ${$('px-round').checked?'s\u00ed':'no'}`,\n      `Estrategia: ${state.strategy==='per'?'precio por canal':'precio al p\u00fablico \u00fanico'}`];\n    if(state.market==='us') lines.push('Estados Unidos: precio al p\u00fablico sin sales tax (IVA del c\u00e1lculo: 0 %).');\n    state.channels.forEach(k=>{\n      const v=cv[k],r=last.rows.find(row=>row.k===k);\n      lines.push(`${CH[k].short}: revendedor ${fmt(v.r,1)} %, distribuidor ${fmt(v.d,1)} %, comisiones\/descuentos introducidos ${fmt(v.f,1)} %${r?', efectivas '+pct(r.f)+' de la facturaci\u00f3n sin impuestos de la marca':''}, publicidad ${fmt(v.m,1)} %, promoci\u00f3n ${fmt(v.p,1)} %, entrega ${money(v.L2,2)} sin impuestos\/producto.`);\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||'Complete los cinco pasos con valores v\u00e1lidos para adjuntar su simulaci\u00f3n.'):'';\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='Copiado'; }\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='Copiado';}catch(_){lab.textContent='No se pudo copiar';} ta.remove(); }\n    setTimeout(()=>lab.textContent='Copiar',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=\"\/es\/wp-json\/wp\/v2\/pages\/66635\" data-token=\"3c9a22d42aad869fcbeeb4c87d813b64\" data-token-time=\"1794438889\"><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\">Por favor, activa JavaScript en tu navegador para completar este formulario.<\/noscript><div id=\"wpforms-error-noscript\" style=\"display: none;\">Por favor, activa JavaScript en tu navegador para completar este formulario.<\/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\">Website<\/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=\"1794438889.f00c543a69cb23442aeccc6ed511f220cf55d4615ee7cd21216974da817c937c\"><input type=\"hidden\" name=\"page_title\" value=\"\"><input type=\"hidden\" name=\"page_url\" value=\"https:\/\/carmelcosmeticslabs.com\/es\/wp-json\/wp\/v2\/pages\/66635\"><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=\"Cargando\" 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-66635","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/carmelcosmeticslabs.com\/es\/wp-json\/wp\/v2\/pages\/66635","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/carmelcosmeticslabs.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/carmelcosmeticslabs.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/carmelcosmeticslabs.com\/es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/carmelcosmeticslabs.com\/es\/wp-json\/wp\/v2\/comments?post=66635"}],"version-history":[{"count":3,"href":"https:\/\/carmelcosmeticslabs.com\/es\/wp-json\/wp\/v2\/pages\/66635\/revisions"}],"predecessor-version":[{"id":66906,"href":"https:\/\/carmelcosmeticslabs.com\/es\/wp-json\/wp\/v2\/pages\/66635\/revisions\/66906"}],"wp:attachment":[{"href":"https:\/\/carmelcosmeticslabs.com\/es\/wp-json\/wp\/v2\/media?parent=66635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}