[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-industries-metallurgiques-mecaniques-et-connexes-de-la-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":110,"tool_html":141,"source":142,"category":143,"audience":144,"publish_mode":145,"hero_image":146,"hero_image_alt":85},"ccn-industries-metallurgiques-mecaniques-et-connexes-de-la","CCN des industries métallurgiques, mécaniques et connexes de la région parisienne — calculateur complet","Calculateur CCN Industries Métallurgiques Région Parisienne IDCC 54 | Expert Zoom","Outil interactif couvrant indemnité, préavis, grille salariale, prime d'ancienneté, 13e mois et congés de la CCN des industries métallurgiques, mécaniques et connexes de la région parisienne (IDCC 54).","Ce calculateur couvre 6 fonctions conventionnelles de la CCN des industries métallurgiques, mécaniques et connexes de la région parisienne (IDCC 54, brochure JO n° 3126) : indemnité de licenciement (formule OETAM et cadres), durée du préavis par niveau I à V, grille des salaires minimaux, prime d'ancienneté obligatoire (dès 3 ans), 13e mois conventionnel et congés payés supplémentaires. Depuis le 1er janvier 2024, l'IDCC 3248 se substitue à l'IDCC 54, mais les droits acquis restent protégés par avenant territorial.",[90],{"name":91,"@type":92,"about":93,"author":98,"@context":101,"isPartOf":102,"inLanguage":105,"description":106,"operatingSystem":107,"applicationCategory":108,"isAccessibleForFree":109},"Calculateur CCN Industries Métallurgiques, Mécaniques et Connexes de la Région Parisienne — IDCC 54","WebApplication",{"name":94,"@type":95,"identifier":96,"description":97},"Convention collective des industries métallurgiques, mécaniques et connexes de la région parisienne","Thing","IDCC 54","Convention collective régionale du 16 juillet 1954, brochure JO n° 3126, applicable aux entreprises de la métallurgie, mécanique et secteurs connexes en Île-de-France.",{"name":99,"@type":100},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":103,"@type":104},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement (formule CCN vs légal), le préavis par niveau, la grille salariale (niveaux I-V), la prime d'ancienneté, le 13e mois, les congés supplémentaires et les heures supplémentaires de la convention collective des industries métallurgiques, mécaniques et connexes de la région parisienne (IDCC 54, brochure JO 3126).","All","FinanceApplication",true,[111,114,117,120,123,126,129,132,135,138],{"a":112,"q":113},"Pour les salariés OETAM (non-cadres), la CCN IDCC 54 prévoit 1\u002F5 de mois de salaire brut par année d'ancienneté pour les 15 premières années, puis 3\u002F10 de mois par année au-delà de 15 ans. Pour les cadres et ingénieurs, le taux est de 1\u002F5 mois pour les 7 premières années, puis 3\u002F5 de mois par année au-delà. L'indemnité légale (art. L1234-9) s'applique si elle est plus favorable.","Comment calculer l'indemnité de licenciement dans la convention collective des industries métallurgiques de la région parisienne (IDCC 54) ?",{"a":115,"q":116},"La CCN IDCC 54 fixe la durée du préavis selon le niveau de classification : Niveau I = 2 semaines, Niveaux II et III = 1 mois, Niveau IV = 2 mois, Niveau V = 3 mois. Les minima légaux (1 mois après 6 mois d'ancienneté, 2 mois après 2 ans) s'appliquent si plus favorables.","Quelle est la durée du préavis dans la CCN IDCC 54 ?",{"a":118,"q":119},"La CCN IDCC 54 publie des taux garantis annuels par niveau hiérarchique (I à V), révisés annuellement par avenant. À titre indicatif 2025-2026 : Niveau I ≈ 22 200 €\u002Fan, Niveau II ≈ 24 800 €\u002Fan, Niveau III ≈ 28 500 €\u002Fan, Niveau IV ≈ 34 000 €\u002Fan, Niveau V ≈ 54 000 €\u002Fan. Ces montants sont supérieurs au SMIC pour les niveaux qualifiés.","Quelle est la grille des salaires minimum dans la convention collective métallurgie région parisienne ?",{"a":121,"q":122},"Oui. La CCN IDCC 54 prévoit une prime d'ancienneté mensuelle obligatoire à partir de 3 ans de présence : 3 % à 3 ans, 6 % à 6 ans, 9 % à 9 ans, 12 % à 12 ans, 15 % à 15 ans (plafond). La prime est calculée sur le salaire de base brut. Le code du travail ne prévoit aucune obligation équivalente.","Y a-t-il une prime d'ancienneté obligatoire dans la CCN IDCC 54 ?",{"a":124,"q":125},"Oui, la convention collective des industries métallurgiques de la région parisienne (IDCC 54) impose un 13e mois obligatoire équivalant à un mois de salaire brut, proratisé selon le temps de présence sur l'année civile. Il s'agit d'un avantage conventionnel absent du code du travail.","La CCN IDCC 54 prévoit-elle un 13e mois ?",{"a":127,"q":128},"Oui, en plus des 25 jours ouvrés légaux (30 jours ouvrables), l'article 45 de la CCN IDCC 54 accorde : +2 jours ouvrables après 10 ans d'ancienneté, +3 jours ouvrables après 20 ans, et +1 jour supplémentaire pour les salariés âgés de 50 ans et plus.","Des congés payés supplémentaires sont-ils prévus par la CCN IDCC 54 ?",{"a":130,"q":131},"La CCN IDCC 54 applique les mêmes taux légaux : +25 % pour les 8 premières heures supplémentaires hebdomadaires, +50 % au-delà. La particularité conventionnelle est que le paiement majoré des 4 premières heures supplémentaires peut être remplacé par un repos compensateur équivalent, à la demande de l'employeur avec accord du salarié.","Quel est le taux de majoration des heures supplémentaires dans la CCN IDCC 54 ?",{"a":133,"q":134},"Depuis le 1er janvier 2024, la nouvelle convention nationale de la métallurgie (IDCC 3248) a remplacé toutes les conventions territoriales, dont l'IDCC 54. Un avenant du 19 avril 2022 préserve cependant certaines dispositions territoriales pour la région parisienne à titre transitoire. Il est recommandé de vérifier les textes en vigueur sur Legifrance.","La CCN IDCC 54 s'applique-t-elle encore en 2025 et 2026 ?",{"a":136,"q":137},"L'IDCC 54 est l'ancienne convention collective régionale des industries métallurgiques de la région parisienne (1954). L'IDCC 3248 est la nouvelle convention nationale unique de la métallurgie, en vigueur depuis le 1er janvier 2024, qui unifie toutes les conventions territoriales de la branche. Certains droits acquis sous l'IDCC 54 sont maintenus par avenant territorial.","Quelle est la différence entre IDCC 54 et IDCC 3248 (nouvelle convention nationale métallurgie) ?",{"a":139,"q":140},"Une entreprise est couverte par l'IDCC 54 si elle est implantée en Île-de-France et si son activité principale relève de la fabrication de produits métalliques, de la mécanique, de la construction automobile, de l'aéronautique ou des secteurs connexes. Le code NAF\u002FAPE et le bulletin de paie mentionnent généralement la convention applicable.","Comment savoir si une entreprise est couverte par la CCN métallurgie région parisienne ?","\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 Industries Métallurgiques Région Parisienne — IDCC 54\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003C!-- CCN IDCC 54 — Industries métallurgiques, mécaniques et connexes de la région parisienne\n       Brochure JO n° 3126 — Convention du 16 juillet 1954\n       Déviations vs code du travail détectées :\n       indemnite:       L1234-9 → OETAM: 1\u002F5 mois × ans ≤15 ans + 3\u002F10 mois au-delà; Cadres: 1\u002F5 × ans ≤7 ans + 3\u002F5 mois au-delà\n       preavis:         L1234-1 → Niveaux I-V : 2 sem. \u002F 1 mois \u002F 1 mois \u002F 2 mois \u002F 3 mois\n       salaire-min:     SMIC → Grille taux garantis annuels par niveaux I-V (Avenant 20 févr. 2023)\n       prime-anciennete: Aucun légal → 3% dès 3 ans, progressif jusqu'à 15% à 15 ans + 13e mois obligatoire\n       conges:          L3141-3 → +2 j après 10 ans, +3 j après 20 ans, +1 j senior >50 ans (art. 45)\n       heures-supp:     L3121-36 → 25%\u002F50% identiques MAIS repos compensateur équivalent possible pour tranche 1\n       Source principale : https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635149\u002F\n  -->\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-mid: #dbeafe;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --green-bg: #f0fdf4;\n      --green-border: #bbf7d0;\n      --green-text: #166534;\n      --amber-bg: #fffbeb;\n      --amber-border: #fde68a;\n      --amber-text: #92400e;\n      --blue-bg: #eff6ff;\n      --blue-border: #bfdbfe;\n      --blue-text: #1e40af;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n      --shadow: 0 1px 3px rgba(0,0,0,.08);\n      --shadow-md: 0 4px 6px -1px rgba(0,0,0,.08), 0 2px 4px -2px rgba(0,0,0,.06);\n    }\n    body {\n      font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n      background: var(--bg);\n      color: var(--text);\n      font-size: 15px;\n      line-height: 1.6;\n    }\n    .tool-root {\n      max-width: 740px;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n    }\n\n    \u002F* ── Header ── *\u002F\n    .tool-header {\n      display: flex;\n      align-items: flex-start;\n      justify-content: space-between;\n      gap: 1rem;\n      margin-bottom: 1.25rem;\n      flex-wrap: wrap;\n    }\n    .tool-title {\n      font-size: 1.1rem;\n      font-weight: 700;\n      line-height: 1.3;\n    }\n    .tool-subtitle {\n      font-size: 0.825rem;\n      color: var(--text-muted);\n      margin-top: 0.15rem;\n    }\n    .idcc-badge {\n      background: var(--accent);\n      color: #fff;\n      font-size: 0.75rem;\n      font-weight: 700;\n      padding: 0.2rem 0.65rem;\n      border-radius: 999px;\n      white-space: nowrap;\n      flex-shrink: 0;\n    }\n\n    \u002F* ── Tabs ── *\u002F\n    .tabs-bar {\n      display: flex;\n      gap: 0;\n      border-bottom: 2px solid var(--border);\n      margin-bottom: 1.25rem;\n      overflow-x: auto;\n      scrollbar-width: none;\n    }\n    .tabs-bar::-webkit-scrollbar { display: none; }\n    .tab-btn {\n      display: flex;\n      align-items: center;\n      gap: 0.3rem;\n      padding: 0.5rem 0.9rem;\n      font-size: 0.825rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      background: none;\n      border: none;\n      border-bottom: 2.5px solid transparent;\n      margin-bottom: -2px;\n      cursor: pointer;\n      white-space: nowrap;\n      transition: color 0.15s, border-color 0.15s;\n    }\n    .tab-btn:hover { color: var(--text); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }\n\n    \u002F* ── Panels ── *\u002F\n    .tab-panel { display: none; }\n    .tab-panel.active { display: block; }\n\n    \u002F* ── Rule callout ── *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.625rem;\n      align-items: flex-start;\n      background: var(--blue-bg);\n      border: 1px solid var(--blue-border);\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 1rem;\n      margin-bottom: 1.25rem;\n      font-size: 0.875rem;\n      color: var(--blue-text);\n      line-height: 1.5;\n    }\n    .rule-callout svg { flex-shrink: 0; margin-top: 2px; }\n\n    \u002F* ── Form ── *\u002F\n    .form-grid {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 1rem 1.25rem;\n      margin-bottom: 1.25rem;\n    }\n    @media (max-width: 520px) { .form-grid { grid-template-columns: 1fr; } }\n    .form-full { grid-column: 1 \u002F -1; }\n    .field label {\n      display: flex;\n      justify-content: space-between;\n      align-items: baseline;\n      font-size: 0.775rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n      margin-bottom: 0.4rem;\n    }\n    .field label .val-display {\n      font-weight: 700;\n      color: var(--accent);\n      text-transform: none;\n      letter-spacing: 0;\n      font-size: 0.9rem;\n      font-variant-numeric: tabular-nums;\n    }\n    input[type=range] {\n      width: 100%;\n      accent-color: var(--accent);\n      cursor: pointer;\n    }\n    select {\n      width: 100%;\n      padding: 0.5rem 0.75rem;\n      border: 1.5px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.875rem;\n      background: var(--surface);\n      color: var(--text);\n      cursor: pointer;\n    }\n    select:focus { outline: none; border-color: var(--accent); }\n\n    \u002F* ── Pills ── *\u002F\n    .pills { display: flex; flex-wrap: wrap; gap: 0.375rem; }\n    .pill {\n      padding: 0.3rem 0.75rem;\n      border: 1.5px solid var(--border);\n      border-radius: 999px;\n      font-size: 0.8rem;\n      font-weight: 600;\n      cursor: pointer;\n      background: var(--surface);\n      color: var(--text-muted);\n      transition: all 0.15s;\n      user-select: none;\n    }\n    .pill.active {\n      border-color: var(--accent);\n      background: var(--accent-light);\n      color: var(--accent-dark);\n    }\n\n    \u002F* ── Result card ── *\u002F\n    .result-card {\n      background: var(--surface);\n      border: 1.5px solid var(--accent);\n      border-radius: var(--radius);\n      padding: 1.1rem 1.25rem;\n      box-shadow: var(--shadow-md);\n      margin-bottom: 0.75rem;\n    }\n    .result-label {\n      font-size: 0.75rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n      margin-bottom: 0.3rem;\n    }\n    .result-value {\n      font-size: 1.9rem;\n      font-weight: 800;\n      color: var(--accent);\n      font-variant-numeric: tabular-nums;\n      line-height: 1.2;\n    }\n    .result-unit {\n      font-size: 1rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      margin-left: 0.25rem;\n    }\n    .result-rows {\n      margin-top: 0.75rem;\n      padding-top: 0.625rem;\n      border-top: 1px solid var(--border);\n    }\n    .rrow {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 0.3rem 0;\n      border-bottom: 1px solid var(--border);\n      font-size: 0.85rem;\n    }\n    .rrow:last-child { border-bottom: none; }\n    .rrow .rl { color: var(--text-muted); }\n    .rrow .rv { font-weight: 700; font-variant-numeric: tabular-nums; }\n    .advantage {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.3rem;\n      font-size: 0.75rem;\n      font-weight: 700;\n      padding: 0.2rem 0.6rem;\n      border-radius: 999px;\n      margin-top: 0.5rem;\n    }\n    .advantage.green { background: var(--green-bg); border: 1px solid var(--green-border); color: var(--green-text); }\n    .advantage.amber { background: var(--amber-bg); border: 1px solid var(--amber-border); color: var(--amber-text); }\n\n    \u002F* ── Disclaimer ── *\u002F\n    .disclaimer {\n      font-size: 0.775rem;\n      color: var(--text-muted);\n      padding-top: 1rem;\n      margin-top: 1.5rem;\n      border-top: 1px solid var(--border);\n      line-height: 1.5;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003Cmain class=\"tool-root\">\n\n  \u003Cdiv class=\"tool-header\">\n    \u003Cdiv>\n      \u003Cdiv class=\"tool-title\">CCN Industries Métallurgiques, Mécaniques &amp; Connexes — Région Parisienne\u003C\u002Fdiv>\n      \u003Cdiv class=\"tool-subtitle\">Calculateur complet des droits conventionnels\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cspan class=\"idcc-badge\">IDCC 54\u003C\u002Fspan>\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\">\u003Ci data-lucide=\"banknote\" width=\"14\" height=\"14\">\u003C\u002Fi> Indemnité\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\u003Ci data-lucide=\"clock\" width=\"14\" height=\"14\">\u003C\u002Fi> Préavis\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\">\u003Ci data-lucide=\"bar-chart-2\" width=\"14\" height=\"14\">\u003C\u002Fi> Grille salaires\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-anciennete\" role=\"tab\">\u003Ci data-lucide=\"star\" width=\"14\" height=\"14\">\u003C\u002Fi> Prime ancienneté\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">\u003Ci data-lucide=\"calendar\" width=\"14\" height=\"14\">\u003C\u002Fi> Congés\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"heures-supp\" role=\"tab\">\u003Ci data-lucide=\"timer\" width=\"14\" height=\"14\">\u003C\u002Fi> H. supp.\u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ══════════════════════════════════════════════════════════════\n       PANEL 1 — Indemnité de licenciement\n  ══════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 54 prévoit une indemnité \u003Cstrong>plus favorable que L1234-9\u003C\u002Fstrong> : OETAM — \u003Cstrong>1\u002F5 de mois × années ≤ 15 ans\u003C\u002Fstrong>, puis \u003Cstrong>3\u002F10 de mois × années\u003C\u002Fstrong> au-delà de 15 ans. Cadres\u002Fingénieurs — \u003Cstrong>1\u002F5 × années ≤ 7 ans\u003C\u002Fstrong>, puis \u003Cstrong>3\u002F5 de mois × années\u003C\u002Fstrong> au-delà. L'indemnité légale s'applique si plus favorable.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire brut mensuel de référence \u003Cspan class=\"val-display\" id=\"ind-sal-v\">3 000 €\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-sal\" min=\"1200\" max=\"10000\" step=\"50\" value=\"3000\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années complètes) \u003Cspan class=\"val-display\" id=\"ind-anc-v\">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 form-full\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-statut\">\n          \u003Cspan class=\"pill active\" data-val=\"non-cadre\">OETAM (non-cadre)\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"cadre\">Cadre \u002F Ingénieur\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Indemnité conventionnelle brute\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ind-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"ind-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ══════════════════════════════════════════════════════════════\n       PANEL 2 — Préavis\n  ══════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 54 détermine la durée du préavis par \u003Cstrong>niveau de classification\u003C\u002Fstrong> plutôt que par la seule ancienneté : Niveau I = 2 semaines, Niveaux II-III = 1 mois, Niveau IV = 2 mois, Niveau V = 3 mois. Le minimum légal (L1234-1) reste applicable s'il est plus favorable.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field form-full\">\n        \u003Clabel>Niveau de classification\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prev-niveau\">\n          \u003Cspan class=\"pill active\" data-val=\"1\">Niveau I\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"2\">Niveau II\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"3\">Niveau III\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"4\">Niveau IV\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"5\">Niveau V\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté \u003Cspan class=\"val-display\" id=\"prev-anc-v\">3 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"prev-anc\" min=\"0\" max=\"35\" step=\"1\" value=\"3\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Type de rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prev-type\">\n          \u003Cspan class=\"pill active\" data-val=\"licenciement\">Licenciement\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"demission\">Démission\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\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=\"prev-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"prev-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ══════════════════════════════════════════════════════════════\n       PANEL 3 — Grille des salaires minimum\n  ══════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 54 publie des \u003Cstrong>taux garantis annuels par niveau hiérarchique\u003C\u002Fstrong> (I à V) via avenant négocié annuellement, supérieurs au SMIC pour les niveaux qualifiés. Avenant de référence : 20 février 2023 (Île-de-France). Valeurs 2025–2026 indicatives.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field form-full\">\n        \u003Clabel>Niveau de classification\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"sm-niveau\">\n          \u003Cspan class=\"pill active\" data-val=\"1\">Niveau I\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"2\">Niveau II\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"3\">Niveau III\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"4\">Niveau IV\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"5\">Niveau V\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Durée hebdomadaire \u003Cspan class=\"val-display\" id=\"sm-h-v\">35 h\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"sm-h\" min=\"17.5\" max=\"39\" step=\"0.5\" value=\"35\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Salaire brut mensuel minimum conventionnel\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"sm-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"sm-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cp style=\"font-size:0.78rem;color:var(--text-muted);margin-top:0.5rem;\">\n      \u003Ci data-lucide=\"alert-triangle\" width=\"12\" height=\"12\" style=\"vertical-align:middle;margin-right:4px\">\u003C\u002Fi>Valeurs indicatives. Consulter le dernier avenant Legifrance pour les montants officiels en vigueur.\n    \u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ══════════════════════════════════════════════════════════════\n       PANEL 4 — Prime d'ancienneté + 13e mois\n  ══════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"prime-anciennete\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 54 impose deux avantages absents du code du travail : une \u003Cstrong>prime d'ancienneté mensuelle obligatoire\u003C\u002Fstrong> à partir de 3 ans (3 % puis +3 % par tranche de 3 ans, plafonné à 15 % à 15 ans), et un \u003Cstrong>13e mois obligatoire\u003C\u002Fstrong> équivalant à un mois de salaire brut proratisé selon la présence sur l'année civile.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire brut mensuel \u003Cspan class=\"val-display\" id=\"pa-sal-v\">2 500 €\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pa-sal\" min=\"1200\" max=\"8000\" step=\"50\" value=\"2500\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté \u003Cspan class=\"val-display\" id=\"pa-anc-v\">6 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pa-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"6\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Mois de présence dans l'année \u003Cspan class=\"val-display\" id=\"pa-mois-v\">12 mois\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pa-mois\" min=\"1\" max=\"12\" step=\"1\" value=\"12\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Avantages conventionnels annuels\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pa-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"pa-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ══════════════════════════════════════════════════════════════\n       PANEL 5 — Congés payés\n  ══════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>En plus des 25 jours ouvrés légaux (30 jours ouvrables), la CCN IDCC 54 (art. 45) accorde des \u003Cstrong>jours supplémentaires d'ancienneté\u003C\u002Fstrong> : +2 jours à partir de 10 ans, +3 jours à partir de 20 ans. Un \u003Cstrong>jour supplémentaire pour les salariés de 50 ans et plus\u003C\u002Fstrong> est également prévu.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté \u003Cspan class=\"val-display\" id=\"cg-anc-v\">5 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cg-anc\" min=\"0\" max=\"40\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Âge du salarié \u003Cspan class=\"val-display\" id=\"cg-age-v\">35 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cg-age\" min=\"18\" max=\"65\" step=\"1\" value=\"35\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field form-full\">\n        \u003Clabel>Mode de décompte\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"cg-mode\">\n          \u003Cspan class=\"pill active\" data-val=\"ouvres\">Jours ouvrés (25 base)\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"ouvrables\">Jours ouvrables (30 base)\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Congés payés annuels\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"cg-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"cg-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ══════════════════════════════════════════════════════════════\n       PANEL 6 — Heures supplémentaires\n  ══════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"heures-supp\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" width=\"16\" height=\"16\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 54 applique les majorations légales (\u003Cstrong>+25 % pour les 8 premières heures supplémentaires, +50 % au-delà\u003C\u002Fstrong>), avec une \u003Cstrong>particularité conventionnelle\u003C\u002Fstrong> : le paiement majoré des 4 premières heures supplémentaires peut être remplacé par un \u003Cstrong>repos compensateur équivalent\u003C\u002Fstrong>, à la demande de l'employeur avec accord du salarié.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Taux horaire brut \u003Cspan class=\"val-display\" id=\"hs-taux-v\">16,00 €\u002Fh\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-taux\" min=\"11.88\" max=\"60\" step=\"0.1\" value=\"16\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures supp. tranche 1 (1–8 h, +25 %) \u003Cspan class=\"val-display\" id=\"hs-h1-v\">4 h\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-h1\" min=\"0\" max=\"8\" step=\"0.5\" value=\"4\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures supp. tranche 2 (au-delà 8 h, +50 %) \u003Cspan class=\"val-display\" id=\"hs-h2-v\">0 h\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-h2\" min=\"0\" max=\"20\" step=\"0.5\" value=\"0\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Mode de compensation — tranche 1\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"hs-mode\">\n          \u003Cspan class=\"pill active\" data-val=\"paiement\">Paiement majoré\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"repos\">Repos compensateur\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv class=\"result-label\">Compensation totale heures supplémentaires\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"hs-result\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"hs-rows\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ══ Disclaimer ══ -->\n  \u003Cp class=\"disclaimer\">\n    \u003Ci data-lucide=\"shield-check\" width=\"13\" height=\"13\" style=\"vertical-align:middle;margin-right:4px\">\u003C\u002Fi>\n    Calcul indicatif basé sur la CCN des industries métallurgiques, mécaniques et connexes de la région parisienne — IDCC 54 (Brochure JO n° 3126, convention du 16 juillet 1954).\n    Depuis le 1ᵉʳ janvier 2024, la convention nationale de la métallurgie (IDCC 3248) s'applique, mais les dispositions territoriales de l'IDCC 54 demeurent applicables en région parisienne par avenant du 19 avril 2022.\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635149\u002F\" target=\"_blank\" rel=\"noopener\">Legifrance — KALICONT000005635149\u003C\u002Fa>.\n    Pour toute validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n'use strict';\n\n\u002F\u002F ─── Formatters ──────────────────────────────────────────────────────────────\nconst fmtEUR = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 }).format(v);\nconst fmtEUR2 = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(v);\nconst fmtPct = v => new Intl.NumberFormat('fr-FR', { style: 'percent', maximumFractionDigits: 0 }).format(v \u002F 100);\n\n\u002F\u002F ─── State ───────────────────────────────────────────────────────────────────\nconst S = {\n  ind:  { sal: 3000, anc: 5,  statut: 'non-cadre' },\n  prev: { niveau: 1, anc: 3,  type: 'licenciement' },\n  sm:   { niveau: 1, h: 35 },\n  pa:   { sal: 2500, anc: 6,  mois: 12 },\n  cg:   { anc: 5,   age: 35,  mode: 'ouvres' },\n  hs:   { taux: 16, h1: 4,    h2: 0, mode: 'paiement' },\n};\n\n\u002F\u002F ─── Pill helper ─────────────────────────────────────────────────────────────\nfunction setupPills(id, obj, key, fn) {\n  const wrap = document.getElementById(id);\n  if (!wrap) return;\n  wrap.querySelectorAll('.pill').forEach(p => {\n    p.addEventListener('click', () => {\n      wrap.querySelectorAll('.pill').forEach(x => x.classList.remove('active'));\n      p.classList.add('active');\n      obj[key] = isNaN(p.dataset.val) ? p.dataset.val : Number(p.dataset.val);\n      fn();\n    });\n  });\n}\nfunction slider(id, obj, key, dispId, fmt, fn) {\n  const el = document.getElementById(id);\n  if (!el) return;\n  el.addEventListener('input', e => {\n    obj[key] = +e.target.value;\n    if (dispId) document.getElementById(dispId).textContent = fmt(obj[key]);\n    fn();\n  });\n}\n\n\u002F\u002F ─── PANEL 1: Indemnité ──────────────────────────────────────────────────────\nfunction renderInd() {\n  const { sal, anc, statut } = S.ind;\n  let ccn, parts = [];\n  if (statut === 'non-cadre') {\n    const t1 = Math.min(anc, 15), t2 = Math.max(0, anc - 15);\n    const p1 = sal * (1\u002F5) * t1;\n    const p2 = sal * (3\u002F10) * t2;\n    ccn = p1 + p2;\n    parts.push({ l: `Tranche 1 : ${t1} an(s) × 1\u002F5 mois`, v: p1 });\n    if (t2 > 0) parts.push({ l: `Tranche 2 : ${t2} an(s) × 3\u002F10 mois`, v: p2 });\n  } else {\n    const t1 = Math.min(anc, 7), t2 = Math.max(0, anc - 7);\n    const p1 = sal * (1\u002F5) * t1;\n    const p2 = sal * (3\u002F5) * t2;\n    ccn = p1 + p2;\n    parts.push({ l: `Tranche 1 : ${t1} an(s) × 1\u002F5 mois`, v: p1 });\n    if (t2 > 0) parts.push({ l: `Tranche 2 : ${t2} an(s) × 3\u002F5 mois`, v: p2 });\n  }\n  const lT1 = Math.min(anc, 10), lT2 = Math.max(0, anc - 10);\n  const legal = sal * (1\u002F4) * lT1 + sal * (1\u002F3) * lT2;\n  const effective = Math.max(ccn, legal);\n  const appliedLegal = effective > ccn;\n\n  document.getElementById('ind-result').textContent = fmtEUR(effective);\n  let html = parts.map(p => `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">${p.l}\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(p.v)}\u003C\u002Fspan>\u003C\u002Fdiv>`).join('');\n  html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Plancher légal L1234-9\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(legal)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  if (appliedLegal) {\n    html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\" style=\"color:var(--amber-text)\">\u003Ci data-lucide=\"shield\" width=\"12\" height=\"12\">\u003C\u002Fi> Légal appliqué (plancher L1234-9 plus favorable)\u003C\u002Fspan>\u003Cspan class=\"rv\">\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  } else {\n    html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\" style=\"color:var(--green-text)\">\u003Ci data-lucide=\"trending-up\" width=\"12\" height=\"12\">\u003C\u002Fi> CCN plus favorable de ${fmtEUR(ccn - legal)}\u003C\u002Fspan>\u003Cspan class=\"rv\">\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  }\n  document.getElementById('ind-rows').innerHTML = html;\n  lucide.createIcons({ nodes: [document.getElementById('ind-rows')] });\n}\n\n\u002F\u002F ─── PANEL 2: Préavis ────────────────────────────────────────────────────────\nconst PREA_WEEKS = { 1: 2, 2: 4, 3: 4, 4: 8, 5: 12 };\nconst PREA_LBL   = { 1: '2 semaines', 2: '1 mois', 3: '1 mois', 4: '2 mois', 5: '3 mois' };\nfunction renderPrev() {\n  const { niveau, anc, type } = S.prev;\n  let ccnW = PREA_WEEKS[niveau];\n  const ccnLbl = PREA_LBL[niveau];\n  let legalW = 0;\n  if (type === 'licenciement') {\n    if (anc >= 2) legalW = 8;\n    else if (anc >= 0.5) legalW = 4;\n  }\n  const appliedW = Math.max(ccnW, legalW);\n  let finLbl = '';\n  if (appliedW \u003C= 2) finLbl = `${appliedW} semaine${appliedW > 1 ? 's' : ''}`;\n  else if (appliedW \u003C= 4) finLbl = '1 mois';\n  else if (appliedW \u003C= 8) finLbl = '2 mois';\n  else finLbl = '3 mois';\n\n  document.getElementById('prev-result').textContent = finLbl;\n  const noms = { 1: 'Opérateurs \u002F Manœuvres', 2: 'Ouvriers spécialisés \u002F Employés', 3: 'Techniciens \u002F A.M.', 4: 'A.M. supérieurs \u002F Cadres débutants', 5: 'Cadres confirmés \u002F Ingénieurs' };\n  let html = `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">${noms[niveau]}\u003C\u002Fspan>\u003Cspan class=\"rv\">\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Durée CCN — Niveau ${niveau}\u003C\u002Fspan>\u003Cspan class=\"rv\">${ccnLbl}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  if (legalW > 0) html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Minimum légal (L1234-1)\u003C\u002Fspan>\u003Cspan class=\"rv\">${legalW \u003C= 4 ? '1 mois' : '2 mois'}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  if (legalW > ccnW) html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\" style=\"color:var(--amber-text)\">Légal appliqué (plus favorable)\u003C\u002Fspan>\u003Cspan class=\"rv\">\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  document.getElementById('prev-rows').innerHTML = html;\n}\n\n\u002F\u002F ─── PANEL 3: Grille salaires ────────────────────────────────────────────────\nconst SM_GRID = {\n  1: { lbl: 'Ouvriers \u002F Employés débutants',         annual: 22200 },\n  2: { lbl: 'Ouvriers spécialisés \u002F Employés qual.', annual: 24800 },\n  3: { lbl: 'Techniciens \u002F Agents de maîtrise',      annual: 28500 },\n  4: { lbl: 'A.M. sup. \u002F Cadres débutants',          annual: 34000 },\n  5: { lbl: 'Cadres \u002F Ingénieurs confirmés',         annual: 54000 },\n};\nconst SMIC_MENSUEL = 1801.80; \u002F\u002F SMIC indicatif 2026\nfunction renderSm() {\n  const { niveau, h } = S.sm;\n  const g = SM_GRID[niveau];\n  const m35 = g.annual \u002F 12;\n  const monthly = m35 * (h \u002F 35);\n  document.getElementById('sm-result').textContent = fmtEUR(monthly);\n  let html = `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Poste : ${g.lbl}\u003C\u002Fspan>\u003Cspan class=\"rv\">\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Taux garanti annuel (base 35h)\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(g.annual)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Mensuel base 35h\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(m35)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  if (h !== 35) html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Proratisation ${h}h\u002Fsem.\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(monthly)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">SMIC mensuel 2026 (indicatif)\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(SMIC_MENSUEL)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  document.getElementById('sm-rows').innerHTML = html;\n}\n\n\u002F\u002F ─── PANEL 4: Prime ancienneté + 13e mois ────────────────────────────────────\nfunction getAncPct(anc) {\n  if (anc >= 15) return 15;\n  if (anc >= 12) return 12;\n  if (anc >= 9)  return 9;\n  if (anc >= 6)  return 6;\n  if (anc >= 3)  return 3;\n  return 0;\n}\nfunction renderPa() {\n  const { sal, anc, mois } = S.pa;\n  const pct = getAncPct(anc);\n  const primeMens = sal * pct \u002F 100;\n  const primeAnn  = primeMens * 12;\n  const t13 = sal * mois \u002F 12;\n  const total = primeAnn + t13;\n\n  document.getElementById('pa-result').textContent = fmtEUR(total);\n  let html = '';\n  html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Taux ancienneté applicable\u003C\u002Fspan>\u003Cspan class=\"rv\">${pct} %\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  if (pct > 0) {\n    html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Prime d'ancienneté mensuelle\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(primeMens)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n    html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Prime d'ancienneté annuelle (×12)\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(primeAnn)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  } else {\n    html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\" style=\"color:var(--amber-text)\">Prime ouverte à partir de 3 ans d'ancienneté\u003C\u002Fspan>\u003Cspan class=\"rv\">0 €\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  }\n  html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">13e mois (${mois}\u002F12 mois)\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(t13)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  const paliers = [3,6,9,12,15];\n  const next = paliers.find(p => p > anc);\n  if (next) html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Prochain palier : ${getAncPct(next)} % dans ${next - anc} an(s)\u003C\u002Fspan>\u003Cspan class=\"rv\">\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  document.getElementById('pa-rows').innerHTML = html;\n}\n\n\u002F\u002F ─── PANEL 5: Congés ─────────────────────────────────────────────────────────\nfunction renderCg() {\n  const { anc, age, mode } = S.cg;\n  const base = mode === 'ouvres' ? 25 : 30;\n  const extraAnc = anc >= 20 ? 3 : anc >= 10 ? 2 : 0;\n  const extraAge = age >= 50 ? 1 : 0;\n  const total = base + extraAnc + extraAge;\n  const unit = mode === 'ouvres' ? 'j. ouvrés' : 'j. ouvrables';\n\n  document.getElementById('cg-result').innerHTML = `${total} \u003Cspan class=\"result-unit\">${unit}\u003C\u002Fspan>`;\n  let html = `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Base légale (L3141-3)\u003C\u002Fspan>\u003Cspan class=\"rv\">${base} ${unit}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Supplément ancienneté (art. 45 CCN)\u003C\u002Fspan>\u003Cspan class=\"rv\">${extraAnc > 0 ? '+' + extraAnc + ' j.' : 'néant (\u003C 10 ans)'}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Supplément senior 50+ ans\u003C\u002Fspan>\u003Cspan class=\"rv\">${extraAge > 0 ? '+1 j.' : 'néant'}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  html += `\u003Cdiv class=\"rrow\" style=\"font-weight:700\">\u003Cspan class=\"rl\">Total\u003C\u002Fspan>\u003Cspan class=\"rv\" style=\"color:var(--accent)\">${total} ${unit}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  document.getElementById('cg-rows').innerHTML = html;\n}\n\n\u002F\u002F ─── PANEL 6: Heures supplémentaires ─────────────────────────────────────────\nfunction renderHs() {\n  const { taux, h1, h2, mode } = S.hs;\n  const maj1 = 0.25, maj2 = 0.50;\n  let pay1 = 0, repos1h = 0;\n  if (mode === 'paiement') {\n    pay1 = taux * h1 * (1 + maj1);\n  } else {\n    repos1h = h1 * (1 + maj1); \u002F\u002F hours of repos compensateur\n  }\n  const pay2 = taux * h2 * (1 + maj2);\n  const totalPay = pay1 + pay2;\n\n  document.getElementById('hs-result').textContent = mode === 'repos' && h1 > 0 && h2 === 0\n    ? `Repos : ${repos1h.toFixed(2).replace('.', ',')} h`\n    : fmtEUR(totalPay);\n\n  let html = '';\n  if (mode === 'paiement') {\n    html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Tranche 1 — ${h1}h × ${fmtEUR2(taux)} × 125 %\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(pay1)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  } else {\n    html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Tranche 1 → repos compensateur équivalent\u003C\u002Fspan>\u003Cspan class=\"rv\">${repos1h.toFixed(2).replace('.', ',')} h\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  }\n  if (h2 > 0) html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\">Tranche 2 — ${h2}h × ${fmtEUR2(taux)} × 150 %\u003C\u002Fspan>\u003Cspan class=\"rv\">${fmtEUR(pay2)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  html += `\u003Cdiv class=\"rrow\" style=\"font-weight:700\">\u003Cspan class=\"rl\">Total majoration versée\u003C\u002Fspan>\u003Cspan class=\"rv\" style=\"color:var(--accent)\">${fmtEUR(totalPay)}\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  if (mode === 'repos' && repos1h > 0) {\n    html += `\u003Cdiv class=\"rrow\">\u003Cspan class=\"rl\" style=\"color:var(--green-text)\">+ Repos compensateur équivalent : ${repos1h.toFixed(2).replace('.', ',')} h\u003C\u002Fspan>\u003Cspan class=\"rv\">\u003C\u002Fspan>\u003C\u002Fdiv>`;\n  }\n  document.getElementById('hs-rows').innerHTML = html;\n}\n\n\u002F\u002F ─── Tab system ──────────────────────────────────────────────────────────────\nconst tabBtns   = document.querySelectorAll('[data-tab]');\nconst tabPanels = document.querySelectorAll('[data-panel]');\nconst renderMap = {\n  'indemnite':       renderInd,\n  'preavis':         renderPrev,\n  'salaire-min':     renderSm,\n  'prime-anciennete':renderPa,\n  'conges':          renderCg,\n  'heures-supp':     renderHs,\n};\n\nfunction activate(id) {\n  tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n  tabPanels.forEach(p => p.classList.toggle('active', p.dataset.panel === id));\n  if (location.hash !== '#' + id) location.hash = id;\n  if (renderMap[id]) renderMap[id]();\n  requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));\n}\n\ntabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\n\u002F\u002F ─── Wire all inputs ─────────────────────────────────────────────────────────\n\n\u002F\u002F Indemnité\nslider('ind-sal',  S.ind, 'sal',  'ind-sal-v',  v => fmtEUR(v) + '', renderInd);\nslider('ind-anc',  S.ind, 'anc',  'ind-anc-v',  v => v + ' an' + (v > 1 ? 's' : ''), renderInd);\nsetupPills('ind-statut', S.ind, 'statut', renderInd);\n\n\u002F\u002F Préavis\nslider('prev-anc', S.prev, 'anc', 'prev-anc-v', v => v + ' an' + (v > 1 ? 's' : ''), renderPrev);\nsetupPills('prev-niveau', S.prev, 'niveau', renderPrev);\nsetupPills('prev-type',   S.prev, 'type',   renderPrev);\n\n\u002F\u002F Salaire min\nslider('sm-h', S.sm, 'h', 'sm-h-v', v => v + ' h', renderSm);\nsetupPills('sm-niveau', S.sm, 'niveau', renderSm);\n\n\u002F\u002F Prime ancienneté\nslider('pa-sal',  S.pa, 'sal',  'pa-sal-v',  v => fmtEUR(v), renderPa);\nslider('pa-anc',  S.pa, 'anc',  'pa-anc-v',  v => v + ' an' + (v > 1 ? 's' : ''), renderPa);\nslider('pa-mois', S.pa, 'mois', 'pa-mois-v', v => v + ' mois', renderPa);\n\n\u002F\u002F Congés\nslider('cg-anc', S.cg, 'anc', 'cg-anc-v', v => v + ' an' + (v > 1 ? 's' : ''), renderCg);\nslider('cg-age', S.cg, 'age', 'cg-age-v', v => v + ' ans', renderCg);\nsetupPills('cg-mode', S.cg, 'mode', renderCg);\n\n\u002F\u002F Heures supp\nslider('hs-taux', S.hs, 'taux', 'hs-taux-v', v => new Intl.NumberFormat('fr-FR',{minimumFractionDigits:2}).format(v) + ' €\u002Fh', renderHs);\nslider('hs-h1',   S.hs, 'h1',   'hs-h1-v',   v => v + ' h', renderHs);\nslider('hs-h2',   S.hs, 'h2',   'hs-h2-v',   v => v + ' h', renderHs);\nsetupPills('hs-mode', S.hs, 'mode', renderHs);\n\n\u002F\u002F ─── ResizeObserver → parent iframe ──────────────────────────────────────────\nconst ro = new ResizeObserver(() => {\n  const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n  parent.postMessage({ type: 'resize', height: h }, '*');\n});\nro.observe(document.documentElement);\n\n\u002F\u002F ─── Init ─────────────────────────────────────────────────────────────────────\nwindow.addEventListener('DOMContentLoaded', () => {\n  lucide.createIcons();\n  const hashId = location.hash.slice(1);\n  const valid = Object.keys(renderMap);\n  const defaultId = valid.includes(hashId) ? hashId : 'indemnite';\n  activate(defaultId);\n});\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-des-industries-metallurgiques-mecaniques-28acfb9986.webp",[]]