[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-outil-convention-collective-metallurgie-idcc-3248-fr":83,"footer-cities-fr":161},[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":89,"json_ld":90,"faq":134,"tool_html":156,"source":157,"category":7,"audience":158,"publish_mode":159,"hero_image":160,"hero_image_alt":85},"outil-cc-metallurgie-3248","Outil Convention Collective Métallurgie IDCC 3248","Convention Collective Métallurgie IDCC 3248 — Outil complet 2024","Calculez salaires minimaux, heures supplémentaires, congés et préavis selon la Convention collective de la métallurgie (IDCC 3248). Grille 2024 incluse.","Cet outil interactif couvre l'ensemble des dispositions clés de la Convention collective nationale de la métallurgie (IDCC 3248), entrée en vigueur le 1er janvier 2024. Calculez les salaires minimaux par niveau de classification (A à I), les majorations d'heures supplémentaires (25 % et 50 %), les droits à congés payés et conventionnels, les durées de préavis et les indemnités de licenciement selon votre catégorie professionnelle et votre ancienneté.","outil-convention-collective-metallurgie-idcc-3248",[91,117],{"name":85,"@type":92,"about":93,"author":97,"@context":101,"audience":102,"inLanguage":105,"description":106,"featureList":107,"operatingSystem":114,"applicationCategory":115,"isAccessibleForFree":116},"WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective nationale de la métallurgie","Thing","IDCC 3248",{"url":98,"name":99,"@type":100},"https:\u002F\u002Fwww.expert-zoom.com","Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"@type":103,"audienceType":104},"Audience","Salariés, employeurs et professionnels RH du secteur de la métallurgie","fr","Outil interactif complet pour la Convention collective nationale de la métallurgie (IDCC 3248) : calcul des salaires minimaux, heures supplémentaires, congés, préavis, indemnités de licenciement et classification des emplois.",[108,109,110,111,112,113],"Calcul des salaires minimaux 2024 par niveau de classification (A-I)","Calculateur d'heures supplémentaires avec majorations 25% et 50%","Calcul des congés payés légaux et conventionnels","Calcul du préavis selon catégorie et ancienneté","Estimation des indemnités de licenciement légales et conventionnelles","Outil de détermination du niveau de classification par critères classants","All","BusinessApplication",true,{"@type":118,"@context":101,"mainEntity":119},"FAQPage",[120,126,130],{"name":121,"@type":122,"acceptedAnswer":123},"Qu'est-ce que la Convention collective nationale de la métallurgie (IDCC 3248) ?","Question",{"text":124,"@type":125},"La CCN de la métallurgie (IDCC 3248) est la convention collective nationale qui régit les relations de travail dans les entreprises de la métallurgie en France. Elle est entrée en vigueur le 1er janvier 2024 et remplace les nombreuses conventions territoriales antérieures. Elle couvre environ 1,5 million de salariés.","Answer",{"name":127,"@type":122,"acceptedAnswer":128},"Quels sont les salaires minimaux de la convention collective métallurgie en 2024 ?",{"text":129,"@type":125},"Les salaires minimaux 2024 de l'IDCC 3248 varient de 1 802 € brut\u002Fmois (niveau B) à 5 200 € brut\u002Fmois (niveau I), sur une base de 35 heures hebdomadaires.",{"name":131,"@type":122,"acceptedAnswer":132},"Quel est le taux de majoration des heures supplémentaires dans la métallurgie ?",{"text":133,"@type":125},"La CCN Métallurgie IDCC 3248 fixe un taux de majoration de 25 % pour les 8 premières heures supplémentaires par semaine, puis de 50 % au-delà. Le contingent annuel est fixé à 220 heures.",[135,137,140,142,144,147,150,153],{"a":136,"q":121},"La CCN de la métallurgie (IDCC 3248) est la convention collective nationale qui régit les relations de travail dans les entreprises de la métallurgie en France. Elle est entrée en vigueur le 1er janvier 2024 et remplace les nombreuses conventions territoriales antérieures. Elle couvre environ 1,5 million de salariés dans des secteurs comme l'automobile, l'aéronautique, la mécanique et l'électronique.",{"a":138,"q":139},"La nouvelle convention remplace les anciens coefficients hiérarchiques (100–395) par une grille de 9 niveaux (A à I) déterminés à partir de 5 critères classants : la complexité des activités, l'autonomie, la responsabilité, les connaissances requises et la dimension relationnelle. Chaque critère est noté de 1 à 5. La somme des notes détermine le niveau de classification du salarié.","Comment fonctionne le nouveau système de classification IDCC 3248 ?",{"a":141,"q":127},"Les salaires minimaux 2024 de l'IDCC 3248 varient de 1 802 € brut\u002Fmois (niveau B, base 35h) à 5 200 € brut\u002Fmois (niveau I). Ces minima sont définis par accord de branche et révisés annuellement. Ils ne peuvent en aucun cas être inférieurs au SMIC légal, actuellement fixé à 1 801,80 € brut\u002Fmois pour 35 heures.",{"a":143,"q":131},"La CCN Métallurgie IDCC 3248 fixe un taux de majoration de 25 % pour les 8 premières heures supplémentaires par semaine (au-delà de la durée légale de 35 heures), puis de 50 % au-delà de la 8e heure. Le contingent annuel d'heures supplémentaires est fixé à 220 heures. Au-delà, une consultation du CSE et une information de la DREETS sont obligatoires.",{"a":145,"q":146},"La durée du préavis dépend de la catégorie professionnelle et de l'ancienneté. Pour un ouvrier\u002Femployé avec plus de 2 ans d'ancienneté : 2 mois. Pour un agent de maîtrise avec plus de 2 ans : 3 mois. Pour un cadre avec plus de 2 ans : 4 mois. Ces durées s'appliquent au licenciement ; en cas de démission, les mêmes durées s'appliquent sauf pour la retraite (1 à 3 mois selon catégorie).","Quelle est la durée du préavis de licenciement dans la métallurgie ?",{"a":148,"q":149},"La prime d'ancienneté dans la CCN Métallurgie est égale à 1 % du salaire de base par année d'ancienneté dans la branche, dans la limite de 15 % atteinte à partir de 15 ans d'ancienneté. Elle s'ajoute au salaire minimum conventionnel de classification et est intégrée dans le salaire mensuel brut.","Comment est calculée la prime d'ancienneté dans la CCN Métallurgie 2024 ?",{"a":151,"q":152},"La CCN Métallurgie accorde des jours de congés supplémentaires en fonction de l'ancienneté dans l'entreprise : 1 jour supplémentaire dès 5 ans d'ancienneté, 2 jours à partir de 10 ans, 3 jours à partir de 15 ans et 4 jours à partir de 20 ans. Ces jours s'ajoutent aux 30 jours ouvrables (5 semaines) de congés légaux.","Combien de jours de congés supplémentaires accorde la convention collective de la métallurgie ?",{"a":154,"q":155},"L'indemnité conventionnelle de licenciement dans la CCN Métallurgie est calculée selon la catégorie professionnelle. Elle ne peut être inférieure à l'indemnité légale (1\u002F4 de mois par année pour les 10 premières années, 1\u002F3 de mois au-delà). Pour les cadres, la convention prévoit des indemnités plus favorables, notamment 3\u002F10 de mois par année jusqu'à 10 ans d'ancienneté. L'indemnité est versée dès 8 mois d'ancienneté.","Quelle est l'indemnité de licenciement dans la métallurgie ?","\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.0\">\n  \u003Ctitle>Outil Convention Collective Métallurgie IDCC 3248\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\n    body {\n      font-family: system-ui, -apple-system, 'Segoe UI', sans-serif;\n      background: #fafaf9;\n      color: #1c1917;\n      padding: 24px;\n      min-height: 100vh;\n    }\n\n    h1 {\n      font-size: 22px;\n      font-weight: 700;\n      color: #1c1917;\n      margin-bottom: 4px;\n    }\n    .subtitle {\n      font-size: 14px;\n      color: #78716c;\n      margin-bottom: 24px;\n    }\n\n    \u002F* Tabs *\u002F\n    .tabs {\n      display: flex;\n      gap: 6px;\n      flex-wrap: wrap;\n      margin-bottom: 24px;\n    }\n    .tab {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      padding: 8px 14px;\n      border-radius: 8px;\n      border: 1px solid #e7e5e4;\n      background: #fff;\n      color: #78716c;\n      font-size: 13px;\n      font-weight: 500;\n      cursor: pointer;\n      transition: all 150ms;\n    }\n    .tab:hover { background: #f5f5f4; color: #1c1917; }\n    .tab.active {\n      background: #1c1917;\n      color: #fff;\n      border-color: #1c1917;\n    }\n    .tab i { width: 15px; height: 15px; }\n\n    \u002F* Panel *\u002F\n    .panel { display: none; }\n    .panel.active { display: block; }\n\n    \u002F* Card *\u002F\n    .card {\n      background: #fff;\n      border: 1px solid #e7e5e4;\n      border-radius: 12px;\n      padding: 24px;\n      margin-bottom: 20px;\n    }\n    .card-title {\n      font-size: 15px;\n      font-weight: 600;\n      color: #1c1917;\n      margin-bottom: 16px;\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n    .card-title i { width: 18px; height: 18px; color: #2563eb; }\n\n    \u002F* Grid *\u002F\n    .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n    .grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 16px; }\n    @media (max-width: 600px) {\n      .grid-2, .grid-3 { grid-template-columns: 1fr; }\n    }\n\n    \u002F* Fields *\u002F\n    .field { margin-bottom: 16px; }\n    .field label {\n      display: block;\n      font-size: 13px;\n      font-weight: 500;\n      color: #44403c;\n      margin-bottom: 6px;\n    }\n    .field-row {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n    }\n    .field-header {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      margin-bottom: 6px;\n    }\n    .value-badge {\n      font-size: 13px;\n      font-weight: 700;\n      color: #2563eb;\n      background: #eff6ff;\n      padding: 2px 8px;\n      border-radius: 4px;\n    }\n\n    input[type=\"number\"], select {\n      width: 100%;\n      padding: 8px 12px;\n      border: 1px solid #d6d3d1;\n      border-radius: 8px;\n      font-size: 14px;\n      color: #1c1917;\n      background: #fff;\n      outline: none;\n      transition: border-color 150ms, box-shadow 150ms;\n    }\n    input[type=\"number\"]:focus, select:focus {\n      border-color: #2563eb;\n      box-shadow: 0 0 0 3px rgba(37,99,235,0.08);\n    }\n\n    input[type=\"range\"] {\n      width: 100%;\n      accent-color: #2563eb;\n      height: 6px;\n      cursor: pointer;\n    }\n\n    .input-with-suffix {\n      position: relative;\n    }\n    .input-with-suffix input {\n      padding-right: 44px;\n    }\n    .input-suffix {\n      position: absolute;\n      right: 12px;\n      top: 50%;\n      transform: translateY(-50%);\n      font-size: 13px;\n      color: #78716c;\n      pointer-events: none;\n    }\n\n    \u002F* Pills *\u002F\n    .pills {\n      display: flex;\n      gap: 6px;\n      flex-wrap: wrap;\n    }\n    .pill {\n      padding: 6px 12px;\n      border-radius: 6px;\n      border: 1px solid #e7e5e4;\n      background: #f5f5f4;\n      color: #57534e;\n      font-size: 13px;\n      font-weight: 500;\n      cursor: pointer;\n      transition: all 150ms;\n    }\n    .pill:hover { background: #e7e5e4; }\n    .pill.active { background: #1c1917; color: #fff; border-color: #1c1917; }\n\n    \u002F* Results *\u002F\n    .result-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n      gap: 12px;\n      margin-top: 8px;\n    }\n    .result-card {\n      background: #eff6ff;\n      border: 1px solid #bfdbfe;\n      border-radius: 10px;\n      padding: 16px;\n    }\n    .result-label {\n      font-size: 12px;\n      color: #3b82f6;\n      font-weight: 500;\n      margin-bottom: 4px;\n    }\n    .result-value {\n      font-size: 20px;\n      font-weight: 700;\n      color: #1e40af;\n      font-variant-numeric: tabular-nums;\n    }\n    .result-sub {\n      font-size: 11px;\n      color: #60a5fa;\n      margin-top: 2px;\n    }\n\n    .result-card.green {\n      background: #f0fdf4;\n      border-color: #bbf7d0;\n    }\n    .result-card.green .result-label { color: #16a34a; }\n    .result-card.green .result-value { color: #15803d; }\n    .result-card.green .result-sub { color: #4ade80; }\n\n    .result-card.orange {\n      background: #fff7ed;\n      border-color: #fed7aa;\n    }\n    .result-card.orange .result-label { color: #ea580c; }\n    .result-card.orange .result-value { color: #c2410c; }\n\n    .result-card.stone {\n      background: #fafaf9;\n      border-color: #d6d3d1;\n    }\n    .result-card.stone .result-label { color: #78716c; }\n    .result-card.stone .result-value { color: #1c1917; }\n\n    \u002F* Info box *\u002F\n    .info-box {\n      background: #f0f9ff;\n      border: 1px solid #bae6fd;\n      border-radius: 8px;\n      padding: 12px 16px;\n      font-size: 13px;\n      color: #0369a1;\n      display: flex;\n      gap: 8px;\n      align-items: flex-start;\n      margin-top: 12px;\n    }\n    .info-box i { width: 16px; height: 16px; flex-shrink: 0; margin-top: 1px; }\n\n    .warn-box {\n      background: #fefce8;\n      border: 1px solid #fde68a;\n      border-radius: 8px;\n      padding: 12px 16px;\n      font-size: 13px;\n      color: #92400e;\n      display: flex;\n      gap: 8px;\n      align-items: flex-start;\n      margin-top: 12px;\n    }\n    .warn-box i { width: 16px; height: 16px; flex-shrink: 0; margin-top: 1px; }\n\n    \u002F* Table *\u002F\n    .table-wrap { overflow-x: auto; }\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      font-size: 13px;\n    }\n    th {\n      background: #f5f5f4;\n      font-weight: 600;\n      color: #44403c;\n      padding: 10px 12px;\n      text-align: left;\n      border-bottom: 1px solid #e7e5e4;\n    }\n    td {\n      padding: 10px 12px;\n      border-bottom: 1px solid #f5f5f4;\n      color: #1c1917;\n    }\n    tr:last-child td { border-bottom: none; }\n    tr.highlight td { background: #eff6ff; font-weight: 600; color: #1e40af; }\n    tr:hover td { background: #fafaf9; }\n\n    \u002F* Tag *\u002F\n    .tag {\n      display: inline-block;\n      padding: 2px 8px;\n      border-radius: 4px;\n      font-size: 11px;\n      font-weight: 600;\n    }\n    .tag-blue { background: #dbeafe; color: #1d4ed8; }\n    .tag-green { background: #dcfce7; color: #15803d; }\n    .tag-orange { background: #ffedd5; color: #c2410c; }\n    .tag-red { background: #fee2e2; color: #dc2626; }\n\n    \u002F* Divider *\u002F\n    .divider {\n      border: none;\n      border-top: 1px solid #e7e5e4;\n      margin: 16px 0;\n    }\n\n    \u002F* Section header *\u002F\n    .section-header {\n      font-size: 12px;\n      font-weight: 600;\n      color: #78716c;\n      text-transform: uppercase;\n      letter-spacing: 0.05em;\n      margin-bottom: 12px;\n      margin-top: 4px;\n    }\n\n    \u002F* Big number *\u002F\n    .big-number {\n      font-size: 36px;\n      font-weight: 800;\n      color: #1e40af;\n      font-variant-numeric: tabular-nums;\n    }\n    .big-number-label {\n      font-size: 13px;\n      color: #78716c;\n      margin-top: 2px;\n    }\n\n    \u002F* Coefficient badge *\u002F\n    .coeff-badge {\n      font-size: 13px;\n      font-weight: 700;\n      padding: 4px 10px;\n      border-radius: 6px;\n      background: #1e40af;\n      color: #fff;\n    }\n\n    \u002F* Responsive footer *\u002F\n    .footer-note {\n      font-size: 12px;\n      color: #a8a29e;\n      text-align: center;\n      margin-top: 24px;\n      padding-top: 16px;\n      border-top: 1px solid #e7e5e4;\n    }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\n  \u003Ch1>\u003Ci data-lucide=\"hard-hat\" style=\"width:22px;height:22px;vertical-align:-4px;color:#2563eb;\">\u003C\u002Fi> Convention Collective Métallurgie — IDCC 3248\u003C\u002Fh1>\n  \u003Cp class=\"subtitle\">Outil de référence interactif · Entrée en vigueur au 1\u003Csup>er\u003C\u002Fsup> janvier 2024\u003C\u002Fp>\n\n  \u003C!-- Tabs -->\n  \u003Cdiv class=\"tabs\">\n    \u003Cbutton class=\"tab active\" data-tab=\"salaires\">\u003Ci data-lucide=\"euro\">\u003C\u002Fi> Salaires minimaux\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab\" data-tab=\"heures\">\u003Ci data-lucide=\"clock\">\u003C\u002Fi> Heures sup.\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab\" data-tab=\"conges\">\u003Ci data-lucide=\"calendar\">\u003C\u002Fi> Congés & absences\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab\" data-tab=\"preavis\">\u003Ci data-lucide=\"file-text\">\u003C\u002Fi> Préavis & rupture\u003C\u002Fbutton>\n    \u003Cbutton class=\"tab\" data-tab=\"classifications\">\u003Ci data-lucide=\"layers\">\u003C\u002Fi> Classifications\u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===================== PANEL 1 : Salaires ===================== -->\n  \u003Cdiv class=\"panel active\" id=\"panel-salaires\">\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"euro\">\u003C\u002Fi> Calcul du salaire minimum mensuel\u003C\u002Fp>\n\n      \u003Cdiv class=\"grid-2\">\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Niveau de classification\u003C\u002Flabel>\n          \u003Cselect id=\"niveau\">\n            \u003Coption value=\"B\">Niveau B — Agent de fabrication débutant\u003C\u002Foption>\n            \u003Coption value=\"C\">Niveau C — Ouvrier qualifié \u002F Employé\u003C\u002Foption>\n            \u003Coption value=\"D\">Niveau D — Technicien \u002F AM débutant\u003C\u002Foption>\n            \u003Coption value=\"E\" selected>Niveau E — Technicien supérieur \u002F AM\u003C\u002Foption>\n            \u003Coption value=\"F\">Niveau F — AM confirmé \u002F Ing. débutant\u003C\u002Foption>\n            \u003Coption value=\"G\">Niveau G — Ingénieur \u002F Cadre\u003C\u002Foption>\n            \u003Coption value=\"H\">Niveau H — Cadre confirmé \u002F Expert\u003C\u002Foption>\n            \u003Coption value=\"I\">Niveau I — Cadre supérieur\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Durée du travail hebdomadaire\u003C\u002Flabel>\n          \u003Cselect id=\"duree-hebdo\">\n            \u003Coption value=\"35\" selected>35 heures (légal)\u003C\u002Foption>\n            \u003Coption value=\"36\">36 heures\u003C\u002Foption>\n            \u003Coption value=\"37\">37 heures\u003C\u002Foption>\n            \u003Coption value=\"38\">38 heures\u003C\u002Foption>\n            \u003Coption value=\"39\">39 heures\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Cdiv class=\"field-header\">\n          \u003Clabel>Ancienneté dans la branche (années)\u003C\u002Flabel>\n          \u003Cspan class=\"value-badge\" id=\"anc-display\">5 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"anciennete\" min=\"0\" max=\"30\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Lieu de travail\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"zone-pills\">\n          \u003Cbutton class=\"pill active\" data-value=\"1\">Zone 1 (IDF + grandes agglo)\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-value=\"2\">Zone 2 (villes moyennes)\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-value=\"3\">Zone 3 (autres)\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Chr class=\"divider\">\n\n      \u003Cp class=\"section-header\">Résultats\u003C\u002Fp>\n      \u003Cdiv class=\"result-grid\">\n        \u003Cdiv class=\"result-card\">\n          \u003Cp class=\"result-label\">Salaire minimum mensuel brut\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"salaire-min\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\" id=\"salaire-min-sub\">base 35h\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card green\">\n          \u003Cp class=\"result-label\">Avec prime d'ancienneté\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"salaire-anc\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\" id=\"anc-pct\">+0%\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card stone\">\n          \u003Cp class=\"result-label\">Taux horaire minimum\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"taux-horaire\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\">brut \u002F heure\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card orange\">\n          \u003Cp class=\"result-label\">Salaire annuel brut\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"salaire-annuel\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\">13 mois conventionnel\u003C\u002Fp>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"info-box\" id=\"smic-check\" style=\"display:none;\">\n        \u003Ci data-lucide=\"alert-triangle\">\u003C\u002Fi>\n        \u003Cspan>Le salaire minimum calculé est inférieur au SMIC (1 801,80 €\u002Fmois brut pour 35h en 2025). Le SMIC s'applique.\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"info-box\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cspan>La CCN Métallurgie 2024 fixe les minima par niveau A à I. La prime d'ancienneté est de 1 % par an, plafonnée à 15 % à partir de 15 ans d'ancienneté dans la branche.\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"table\">\u003C\u002Fi> Grille complète des minima 2024\u003C\u002Fp>\n      \u003Cdiv class=\"table-wrap\">\n        \u003Ctable id=\"grille-table\">\n          \u003Cthead>\n            \u003Ctr>\n              \u003Cth>Niveau\u003C\u002Fth>\n              \u003Cth>Emplois repères\u003C\u002Fth>\n              \u003Cth>Min. mensuel (35h)\u003C\u002Fth>\n              \u003Cth>Taux horaire\u003C\u002Fth>\n              \u003Cth>vs SMIC\u003C\u002Fth>\n            \u003C\u002Ftr>\n          \u003C\u002Fthead>\n          \u003Ctbody id=\"grille-body\">\u003C\u002Ftbody>\n        \u003C\u002Ftable>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===================== PANEL 2 : Heures sup ===================== -->\n  \u003Cdiv class=\"panel\" id=\"panel-heures\">\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"clock\">\u003C\u002Fi> Calculateur d'heures supplémentaires\u003C\u002Fp>\n\n      \u003Cdiv class=\"grid-2\">\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Salaire mensuel brut de base (€)\u003C\u002Flabel>\n          \u003Cdiv class=\"input-with-suffix\">\n            \u003Cinput type=\"number\" id=\"salaire-base-hs\" value=\"2800\" min=\"1802\" step=\"50\">\n            \u003Cspan class=\"input-suffix\">€\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Durée contractuelle hebdomadaire\u003C\u002Flabel>\n          \u003Cselect id=\"duree-contrat\">\n            \u003Coption value=\"35\" selected>35 heures\u003C\u002Foption>\n            \u003Coption value=\"36\">36 heures\u003C\u002Foption>\n            \u003Coption value=\"37\">37 heures\u003C\u002Foption>\n            \u003Coption value=\"38\">38 heures\u003C\u002Foption>\n            \u003Coption value=\"39\">39 heures\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"grid-2\">\n        \u003Cdiv class=\"field\">\n          \u003Cdiv class=\"field-header\">\n            \u003Clabel>Heures sup. semaine 1 (au-delà du contrat)\u003C\u002Flabel>\n            \u003Cspan class=\"value-badge\" id=\"hs1-display\">4 h\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n          \u003Cinput type=\"range\" id=\"hs1\" min=\"0\" max=\"20\" step=\"0.5\" value=\"4\">\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Cdiv class=\"field-header\">\n            \u003Clabel>Heures sup. semaine 2\u003C\u002Flabel>\n            \u003Cspan class=\"value-badge\" id=\"hs2-display\">2 h\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n          \u003Cinput type=\"range\" id=\"hs2\" min=\"0\" max=\"20\" step=\"0.5\" value=\"2\">\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Mode de compensation\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"mode-pills\">\n          \u003Cbutton class=\"pill active\" data-value=\"majoration\">Majoration salariale\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-value=\"repos\">Repos compensateur équivalent\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-value=\"mixte\">Mixte (50% salaire \u002F 50% repos)\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Chr class=\"divider\">\n      \u003Cp class=\"section-header\">Décompte hebdomadaire\u003C\u002Fp>\n      \u003Cdiv id=\"hs-breakdown-container\">\u003C\u002Fdiv>\n\n      \u003Chr class=\"divider\">\n      \u003Cp class=\"section-header\">Résultats\u003C\u002Fp>\n      \u003Cdiv class=\"result-grid\">\n        \u003Cdiv class=\"result-card\">\n          \u003Cp class=\"result-label\">Majorations dues (semaine 1)\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"major-s1\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\" id=\"major-s1-sub\">\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card\">\n          \u003Cp class=\"result-label\">Majorations dues (semaine 2)\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"major-s2\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\" id=\"major-s2-sub\">\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card green\">\n          \u003Cp class=\"result-label\">Total majorations mensuelles (×4,33)\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"major-mensuel\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\">estimation mensuelle\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card stone\">\n          \u003Cp class=\"result-label\">Repos compensateur total\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"repos-total\">— h\u003C\u002Fp>\n          \u003Cp class=\"result-sub\" id=\"repos-sub\">\u003C\u002Fp>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"info-box\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cspan>\u003Cstrong>Taux de majoration IDCC 3248 :\u003C\u002Fstrong> 25 % pour les 8 premières heures sup. par semaine (H+1 à H+8 au-delà de la durée légale), puis 50 % au-delà. Le contingent annuel est fixé à 220 heures.\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"trending-up\">\u003C\u002Fi> Contingent annuel d'heures supplémentaires\u003C\u002Fp>\n\n      \u003Cdiv class=\"grid-2\">\n        \u003Cdiv class=\"field\">\n          \u003Cdiv class=\"field-header\">\n            \u003Clabel>Heures sup. déjà effectuées cette année\u003C\u002Flabel>\n            \u003Cspan class=\"value-badge\" id=\"contingent-display\">120 h\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n          \u003Cinput type=\"range\" id=\"contingent-effectue\" min=\"0\" max=\"300\" step=\"5\" value=\"120\">\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Cdiv class=\"field-header\">\n            \u003Clabel>Prévision heures sup. restantes\u003C\u002Flabel>\n            \u003Cspan class=\"value-badge\" id=\"contingent-prev-display\">60 h\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n          \u003Cinput type=\"range\" id=\"contingent-prevision\" min=\"0\" max=\"200\" step=\"5\" value=\"60\">\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv id=\"contingent-result\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===================== PANEL 3 : Congés ===================== -->\n  \u003Cdiv class=\"panel\" id=\"panel-conges\">\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"calendar\">\u003C\u002Fi> Calcul des congés payés et absences\u003C\u002Fp>\n\n      \u003Cdiv class=\"grid-2\">\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Nombre de jours travaillés dans la période de référence\u003C\u002Flabel>\n          \u003Cdiv class=\"input-with-suffix\">\n            \u003Cinput type=\"number\" id=\"jours-travailles\" value=\"220\" min=\"0\" max=\"365\" step=\"1\">\n            \u003Cspan class=\"input-suffix\">j\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Mode de décompte\u003C\u002Flabel>\n          \u003Cdiv class=\"pills\" id=\"decompte-pills\">\n            \u003Cbutton class=\"pill active\" data-value=\"ouvrables\">Jours ouvrables (6j\u002Fsem)\u003C\u002Fbutton>\n            \u003Cbutton class=\"pill\" data-value=\"ouvres\">Jours ouvrés (5j\u002Fsem)\u003C\u002Fbutton>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Cdiv class=\"field-header\">\n          \u003Clabel>Ancienneté dans l'entreprise (années)\u003C\u002Flabel>\n          \u003Cspan class=\"value-badge\" id=\"anc-cong-display\">3 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"anc-conges\" min=\"0\" max=\"35\" step=\"1\" value=\"3\">\n      \u003C\u002Fdiv>\n\n      \u003Chr class=\"divider\">\n      \u003Cp class=\"section-header\">Droits à congés\u003C\u002Fp>\n      \u003Cdiv class=\"result-grid\">\n        \u003Cdiv class=\"result-card\">\n          \u003Cp class=\"result-label\">CP légaux acquis\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"cp-legaux\">— j\u003C\u002Fp>\n          \u003Cp class=\"result-sub\" id=\"cp-legaux-sub\">jours ouvrables\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card green\">\n          \u003Cp class=\"result-label\">Jours conventionnels supplémentaires\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"cp-conv\">— j\u003C\u002Fp>\n          \u003Cp class=\"result-sub\">ancienneté IDCC 3248\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card orange\">\n          \u003Cp class=\"result-label\">Total congés annuels\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"cp-total\">— j\u003C\u002Fp>\n          \u003Cp class=\"result-sub\">légaux + conventionnels\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card stone\">\n          \u003Cp class=\"result-label\">Équivalent semaines\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"cp-semaines\">— sem.\u003C\u002Fp>\n          \u003Cp class=\"result-sub\">de congés\u003C\u002Fp>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"heart\">\u003C\u002Fi> Congés pour événements familiaux\u003C\u002Fp>\n      \u003Cdiv class=\"table-wrap\">\n        \u003Ctable>\n          \u003Cthead>\n            \u003Ctr>\u003Cth>Événement\u003C\u002Fth>\u003Cth>Durée légale\u003C\u002Fth>\u003Cth>Durée CCN Métal\u003C\u002Fth>\u003Cth>Remarque\u003C\u002Fth>\u003C\u002Ftr>\n          \u003C\u002Fthead>\n          \u003Ctbody>\n            \u003Ctr>\u003Ctd>Mariage \u002F PACS du salarié\u003C\u002Ftd>\u003Ctd>4 j ouvrables\u003C\u002Ftd>\u003Ctd>\u003Cstrong>5 j ouvrables\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Jours non fractionnables\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>Naissance \u002F adoption\u003C\u002Ftd>\u003Ctd>3 j\u003C\u002Ftd>\u003Ctd>\u003Cstrong>3 j\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Ouvrés\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>Mariage d'un enfant\u003C\u002Ftd>\u003Ctd>1 j\u003C\u002Ftd>\u003Ctd>\u003Cstrong>2 j\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>Décès conjoint \u002F partenaire\u003C\u002Ftd>\u003Ctd>3 j\u003C\u002Ftd>\u003Ctd>\u003Cstrong>5 j\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Ouvrés\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>Décès enfant\u003C\u002Ftd>\u003Ctd>12 j\u003C\u002Ftd>\u003Ctd>\u003Cstrong>12 j\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Ou 14 j si enfant &lt;25 ans\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>Décès père \u002F mère\u003C\u002Ftd>\u003Ctd>3 j\u003C\u002Ftd>\u003Ctd>\u003Cstrong>4 j\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Ouvrés\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>Décès frère \u002F sœur\u003C\u002Ftd>\u003Ctd>3 j\u003C\u002Ftd>\u003Ctd>\u003Cstrong>3 j\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Ouvrés\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>Décès beau-père \u002F belle-mère\u003C\u002Ftd>\u003Ctd>3 j\u003C\u002Ftd>\u003Ctd>\u003Cstrong>3 j\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Ouvrés\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>Déménagement\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd>\u003Cstrong>1 j\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>1 fois\u002Fan max\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>Enfant malade (&lt;12 ans)\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003Ctd>\u003Cstrong>6 j\u002Fan\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Non rémunérés légalement\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003C\u002Ftbody>\n        \u003C\u002Ftable>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-box\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cspan>Les congés conventionnels pour événements familiaux sont accordés sans condition d'ancienneté et ne se déduisent pas du solde de congés payés.\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===================== PANEL 4 : Préavis ===================== -->\n  \u003Cdiv class=\"panel\" id=\"panel-preavis\">\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"file-text\">\u003C\u002Fi> Calcul du préavis et des indemnités de licenciement\u003C\u002Fp>\n\n      \u003Cdiv class=\"grid-2\">\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Catégorie professionnelle\u003C\u002Flabel>\n          \u003Cselect id=\"categorie\">\n            \u003Coption value=\"ouvrier\">Ouvrier \u002F Employé (niveaux B-D)\u003C\u002Foption>\n            \u003Coption value=\"am\" selected>Agent de maîtrise (niveaux E-F)\u003C\u002Foption>\n            \u003Coption value=\"cadre\">Cadre (niveaux G-I)\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Motif de rupture\u003C\u002Flabel>\n          \u003Cselect id=\"motif\">\n            \u003Coption value=\"licenciement\">Licenciement\u003C\u002Foption>\n            \u003Coption value=\"demission\">Démission\u003C\u002Foption>\n            \u003Coption value=\"retraite\">Départ à la retraite\u003C\u002Foption>\n            \u003Coption value=\"retraite-mise\">Mise à la retraite\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Cdiv class=\"field-header\">\n          \u003Clabel>Ancienneté dans l'entreprise (années)\u003C\u002Flabel>\n          \u003Cspan class=\"value-badge\" id=\"anc-preavis-display\">8 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"anc-preavis\" min=\"0\" max=\"40\" step=\"1\" value=\"8\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire mensuel brut de référence (€)\u003C\u002Flabel>\n        \u003Cdiv class=\"input-with-suffix\">\n          \u003Cinput type=\"number\" id=\"salaire-ref\" value=\"3200\" min=\"0\" step=\"100\">\n          \u003Cspan class=\"input-suffix\">€\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Type de licenciement\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"type-licenc-pills\">\n          \u003Cbutton class=\"pill active\" data-value=\"economique\">Économique\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-value=\"personnel\">Cause réelle et sérieuse\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-value=\"faute-grave\">Faute grave\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Chr class=\"divider\">\n      \u003Cp class=\"section-header\">Résultats\u003C\u002Fp>\n      \u003Cdiv class=\"result-grid\">\n        \u003Cdiv class=\"result-card\">\n          \u003Cp class=\"result-label\">Durée du préavis\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"duree-preavis\">— mois\u003C\u002Fp>\n          \u003Cp class=\"result-sub\" id=\"preavis-sub\">\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card orange\">\n          \u003Cp class=\"result-label\">Indemnité légale de licenciement\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"indemn-legale\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\">brut\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card green\">\n          \u003Cp class=\"result-label\">Indemnité conventionnelle\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"indemn-conv\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\">IDCC 3248 (si plus favorable)\u003C\u002Fp>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-card stone\">\n          \u003Cp class=\"result-label\">Indemnité compensatrice de préavis\u003C\u002Fp>\n          \u003Cp class=\"result-value\" id=\"indemn-preavis-comp\">— €\u003C\u002Fp>\n          \u003Cp class=\"result-sub\">si dispense de préavis\u003C\u002Fp>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"warn-box\" id=\"warn-faute\" style=\"display:none;\">\n        \u003Ci data-lucide=\"alert-triangle\">\u003C\u002Fi>\n        \u003Cspan>En cas de faute grave ou lourde, aucune indemnité de licenciement ni indemnité compensatrice de préavis n'est due. Seuls les congés payés acquis sont versés.\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"info-box\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cspan id=\"preavis-info-text\">La CCN Métallurgie 2024 prévoit des délais de préavis et indemnités plus favorables que la loi pour les cadres et agents de maîtrise. L'indemnité conventionnelle s'applique si elle est supérieure à l'indemnité légale.\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"table\">\u003C\u002Fi> Barème des préavis IDCC 3248\u003C\u002Fp>\n      \u003Cdiv class=\"table-wrap\">\n        \u003Ctable>\n          \u003Cthead>\n            \u003Ctr>\u003Cth>Catégorie\u003C\u002Fth>\u003Cth>Ancienneté\u003C\u002Fth>\u003Cth>Licenciement\u003C\u002Fth>\u003Cth>Démission\u003C\u002Fth>\u003Cth>Retraite\u003C\u002Fth>\u003C\u002Ftr>\n          \u003C\u002Fthead>\n          \u003Ctbody>\n            \u003Ctr>\u003Ctd rowspan=\"3\">Ouvrier \u002F Employé\u003C\u002Ftd>\u003Ctd>&lt; 6 mois\u003C\u002Ftd>\u003Ctd>1 semaine\u003C\u002Ftd>\u003Ctd>1 semaine\u003C\u002Ftd>\u003Ctd>1 mois\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>6 mois à 2 ans\u003C\u002Ftd>\u003Ctd>1 mois\u003C\u002Ftd>\u003Ctd>1 mois\u003C\u002Ftd>\u003Ctd>1 mois\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>&gt; 2 ans\u003C\u002Ftd>\u003Ctd>2 mois\u003C\u002Ftd>\u003Ctd>2 mois\u003C\u002Ftd>\u003Ctd>1 mois\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd rowspan=\"2\">Agent de maîtrise\u003C\u002Ftd>\u003Ctd>&lt; 2 ans\u003C\u002Ftd>\u003Ctd>2 mois\u003C\u002Ftd>\u003Ctd>2 mois\u003C\u002Ftd>\u003Ctd>2 mois\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>&gt; 2 ans\u003C\u002Ftd>\u003Ctd>3 mois\u003C\u002Ftd>\u003Ctd>3 mois\u003C\u002Ftd>\u003Ctd>2 mois\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd rowspan=\"2\">Cadre\u003C\u002Ftd>\u003Ctd>&lt; 2 ans\u003C\u002Ftd>\u003Ctd>3 mois\u003C\u002Ftd>\u003Ctd>3 mois\u003C\u002Ftd>\u003Ctd>3 mois\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>&gt; 2 ans\u003C\u002Ftd>\u003Ctd>4 mois\u003C\u002Ftd>\u003Ctd>4 mois\u003C\u002Ftd>\u003Ctd>3 mois\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003C\u002Ftbody>\n        \u003C\u002Ftable>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===================== PANEL 5 : Classifications ===================== -->\n  \u003Cdiv class=\"panel\" id=\"panel-classifications\">\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"layers\">\u003C\u002Fi> Système de classification IDCC 3248\u003C\u002Fp>\n\n      \u003Cp style=\"font-size:14px;color:#57534e;margin-bottom:16px;\">La nouvelle CCN Métallurgie 2024 remplace le système de coefficients par une grille à 5 critères classants. Renseignez vos critères pour déterminer votre niveau de classification.\u003C\u002Fp>\n\n      \u003Cdiv class=\"grid-2\">\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Complexité des activités\u003C\u002Flabel>\n          \u003Cselect id=\"critere-complexite\">\n            \u003Coption value=\"1\">1 — Tâches simples et répétitives\u003C\u002Foption>\n            \u003Coption value=\"2\">2 — Tâches variées, modes opératoires définis\u003C\u002Foption>\n            \u003Coption value=\"3\" selected>3 — Activités complexes, marge d'initiative\u003C\u002Foption>\n            \u003Coption value=\"4\">4 — Activités très complexes, expertise\u003C\u002Foption>\n            \u003Coption value=\"5\">5 — Activités hautement complexes, stratégie\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Autonomie\u003C\u002Flabel>\n          \u003Cselect id=\"critere-autonomie\">\n            \u003Coption value=\"1\">1 — Contrôle permanent\u003C\u002Foption>\n            \u003Coption value=\"2\">2 — Contrôle régulier\u003C\u002Foption>\n            \u003Coption value=\"3\" selected>3 — Autonomie dans le cadre défini\u003C\u002Foption>\n            \u003Coption value=\"4\">4 — Large autonomie\u003C\u002Foption>\n            \u003Coption value=\"5\">5 — Pleine autonomie, définit les orientations\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Responsabilité\u003C\u002Flabel>\n          \u003Cselect id=\"critere-responsabilite\">\n            \u003Coption value=\"1\">1 — Responsabilité sur son propre travail\u003C\u002Foption>\n            \u003Coption value=\"2\">2 — Responsabilité partielle sur l'équipe\u003C\u002Foption>\n            \u003Coption value=\"3\" selected>3 — Responsabilité d'une équipe ou fonction\u003C\u002Foption>\n            \u003Coption value=\"4\">4 — Responsabilité de plusieurs équipes \u002F projets\u003C\u002Foption>\n            \u003Coption value=\"5\">5 — Responsabilité globale d'un domaine\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Connaissances requises\u003C\u002Flabel>\n          \u003Cselect id=\"critere-connaissances\">\n            \u003Coption value=\"1\">1 — CAP \u002F BEP ou expérience courte\u003C\u002Foption>\n            \u003Coption value=\"2\">2 — Bac ou expérience équivalente\u003C\u002Foption>\n            \u003Coption value=\"3\" selected>3 — Bac+2 \u002F BTS ou expérience longue\u003C\u002Foption>\n            \u003Coption value=\"4\">4 — Bac+3 à Bac+5\u003C\u002Foption>\n            \u003Coption value=\"5\">5 — Expertise pointue, diplôme spécialisé\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Dimension relationnelle\u003C\u002Flabel>\n          \u003Cselect id=\"critere-relationnel\">\n            \u003Coption value=\"1\">1 — Contacts simples, internes\u003C\u002Foption>\n            \u003Coption value=\"2\">2 — Contacts internes variés\u003C\u002Foption>\n            \u003Coption value=\"3\" selected>3 — Contacts internes et externes réguliers\u003C\u002Foption>\n            \u003Coption value=\"4\">4 — Représentation, négociation\u003C\u002Foption>\n            \u003Coption value=\"5\">5 — Représentation stratégique, influence\u003C\u002Foption>\n          \u003C\u002Fselect>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Chr class=\"divider\">\n      \u003Cp class=\"section-header\">Résultat de la classification\u003C\u002Fp>\n      \u003Cdiv id=\"classif-result\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cp class=\"card-title\">\u003Ci data-lucide=\"book-open\">\u003C\u002Fi> Grille de correspondance des niveaux\u003C\u002Fp>\n      \u003Cdiv class=\"table-wrap\">\n        \u003Ctable>\n          \u003Cthead>\n            \u003Ctr>\u003Cth>Niveau\u003C\u002Fth>\u003Cth>Score critères\u003C\u002Fth>\u003Cth>Emplois types\u003C\u002Fth>\u003Cth>Min. mensuel 2024 (35h)\u003C\u002Fth>\u003C\u002Ftr>\n          \u003C\u002Fthead>\n          \u003Ctbody>\n            \u003Ctr>\u003Ctd>\u003Cspan class=\"tag tag-blue\">B\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd>5–7\u003C\u002Ftd>\u003Ctd>Opérateur, agent de production débutant\u003C\u002Ftd>\u003Ctd>1 802 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>\u003Cspan class=\"tag tag-blue\">C\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd>8–10\u003C\u002Ftd>\u003Ctd>Ouvrier qualifié, opérateur confirmé, employé\u003C\u002Ftd>\u003Ctd>1 860 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>\u003Cspan class=\"tag tag-blue\">D\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd>11–13\u003C\u002Ftd>\u003Ctd>Technicien, AM débutant, gestionnaire admin.\u003C\u002Ftd>\u003Ctd>1 980 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>\u003Cspan class=\"tag tag-green\">E\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd>14–16\u003C\u002Ftd>\u003Ctd>Technicien supérieur, AM, responsable secteur\u003C\u002Ftd>\u003Ctd>2 230 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>\u003Cspan class=\"tag tag-green\">F\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd>17–19\u003C\u002Ftd>\u003Ctd>AM confirmé, ingénieur débutant, chef de projet\u003C\u002Ftd>\u003Ctd>2 620 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>\u003Cspan class=\"tag tag-orange\">G\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd>20–22\u003C\u002Ftd>\u003Ctd>Ingénieur, cadre, responsable de service\u003C\u002Ftd>\u003Ctd>3 150 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>\u003Cspan class=\"tag tag-orange\">H\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd>23–23\u003C\u002Ftd>\u003Ctd>Cadre confirmé, expert, directeur adjoint\u003C\u002Ftd>\u003Ctd>4 000 €\u003C\u002Ftd>\u003C\u002Ftr>\n            \u003Ctr>\u003Ctd>\u003Cspan class=\"tag tag-red\">I\u003C\u002Fspan>\u003C\u002Ftd>\u003Ctd>24–25\u003C\u002Ftd>\u003Ctd>Cadre supérieur, directeur\u003C\u002Ftd>\u003Ctd>5 200 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003C\u002Ftbody>\n        \u003C\u002Ftable>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"info-box\">\n        \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n        \u003Cspan>La classification est déterminée par l'évaluation conjointe des 5 critères. Chaque critère est noté de 1 à 5. Le score total (somme) détermine le niveau. En cas de désaccord, le salarié peut demander un entretien de classification.\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n  \u003C\u002Fdiv>\n\n  \u003Cp class=\"footer-note\">\n    Source : Convention collective nationale de la métallurgie (IDCC 3248) — Accord de branche du 7 février 2022, avenant salaires 2024.\u003Cbr>\n    Cet outil est indicatif. Consultez un expert RH ou juridique pour toute décision.\n  \u003C\u002Fp>\n\n  \u003Cscript>\n    \u002F\u002F ==================== DATA ====================\n\n    const SMIC_MENSUEL = 1801.80;\n    const HEURES_MOIS = 151.67;\n\n    \u002F\u002F Salaires minimaux 2024 (base 35h mensuel brut)\n    const SALAIRES_MIN = {\n      B: { min: 1802, label: \"Opérateur, agent de production\", emplois: \"Agent de fabrication débutant, manutentionnaire\" },\n      C: { min: 1860, label: \"Ouvrier qualifié, Employé\", emplois: \"Opérateur qualifié, agent admin., conducteur machine\" },\n      D: { min: 1980, label: \"Technicien \u002F AM débutant\", emplois: \"Technicien d'atelier, gestionnaire administratif\" },\n      E: { min: 2230, label: \"Technicien supérieur \u002F AM\", emplois: \"Technicien spécialisé, agent de maîtrise\" },\n      F: { min: 2620, label: \"AM confirmé \u002F Ingénieur débutant\", emplois: \"Chef d'équipe, ingénieur junior, chef de projet\" },\n      G: { min: 3150, label: \"Ingénieur \u002F Cadre\", emplois: \"Ingénieur confirmé, responsable de service\" },\n      H: { min: 4000, label: \"Cadre confirmé \u002F Expert\", emplois: \"Directeur adjoint, expert, manager senior\" },\n      I: { min: 5200, label: \"Cadre supérieur\", emplois: \"Directeur, VP, member du comité de direction\" }\n    };\n\n    \u002F\u002F Zone salariale (majoration %)\n    const ZONES = { \"1\": 0.03, \"2\": 0.015, \"3\": 0 };\n\n    \u002F\u002F ==================== STATE ====================\n    let state = {\n      \u002F\u002F Salaires\n      niveau: 'E',\n      anciennete: 5,\n      zone: '1',\n      dureeHebdo: 35,\n      \u002F\u002F HS\n      salaireBaseHS: 2800,\n      dureeContrat: 35,\n      hs1: 4,\n      hs2: 2,\n      modeCompensation: 'majoration',\n      contingentEffectue: 120,\n      contingentPrevision: 60,\n      \u002F\u002F Congés\n      joursTravailles: 220,\n      decompteConges: 'ouvrables',\n      ancConges: 3,\n      \u002F\u002F Préavis\n      categorie: 'am',\n      motif: 'licenciement',\n      ancPreavis: 8,\n      salaireRef: 3200,\n      typeLicenc: 'economique',\n      \u002F\u002F Classifications\n      complexite: 3,\n      autonomie: 3,\n      responsabilite: 3,\n      connaissances: 3,\n      relationnel: 3,\n    };\n\n    \u002F\u002F ==================== UTILS ====================\n    function fmt(n, decimals = 0) {\n      return new Intl.NumberFormat('fr-FR', { maximumFractionDigits: decimals }).format(n);\n    }\n    function fmtEur(n) { return fmt(n) + ' €'; }\n    function fmtH(n) { return fmt(n, 1) + ' h'; }\n\n    \u002F\u002F ==================== SALAIRES ====================\n    function computeSalaires() {\n      const niv = state.niveau;\n      const base = SALAIRES_MIN[niv].min;\n      const zone = ZONES[state.zone] || 0;\n      const baseZone = base * (1 + zone);\n\n      \u002F\u002F Ajustement durée hebdo\n      const facteurHebdo = state.dureeHebdo \u002F 35;\n      const salaireMensuel = baseZone * facteurHebdo;\n\n      \u002F\u002F Ancienneté : 1% par an, plafonné à 15% à 15 ans\n      const tauxAnc = Math.min(state.anciennete * 0.01, 0.15);\n      const salaireAvecAnc = salaireMensuel * (1 + tauxAnc);\n\n      \u002F\u002F Taux horaire\n      const heuresMois = HEURES_MOIS * facteurHebdo;\n      const txHoraire = salaireMensuel \u002F heuresMois;\n\n      \u002F\u002F Annuel (13 mois conventionnel)\n      const annuel = salaireAvecAnc * 13;\n\n      document.getElementById('salaire-min').textContent = fmtEur(Math.round(salaireMensuel));\n      document.getElementById('salaire-min-sub').textContent = `base ${state.dureeHebdo}h`;\n      document.getElementById('salaire-anc').textContent = fmtEur(Math.round(salaireAvecAnc));\n      document.getElementById('anc-pct').textContent = `+${Math.round(tauxAnc * 100)}% ancienneté`;\n      document.getElementById('taux-horaire').textContent = fmt(txHoraire, 2) + ' €';\n      document.getElementById('salaire-annuel').textContent = fmtEur(Math.round(annuel));\n\n      \u002F\u002F SMIC check\n      const smicCheck = document.getElementById('smic-check');\n      smicCheck.style.display = (salaireMensuel \u003C SMIC_MENSUEL) ? 'flex' : 'none';\n\n      buildGrilleTable(state.niveau);\n    }\n\n    function buildGrilleTable(niveauSelec) {\n      const body = document.getElementById('grille-body');\n      body.innerHTML = '';\n      const niveaux = Object.entries(SALAIRES_MIN);\n      niveaux.forEach(([niv, data]) => {\n        const tx = data.min \u002F HEURES_MOIS;\n        const vsSmic = ((data.min \u002F SMIC_MENSUEL - 1) * 100).toFixed(0);\n        const tr = document.createElement('tr');\n        if (niv === niveauSelec) tr.classList.add('highlight');\n        tr.innerHTML = `\n          \u003Ctd>\u003Cspan class=\"tag tag-blue\">${niv}\u003C\u002Fspan>\u003C\u002Ftd>\n          \u003Ctd>${data.label}\u003C\u002Ftd>\n          \u003Ctd>${fmtEur(data.min)}\u003C\u002Ftd>\n          \u003Ctd>${fmt(tx, 2)} €\u002Fh\u003C\u002Ftd>\n          \u003Ctd>${vsSmic >= 0 ? '+' : ''}${vsSmic} %\u003C\u002Ftd>\n        `;\n        body.appendChild(tr);\n      });\n      if (window.lucide) lucide.createIcons();\n    }\n\n    \u002F\u002F ==================== HEURES SUP ====================\n    function computeHS() {\n      const salHoraire = state.salaireBaseHS \u002F HEURES_MOIS;\n      const seuil = state.dureeContrat; \u002F\u002F heures contractuelles\n\n      function calcMaj(heures) {\n        \u002F\u002F IDCC 3248 : 25% pour H1-H8 au-delà de la durée légale, 50% au-delà\n        \u002F\u002F Par rapport au seuil légal (35h)\n        const hLegales = 35;\n        let maj = 0;\n        let repos = 0;\n        if (heures \u003C= 0) return { maj: 0, repos: 0, detail: [] };\n        \u002F\u002F Heures dans la tranche 25%\n        const tranche25 = Math.min(heures, 8);\n        const tranche50 = Math.max(heures - 8, 0);\n        const montant25 = tranche25 * salHoraire * 0.25;\n        const montant50 = tranche50 * salHoraire * 0.50;\n        maj = montant25 + montant50;\n        repos = tranche25 * 0.25 + tranche50 * 0.50;\n        const detail = [];\n        if (tranche25 > 0) detail.push(`${fmt(tranche25,1)}h × 25 % = ${fmtEur(montant25)}`);\n        if (tranche50 > 0) detail.push(`${fmt(tranche50,1)}h × 50 % = ${fmtEur(montant50)}`);\n        return { maj, repos, detail };\n      }\n\n      const r1 = calcMaj(state.hs1);\n      const r2 = calcMaj(state.hs2);\n\n      \u002F\u002F Mode compensation\n      let majS1 = r1.maj, majS2 = r2.maj, reposS1 = r1.repos, reposS2 = r2.repos;\n      if (state.modeCompensation === 'repos') {\n        majS1 = 0; majS2 = 0;\n      } else if (state.modeCompensation === 'mixte') {\n        majS1 = r1.maj * 0.5; majS2 = r2.maj * 0.5;\n        reposS1 = r1.repos * 0.5; reposS2 = r2.repos * 0.5;\n      }\n\n      const totalMaj = (majS1 + majS2) * 4.33;\n      const totalRepos = reposS1 + reposS2;\n\n      document.getElementById('major-s1').textContent = fmtEur(Math.round(majS1));\n      document.getElementById('major-s1-sub').textContent = r1.detail.join(' + ') || '—';\n      document.getElementById('major-s2').textContent = fmtEur(Math.round(majS2));\n      document.getElementById('major-s2-sub').textContent = r2.detail.join(' + ') || '—';\n      document.getElementById('major-mensuel').textContent = fmtEur(Math.round(totalMaj));\n      document.getElementById('repos-total').textContent = fmtH(totalRepos);\n      document.getElementById('repos-sub').textContent = state.modeCompensation === 'majoration' ? 'Non applicable (mode salarial)' : 'Repos compensateur à prendre';\n\n      \u002F\u002F Breakdown\n      const cont = document.getElementById('hs-breakdown-container');\n      cont.innerHTML = '';\n      [[state.hs1, r1, 1],[state.hs2, r2, 2]].forEach(([hs, r, wk]) => {\n        if (hs \u003C= 0) return;\n        const div = document.createElement('div');\n        div.style.cssText = 'background:#f5f5f4;border-radius:8px;padding:12px 16px;margin-bottom:8px;font-size:13px;';\n        div.innerHTML = `\u003Cstrong>Semaine ${wk} — ${fmt(hs,1)} heures sup.\u003C\u002Fstrong>\u003Cbr>${r.detail.join(' &nbsp;|&nbsp; ') || 'Aucune heure sup.'}`;\n        cont.appendChild(div);\n      });\n\n      \u002F\u002F Contingent\n      computeContingent();\n    }\n\n    function computeContingent() {\n      const effectue = state.contingentEffectue;\n      const prevision = state.contingentPrevision;\n      const total = effectue + prevision;\n      const contingent = 220;\n      const depasse = total > contingent;\n      const reste = Math.max(contingent - effectue, 0);\n      const pct = Math.min((effectue \u002F contingent) * 100, 100);\n\n      const div = document.getElementById('contingent-result');\n      const couleur = effectue > contingent ? '#dc2626' : (effectue > 180 ? '#ea580c' : '#16a34a');\n      div.innerHTML = `\n        \u003Cdiv style=\"display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;\">\n          \u003Cspan style=\"font-size:14px;color:#44403c;\">Utilisation du contingent (220 h\u002Fan)\u003C\u002Fspan>\n          \u003Cspan style=\"font-size:14px;font-weight:700;color:${couleur};\">${fmt(effectue)} \u002F 220 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cdiv style=\"background:#e7e5e4;border-radius:999px;height:10px;overflow:hidden;margin-bottom:12px;\">\n          \u003Cdiv style=\"background:${couleur};height:100%;width:${Math.min(pct,100)}%;border-radius:999px;transition:width 300ms;\">\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"result-grid\">\n          \u003Cdiv class=\"result-card ${depasse ? 'orange' : 'green'}\">\n            \u003Cp class=\"result-label\">Heures restantes au contingent\u003C\u002Fp>\n            \u003Cp class=\"result-value\">${fmt(reste)} h\u003C\u002Fp>\n          \u003C\u002Fdiv>\n          \u003Cdiv class=\"result-card ${total > contingent ? 'orange' : 'stone'}\">\n            \u003Cp class=\"result-label\">Total projeté\u003C\u002Fp>\n            \u003Cp class=\"result-value\">${fmt(total)} h\u003C\u002Fp>\n            \u003Cp class=\"result-sub\">${total > contingent ? '⚠ Dépassement : autorisation DREETS requise' : 'Dans le contingent'}\u003C\u002Fp>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        ${total > contingent ? `\u003Cdiv class=\"warn-box\" style=\"margin-top:12px;\">\u003Ci data-lucide=\"alert-triangle\">\u003C\u002Fi>\u003Cspan>Au-delà de 220 h, l'employeur doit consulter le CSE et informer la DREETS. Des majorations supplémentaires peuvent s'appliquer (accord d'entreprise).\u003C\u002Fspan>\u003C\u002Fdiv>` : ''}\n      `;\n      if (window.lucide) lucide.createIcons();\n    }\n\n    \u002F\u002F ==================== CONGES ====================\n    function computeConges() {\n      const jt = state.joursTravailles;\n      const anc = state.ancConges;\n\n      \u002F\u002F CP légaux : 2,5 j ouvrables par mois de travail effectif → max 30j ouvrables\n      const moisEquiv = jt \u002F 21; \u002F\u002F ~21 j ouvrés\u002Fmois\n      const cpLegauxOuvrables = Math.min(Math.round(moisEquiv * 2.5), 30);\n      const cpLegauxOuvres = Math.min(Math.round(moisEquiv * 2.08), 25);\n\n      const cpLegaux = state.decompteConges === 'ouvrables' ? cpLegauxOuvrables : cpLegauxOuvres;\n      const unite = state.decompteConges === 'ouvrables' ? 'j. ouvrables' : 'j. ouvrés';\n\n      \u002F\u002F Jours supplémentaires CCN Métallurgie par ancienneté\n      let cpConv = 0;\n      if (anc >= 20) cpConv = 4;\n      else if (anc >= 15) cpConv = 3;\n      else if (anc >= 10) cpConv = 2;\n      else if (anc >= 5) cpConv = 1;\n      \u002F\u002F Convertir si ouvrés\n      if (state.decompteConges === 'ouvres') cpConv = Math.round(cpConv * 5 \u002F 6);\n\n      const cpTotal = cpLegaux + cpConv;\n      const semaines = (cpTotal \u002F (state.decompteConges === 'ouvrables' ? 6 : 5)).toFixed(1);\n\n      document.getElementById('cp-legaux').textContent = cpLegaux + ' j';\n      document.getElementById('cp-legaux-sub').textContent = unite;\n      document.getElementById('cp-conv').textContent = cpConv + ' j';\n      document.getElementById('cp-total').textContent = cpTotal + ' j';\n      document.getElementById('cp-semaines').textContent = semaines + ' sem.';\n    }\n\n    \u002F\u002F ==================== PREAVIS ====================\n    function computePreavis() {\n      const anc = state.ancPreavis;\n      const sal = state.salaireRef;\n      const motif = state.motif;\n      const cat = state.categorie;\n      const typeLic = state.typeLicenc;\n      const isFauteGrave = typeLic === 'faute-grave';\n\n      \u002F\u002F Durée préavis (mois)\n      let durMois = 0;\n      if (cat === 'ouvrier') {\n        if (anc \u003C 0.5) durMois = 0.25; \u002F\u002F 1 semaine\n        else if (anc \u003C 2) durMois = 1;\n        else durMois = motif === 'retraite' ? 1 : 2;\n      } else if (cat === 'am') {\n        if (anc \u003C 2) durMois = motif === 'retraite' ? 2 : 2;\n        else durMois = motif === 'retraite' ? 2 : 3;\n      } else { \u002F\u002F cadre\n        if (anc \u003C 2) durMois = 3;\n        else durMois = motif === 'retraite' ? 3 : 4;\n      }\n\n      \u002F\u002F Faute grave : pas de préavis\n      const durPreavisText = isFauteGrave ? 'Aucun' : (\n        durMois === 0.25 ? '1 semaine' :\n        durMois === 1 ? '1 mois' :\n        durMois === 2 ? '2 mois' :\n        durMois === 3 ? '3 mois' :\n        durMois === 4 ? '4 mois' : `${durMois} mois`\n      );\n      document.getElementById('duree-preavis').textContent = durPreavisText;\n      document.getElementById('preavis-sub').textContent = motif === 'licenciement' ? 'Licenciement' : (motif === 'demission' ? 'Démission' : 'Retraite');\n\n      \u002F\u002F Indemnité légale de licenciement (si ancienneté ≥ 8 mois)\n      \u002F\u002F Légal : 1\u002F4 mois\u002Fan pour les 10 premières années, 1\u002F3 mois\u002Fan au-delà\n      let indemnLegale = 0;\n      if (!isFauteGrave && motif === 'licenciement' && anc >= 8\u002F12) {\n        const base = (sal * 3 \u002F 36); \u002F\u002F 1\u002F12 du salaire trimestriel... simplifié\n        const tranche1 = Math.min(anc, 10) * (sal \u002F 4);\n        const tranche2 = Math.max(anc - 10, 0) * (sal \u002F 3);\n        indemnLegale = tranche1 + tranche2;\n      }\n      if (motif === 'retraite' && !isFauteGrave && anc >= 1) {\n        \u002F\u002F Mise à la retraite : même calcul\n        if (state.motif === 'retraite-mise') {\n          const t1 = Math.min(anc, 10) * (sal \u002F 4);\n          const t2 = Math.max(anc - 10, 0) * (sal \u002F 3);\n          indemnLegale = t1 + t2;\n        }\n      }\n\n      \u002F\u002F Indemnité conventionnelle IDCC 3248\n      \u002F\u002F AM\u002FCadre : 1\u002F5 mois\u002Fan + 2\u002F15 mois\u002Fan au-delà de 10 ans\n      let indemnConv = 0;\n      if (!isFauteGrave && (motif === 'licenciement' || motif === 'retraite-mise')) {\n        if (cat === 'ouvrier') {\n          indemnConv = indemnLegale; \u002F\u002F même que légal\n        } else if (cat === 'am') {\n          const t1 = Math.min(anc, 10) * (sal \u002F 5);\n          const t2 = Math.max(anc - 10, 0) * (sal * 2 \u002F 15);\n          indemnConv = t1 + t2;\n          \u002F\u002F Légal si plus favorable\n          indemnConv = Math.max(indemnConv, indemnLegale);\n        } else { \u002F\u002F cadre\n          \u002F\u002F 1\u002F5 par an jusqu'à 10 ans, 2\u002F15 au-delà (convention cadre)\n          const t1 = Math.min(anc, 10) * (sal * 3 \u002F 10);\n          const t2 = Math.max(anc - 10, 0) * (sal * 1 \u002F 4);\n          indemnConv = t1 + t2;\n          indemnConv = Math.max(indemnConv, indemnLegale);\n        }\n      }\n\n      const indemnPreavisComp = isFauteGrave ? 0 : durMois * sal;\n\n      document.getElementById('indemn-legale').textContent = isFauteGrave ? '0 €' : fmtEur(Math.round(indemnLegale));\n      document.getElementById('indemn-conv').textContent = isFauteGrave ? '0 €' : fmtEur(Math.round(indemnConv));\n      document.getElementById('indemn-preavis-comp').textContent = fmtEur(Math.round(indemnPreavisComp));\n\n      const warnFaute = document.getElementById('warn-faute');\n      warnFaute.style.display = isFauteGrave ? 'flex' : 'none';\n    }\n\n    \u002F\u002F ==================== CLASSIFICATION ====================\n    function computeClassif() {\n      const score = state.complexite + state.autonomie + state.responsabilite + state.connaissances + state.relationnel;\n\n      let niveau, label, couleur, tag;\n      if (score \u003C= 7) { niveau = 'B'; label = 'Agent de fabrication, opérateur débutant'; couleur = '#1d4ed8'; tag = 'tag-blue'; }\n      else if (score \u003C= 10) { niveau = 'C'; label = 'Ouvrier qualifié, employé'; couleur = '#1d4ed8'; tag = 'tag-blue'; }\n      else if (score \u003C= 13) { niveau = 'D'; label = 'Technicien, agent de maîtrise débutant'; couleur = '#1d4ed8'; tag = 'tag-blue'; }\n      else if (score \u003C= 16) { niveau = 'E'; label = 'Technicien supérieur, agent de maîtrise'; couleur = '#15803d'; tag = 'tag-green'; }\n      else if (score \u003C= 19) { niveau = 'F'; label = 'AM confirmé, ingénieur débutant'; couleur = '#15803d'; tag = 'tag-green'; }\n      else if (score \u003C= 22) { niveau = 'G'; label = 'Ingénieur, cadre'; couleur = '#c2410c'; tag = 'tag-orange'; }\n      else if (score \u003C= 23) { niveau = 'H'; label = 'Cadre confirmé, expert'; couleur = '#c2410c'; tag = 'tag-orange'; }\n      else { niveau = 'I'; label = 'Cadre supérieur, directeur'; couleur = '#dc2626'; tag = 'tag-red'; }\n\n      const salMin = SALAIRES_MIN[niveau].min;\n\n      const div = document.getElementById('classif-result');\n      div.innerHTML = `\n        \u003Cdiv style=\"display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:16px;\">\n          \u003Cdiv>\n            \u003Cp style=\"font-size:12px;color:#78716c;margin-bottom:4px;\">Score total\u003C\u002Fp>\n            \u003Cdiv class=\"big-number\">${score} \u002F 25\u003C\u002Fdiv>\n          \u003C\u002Fdiv>\n          \u003Cdiv style=\"width:1px;height:60px;background:#e7e5e4;\">\u003C\u002Fdiv>\n          \u003Cdiv>\n            \u003Cp style=\"font-size:12px;color:#78716c;margin-bottom:4px;\">Niveau IDCC 3248\u003C\u002Fp>\n            \u003Cspan class=\"coeff-badge\" style=\"font-size:22px;padding:8px 20px;\">Niveau ${niveau}\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n          \u003Cdiv style=\"flex:1;min-width:200px;\">\n            \u003Cp style=\"font-size:13px;font-weight:600;color:#1c1917;margin-bottom:2px;\">${label}\u003C\u002Fp>\n            \u003Cp style=\"font-size:13px;color:#78716c;\">Salaire minimum : \u003Cstrong>${fmtEur(salMin)}\u002Fmois\u003C\u002Fstrong> (base 35h)\u003C\u002Fp>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cdiv style=\"background:#f5f5f4;border-radius:8px;padding:12px 16px;font-size:13px;\">\n          \u003Cdiv style=\"display:flex;gap:8px;flex-wrap:wrap;\">\n            \u003Cspan>Complexité : \u003Cstrong>${state.complexite}\u002F5\u003C\u002Fstrong>\u003C\u002Fspan>\n            \u003Cspan>·\u003C\u002Fspan>\n            \u003Cspan>Autonomie : \u003Cstrong>${state.autonomie}\u002F5\u003C\u002Fstrong>\u003C\u002Fspan>\n            \u003Cspan>·\u003C\u002Fspan>\n            \u003Cspan>Responsabilité : \u003Cstrong>${state.responsabilite}\u002F5\u003C\u002Fstrong>\u003C\u002Fspan>\n            \u003Cspan>·\u003C\u002Fspan>\n            \u003Cspan>Connaissances : \u003Cstrong>${state.connaissances}\u002F5\u003C\u002Fstrong>\u003C\u002Fspan>\n            \u003Cspan>·\u003C\u002Fspan>\n            \u003Cspan>Relationnel : \u003Cstrong>${state.relationnel}\u002F5\u003C\u002Fstrong>\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      `;\n      if (window.lucide) lucide.createIcons();\n      buildGrilleTable(niveau);\n    }\n\n    \u002F\u002F ==================== BIND ALL ====================\n\n    \u002F\u002F Tabs\n    document.querySelectorAll('.tab').forEach(btn => {\n      btn.addEventListener('click', () => {\n        document.querySelectorAll('.tab').forEach(b => b.classList.remove('active'));\n        document.querySelectorAll('.panel').forEach(p => p.classList.remove('active'));\n        btn.classList.add('active');\n        document.getElementById('panel-' + btn.dataset.tab).classList.add('active');\n        if (window.lucide) lucide.createIcons();\n        parent.postMessage({ type: 'resize', height: document.body.scrollHeight + 32 }, '*');\n      });\n    });\n\n    \u002F\u002F Salaires\n    document.getElementById('niveau').addEventListener('change', e => { state.niveau = e.target.value; computeSalaires(); });\n    document.getElementById('duree-hebdo').addEventListener('change', e => { state.dureeHebdo = +e.target.value; computeSalaires(); });\n    document.getElementById('anciennete').addEventListener('input', e => {\n      state.anciennete = +e.target.value;\n      document.getElementById('anc-display').textContent = e.target.value + ' ans';\n      computeSalaires();\n    });\n    makePills('zone-pills', 'zone', computeSalaires);\n\n    \u002F\u002F Heures sup\n    document.getElementById('salaire-base-hs').addEventListener('input', e => { state.salaireBaseHS = +e.target.value || 2800; computeHS(); });\n    document.getElementById('duree-contrat').addEventListener('change', e => { state.dureeContrat = +e.target.value; computeHS(); });\n    bindSlider('hs1', 'hs1-display', '{v} h', v => { state.hs1 = v; computeHS(); });\n    bindSlider('hs2', 'hs2-display', '{v} h', v => { state.hs2 = v; computeHS(); });\n    makePills('mode-pills', 'modeCompensation', computeHS);\n    bindSlider('contingent-effectue', 'contingent-display', '{v} h', v => { state.contingentEffectue = v; computeContingent(); });\n    bindSlider('contingent-prevision', 'contingent-prev-display', '{v} h', v => { state.contingentPrevision = v; computeContingent(); });\n\n    \u002F\u002F Congés\n    document.getElementById('jours-travailles').addEventListener('input', e => { state.joursTravailles = +e.target.value; computeConges(); });\n    makePills('decompte-pills', 'decompteConges', computeConges);\n    bindSlider('anc-conges', 'anc-cong-display', '{v} ans', v => { state.ancConges = v; computeConges(); });\n\n    \u002F\u002F Préavis\n    document.getElementById('categorie').addEventListener('change', e => { state.categorie = e.target.value; computePreavis(); });\n    document.getElementById('motif').addEventListener('change', e => { state.motif = e.target.value; computePreavis(); });\n    bindSlider('anc-preavis', 'anc-preavis-display', '{v} ans', v => { state.ancPreavis = v; computePreavis(); });\n    document.getElementById('salaire-ref').addEventListener('input', e => { state.salaireRef = +e.target.value || 3200; computePreavis(); });\n    makePills('type-licenc-pills', 'typeLicenc', computePreavis);\n\n    \u002F\u002F Classifications\n    ['complexite','autonomie','responsabilite','connaissances','relationnel'].forEach(c => {\n      document.getElementById('critere-' + c).addEventListener('change', e => {\n        state[c] = +e.target.value;\n        computeClassif();\n      });\n    });\n\n    \u002F\u002F ==================== HELPERS ====================\n    function bindSlider(id, displayId, tpl, cb) {\n      const el = document.getElementById(id);\n      const disp = document.getElementById(displayId);\n      if (!el) return;\n      el.addEventListener('input', e => {\n        const v = +e.target.value;\n        disp.textContent = tpl.replace('{v}', fmt(v, 1));\n        cb(v);\n      });\n    }\n\n    function makePills(containerId, stateKey, cb) {\n      const cont = document.getElementById(containerId);\n      if (!cont) return;\n      cont.querySelectorAll('.pill').forEach(btn => {\n        btn.addEventListener('click', () => {\n          cont.querySelectorAll('.pill').forEach(b => b.classList.remove('active'));\n          btn.classList.add('active');\n          state[stateKey] = btn.dataset.value;\n          cb();\n        });\n      });\n    }\n\n    \u002F\u002F ==================== INIT ====================\n    computeSalaires();\n    computeHS();\n    computeConges();\n    computePreavis();\n    computeClassif();\n\n    \u002F\u002F MANDATORY: Initialize Lucide icons\n    if (window.lucide) lucide.createIcons();\n\n    \u002F\u002F MANDATORY: Auto-resize for iframe\n    new ResizeObserver(() => {\n      parent.postMessage({ type: 'resize', height: document.body.scrollHeight + 32 }, '*');\n    }).observe(document.body);\n\n  \u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","consumer","embed","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Foutil-cc-metallurgie-3248-4a1fa82e01.webp",[]]