[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-commerce-des-articles-de-sports-et-d-equipements-de-fr":83,"footer-cities-fr":140},[4,14,22,30,38,45,53,60,67,75],{"seo_content":5,"id":8,"name":9,"slug":10,"parentId":7,"lang":11,"_count":12},[6],{"page_slug":7},null,"cmkzhl7xm00dbulbc93h4qog5","Juridique","avocats","fr-FR",{"experts":13},8,{"seo_content":15,"id":17,"name":18,"slug":19,"parentId":7,"lang":11,"_count":20},[16],{"page_slug":7},"cmkzhl84700djulbcbv6pzu9e","Informatique","informaticiens",{"experts":21},3,{"seo_content":23,"id":25,"name":26,"slug":27,"parentId":7,"lang":11,"_count":28},[24],{"page_slug":7},"cmkzhlaos00gnulbc07i9jrco","Amélioration de la Maison","artisans",{"experts":29},4,{"seo_content":31,"id":33,"name":34,"slug":35,"parentId":7,"lang":11,"_count":36},[32],{"page_slug":7},"cmkzhlaqg00gpulbcx38bwoc2","Général","divers-generalistes",{"experts":37},0,{"seo_content":39,"id":41,"name":42,"slug":43,"parentId":7,"lang":11,"_count":44},[40],{"page_slug":7},"cmkzhlbvq00i3ulbcutdbcz50","Électronique Grand Public","techniciens-electronique",{"experts":21},{"seo_content":46,"id":48,"name":49,"slug":50,"parentId":7,"lang":11,"_count":51},[47],{"page_slug":7},"cmkzhlcaw00ilulbc38pxoogr","Santé","medecins",{"experts":52},5,{"seo_content":54,"id":56,"name":57,"slug":58,"parentId":7,"lang":11,"_count":59},[55],{"page_slug":7},"cmkzhlcmi00izulbcxva1m47f","Gestion de Patrimoine","conseillers-patrimoniaux",{"experts":21},{"seo_content":61,"id":63,"name":64,"slug":65,"parentId":7,"lang":11,"_count":66},[62],{"page_slug":7},"cmkzhldcv00jvulbcmcd5a7mk","Animaux et Vétérinaires","veterinaires",{"experts":21},{"seo_content":68,"id":70,"name":71,"slug":72,"parentId":7,"lang":11,"_count":73},[69],{"page_slug":7},"cmkzhldrr00kdulbchxfo67eg","Mécanique et Réparation","mecaniciens",{"experts":74},1,{"seo_content":76,"id":78,"name":79,"slug":80,"parentId":7,"lang":11,"_count":81},[77],{"page_slug":7},"cmkzhl9l300fbulbcv3i8q8p3","Aide aux Devoirs","professeurs-particuliers",{"experts":82},6,{"slug":84,"title":85,"page_title":86,"description":87,"content_md":88,"local_slug":84,"json_ld":89,"faq":109,"tool_html":134,"source":135,"category":136,"audience":137,"publish_mode":138,"hero_image":139,"hero_image_alt":85},"ccn-commerce-des-articles-de-sports-et-d-equipements-de","CCN du commerce des articles de sports et d'équipements de loisirs — calculateur complet","Calculateur CCN Commerce Articles de Sports IDCC 1557 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté et les congés de la CCN du commerce des articles de sports et d'équipements de loisirs (IDCC 1557).","Ce calculateur couvre les 5 principales dispositions de la CCN IDCC 1557 : l'indemnité de licenciement (comparée au barème légal L1234-9), la durée du préavis par catégorie (1 à 3 mois), la grille de salaires minima conventionnels 2024, la prime d'ancienneté progressive (jusqu'à 15 % du SMC) et les congés payés avec bonifications enfants.",[90],{"name":91,"@type":92,"about":93,"author":97,"@context":100,"isPartOf":101,"inLanguage":104,"description":105,"operatingSystem":106,"applicationCategory":107,"isAccessibleForFree":108},"Calculateur CCN Commerce des articles de sports et d'équipements de loisirs — IDCC 1557","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective nationale du commerce des articles de sports et d'équipements de loisirs","Thing","IDCC 1557",{"name":98,"@type":99},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":102,"@type":103},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté et les congés de la convention collective du commerce des articles de sports et d'équipements de loisirs (IDCC 1557).","All","FinanceApplication",true,[110,113,116,119,122,125,128,131],{"a":111,"q":112},"La CCN 1557 prévoit 1\u002F5 de mois de salaire brut par année d'ancienneté pour les 10 premières années, puis 1\u002F5 + 2\u002F15 au-delà. Toutefois, cette formule étant moins favorable que l'article L1234-9 du Code du travail (1\u002F4 mois pour ≤ 10 ans, 1\u002F3 mois au-delà), l'employeur doit verser le montant légal minimal, qui s'avère systématiquement plus avantageux sur les 10 premières années.","Quelle est l'indemnité de licenciement dans la CCN du commerce des articles de sports (IDCC 1557) ?",{"a":114,"q":115},"La CCN 1557 (Accord du 30 septembre 2021) fixe : 1 mois pour une ancienneté inférieure à 2 ans (ouvriers, employés, techniciens et agents de maîtrise) ; 2 mois pour une ancienneté d'au moins 2 ans ; 3 mois pour les cadres, quelle que soit leur ancienneté. Le salarié licencié bénéficie de 2 heures par jour ouvré pour rechercher un emploi.","Quelle est la durée du préavis dans la convention collective IDCC 1557 ?",{"a":117,"q":118},"Selon l'Avenant du 9 février 2024, les salaires minima mensuels bruts pour 35 h\u002Fsemaine sont : O1\u002FEmployé N1 : 1 767 € (= SMIC) ; O2 : 1 795 € ; O3 : 1 819 € ; O4 : 1 858 € ; Agent de maîtrise coef. 220 : 1 975 € ; coef. 250 : 2 090 € ; coef. 280 : 2 210 € ; Cadre coef. 320 : 2 497 € ; jusqu'à 3 814 € pour le coef. 550.","Quels sont les salaires minima de la CCN du commerce des articles de sports en 2024 ?",{"a":120,"q":121},"Oui. La CCN 1557 impose une prime d'ancienneté mensuelle égale à 1 % du salaire minimum conventionnel (SMC) du groupe 3 par tranche de 2 ans d'ancienneté, plafonnée à 15 %. Les salariés du groupe 1 bénéficient en outre d'une bonification supplémentaire de 5 % dès 3 ans d'ancienneté. Cette prime figure obligatoirement sur une ligne distincte du bulletin de paie.","La CCN 1557 prévoit-elle une prime d'ancienneté ?",{"a":123,"q":124},"La CCN 1557 applique les 30 jours ouvrables légaux (L3141-3). Elle ajoute 2 jours ouvrables supplémentaires par enfant de moins de 15 ans à charge pour les femmes salariées et les apprentis de moins de 21 ans. En cas de rappel pendant les congés, le salarié gagne 2 jours de congé supplémentaires.","Les congés payés de la CCN du commerce des articles de sports diffèrent-ils de la loi ?",{"a":126,"q":127},"La CCN 1557 est alignée sur le Code du travail : +25 % pour les 8 premières heures supplémentaires par semaine (36e–43e heure) et +50 % au-delà (44e heure et plus). Le contingent annuel d'heures supplémentaires est fixé à 220 heures. Les heures au-delà du contingent ouvrent droit à un repos compensateur obligatoire.","Quelles sont les majorations pour heures supplémentaires dans la CCN 1557 ?",{"a":129,"q":130},"La CCN IDCC 1557 couvre les salariés des établissements du commerce de détail et de gros d'articles de sports, de loisirs et d'équipements outdoor : magasins de sport, vélo, fitness, camping, ski, randonnée, etc. Elle s'applique aux entreprises dont l'activité principale relève du code NAF 47.64Z ou 46.49Z selon les cas.","Qui est couvert par la convention collective IDCC 1557 ?",{"a":132,"q":133},"La CCN 1557 ne prévoit pas de 13e mois au sens classique. Elle garantit une rémunération annuelle minimale correspondant à 12 fois le salaire minimum conventionnel (SMC). La prime d'ancienneté constitue le principal avantage salarial conventionnel, versée mensuellement en supplément du salaire de base.","La CCN 1557 prévoit-elle un 13e mois ?","\u003C!DOCTYPE html>\n\u003Chtml lang=\"fr\">\n\u003Chead>\n  \u003Cmeta charset=\"utf-8\">\n  \u003Cmeta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n  \u003Ctitle>Calculateur CCN Commerce Articles de Sports — IDCC 1557\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n    :root {\n      --bg: #fafaf9;\n      --surface: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #eff6ff;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --success: #16a34a;\n      --warning: #d97706;\n      --warning-light: #fffbeb;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n    }\n    body { background: var(--bg); font-family: system-ui, -apple-system, sans-serif; color: var(--text); font-size: 15px; line-height: 1.5; }\n    .tool-root { max-width: 680px; margin: 0 auto; padding: 1.25rem 1rem 1.5rem; }\n    .tool-header { margin-bottom: 1.25rem; }\n    .tool-header h1 { font-size: 1.15rem; font-weight: 700; color: var(--text); line-height: 1.3; }\n    .tool-header .idcc-badge { display: inline-flex; align-items: center; gap: 0.3rem; background: var(--accent-light); color: var(--accent); font-size: 0.75rem; font-weight: 600; padding: 0.2rem 0.55rem; border-radius: 99px; margin-top: 0.4rem; }\n    \u002F* Tabs *\u002F\n    .tabs-bar { display: flex; gap: 0.25rem; overflow-x: auto; padding-bottom: 0; border-bottom: 2px solid var(--border); margin-bottom: 1.25rem; scrollbar-width: none; }\n    .tabs-bar::-webkit-scrollbar { display: none; }\n    .tab-btn { flex-shrink: 0; padding: 0.55rem 1rem; font-size: 0.82rem; font-weight: 600; color: var(--text-muted); background: none; border: none; border-bottom: 2.5px solid transparent; margin-bottom: -2px; cursor: pointer; transition: color 0.15s, border-color 0.15s; border-radius: 0.35rem 0.35rem 0 0; white-space: nowrap; }\n    .tab-btn:hover { color: var(--accent); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }\n    \u002F* Panels *\u002F\n    .panel { display: none; }\n    .panel.active { display: block; }\n    \u002F* Rule callout *\u002F\n    .rule-callout { display: flex; gap: 0.65rem; align-items: flex-start; background: var(--accent-light); border: 1px solid #bfdbfe; border-radius: var(--radius-sm); padding: 0.75rem 1rem; margin-bottom: 1.1rem; }\n    .rule-callout svg { flex-shrink: 0; color: var(--accent); margin-top: 0.1rem; }\n    .rule-callout p { font-size: 0.85rem; color: #1e40af; line-height: 1.45; }\n    .rule-callout strong { font-weight: 700; }\n    \u002F* Warning callout *\u002F\n    .warn-callout { display: flex; gap: 0.65rem; align-items: flex-start; background: var(--warning-light); border: 1px solid #fcd34d; border-radius: var(--radius-sm); padding: 0.75rem 1rem; margin-bottom: 1.1rem; }\n    .warn-callout svg { flex-shrink: 0; color: var(--warning); margin-top: 0.1rem; }\n    .warn-callout p { font-size: 0.85rem; color: #92400e; line-height: 1.45; }\n    \u002F* Form *\u002F\n    .field { margin-bottom: 1rem; }\n    .field label { display: flex; justify-content: space-between; align-items: center; font-size: 0.83rem; font-weight: 600; color: var(--text); margin-bottom: 0.4rem; }\n    .field label .val { font-weight: 700; color: var(--accent); font-variant-numeric: tabular-nums; }\n    input[type=range] { width: 100%; accent-color: var(--accent); height: 4px; cursor: pointer; }\n    .pills { display: flex; flex-wrap: wrap; gap: 0.4rem; }\n    .pill { padding: 0.35rem 0.75rem; font-size: 0.8rem; font-weight: 600; border: 1.5px solid var(--border); border-radius: 99px; cursor: pointer; background: var(--surface); color: var(--text-muted); transition: all 0.12s; }\n    .pill.active { background: var(--accent); border-color: var(--accent); color: #fff; }\n    select { width: 100%; padding: 0.5rem 0.75rem; border: 1.5px solid var(--border); border-radius: var(--radius-sm); font-size: 0.88rem; background: var(--surface); color: var(--text); cursor: pointer; }\n    select:focus { outline: 2px solid var(--accent); outline-offset: 1px; }\n    .toggle-row { display: flex; align-items: center; justify-content: space-between; padding: 0.5rem 0; }\n    .toggle-row span { font-size: 0.83rem; font-weight: 600; }\n    .toggle { position: relative; width: 44px; height: 24px; }\n    .toggle input { opacity: 0; width: 0; height: 0; }\n    .toggle .slider { position: absolute; inset: 0; background: #d6d3d1; border-radius: 99px; cursor: pointer; transition: background 0.15s; }\n    .toggle .slider::before { content: ''; position: absolute; width: 18px; height: 18px; left: 3px; top: 3px; background: white; border-radius: 50%; transition: transform 0.15s; }\n    .toggle input:checked + .slider { background: var(--accent); }\n    .toggle input:checked + .slider::before { transform: translateX(20px); }\n    \u002F* Result *\u002F\n    .result-card { background: var(--surface); border: 1.5px solid var(--border); border-radius: var(--radius); padding: 1.1rem 1.25rem; margin-top: 1.25rem; }\n    .result-card .result-label { font-size: 0.78rem; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 0.3rem; }\n    .result-card .result-value { font-size: 1.75rem; font-weight: 800; color: var(--accent); font-variant-numeric: tabular-nums; }\n    .result-card .result-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 0.3rem; }\n    .result-card .result-detail { font-size: 0.8rem; color: var(--text-muted); margin-top: 0.6rem; padding-top: 0.6rem; border-top: 1px solid var(--border); }\n    \u002F* Grid table *\u002F\n    .grid-table { width: 100%; border-collapse: collapse; font-size: 0.82rem; margin-top: 0.5rem; }\n    .grid-table th { background: #f5f5f4; font-weight: 700; padding: 0.4rem 0.6rem; text-align: left; border: 1px solid var(--border); }\n    .grid-table td { padding: 0.4rem 0.6rem; border: 1px solid var(--border); font-variant-numeric: tabular-nums; }\n    .grid-table tr:nth-child(even) td { background: #fafaf9; }\n    .grid-table .highlight td { color: var(--accent); font-weight: 700; }\n    \u002F* Disclaimer *\u002F\n    .disclaimer { font-size: 0.75rem; color: var(--text-muted); margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--border); line-height: 1.5; }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n    \u002F* Section label *\u002F\n    .section-label { font-size: 0.78rem; font-weight: 700; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.6rem; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1557 — deviations\n     indemnite: L1234-9 (1\u002F4+1\u002F3) → CCN 1\u002F5 + 2\u002F15 au-delà de 10 ans (MOINS favorable — plafonné par L1234-9)\n     preavis: L1234-1 → 1 mois (\u003C2 ans), 2 mois (≥2 ans), 3 mois (cadres)\n     salaire-min: grille par niveau O1→cadre 5, Avenant 2024\n     prime-anciennete: 1% par tranche de 2 ans, max 15% du SMC groupe 3\n     conges: 30j ouvrables (aligné) + bonification enfants\n     (source: Legifrance KALICONT000005635645, Accord du 30\u002F09\u002F2021, Accord du 09\u002F02\u002F2024) -->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Calculateur — CCN Commerce des articles de sports et d'équipements de loisirs\u003C\u002Fh1>\n    \u003Cdiv class=\"idcc-badge\">\u003Ci data-lucide=\"tag\" style=\"width:12px;height:12px\">\u003C\u002Fi> IDCC 1557\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Tab bar -->\n  \u003Cdiv class=\"tabs-bar\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">Indemnité licenciement\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">Préavis\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire\" role=\"tab\">Grille salaires\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"anciennete\" role=\"tab\">Prime ancienneté\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">Congés\u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- === PANEL: INDEMNITE === -->\n  \u003Cdiv class=\"panel\" data-panel=\"indemnite\" id=\"panel-indemnite\">\n    \u003Cdiv class=\"warn-callout\">\n      \u003Ci data-lucide=\"alert-triangle\" style=\"width:18px;height:18px;flex-shrink:0\">\u003C\u002Fi>\n      \u003Cp>La CCN 1557 prévoit \u003Cstrong>1\u002F5 de mois × années (≤ 10 ans)\u003C\u002Fstrong> et \u003Cstrong>1\u002F5 + 2\u002F15 de mois × années (> 10 ans)\u003C\u002Fstrong> — formule \u003Cstrong>moins favorable\u003C\u002Fstrong> que L1234-9 (1\u002F4 + 1\u002F3). La loi s'applique en priorité : le calcul ci-dessous utilise automatiquement le barème légal minimal.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Salaire brut de référence \u003Cspan class=\"val\" id=\"ind-sal-val\">2 500 €\u002Fmois\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"ind-sal\" min=\"1400\" max=\"8000\" step=\"50\" value=\"2500\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Ancienneté \u003Cspan class=\"val\" id=\"ind-anc-val\">5 ans\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"40\" step=\"1\" value=\"5\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-label\">Motif de rupture\u003C\u002Fdiv>\n      \u003Cdiv class=\"pills\" id=\"ind-motif\">\n        \u003Cbutton class=\"pill active\" data-val=\"pe\">Cause personnelle\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"eco\">Licenciement économique\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"retraite\">Mise à la retraite\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Indemnité brute estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ind-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"ind-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"ind-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- === PANEL: PREAVIS === -->\n  \u003Cdiv class=\"panel\" data-panel=\"preavis\" id=\"panel-preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:18px;height:18px;flex-shrink:0\">\u003C\u002Fi>\n      \u003Cp>La CCN 1557 fixe des durées précises : \u003Cstrong>1 mois\u003C\u002Fstrong> (ancienneté \u003C 2 ans) ou \u003Cstrong>2 mois\u003C\u002Fstrong> (≥ 2 ans) pour les non-cadres ; \u003Cstrong>3 mois\u003C\u002Fstrong> pour les cadres. Les salariés licenciés bénéficient de 2 heures\u002Fjour payées pour rechercher un emploi.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-label\">Catégorie professionnelle\u003C\u002Fdiv>\n      \u003Cdiv class=\"pills\" id=\"pre-cat\">\n        \u003Cbutton class=\"pill active\" data-val=\"emp\">Ouvrier \u002F Employé \u002F TAM\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\" id=\"pre-anc-field\">\n      \u003Clabel>Ancienneté \u003Cspan class=\"val\" id=\"pre-anc-val\">3 ans\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"pre-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"3\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Durée du préavis\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pre-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"pre-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\">Droit à 2 heures de recherche d'emploi par jour ouvré travaillé, rémunérées, en cas de licenciement.\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- === PANEL: SALAIRE MIN === -->\n  \u003Cdiv class=\"panel\" data-panel=\"salaire\" id=\"panel-salaire\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:18px;height:18px;flex-shrink:0\">\u003C\u002Fi>\n      \u003Cp>La CCN 1557 publie une \u003Cstrong>grille de salaires minima conventionnels\u003C\u002Fstrong> par niveau\u002Féchelon (Avenant du 9 février 2024). Les minima s'appliquent pour 35 h\u002Fsemaine et sont supérieurs au SMIC dès le niveau O2.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-label\">Catégorie \u002F Niveau\u003C\u002Fdiv>\n      \u003Cselect id=\"sal-niveau\">\n        \u003Coptgroup label=\"Ouvriers \u002F Employés\">\n          \u003Coption value=\"O1\">O1 \u002F Employé niveau 1 — 1 767 €\u003C\u002Foption>\n          \u003Coption value=\"O2\">O2 \u002F Employé niveau 2 — 1 795 €\u003C\u002Foption>\n          \u003Coption value=\"O3\">O3 \u002F Employé niveau 3 — 1 819 €\u003C\u002Foption>\n          \u003Coption value=\"O4\">O4 \u002F Employé niveau 4 — 1 858 €\u003C\u002Foption>\n        \u003C\u002Foptgroup>\n        \u003Coptgroup label=\"Agents de maîtrise \u002F Techniciens\">\n          \u003Coption value=\"AM1\">Agent de maîtrise coef. 220 — 1 975 €\u003C\u002Foption>\n          \u003Coption value=\"AM2\">Agent de maîtrise coef. 250 — 2 090 €\u003C\u002Foption>\n          \u003Coption value=\"AM3\">Agent de maîtrise coef. 280 — 2 210 €\u003C\u002Foption>\n        \u003C\u002Foptgroup>\n        \u003Coptgroup label=\"Cadres\">\n          \u003Coption value=\"C1\">Cadre coef. 320 — 2 497 €\u003C\u002Foption>\n          \u003Coption value=\"C2\">Cadre coef. 380 — 2 780 €\u003C\u002Foption>\n          \u003Coption value=\"C3\">Cadre coef. 450 — 3 150 €\u003C\u002Foption>\n          \u003Coption value=\"C4\">Cadre coef. 500 — 3 520 €\u003C\u002Foption>\n          \u003Coption value=\"C5\">Cadre coef. 550 — 3 814 €\u003C\u002Foption>\n        \u003C\u002Foptgroup>\n      \u003C\u002Fselect>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Durée hebdomadaire \u003Cspan class=\"val\" id=\"sal-h-val\">35 h\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"sal-h\" min=\"20\" max=\"39\" step=\"0.5\" value=\"35\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Salaire minimum conventionnel\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"sal-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"sal-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"sal-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv style=\"margin-top:1.1rem\">\n      \u003Cdiv class=\"section-label\">Grille complète (35 h\u002Fsemaine)\u003C\u002Fdiv>\n      \u003Ctable class=\"grid-table\">\n        \u003Cthead>\n          \u003Ctr>\u003Cth>Niveau\u003C\u002Fth>\u003Cth>Catégorie\u003C\u002Fth>\u003Cth>Salaire min.\u002Fmois\u003C\u002Fth>\u003C\u002Ftr>\n        \u003C\u002Fthead>\n        \u003Ctbody>\n          \u003Ctr>\u003Ctd>O1\u003C\u002Ftd>\u003Ctd>Ouvrier\u002FEmployé N1\u003C\u002Ftd>\u003Ctd>1 767 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>O2\u003C\u002Ftd>\u003Ctd>Ouvrier\u002FEmployé N2\u003C\u002Ftd>\u003Ctd>1 795 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>O3\u003C\u002Ftd>\u003Ctd>Ouvrier\u002FEmployé N3\u003C\u002Ftd>\u003Ctd>1 819 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>O4\u003C\u002Ftd>\u003Ctd>Ouvrier\u002FEmployé N4\u003C\u002Ftd>\u003Ctd>1 858 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>AM coef. 220\u003C\u002Ftd>\u003Ctd>Agent de maîtrise\u003C\u002Ftd>\u003Ctd>1 975 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>AM coef. 250\u003C\u002Ftd>\u003Ctd>Agent de maîtrise\u003C\u002Ftd>\u003Ctd>2 090 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>AM coef. 280\u003C\u002Ftd>\u003Ctd>Agent de maîtrise\u003C\u002Ftd>\u003Ctd>2 210 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>C coef. 320\u003C\u002Ftd>\u003Ctd>Cadre\u003C\u002Ftd>\u003Ctd>2 497 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>C coef. 380\u003C\u002Ftd>\u003Ctd>Cadre\u003C\u002Ftd>\u003Ctd>2 780 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>C coef. 450\u003C\u002Ftd>\u003Ctd>Cadre\u003C\u002Ftd>\u003Ctd>3 150 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>C coef. 500\u003C\u002Ftd>\u003Ctd>Cadre\u003C\u002Ftd>\u003Ctd>3 520 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>C coef. 550\u003C\u002Ftd>\u003Ctd>Cadre\u003C\u002Ftd>\u003Ctd>3 814 €\u003C\u002Ftd>\u003C\u002Ftr>\n        \u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- === PANEL: PRIME ANCIENNETE === -->\n  \u003Cdiv class=\"panel\" data-panel=\"anciennete\" id=\"panel-anciennete\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:18px;height:18px;flex-shrink:0\">\u003C\u002Fi>\n      \u003Cp>La CCN 1557 institue une \u003Cstrong>prime d'ancienneté mensuelle\u003C\u002Fstrong> : \u003Cstrong>+1 % du SMC groupe 3\u003C\u002Fstrong> par tranche de 2 ans d'ancienneté, plafonnée à \u003Cstrong>15 %\u003C\u002Fstrong>. Les salariés du groupe 1 bénéficient d'une majoration supplémentaire de \u003Cstrong>5 %\u003C\u002Fstrong> dès 3 ans. Aucune obligation légale n'existe — c'est un avantage conventionnel.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Ancienneté \u003Cspan class=\"val\" id=\"anc-anc-val\">4 ans\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"anc-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"4\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-label\">Groupe professionnel\u003C\u002Fdiv>\n      \u003Cdiv class=\"pills\" id=\"anc-grp\">\n        \u003Cbutton class=\"pill active\" data-val=\"g1\">Groupe 1 (employés)\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"g2\">Groupes 2–6 (TAM\u002Fcadres)\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Clabel>SMC groupe 3 de référence \u003Cspan class=\"val\" id=\"anc-smc-val\">1 819 €\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"anc-smc\" min=\"1767\" max=\"2000\" step=\"1\" value=\"1819\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Prime d'ancienneté mensuelle\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"anc-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"anc-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"anc-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- === PANEL: CONGES === -->\n  \u003Cdiv class=\"panel\" data-panel=\"conges\" id=\"panel-conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:18px;height:18px;flex-shrink:0\">\u003C\u002Fi>\n      \u003Cp>La CCN 1557 retient les \u003Cstrong>30 jours ouvrables légaux\u003C\u002Fstrong> (L3141-3), avec des \u003Cstrong>bonifications pour enfants à charge\u003C\u002Fstrong> : +2 jours ouvrables par enfant de moins de 15 ans (pour les femmes salariées et les apprentis de moins de 21 ans). En cas de rappel pendant les congés, +2 jours de congé supplémentaires.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Clabel>Ancienneté \u003Cspan class=\"val\" id=\"cg-anc-val\">2 ans\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"cg-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"2\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"section-label\">Situation\u003C\u002Fdiv>\n      \u003Cdiv class=\"toggle-row\">\n        \u003Cspan>Femme salariée ou apprenti(e) \u003C 21 ans\u003C\u002Fspan>\n        \u003Clabel class=\"toggle\">\u003Cinput type=\"checkbox\" id=\"cg-bonif\">\u003Cspan class=\"slider\">\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\" id=\"cg-enfants-field\" style=\"display:none\">\n      \u003Clabel>Nombre d'enfants \u003C 15 ans \u003Cspan class=\"val\" id=\"cg-enf-val\">1\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"cg-enf\" min=\"0\" max=\"6\" step=\"1\" value=\"1\">\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"field\">\n      \u003Cdiv class=\"toggle-row\">\n        \u003Cspan>Rappelé(e) pendant les congés\u003C\u002Fspan>\n        \u003Clabel class=\"toggle\">\u003Cinput type=\"checkbox\" id=\"cg-rappel\">\u003Cspan class=\"slider\">\u003C\u002Fspan>\u003C\u002Flabel>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Congés annuels (jours ouvrables)\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"cg-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"cg-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"cg-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Shared disclaimer -->\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN IDCC 1557 (Commerce des articles de sports et d'équipements de loisirs).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635645\u002F\" target=\"_blank\" rel=\"noopener\">Legifrance — KALICONT000005635645\u003C\u002Fa>.\n    Les montants sont donnés à titre indicatif. Pour une validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n(function() {\n  \u002F\u002F ─── Utilities ────────────────────────────────────────────\n  const fmt = (n) => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 }).format(n);\n  const fmtDec = (n) => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(n);\n\n  \u002F\u002F ─── Tab system ───────────────────────────────────────────\n  const tabBtns = document.querySelectorAll('.tab-btn');\n  const panels = document.querySelectorAll('.panel');\n\n  function activate(id) {\n    tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n    panels.forEach(p => {\n      const active = p.dataset.panel === id;\n      p.classList.toggle('active', active);\n      p.style.display = active ? 'block' : 'none';\n    });\n    try { if (location.hash !== '#' + id) location.hash = id; } catch(e) {}\n    requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));\n  }\n  tabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n  const hashTab = location.hash.slice(1);\n  const validTab = hashTab && document.querySelector(`[data-tab=\"${hashTab}\"]`) ? hashTab : tabBtns[0].dataset.tab;\n  activate(validTab);\n\n  \u002F\u002F ─── PANEL: INDEMNITE ────────────────────────────────────\n  const indState = { sal: 2500, anc: 5, motif: 'pe' };\n\n  function computeInd() {\n    const { sal, anc, motif } = indState;\n    \u002F\u002F Code du travail L1234-9 (always more favorable than CCN 1\u002F5)\n    const legal = anc \u003C= 10\n      ? (1\u002F4) * sal * anc\n      : (1\u002F4) * sal * 10 + (1\u002F3) * sal * (anc - 10);\n    \u002F\u002F CCN 1557 (1\u002F5 + 2\u002F15 au-delà de 10 ans)\n    const ccn = anc \u003C= 10\n      ? (1\u002F5) * sal * anc\n      : (1\u002F5) * sal * 10 + (1\u002F5 + 2\u002F15) * sal * (anc - 10);\n    const used = Math.max(legal, ccn);\n    return { legal, ccn, used, anc };\n  }\n\n  function renderInd() {\n    const r = computeInd();\n    document.getElementById('ind-result').textContent = fmtDec(r.used);\n    document.getElementById('ind-result-sub').textContent =\n      `Base : code du travail L1234-9 (plus favorable que la CCN)`;\n    document.getElementById('ind-detail').innerHTML =\n      `Calcul légal L1234-9 : ${fmtDec(r.legal)} &nbsp;·&nbsp; Calcul CCN 1557 : ${fmtDec(r.ccn)}\u003Cbr>` +\n      `Le salarié bénéficie du barème le plus favorable : \u003Cstrong>${fmtDec(r.used)}\u003C\u002Fstrong>.`;\n  }\n\n  document.getElementById('ind-sal').addEventListener('input', e => {\n    indState.sal = +e.target.value;\n    document.getElementById('ind-sal-val').textContent = fmt(indState.sal) + '\u002Fmois';\n    renderInd();\n  });\n  document.getElementById('ind-anc').addEventListener('input', e => {\n    indState.anc = +e.target.value;\n    document.getElementById('ind-anc-val').textContent = indState.anc + ' an' + (indState.anc > 1 ? 's' : '');\n    renderInd();\n  });\n  document.querySelectorAll('#ind-motif .pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.querySelectorAll('#ind-motif .pill').forEach(x => x.classList.remove('active'));\n      p.classList.add('active');\n      indState.motif = p.dataset.val;\n      renderInd();\n    });\n  });\n  document.getElementById('ind-sal-val').textContent = fmt(indState.sal) + '\u002Fmois';\n  document.getElementById('ind-anc-val').textContent = indState.anc + ' an' + (indState.anc > 1 ? 's' : '');\n  renderInd();\n\n  \u002F\u002F ─── PANEL: PREAVIS ──────────────────────────────────────\n  const preState = { cat: 'emp', anc: 3 };\n\n  function computePre() {\n    const { cat, anc } = preState;\n    if (cat === 'cadre') return { duree: 3, unite: 'mois', label: '3 mois (cadre)' };\n    if (anc \u003C 2) return { duree: 1, unite: 'mois', label: '1 mois (ancienneté \u003C 2 ans)' };\n    return { duree: 2, unite: 'mois', label: '2 mois (ancienneté ≥ 2 ans)' };\n  }\n\n  function renderPre() {\n    const r = computePre();\n    document.getElementById('pre-result').textContent = r.duree + ' ' + r.unite;\n    document.getElementById('pre-result-sub').textContent = r.label;\n  }\n\n  document.querySelectorAll('#pre-cat .pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.querySelectorAll('#pre-cat .pill').forEach(x => x.classList.remove('active'));\n      p.classList.add('active');\n      preState.cat = p.dataset.val;\n      const ancField = document.getElementById('pre-anc-field');\n      ancField.style.display = preState.cat === 'cadre' ? 'none' : '';\n      renderPre();\n    });\n  });\n  document.getElementById('pre-anc').addEventListener('input', e => {\n    preState.anc = +e.target.value;\n    document.getElementById('pre-anc-val').textContent = preState.anc + ' an' + (preState.anc > 1 ? 's' : '');\n    renderPre();\n  });\n  document.getElementById('pre-anc-val').textContent = preState.anc + ' an' + (preState.anc > 1 ? 's' : '');\n  renderPre();\n\n  \u002F\u002F ─── PANEL: SALAIRE MIN ───────────────────────────────────\n  const salGrid = {\n    O1: 1767, O2: 1795, O3: 1819, O4: 1858,\n    AM1: 1975, AM2: 2090, AM3: 2210,\n    C1: 2497, C2: 2780, C3: 3150, C4: 3520, C5: 3814\n  };\n  const salLabels = {\n    O1: 'O1 — Ouvrier\u002FEmployé N1', O2: 'O2 — Ouvrier\u002FEmployé N2',\n    O3: 'O3 — Ouvrier\u002FEmployé N3', O4: 'O4 — Ouvrier\u002FEmployé N4',\n    AM1: 'Agent de maîtrise coef. 220', AM2: 'Agent de maîtrise coef. 250', AM3: 'Agent de maîtrise coef. 280',\n    C1: 'Cadre coef. 320', C2: 'Cadre coef. 380', C3: 'Cadre coef. 450',\n    C4: 'Cadre coef. 500', C5: 'Cadre coef. 550'\n  };\n  const salState = { niveau: 'O1', h: 35 };\n  const SMIC_35H = 1767;\n\n  function computeSal() {\n    const base = salGrid[salState.niveau];\n    const prorata = base * (salState.h \u002F 35);\n    const diff = prorata - (SMIC_35H * salState.h \u002F 35);\n    return { base, prorata, diff };\n  }\n\n  function renderSal() {\n    const r = computeSal();\n    document.getElementById('sal-result').textContent = fmtDec(r.prorata);\n    document.getElementById('sal-result-sub').textContent = salLabels[salState.niveau] + ' · ' + salState.h + ' h\u002Fsemaine';\n    document.getElementById('sal-detail').innerHTML = r.diff > 0\n      ? `Écart avec le SMIC : \u003Cstrong>+${fmtDec(r.diff)}\u002Fmois\u003C\u002Fstrong> (base 35 h = ${fmt(salGrid[salState.niveau])}).`\n      : `Égal au SMIC (base 35 h = ${fmt(salGrid[salState.niveau])}).`;\n  }\n\n  document.getElementById('sal-niveau').addEventListener('change', e => {\n    salState.niveau = e.target.value;\n    renderSal();\n  });\n  document.getElementById('sal-h').addEventListener('input', e => {\n    salState.h = +e.target.value;\n    document.getElementById('sal-h-val').textContent = salState.h + ' h';\n    renderSal();\n  });\n  renderSal();\n\n  \u002F\u002F ─── PANEL: PRIME ANCIENNETE ──────────────────────────────\n  const ancState = { anc: 4, grp: 'g1', smc: 1819 };\n\n  function computeAnc() {\n    const { anc, grp, smc } = ancState;\n    const tranches = Math.floor(anc \u002F 2);\n    const taux = Math.min(tranches * 0.01, 0.15);\n    const bonusG1 = grp === 'g1' && anc >= 3 ? 0.05 : 0;\n    const tauxTotal = Math.min(taux + bonusG1, 0.15 + (grp === 'g1' ? 0.05 : 0));\n    const montant = smc * tauxTotal;\n    return { taux, bonusG1, tauxTotal, montant, tranches };\n  }\n\n  function renderAnc() {\n    const r = computeAnc();\n    document.getElementById('anc-result').textContent = r.montant > 0 ? fmtDec(r.montant) : '0 €';\n    document.getElementById('anc-result-sub').textContent =\n      `Taux : ${(r.tauxTotal * 100).toFixed(0)} % du SMC groupe 3 (${fmt(ancState.smc)})`;\n    let detail = `Tranche d'ancienneté : ${r.tranches} × 1 % = ${(r.taux * 100).toFixed(0)} %`;\n    if (r.bonusG1 > 0) detail += ` + 5 % (groupe 1, ≥ 3 ans)`;\n    detail += `.`;\n    document.getElementById('anc-detail').textContent = detail;\n  }\n\n  document.getElementById('anc-anc').addEventListener('input', e => {\n    ancState.anc = +e.target.value;\n    document.getElementById('anc-anc-val').textContent = ancState.anc + ' an' + (ancState.anc > 1 ? 's' : '');\n    renderAnc();\n  });\n  document.getElementById('anc-smc').addEventListener('input', e => {\n    ancState.smc = +e.target.value;\n    document.getElementById('anc-smc-val').textContent = fmt(ancState.smc);\n    renderAnc();\n  });\n  document.querySelectorAll('#anc-grp .pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.querySelectorAll('#anc-grp .pill').forEach(x => x.classList.remove('active'));\n      p.classList.add('active');\n      ancState.grp = p.dataset.val;\n      renderAnc();\n    });\n  });\n  document.getElementById('anc-anc-val').textContent = ancState.anc + ' an' + (ancState.anc > 1 ? 's' : '');\n  renderAnc();\n\n  \u002F\u002F ─── PANEL: CONGES ────────────────────────────────────────\n  const cgState = { anc: 2, bonif: false, enfants: 1, rappel: false };\n\n  function computeCg() {\n    const base = 30;\n    const enfBonus = cgState.bonif ? cgState.enfants * 2 : 0;\n    const rappelBonus = cgState.rappel ? 2 : 0;\n    return { base, enfBonus, rappelBonus, total: base + enfBonus + rappelBonus };\n  }\n\n  function renderCg() {\n    const r = computeCg();\n    document.getElementById('cg-result').textContent = r.total + ' jours ouvrables';\n    document.getElementById('cg-result-sub').textContent = `Base légale : ${r.base} j` +\n      (r.enfBonus > 0 ? ` + ${r.enfBonus} j enfants` : '') +\n      (r.rappelBonus > 0 ? ` + ${r.rappelBonus} j rappel` : '');\n    let detail = '';\n    if (r.enfBonus > 0) detail += `+${r.enfBonus} jours pour ${cgState.enfants} enfant(s) \u003C 15 ans. `;\n    if (r.rappelBonus > 0) detail += '+2 jours en cas de rappel pendant les congés.';\n    document.getElementById('cg-detail').textContent = detail || 'Droit aux 30 jours ouvrables légaux, sans bonification supplémentaire.';\n  }\n\n  document.getElementById('cg-anc').addEventListener('input', e => {\n    cgState.anc = +e.target.value;\n    document.getElementById('cg-anc-val').textContent = cgState.anc + ' an' + (cgState.anc > 1 ? 's' : '');\n    renderCg();\n  });\n  document.getElementById('cg-bonif').addEventListener('change', e => {\n    cgState.bonif = e.target.checked;\n    document.getElementById('cg-enfants-field').style.display = cgState.bonif ? '' : 'none';\n    renderCg();\n  });\n  document.getElementById('cg-enf').addEventListener('input', e => {\n    cgState.enfants = +e.target.value;\n    document.getElementById('cg-enf-val').textContent = cgState.enfants;\n    renderCg();\n  });\n  document.getElementById('cg-rappel').addEventListener('change', e => {\n    cgState.rappel = e.target.checked;\n    renderCg();\n  });\n  document.getElementById('cg-anc-val').textContent = cgState.anc + ' an' + (cgState.anc > 1 ? 's' : '');\n  renderCg();\n\n  \u002F\u002F ─── Lucide icons + ResizeObserver ───────────────────────\n  if (window.lucide) lucide.createIcons();\n\n  const ro = new ResizeObserver(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n  ro.observe(document.documentElement);\n\n  window.addEventListener('resize', () => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n})();\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-commerce-des-articles-de-sports-et-d-equipements-de-3a4787d225.webp",[]]