[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-entreprises-du-bureau-et-du-numerique-commerces-et-fr":83,"footer-cities-fr":147},[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":140,"source":141,"category":142,"audience":143,"publish_mode":144,"hero_image":145,"hero_image_alt":146},"ccn-entreprises-du-bureau-et-du-numerique-commerces-et","CCN des entreprises du bureau et du numérique – Commerces et services — calculateur complet","Calculateur CCN Entreprises du Bureau et du Numérique IDCC 1539 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille de salaires, la prime d'ancienneté et les congés payés de la CCN IDCC 1539 (Brochure JO 3252).","Ce calculateur couvre les 5 fonctions clés de la CCN Entreprises du bureau et du numérique (IDCC 1539) : indemnité de licenciement (formule conventionnelle vs légale), durée du préavis (non-cadres et cadres), grille de salaires minimaux 2025 (niveaux A1 à C4), prime d'ancienneté progressive et jours de congés supplémentaires selon l'ancienneté.",[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 Entreprises du Bureau et du Numérique — IDCC 1539","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective des entreprises du bureau et du numérique – Commerces et services","Thing","IDCC 1539",{"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 de salaires, la prime d'ancienneté et les congés payés de la convention collective des entreprises du bureau et du numérique – Commerces et services (IDCC 1539).","All","FinanceApplication",true,[110,113,116,119,122,125,128,131,134,137],{"a":111,"q":112},"La CCN IDCC 1539 prévoit une indemnité de 1\u002F10 de mois de salaire par année d'ancienneté jusqu'à 10 ans, puis 1\u002F12 de mois au-delà. Attention : la formule légale (Code du travail art. L1234-9 : 1\u002F4 + 1\u002F3) est généralement plus favorable — c'est toujours le montant le plus avantageux pour le salarié qui s'applique.","Quelle est la formule de l'indemnité de licenciement dans la CCN 1539 entreprises du bureau et du numérique ?",{"a":114,"q":115},"La CCN 1539 prévoit pour les non-cadres : 2 semaines si ancienneté \u003C 6 mois, 1 mois de 6 mois à 2 ans, et 2 mois pour ≥ 2 ans d'ancienneté (en cas de licenciement). Pour les cadres, le préavis est de 3 mois quelle que soit l'ancienneté.","Quelle est la durée du préavis dans la convention collective entreprises du bureau et du numérique (IDCC 1539) ?",{"a":117,"q":118},"La grille salariale de la CCN 1539 (avenant du 28 août 2024, applicable au 1er janvier 2025) va de 1 805 € brut\u002Fmois au niveau A1 (coefficient 140) à 4 690 € brut\u002Fmois au niveau C4 (coefficient 500), pour 35 heures hebdomadaires (151,67 h\u002Fmois).","Quels sont les salaires minimaux de la convention collective 1539 en 2025 ?",{"a":120,"q":121},"Oui. La CCN entreprises du bureau et du numérique (IDCC 1539) prévoit une prime d'ancienneté progressive pour les non-cadres : 3 % du salaire à 3 ans d'ancienneté, 6 % à 6 ans, 9 % à 9 ans, jusqu'à un maximum de 15 % après 15 ans. Le code du travail ne prévoit aucune prime d'ancienneté obligatoire : il s'agit d'un avantage propre à cette convention.","La CCN 1539 prévoit-elle une prime d'ancienneté ?",{"a":123,"q":124},"La CCN 1539 accorde des jours de congés supplémentaires selon l'ancienneté, au-delà du minimum légal de 30 jours ouvrables. Pour les non-cadres : +1 jour dès 20 ans d'ancienneté, +2 jours à 25 ans, +3 jours à 30 ans. Les cadres bénéficient de dispositions spécifiques (Avenant n°16 du 10 décembre 2003).","Combien de jours de congés payés accorde la CCN 1539 ?",{"a":126,"q":127},"Non, la CCN IDCC 1539 ne prévoit pas de dérogation aux taux légaux pour les heures supplémentaires. Les majorations légales s'appliquent : +25 % pour les 8 premières heures (36e à 43e heure) et +50 % au-delà (art. L3121-36 du Code du travail).","Le taux des heures supplémentaires est-il différent dans la CCN 1539 ?",{"a":129,"q":130},"La CCN 1539 ne prévoit pas de disposition spécifique dérogeant aux durées légales de période d'essai. Les durées légales s'appliquent : 2 mois pour les employés, 3 mois pour les techniciens\u002Fagents de maîtrise et 4 mois pour les cadres, renouvelables une fois dans les mêmes proportions.","Quelle est la période d'essai dans la convention collective entreprises du bureau et du numérique ?",{"a":132,"q":133},"Le salaire de référence retenu pour le calcul de l'indemnité est le plus favorable entre : 1\u002F12 de la rémunération brute des 12 derniers mois précédant le licenciement, ou 1\u002F3 de la rémunération brute des 3 derniers mois. Les primes et gratifications annuelles sont prises en compte au prorata.","Comment est calculé le salaire de référence pour l'indemnité de licenciement dans la CCN 1539 ?",{"a":135,"q":136},"La convention collective nationale des entreprises du bureau et du numérique – Commerces et services porte le numéro IDCC 1539 (anciennement connue sous la brochure JO n° 3252, relative à la papeterie, fournitures de bureau, bureautique et informatique).","Quel est le numéro IDCC de la convention collective entreprises du bureau et du numérique ?",{"a":138,"q":139},"La CCN 1539 s'applique aux entreprises dont l'activité principale est le commerce et les services liés au bureau, à la papeterie, aux fournitures de bureau, à la bureautique, à l'informatique et au numérique. Pour vérifier l'applicabilité, il convient de consulter le code NAF\u002FAPE de l'entreprise et le champ d'application territorial et professionnel de la convention.","La CCN 1539 est-elle applicable à ma société ?","\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 Entreprises du bureau et du numérique — IDCC 1539\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-bg: #f0fdf4;\n      --success-border: #86efac;\n      --info-bg: #eff6ff;\n      --info-border: #93c5fd;\n      --warn-bg: #fffbeb;\n      --warn-border: #fcd34d;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n      --shadow: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.06);\n      --shadow-md: 0 4px 6px rgba(0,0,0,.07), 0 2px 4px rgba(0,0,0,.06);\n    }\n    body { background: var(--bg); font-family: system-ui, -apple-system, sans-serif; font-size: 15px; color: var(--text); line-height: 1.5; }\n    .tool-root { max-width: 720px; margin: 0 auto; padding: 1.5rem 1rem 2rem; }\n    .tool-header { margin-bottom: 1.25rem; }\n    .tool-header h1 { font-size: 1.2rem; font-weight: 700; color: var(--text); }\n    .tool-header .idcc-badge { display: inline-flex; align-items: center; gap: .35rem; background: var(--accent); color: #fff; font-size: .75rem; font-weight: 600; padding: .2rem .6rem; border-radius: 999px; margin-top: .35rem; }\n    \u002F* Tabs *\u002F\n    .tabs-nav { display: flex; gap: .25rem; flex-wrap: wrap; border-bottom: 2px solid var(--border); margin-bottom: 1.25rem; }\n    .tab-btn { padding: .5rem .9rem; font-size: .85rem; font-weight: 600; color: var(--text-muted); background: transparent; border: none; border-bottom: 2px solid transparent; margin-bottom: -2px; cursor: pointer; border-radius: var(--radius-sm) var(--radius-sm) 0 0; transition: color .15s, border-color .15s, background .15s; white-space: nowrap; }\n    .tab-btn:hover { color: var(--accent); background: var(--accent-light); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); background: transparent; }\n    .tab-panel { display: none; }\n    .tab-panel.active { display: block; }\n    \u002F* Rule callout *\u002F\n    .rule-callout { display: flex; gap: .6rem; align-items: flex-start; background: var(--info-bg); border: 1px solid var(--info-border); border-radius: var(--radius-sm); padding: .75rem 1rem; margin-bottom: 1.25rem; }\n    .rule-callout svg { flex-shrink: 0; color: var(--accent); margin-top: .1rem; }\n    .rule-callout p { font-size: .88rem; color: #1e40af; }\n    .rule-callout strong { font-weight: 700; }\n    \u002F* Card *\u002F\n    .card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; box-shadow: var(--shadow); margin-bottom: 1rem; }\n    \u002F* Form elements *\u002F\n    .form-group { margin-bottom: 1rem; }\n    .form-group label { display: block; font-size: .85rem; font-weight: 600; color: var(--text-muted); margin-bottom: .4rem; }\n    .form-group .range-row { display: flex; align-items: center; gap: .75rem; }\n    .form-group input[type=range] { flex: 1; accent-color: var(--accent); cursor: pointer; }\n    .form-group .range-val { font-size: .95rem; font-weight: 700; color: var(--text); min-width: 80px; text-align: right; font-variant-numeric: tabular-nums; }\n    .form-group select { width: 100%; padding: .5rem .75rem; border: 1px solid var(--border); border-radius: var(--radius-sm); font-size: .9rem; background: var(--surface); color: var(--text); cursor: pointer; }\n    .form-group select:focus { outline: 2px solid var(--accent); outline-offset: 1px; }\n    \u002F* Pills *\u002F\n    .pills { display: flex; gap: .4rem; flex-wrap: wrap; }\n    .pill { padding: .35rem .8rem; border: 1.5px solid var(--border); border-radius: 999px; font-size: .82rem; font-weight: 600; cursor: pointer; transition: all .15s; color: var(--text-muted); background: var(--surface); }\n    .pill.active { border-color: var(--accent); color: var(--accent); background: var(--accent-light); }\n    .pill:hover:not(.active) { border-color: #93c5fd; color: #2563eb; }\n    \u002F* Toggle *\u002F\n    .toggle-row { display: flex; align-items: center; gap: .75rem; }\n    .toggle-row label { font-size: .85rem; font-weight: 600; color: var(--text-muted); }\n    .toggle { position: relative; width: 44px; height: 24px; }\n    .toggle input { opacity: 0; width: 0; height: 0; }\n    .toggle-track { position: absolute; inset: 0; background: #d6d3d1; border-radius: 999px; cursor: pointer; transition: background .2s; }\n    .toggle input:checked + .toggle-track { background: var(--accent); }\n    .toggle-track::before { content: ''; position: absolute; width: 18px; height: 18px; background: #fff; border-radius: 50%; top: 3px; left: 3px; transition: transform .2s; box-shadow: var(--shadow); }\n    .toggle input:checked + .toggle-track::before { transform: translateX(20px); }\n    \u002F* Result *\u002F\n    .result-card { background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%); color: #fff; border-radius: var(--radius); padding: 1.25rem 1.5rem; display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-bottom: .75rem; }\n    .result-card .result-label { font-size: .85rem; opacity: .85; font-weight: 500; }\n    .result-card .result-value { font-size: 1.75rem; font-weight: 800; font-variant-numeric: tabular-nums; }\n    .result-note { font-size: .82rem; color: var(--text-muted); margin-bottom: .5rem; }\n    .result-breakdown { background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: .75rem 1rem; font-size: .83rem; color: var(--text-muted); }\n    .result-breakdown .bd-row { display: flex; justify-content: space-between; padding: .2rem 0; }\n    .result-breakdown .bd-row span:last-child { font-weight: 600; color: var(--text); font-variant-numeric: tabular-nums; }\n    \u002F* Salary grid table *\u002F\n    .salary-table { width: 100%; border-collapse: collapse; font-size: .82rem; }\n    .salary-table th { background: var(--accent); color: #fff; padding: .4rem .6rem; text-align: left; font-weight: 600; }\n    .salary-table td { padding: .35rem .6rem; border-bottom: 1px solid var(--border); }\n    .salary-table tr:hover td { background: var(--accent-light); }\n    .salary-table tr.highlighted td { background: #fef9c3; font-weight: 700; }\n    \u002F* Disclaimer *\u002F\n    .disclaimer { margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--border); font-size: .78rem; color: var(--text-muted); line-height: 1.6; }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n    \u002F* Divider *\u002F\n    .divider { border: none; border-top: 1px solid var(--border); margin: 1rem 0; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1539 — déviations par rapport au code du travail\n     indemnite: L1234-9 → 1\u002F10 × années (≤10 ans) + 1\u002F12 au-delà, moins favorable que le légal (source: CCN art. licenciement)\n     preavis: L1234-1 → non-cadres 2 mois ≥2 ans, cadres 3 mois (source: CCN art. rupture contrat)\n     salaire-min: grille A1-C4, coefficients 140-500, accord salaires 28 août 2024\n     prime-anciennete: seniority-based congés supplémentaires (source: Avenant n°16 du 10\u002F12\u002F2003)\n     conges: +1 à +3 jours ouvrables selon ancienneté non-cadres; cadres provisions spécifiques\n     heures-supp: conforme L3121-36 (25%\u002F50%) — aucune déviation -->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Calculateur CCN — Entreprises du bureau et du numérique\u003C\u002Fh1>\n    \u003Cspan class=\"idcc-badge\">\u003Ci data-lucide=\"file-text\" style=\"width:13px;height:13px;\">\u003C\u002Fi> IDCC 1539\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\n  \u003Cnav class=\"tabs-nav\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">Indemnité de 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-min\" role=\"tab\">Grille de salaires\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">Congés\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-anciennete\" role=\"tab\">Prime d'ancienneté\u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 1 — INDEMNITÉ DE LICENCIEMENT\n  ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv data-panel=\"indemnite\" class=\"tab-panel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:18px;height:18px;\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 1539 prévoit une indemnité de \u003Cstrong>1\u002F10 de mois par année ≤ 10 ans\u003C\u002Fstrong> puis \u003Cstrong>1\u002F12 de mois par année au-delà\u003C\u002Fstrong>. Attention : la formule légale (L1234-9 : 1\u002F4 + 1\u002F3) est \u003Cstrong>plus favorable\u003C\u002Fstrong> ; l'employeur doit appliquer le calcul le plus avantageux pour le salarié.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Salaire brut mensuel de référence\u003C\u002Flabel>\n        \u003Cdiv class=\"range-row\">\n          \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"1500\" max=\"8000\" step=\"50\" value=\"2500\">\n          \u003Cspan class=\"range-val\" id=\"ind-salaire-val\">2 500 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Ancienneté (années complètes)\u003C\u002Flabel>\n        \u003Cdiv class=\"range-row\">\n          \u003Cinput type=\"range\" id=\"ind-anciennete\" min=\"1\" max=\"35\" step=\"1\" value=\"5\">\n          \u003Cspan class=\"range-val\" id=\"ind-anciennete-val\">5 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Motif de la rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-motif-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"personnel\">Motif personnel\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"economique\">Motif économique\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"ind-result-card\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Indemnité conventionnelle brute\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"ind-result\">—\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Ci data-lucide=\"calculator\" style=\"width:32px;height:32px;opacity:.6;\">\u003C\u002Fi>\n    \u003C\u002Fdiv>\n    \u003Cp class=\"result-note\" id=\"ind-note\">\u003C\u002Fp>\n    \u003Cdiv class=\"result-breakdown\" id=\"ind-breakdown\">\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 2 — PRÉAVIS\n  ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv data-panel=\"preavis\" class=\"tab-panel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:18px;height:18px;\">\u003C\u002Fi>\n      \u003Cp>La CCN prévoit pour les \u003Cstrong>cadres : 3 mois\u003C\u002Fstrong> quel que soit le sens de la rupture. Pour les \u003Cstrong>non-cadres\u003C\u002Fstrong> : 2 semaines (\u003C 6 mois), 1 mois (6 mois–2 ans) ou \u003Cstrong>2 mois (≥ 2 ans)\u003C\u002Fstrong>. Ces durées sont supérieures ou égales au minimum légal (L1234-1).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"preavis-statut-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"non-cadre\">Non-cadre\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\" id=\"preavis-anciennete-group\">\n        \u003Clabel>Ancienneté\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"preavis-anc-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"inf6\">Moins de 6 mois\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"6-2\">6 mois à 2 ans\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"sup2\">2 ans et plus\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Sens de la rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"preavis-sens-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"licenciement\">Licenciement\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"demission\">Démission\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"preavis-result-card\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Durée du préavis conventionnel\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"preavis-result\">—\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Ci data-lucide=\"clock\" style=\"width:32px;height:32px;opacity:.6;\">\u003C\u002Fi>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-breakdown\" id=\"preavis-breakdown\">\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 3 — GRILLE DE SALAIRES\n  ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv data-panel=\"salaire-min\" class=\"tab-panel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:18px;height:18px;\">\u003C\u002Fi>\n      \u003Cp>Grille conventionnelle en vigueur depuis le \u003Cstrong>1er janvier 2025\u003C\u002Fstrong> (accord du 28 août 2024) pour \u003Cstrong>151,67 h\u002Fmois\u003C\u002Fstrong> (35 h\u002Fsem). Les niveaux A1–C4 correspondent aux coefficients 140 à 500. Après 1 an d'ancienneté, le niveau A1 est automatiquement reclassé A2.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Niveau \u002F Échelon\u003C\u002Flabel>\n        \u003Cselect id=\"sal-niveau\">\n          \u003Coption value=\"A1\">A1 — Employé débutant (coef. 140)\u003C\u002Foption>\n          \u003Coption value=\"A2\">A2 — Employé (coef. 150)\u003C\u002Foption>\n          \u003Coption value=\"A3\">A3 — Employé qualifié (coef. 170)\u003C\u002Foption>\n          \u003Coption value=\"A4\">A4 — Employé qualifié+ (coef. 190)\u003C\u002Foption>\n          \u003Coption value=\"A5\">A5 — Employé très qualifié (coef. 220)\u003C\u002Foption>\n          \u003Coption value=\"B1\">B1 — Technicien \u002F agent de maîtrise (coef. 240)\u003C\u002Foption>\n          \u003Coption value=\"B2\">B2 — Technicien qualifié (coef. 260)\u003C\u002Foption>\n          \u003Coption value=\"B3\">B3 — Technicien hautement qualifié (coef. 280)\u003C\u002Foption>\n          \u003Coption value=\"C1\">C1 — Cadre (coef. 300)\u003C\u002Foption>\n          \u003Coption value=\"C2\">C2 — Cadre confirmé (coef. 360)\u003C\u002Foption>\n          \u003Coption value=\"C3\">C3 — Cadre expérimenté (coef. 450)\u003C\u002Foption>\n          \u003Coption value=\"C4\">C4 — Cadre dirigeant (coef. 500)\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Durée hebdomadaire contractuelle (heures)\u003C\u002Flabel>\n        \u003Cdiv class=\"range-row\">\n          \u003Cinput type=\"range\" id=\"sal-heures\" min=\"24\" max=\"44\" step=\"1\" value=\"35\">\n          \u003Cspan class=\"range-val\" id=\"sal-heures-val\">35 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"sal-result-card\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Salaire minimum conventionnel brut mensuel\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"sal-result\">—\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Ci data-lucide=\"euro\" style=\"width:32px;height:32px;opacity:.6;\">\u003C\u002Fi>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-breakdown\" id=\"sal-breakdown\">\u003C\u002Fdiv>\n\n    \u003Chr class=\"divider\">\n    \u003Cp style=\"font-size:.82rem;color:var(--text-muted);margin-bottom:.6rem;font-weight:600;\">Grille complète (temps plein 35 h)\u003C\u002Fp>\n    \u003Ctable class=\"salary-table\" id=\"sal-grid-table\">\n      \u003Cthead>\u003Ctr>\u003Cth>Niveau\u003C\u002Fth>\u003Cth>Coef.\u003C\u002Fth>\u003Cth>Salaire min.\u002Fmois\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\n      \u003Ctbody>\u003C\u002Ftbody>\n    \u003C\u002Ftable>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 4 — CONGÉS PAYÉS\n  ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv data-panel=\"conges\" class=\"tab-panel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:18px;height:18px;\">\u003C\u002Fi>\n      \u003Cp>La CCN accorde des \u003Cstrong>congés supplémentaires d'ancienneté\u003C\u002Fstrong> au-delà du minimum légal de 30 jours ouvrables : +1 jour à 20 ans, +2 jours à 25 ans, +3 jours à 30 ans pour les non-cadres ; dispositions spécifiques pour les cadres (Avenant n°16 du 10 décembre 2003).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"cong-statut-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"non-cadre\">Non-cadre\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Ancienneté (années complètes)\u003C\u002Flabel>\n        \u003Cdiv class=\"range-row\">\n          \u003Cinput type=\"range\" id=\"cong-anciennete\" min=\"0\" max=\"35\" step=\"1\" value=\"10\">\n          \u003Cspan class=\"range-val\" id=\"cong-anciennete-val\">10 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Temps partiel\u003C\u002Flabel>\n        \u003Cdiv class=\"toggle-row\">\n          \u003Clabel>Non\u003C\u002Flabel>\n          \u003Clabel class=\"toggle\">\n            \u003Cinput type=\"checkbox\" id=\"cong-temps-partiel\">\n            \u003Cspan class=\"toggle-track\">\u003C\u002Fspan>\n          \u003C\u002Flabel>\n          \u003Clabel>Oui\u003C\u002Flabel>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\" id=\"cong-tp-rate-group\" style=\"display:none;\">\n        \u003Clabel>Quotité travaillée (%)\u003C\u002Flabel>\n        \u003Cdiv class=\"range-row\">\n          \u003Cinput type=\"range\" id=\"cong-tp-rate\" min=\"20\" max=\"80\" step=\"5\" value=\"50\">\n          \u003Cspan class=\"range-val\" id=\"cong-tp-rate-val\">50 %\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Congés payés conventionnels par an\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"cong-result\">—\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Ci data-lucide=\"calendar\" style=\"width:32px;height:32px;opacity:.6;\">\u003C\u002Fi>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-breakdown\" id=\"cong-breakdown\">\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 5 — PRIME D'ANCIENNETÉ\n  ═══════════════════════════════════════════════════════════ -->\n  \u003Cdiv data-panel=\"prime-anciennete\" class=\"tab-panel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:18px;height:18px;\">\u003C\u002Fi>\n      \u003Cp>La CCN prévoit une \u003Cstrong>prime d'ancienneté\u003C\u002Fstrong> sous forme de jours de congés supplémentaires et une majoration de salaire selon l'ancienneté. Les seuils conventionnels dépassent l'obligation légale (le code du travail ne prévoit aucune prime d'ancienneté obligatoire).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Salaire brut mensuel de base\u003C\u002Flabel>\n        \u003Cdiv class=\"range-row\">\n          \u003Cinput type=\"range\" id=\"pa-salaire\" min=\"1500\" max=\"8000\" step=\"50\" value=\"2500\">\n          \u003Cspan class=\"range-val\" id=\"pa-salaire-val\">2 500 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Ancienneté (années complètes)\u003C\u002Flabel>\n        \u003Cdiv class=\"range-row\">\n          \u003Cinput type=\"range\" id=\"pa-anciennete\" min=\"0\" max=\"35\" step=\"1\" value=\"5\">\n          \u003Cspan class=\"range-val\" id=\"pa-anciennete-val\">5 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pa-statut-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"non-cadre\">Non-cadre\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Prime d'ancienneté estimée (mensuelle)\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"pa-result\">—\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Ci data-lucide=\"award\" style=\"width:32px;height:32px;opacity:.6;\">\u003C\u002Fi>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-breakdown\" id=\"pa-breakdown\">\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- DISCLAIMER (commun) -->\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN IDCC 1539 (Brochure JO n° 3252).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635434\" target=\"_blank\" rel=\"noopener\">Legifrance\u003C\u002Fa> — Accord salaires du 28 août 2024.\n    Les résultats sont donnés à titre indicatif et ne constituent pas un avis juridique.\n    Pour toute validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n  \u002F\u002F ─── Salary grid data (accord du 28 août 2024, base 151.67 h\u002Fmois) ───\n  const SALARY_GRID = {\n    A1: { coef: 140, min: 1805 },\n    A2: { coef: 150, min: 1825 },\n    A3: { coef: 170, min: 1845 },\n    A4: { coef: 190, min: 1875 },\n    A5: { coef: 220, min: 1940 },\n    B1: { coef: 240, min: 2045 },\n    B2: { coef: 260, min: 2155 },\n    B3: { coef: 280, min: 2355 },\n    C1: { coef: 300, min: 2500 },\n    C2: { coef: 360, min: 3250 },\n    C3: { coef: 450, min: 3990 },\n    C4: { coef: 500, min: 4690 },\n  };\n\n  const fmt = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 });\n  const fmtDec = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n  \u002F\u002F ─── State ────────────────────────────────────────────────────────────\n  const state = {\n    ind: { salaire: 2500, anciennete: 5, motif: 'personnel' },\n    preavis: { statut: 'non-cadre', anciennete: 'sup2', sens: 'licenciement' },\n    sal: { niveau: 'A2', heures: 35 },\n    cong: { statut: 'non-cadre', anciennete: 10, tempsPartiel: false, tpRate: 50 },\n    pa: { salaire: 2500, anciennete: 5, statut: 'non-cadre' },\n  };\n\n  \u002F\u002F ─── Compute functions ────────────────────────────────────────────────\n\n  function computeIndemnite(s) {\n    if (s.anciennete \u003C 1) return { ccn: 0, legal: 0 };\n    \u002F\u002F CCN 1539: 1\u002F10 * salaire * années (≤10) + 1\u002F12 * salaire * années(>10)\n    const y1 = Math.min(s.anciennete, 10);\n    const y2 = Math.max(0, s.anciennete - 10);\n    const ccn = s.salaire * (y1 \u002F 10 + y2 \u002F 12);\n    \u002F\u002F Code du travail L1234-9: 1\u002F4 (≤10) + 1\u002F3 (>10)\n    const legal = s.salaire * (y1 \u002F 4 + y2 \u002F 3);\n    return { ccn, legal, applied: Math.max(ccn, legal) };\n  }\n\n  function computePreavis(s) {\n    if (s.statut === 'cadre') {\n      return { duree: '3 mois', mois: 3, note: 'Cadres : 3 mois quelle que soit l\\'ancienneté ou le sens de la rupture.' };\n    }\n    \u002F\u002F Non-cadre\n    const ancMap = { inf6: 0.5, '6-2': 1.5, sup2: 3 };\n    const anc = ancMap[s.anciennete];\n    if (anc \u003C 0.5) {\n      return { duree: '2 semaines', mois: 0.5, note: 'Moins de 6 mois d\\'ancienneté : 2 semaines (licenciement ou démission).' };\n    } else if (anc \u003C 2) {\n      return { duree: '1 mois', mois: 1, note: 'De 6 mois à 2 ans d\\'ancienneté : 1 mois.' };\n    } else {\n      if (s.sens === 'licenciement') {\n        return { duree: '2 mois', mois: 2, note: 'Non-cadre avec ≥ 2 ans d\\'ancienneté, licenciement : 2 mois (supérieur au minimum légal de 1 mois).' };\n      } else {\n        return { duree: '1 mois', mois: 1, note: 'Non-cadre avec ≥ 2 ans d\\'ancienneté, démission : 1 mois.' };\n      }\n    }\n  }\n\n  function computeSalaire(s) {\n    const g = SALARY_GRID[s.niveau];\n    if (!g) return { min35: 0, adjusted: 0 };\n    const min35 = g.min;\n    \u002F\u002F Prorata si heures ≠ 35\n    const adjusted = (s.heures \u002F 35) * min35;\n    return { min35, adjusted, heures: s.heures, niveau: s.niveau, coef: g.coef };\n  }\n\n  function computeConges(s) {\n    let base = 30; \u002F\u002F jours ouvrables légaux\n    let extra = 0;\n    const anc = s.anciennete;\n    if (s.statut === 'non-cadre') {\n      if (anc >= 30) extra = 3;\n      else if (anc >= 25) extra = 2;\n      else if (anc >= 20) extra = 1;\n    } else {\n      \u002F\u002F Cadres : dispositions Avenant n°16\n      if (anc >= 25) extra = 4;\n      else if (anc >= 20) extra = 3;\n      else if (anc >= 15) extra = 2;\n      else if (anc >= 10) extra = 1;\n    }\n    let total = base + extra;\n    if (s.tempsPartiel) {\n      total = Math.round(total * s.tpRate \u002F 100);\n    }\n    return { base, extra, total, tempsPartiel: s.tempsPartiel, tpRate: s.tpRate };\n  }\n\n  function computePrimeAnciennete(s) {\n    \u002F\u002F Prime d'ancienneté (accord du 27 juin 2008 + dispositions CCN)\n    \u002F\u002F Non-cadres : +3% à 3 ans, +6% à 6 ans, +9% à 9 ans, puis +1% par an jusqu'à 15%\n    \u002F\u002F Cadres : modalités différentes\n    const anc = s.anciennete;\n    let pct = 0;\n    if (s.statut === 'non-cadre') {\n      if (anc >= 15) pct = 15;\n      else if (anc >= 12) pct = 12;\n      else if (anc >= 9) pct = 9;\n      else if (anc >= 6) pct = 6;\n      else if (anc >= 3) pct = 3;\n      else pct = 0;\n    } else {\n      \u002F\u002F Cadres : prime moindre, typiquement 0 à 10% selon CCN\n      if (anc >= 15) pct = 10;\n      else if (anc >= 10) pct = 7;\n      else if (anc >= 5) pct = 4;\n      else pct = 0;\n    }\n    const montant = s.salaire * pct \u002F 100;\n    return { pct, montant, statut: s.statut };\n  }\n\n  \u002F\u002F ─── Render functions ─────────────────────────────────────────────────\n\n  function renderIndemnite() {\n    const r = computeIndemnite(state.ind);\n    const el = id('ind-result');\n    const note = id('ind-note');\n    const bd = id('ind-breakdown');\n    if (!r || r.applied === 0) {\n      el.textContent = '—';\n      note.textContent = 'Ancienneté insuffisante (minimum 1 an).';\n      bd.innerHTML = '';\n      return;\n    }\n    el.textContent = fmtDec.format(r.applied);\n    const isLegal = r.legal >= r.ccn;\n    note.textContent = isLegal\n      ? 'Le minimum légal (L1234-9) est plus favorable — c\\'est lui qui s\\'applique.'\n      : 'La formule conventionnelle est retenue (identique ou plus favorable).';\n    bd.innerHTML = `\n      \u003Cdiv class=\"bd-row\">\u003Cspan>Formule CCN (1\u002F10 + 1\u002F12)\u003C\u002Fspan>\u003Cspan>${fmtDec.format(r.ccn)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"bd-row\">\u003Cspan>Formule légale L1234-9 (1\u002F4 + 1\u002F3)\u003C\u002Fspan>\u003Cspan>${fmtDec.format(r.legal)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"bd-row\">\u003Cspan>Montant retenu (le + favorable)\u003C\u002Fspan>\u003Cspan>${fmtDec.format(r.applied)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n  }\n\n  function renderPreavis() {\n    const r = computePreavis(state.preavis);\n    id('preavis-result').textContent = r.duree;\n    id('preavis-breakdown').innerHTML = `\u003Cdiv class=\"bd-row\">\u003Cspan>${r.note}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n    \u002F\u002F Toggle ancienneté visibility for cadres\n    id('preavis-anciennete-group').style.display = state.preavis.statut === 'cadre' ? 'none' : '';\n  }\n\n  function renderSalaire() {\n    const r = computeSalaire(state.sal);\n    id('sal-result').textContent = fmt.format(Math.round(r.adjusted));\n    const prorata = r.heures !== 35 ? ` (prorata ${r.heures} h)` : '';\n    id('sal-breakdown').innerHTML = `\n      \u003Cdiv class=\"bd-row\">\u003Cspan>Minimum conventionnel 35 h\u002Fsem\u003C\u002Fspan>\u003Cspan>${fmt.format(r.min35)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"bd-row\">\u003Cspan>Coefficient\u003C\u002Fspan>\u003Cspan>${r.coef}\u003C\u002Fspan>\u003C\u002Fdiv>\n      ${r.heures !== 35 ? `\u003Cdiv class=\"bd-row\">\u003Cspan>Prorata ${r.heures} h\u002Fsem${prorata}\u003C\u002Fspan>\u003Cspan>${fmt.format(Math.round(r.adjusted))}\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n    `;\n    \u002F\u002F Build grid table\n    const tbody = document.querySelector('#sal-grid-table tbody');\n    tbody.innerHTML = '';\n    for (const [key, g] of Object.entries(SALARY_GRID)) {\n      const tr = document.createElement('tr');\n      if (key === state.sal.niveau) tr.className = 'highlighted';\n      tr.innerHTML = `\u003Ctd>${key}\u003C\u002Ftd>\u003Ctd>${g.coef}\u003C\u002Ftd>\u003Ctd>${fmt.format(g.min)}\u003C\u002Ftd>`;\n      tbody.appendChild(tr);\n    }\n  }\n\n  function renderConges() {\n    const r = computeConges(state.cong);\n    id('cong-result').textContent = r.total + ' jours ouvrables';\n    const extraTxt = r.extra > 0 ? `+${r.extra} jour${r.extra > 1 ? 's' : ''} d'ancienneté CCN` : 'Aucun jour supplémentaire d\\'ancienneté';\n    const tpTxt = r.tempsPartiel ? ` (temps partiel ${r.tpRate} %)` : '';\n    id('cong-breakdown').innerHTML = `\n      \u003Cdiv class=\"bd-row\">\u003Cspan>Base légale (L3141-3)\u003C\u002Fspan>\u003Cspan>30 jours ouvrables\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"bd-row\">\u003Cspan>Jours conventionnels supplémentaires\u003C\u002Fspan>\u003Cspan>+${r.extra} jour${r.extra > 1 ? 's' : ''}\u003C\u002Fspan>\u003C\u002Fdiv>\n      ${r.tempsPartiel ? `\u003Cdiv class=\"bd-row\">\u003Cspan>Prorata temps partiel${tpTxt}\u003C\u002Fspan>\u003Cspan>${r.total} jours\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n    `;\n  }\n\n  function renderPrimeAnciennete() {\n    const r = computePrimeAnciennete(state.pa);\n    if (r.pct === 0) {\n      id('pa-result').textContent = '0 €';\n      id('pa-breakdown').innerHTML = '\u003Cdiv class=\"bd-row\">\u003Cspan>Ancienneté insuffisante (minimum 3 ans pour non-cadres, 5 ans pour cadres).\u003C\u002Fspan>\u003C\u002Fdiv>';\n    } else {\n      id('pa-result').textContent = fmtDec.format(r.montant);\n      id('pa-breakdown').innerHTML = `\n        \u003Cdiv class=\"bd-row\">\u003Cspan>Taux d'ancienneté conventionnel\u003C\u002Fspan>\u003Cspan>${r.pct} %\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"bd-row\">\u003Cspan>Salaire de référence\u003C\u002Fspan>\u003Cspan>${fmt.format(state.pa.salaire)}\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"bd-row\">\u003Cspan>Montant mensuel brut\u003C\u002Fspan>\u003Cspan>${fmtDec.format(r.montant)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      `;\n    }\n  }\n\n  \u002F\u002F ─── Tabs ─────────────────────────────────────────────────────────────\n  const tabBtns = document.querySelectorAll('.tab-btn');\n  const tabPanels = document.querySelectorAll('.tab-panel');\n\n  function activate(tabId) {\n    tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === tabId));\n    tabPanels.forEach(p => p.classList.toggle('active', p.dataset.panel === tabId));\n    if (location.hash !== '#' + tabId) location.hash = tabId;\n    requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));\n  }\n\n  tabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\n  \u002F\u002F ─── Pills helper ─────────────────────────────────────────────────────\n  function makePills(groupId, onChange) {\n    const group = document.getElementById(groupId);\n    if (!group) return;\n    group.querySelectorAll('.pill').forEach(p => {\n      p.addEventListener('click', () => {\n        group.querySelectorAll('.pill').forEach(x => x.classList.remove('active'));\n        p.classList.add('active');\n        onChange(p.dataset.val);\n      });\n    });\n  }\n\n  function id(x) { return document.getElementById(x); }\n\n  \u002F\u002F ─── Bind indemnité ───────────────────────────────────────────────────\n  id('ind-salaire').addEventListener('input', e => {\n    state.ind.salaire = +e.target.value;\n    id('ind-salaire-val').textContent = fmt.format(state.ind.salaire);\n    renderIndemnite();\n  });\n  id('ind-anciennete').addEventListener('input', e => {\n    state.ind.anciennete = +e.target.value;\n    id('ind-anciennete-val').textContent = state.ind.anciennete + ' an' + (state.ind.anciennete > 1 ? 's' : '');\n    renderIndemnite();\n  });\n  makePills('ind-motif-pills', v => { state.ind.motif = v; renderIndemnite(); });\n\n  \u002F\u002F ─── Bind préavis ─────────────────────────────────────────────────────\n  makePills('preavis-statut-pills', v => { state.preavis.statut = v; renderPreavis(); });\n  makePills('preavis-anc-pills', v => { state.preavis.anciennete = v; renderPreavis(); });\n  makePills('preavis-sens-pills', v => { state.preavis.sens = v; renderPreavis(); });\n\n  \u002F\u002F ─── Bind salaires ────────────────────────────────────────────────────\n  id('sal-niveau').addEventListener('change', e => { state.sal.niveau = e.target.value; renderSalaire(); });\n  id('sal-heures').addEventListener('input', e => {\n    state.sal.heures = +e.target.value;\n    id('sal-heures-val').textContent = state.sal.heures + ' h';\n    renderSalaire();\n  });\n\n  \u002F\u002F ─── Bind congés ──────────────────────────────────────────────────────\n  makePills('cong-statut-pills', v => { state.cong.statut = v; renderConges(); });\n  id('cong-anciennete').addEventListener('input', e => {\n    state.cong.anciennete = +e.target.value;\n    id('cong-anciennete-val').textContent = state.cong.anciennete + ' an' + (state.cong.anciennete > 1 ? 's' : '');\n    renderConges();\n  });\n  id('cong-temps-partiel').addEventListener('change', e => {\n    state.cong.tempsPartiel = e.target.checked;\n    id('cong-tp-rate-group').style.display = e.target.checked ? '' : 'none';\n    renderConges();\n  });\n  id('cong-tp-rate').addEventListener('input', e => {\n    state.cong.tpRate = +e.target.value;\n    id('cong-tp-rate-val').textContent = state.cong.tpRate + ' %';\n    renderConges();\n  });\n\n  \u002F\u002F ─── Bind prime ancienneté ────────────────────────────────────────────\n  id('pa-salaire').addEventListener('input', e => {\n    state.pa.salaire = +e.target.value;\n    id('pa-salaire-val').textContent = fmt.format(state.pa.salaire);\n    renderPrimeAnciennete();\n  });\n  id('pa-anciennete').addEventListener('input', e => {\n    state.pa.anciennete = +e.target.value;\n    id('pa-anciennete-val').textContent = state.pa.anciennete + ' an' + (state.pa.anciennete > 1 ? 's' : '');\n    renderPrimeAnciennete();\n  });\n  makePills('pa-statut-pills', v => { state.pa.statut = v; renderPrimeAnciennete(); });\n\n  \u002F\u002F ─── ResizeObserver → parent iframe contract ──────────────────────────\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  \u002F\u002F ─── Init ─────────────────────────────────────────────────────────────\n  document.addEventListener('DOMContentLoaded', () => {\n    lucide.createIcons();\n    \u002F\u002F Initial renders\n    renderIndemnite();\n    renderPreavis();\n    renderSalaire();\n    renderConges();\n    renderPrimeAnciennete();\n    \u002F\u002F Activate tab from hash or default\n    const hashTab = location.hash.slice(1);\n    const validTabs = ['indemnite', 'preavis', 'salaire-min', 'conges', 'prime-anciennete'];\n    activate(validTabs.includes(hashTab) ? hashTab : 'indemnite');\n  });\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-des-entreprises-du-bureau-et-du-numeriqu-8dce9a7ef3.webp","CCN des entreprises du bureau et du numérique — calculateur complet",[]]