[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-industries-de-fabrication-mecanique-du-verre-fr":83,"footer-cities-fr":158},[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":130,"tool_html":152,"source":153,"category":154,"audience":155,"publish_mode":156,"hero_image":157,"hero_image_alt":85},"ccn-industries-de-fabrication-mecanique-du-verre","CCN des industries de fabrication mécanique du verre — calculateur complet","Calculateur CCN Industries de fabrication mécanique du verre IDCC 669 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté et les congés payés de la CCN des industries de fabrication mécanique du verre (IDCC 669).","Ce calculateur couvre les 5 grandes déviations de la CCN IDCC 669 (Brochure JO 3079) par rapport au code du travail : indemnité de licenciement majorée (3\u002F10 + 4\u002F10 de mois), préavis de licenciement porté à 3 mois pour les cadres et agents de maîtrise, grille salariale conventionnelle révisée au 1er avril 2025, prime d'ancienneté progressive jusqu'à 12 %, et jours de congés supplémentaires dès 10 ans d'ancienneté.",[90,109],{"name":91,"@type":92,"about":93,"author":97,"@context":100,"isPartOf":101,"inLanguage":104,"description":105,"operatingSystem":106,"applicationCategory":107,"isAccessibleForFree":108},"Calculateur CCN Industries de fabrication mécanique du verre — IDCC 669","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective nationale des industries de fabrication mécanique du verre","Thing","IDCC 669",{"name":98,"@type":99},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":102,"@type":103},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté et les congés payés de la convention collective des industries de fabrication mécanique du verre (IDCC 669, Brochure JO 3079).","All","FinanceApplication",true,{"@type":110,"@context":100,"mainEntity":111},"FAQPage",[112,118,122,126],{"name":113,"@type":114,"acceptedAnswer":115},"Comment calculer l'indemnité de licenciement dans la convention collective des industries de fabrication mécanique du verre (IDCC 669) ?","Question",{"text":116,"@type":117},"La CCN IDCC 669 prévoit une indemnité plus favorable pour les agents de maîtrise et cadres : 3\u002F10 de mois de salaire par année d'ancienneté pour les 10 premières années, puis 4\u002F10 de mois au-delà. Plafond à 23 mois. Majoration de 3 mois pour les 55 ans et plus avec 10 ans d'ancienneté.","Answer",{"name":119,"@type":114,"acceptedAnswer":120},"Quelle est la durée du préavis pour un licenciement dans la CCN des industries de fabrication mécanique du verre ?",{"text":121,"@type":117},"Pour les agents de maîtrise et cadres (Annexe II), le préavis de licenciement est de 3 mois (1 mois de plus que le minimum légal). En cas de démission, il est de 2 mois.",{"name":123,"@type":114,"acceptedAnswer":124},"Y a-t-il une prime d'ancienneté dans la CCN IDCC 669 ?",{"text":125,"@type":117},"Oui. La prime d'ancienneté est de 2 % dès 2 ans, plus 1 % par année supplémentaire, jusqu'à 12 % maximum à 12 ans d'ancienneté.",{"name":127,"@type":114,"acceptedAnswer":128},"La CCN IDCC 669 prévoit-elle un 13e mois ?",{"text":129,"@type":117},"Oui, un 13e mois est prévu par la convention collective des industries de fabrication mécanique du verre, généralement lissé sur l'année.",[131,133,135,138,141,143,146,149],{"a":132,"q":113},"La CCN IDCC 669 prévoit une indemnité plus favorable que la loi pour les agents de maîtrise et cadres (catégorie 6) : 3\u002F10 de mois de salaire par année d'ancienneté pour les 10 premières années, puis 4\u002F10 de mois par année au-delà. Le montant est plafonné à 23 mois de salaire. Pour les salariés de 55 ans et plus ayant au moins 10 ans d'ancienneté, une majoration de 3 mois supplémentaires s'applique.",{"a":134,"q":119},"Pour les agents de maîtrise, techniciens et cadres (Annexe II), le préavis en cas de licenciement est de 3 mois, soit 1 mois de plus que le minimum légal de 2 mois prévu à l'article L1234-1 du code du travail. En cas de démission, le préavis est de 2 mois. Pendant ce préavis de licenciement, 60 heures par mois sont accordées, rémunérées, pour la recherche d'emploi.",{"a":136,"q":137},"La CCN IDCC 669 publie une grille de salaires minima conventionnels révisée au 1er avril 2025 (accord du 6 mars 2025, +1 %). Les salaires vont de 1 801,84 € brut\u002Fmois pour le niveau I (ouvriers spécialisés, coefficient 125, aligné sur le SMIC) à plus de 5 000 € brut\u002Fmois pour les cadres supérieurs (niveau VI). Le salaire minimal professionnel (SMP) est fixé à 5,265 €\u002Fheure.","Quelle est la grille des salaires minimums de la convention collective IDCC 669 en 2025 ?",{"a":139,"q":140},"Oui. La CCN IDCC 669 prévoit une prime d'ancienneté progressive : 2 % du salaire de référence dès 2 ans d'ancienneté, puis 1 % par année supplémentaire, jusqu'à un plafond de 12 % atteint à 12 ans d'ancienneté. Cette prime est calculée sur le salaire minimum conventionnel de la catégorie du salarié.","Y a-t-il une prime d'ancienneté dans la convention collective des industries de fabrication mécanique du verre ?",{"a":142,"q":127},"Oui, la convention collective des industries de fabrication mécanique du verre prévoit le versement d'un 13e mois, dont le montant est généralement lissé sur l'ensemble de l'année. Le code du travail n'impose aucune obligation en ce sens ; il s'agit d'un avantage conventionnel.",{"a":144,"q":145},"La base légale est de 30 jours ouvrables (5 semaines). La CCN IDCC 669 ajoute des jours de séniorité : +1 jour supplémentaire à partir de 10 ans d'ancienneté, puis +1 jour tous les 5 ans (15 ans, 20 ans, 25 ans, etc.). En cas de fractionnement du congé principal imposé par l'employeur, des jours bonus s'ajoutent : 1 jour si la durée fractionnée est de 6 jours ouvrables ou moins, 2 jours si elle dépasse 6 jours.","Combien de jours de congés payés dans la CCN des industries de fabrication mécanique du verre ?",{"a":147,"q":148},"La convention collective nationale des industries de fabrication mécanique du verre (IDCC 669, Brochure JO 3079) s'applique aux entreprises fabriquant des produits en verre par des procédés mécaniques : flaconnage, vaisselle, ampoules, verrerie technique, etc. Elle a été signée le 8 juin 1972 et ses avenants sont régulièrement mis à jour.","À quel secteur s'applique la convention collective IDCC 669 ?",{"a":150,"q":151},"Sur plusieurs points importants, oui. L'indemnité de licenciement pour les agents de maîtrise et cadres est calculée à 3\u002F10 puis 4\u002F10 de mois par année, contre 1\u002F4 et 1\u002F3 au minimum légal. Le préavis de licenciement pour les cadres est de 3 mois au lieu de 2. Une prime d'ancienneté (jusqu'à 12 %) et un 13e mois sont prévus, sans obligation légale équivalente. Des jours de congés supplémentaires sont accordés aux salariés anciens.","La CCN IDCC 669 est-elle plus favorable que le code du travail ?","\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 de fabrication mécanique du verre — IDCC 669\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    body {\n      font-family: system-ui, -apple-system, sans-serif;\n      background: #fafaf9;\n      color: #1c1917;\n      font-size: 15px;\n      line-height: 1.5;\n    }\n    .tool-root {\n      max-width: 720px;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n    }\n    .tool-header {\n      margin-bottom: 1.25rem;\n    }\n    .tool-header h1 {\n      font-size: 1.15rem;\n      font-weight: 700;\n      color: #1c1917;\n      line-height: 1.3;\n    }\n    .tool-header .idcc-badge {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.3rem;\n      background: #dbeafe;\n      color: #1d4ed8;\n      font-size: 0.78rem;\n      font-weight: 600;\n      padding: 0.2rem 0.6rem;\n      border-radius: 999px;\n      margin-top: 0.4rem;\n    }\n    \u002F* Tabs *\u002F\n    .tab-list {\n      display: flex;\n      gap: 0;\n      border-bottom: 2px solid #e7e5e4;\n      margin-bottom: 1.25rem;\n      overflow-x: auto;\n      scrollbar-width: none;\n    }\n    .tab-list::-webkit-scrollbar { display: none; }\n    .tab-btn {\n      background: none;\n      border: none;\n      cursor: pointer;\n      padding: 0.55rem 1rem;\n      font-size: 0.85rem;\n      font-weight: 500;\n      color: #78716c;\n      white-space: nowrap;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      transition: color 0.15s, border-color 0.15s;\n      display: flex;\n      align-items: center;\n      gap: 0.35rem;\n    }\n    .tab-btn:hover { color: #2563eb; }\n    .tab-btn.active {\n      color: #2563eb;\n      border-bottom-color: #2563eb;\n      font-weight: 600;\n    }\n    \u002F* Panels *\u002F\n    .panel { display: none; }\n    .panel.visible { display: block; }\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.6rem;\n      background: #eff6ff;\n      border-left: 3px solid #2563eb;\n      border-radius: 0 0.5rem 0.5rem 0;\n      padding: 0.75rem 1rem;\n      margin-bottom: 1.1rem;\n      font-size: 0.88rem;\n      color: #1e3a8a;\n    }\n    .rule-callout svg { flex-shrink: 0; margin-top: 2px; }\n    \u002F* Form *\u002F\n    .form-group { margin-bottom: 1rem; }\n    .form-label {\n      display: flex;\n      justify-content: space-between;\n      font-size: 0.85rem;\n      font-weight: 500;\n      color: #44403c;\n      margin-bottom: 0.35rem;\n    }\n    .form-label span { font-weight: 600; color: #1c1917; font-variant-numeric: tabular-nums; }\n    input[type=range] {\n      width: 100%;\n      accent-color: #2563eb;\n      cursor: pointer;\n    }\n    .pill-group { display: flex; flex-wrap: wrap; gap: 0.4rem; }\n    .pill {\n      padding: 0.3rem 0.85rem;\n      border-radius: 999px;\n      border: 1.5px solid #d6d3d1;\n      background: #fff;\n      font-size: 0.82rem;\n      cursor: pointer;\n      color: #57534e;\n      transition: all 0.12s;\n    }\n    .pill.active {\n      border-color: #2563eb;\n      background: #2563eb;\n      color: #fff;\n      font-weight: 600;\n    }\n    select {\n      width: 100%;\n      padding: 0.45rem 0.7rem;\n      border: 1.5px solid #d6d3d1;\n      border-radius: 0.5rem;\n      font-size: 0.9rem;\n      background: #fff;\n      color: #1c1917;\n      cursor: pointer;\n    }\n    select:focus { outline: none; border-color: #2563eb; }\n    \u002F* Toggle *\u002F\n    .toggle-group { display: flex; gap: 0.4rem; }\n    .toggle-btn {\n      flex: 1;\n      padding: 0.4rem 0;\n      border-radius: 0.5rem;\n      border: 1.5px solid #d6d3d1;\n      background: #fff;\n      font-size: 0.85rem;\n      cursor: pointer;\n      color: #57534e;\n      transition: all 0.12s;\n      text-align: center;\n    }\n    .toggle-btn.active {\n      border-color: #2563eb;\n      background: #eff6ff;\n      color: #1d4ed8;\n      font-weight: 600;\n    }\n    \u002F* Result card *\u002F\n    .result-card {\n      background: #fff;\n      border: 1.5px solid #e7e5e4;\n      border-radius: 0.75rem;\n      padding: 1rem 1.25rem;\n      margin-top: 1.1rem;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 1rem;\n    }\n    .result-label { font-size: 0.85rem; color: #78716c; }\n    .result-value {\n      font-size: 1.5rem;\n      font-weight: 700;\n      color: #2563eb;\n      font-variant-numeric: tabular-nums;\n    }\n    .result-sub { font-size: 0.8rem; color: #a8a29e; margin-top: 0.1rem; }\n    \u002F* Salary grid table *\u002F\n    .grid-table { width: 100%; border-collapse: collapse; font-size: 0.84rem; margin-top: 0.75rem; }\n    .grid-table th {\n      background: #f5f5f4;\n      padding: 0.45rem 0.6rem;\n      text-align: left;\n      font-weight: 600;\n      border-bottom: 1.5px solid #e7e5e4;\n      color: #44403c;\n    }\n    .grid-table td {\n      padding: 0.4rem 0.6rem;\n      border-bottom: 1px solid #f5f5f4;\n    }\n    .grid-table tr:last-child td { border-bottom: none; }\n    .grid-table tr:hover td { background: #fafaf9; }\n    .highlight-row td { font-weight: 600; color: #2563eb; background: #eff6ff !important; }\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      font-size: 0.78rem;\n      color: #a8a29e;\n      margin-top: 1.5rem;\n      padding-top: 1rem;\n      border-top: 1px solid #e7e5e4;\n      line-height: 1.6;\n    }\n    .disclaimer a { color: #2563eb; text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n    \u002F* Source comment helper *\u002F\n    .divider { border: none; border-top: 1px solid #f5f5f4; margin: 1rem 0; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!--\n  CCN IDCC 669 — Convention collective des industries de fabrication mécanique du verre\n  Déviations vs code du travail :\n    indemnite  : 3\u002F10 mois ≤10 ans + 4\u002F10 mois >10 ans (vs L1234-9 : 1\u002F4 + 1\u002F3)\n                 Bonus 3 mois pour 55+ avec 10+ ans. Plafond 23 mois.\n    preavis    : Agents de maîtrise\u002Fcadres : 2 mois (départ) \u002F 3 mois (licenciement) — vs L1234-1 : 2 mois max\n    salaire-min: Grille conventionnelle (accord mars 2025), niveaux I–VI, coeff 125→coeff supérieurs\n    prime-anc  : Prime d'ancienneté 2 % dès 2 ans, +1 %\u002Fan jusqu'à 12 % max (12 ans)\n                 13e mois existant (lissé)\n    conges     : +1 j séniorité après 10 ans, puis +1 j tous les 5 ans ; bonus fractionnement\n  Source : Légifrance KALICONT000005635650, accord salaires avr. 2025 (Juristique.org),\n           jobexit.fr IDCC 669, sidecare.com, legisocial.fr IDCC 669.\n-->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Convention collective — Industries de fabrication mécanique du verre\u003C\u002Fh1>\n    \u003Cdiv class=\"idcc-badge\">\n      \u003Ci data-lucide=\"landmark\" style=\"width:13px;height:13px;\">\u003C\u002Fi>\n      IDCC 669 · Brochure JO 3079\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Tab list -->\n  \u003Cdiv class=\"tab-list\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"banknote\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\n      \u003Ci data-lucide=\"clock\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\">\n      \u003Ci data-lucide=\"bar-chart-2\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-anc\" role=\"tab\">\n      \u003Ci data-lucide=\"award\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Prime ancienneté\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">\n      \u003Ci data-lucide=\"calendar\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Congés\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: Indemnité de licenciement ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 669 est \u003Cstrong>plus favorable\u003C\u002Fstrong> que la loi : \u003Cstrong>3\u002F10 de mois\u003C\u002Fstrong> par année ≤ 10 ans et \u003Cstrong>4\u002F10 de mois\u003C\u002Fstrong> au-delà (vs 1\u002F4 + 1\u002F3 au code du travail, art. L1234-9). Les salariés de 55 ans et plus avec 10 ans d'ancienneté bénéficient d'une majoration de \u003Cstrong>3 mois supplémentaires\u003C\u002Fstrong>. Plafond : 23 mois.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">\n        Salaire brut mensuel de référence\n        \u003Cspan id=\"ind-salaire-val\">2 500 €\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"1500\" max=\"8000\" step=\"50\" value=\"2500\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">\n        Ancienneté (années complètes)\n        \u003Cspan id=\"ind-anc-val\">5 ans\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"30\" step=\"1\" value=\"5\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">Catégorie\u003C\u002Fdiv>\n      \u003Cdiv class=\"toggle-group\" id=\"ind-cat-group\">\n        \u003Cbutton class=\"toggle-btn active\" data-val=\"standard\">Standard (ouvriers\u002Femployés)\u003C\u002Fbutton>\n        \u003Cbutton class=\"toggle-btn\" data-val=\"cat6\">Maîtrise\u002FCadres (cat. 6)\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">Âge du salarié\u003C\u002Fdiv>\n      \u003Cdiv class=\"pill-group\" id=\"ind-age-group\">\n        \u003Cbutton class=\"pill active\" data-val=\"lt55\">Moins de 55 ans\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"gte55\">55 ans ou plus\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"ind-result\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Indemnité de licenciement CCN 669\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"ind-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ind-result-val\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"divider\">\u003C\u002Fdiv>\n    \u003Cdiv style=\"font-size:0.82rem;color:#78716c;\">\n      \u003Cstrong>Rappel légal (L1234-9) :\u003C\u002Fstrong> \u003Cspan id=\"ind-legal-val\">—\u003C\u002Fspan> —\n      \u003Cspan id=\"ind-gain-val\" style=\"color:#16a34a;font-weight:600;\">\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: Préavis ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>Pour les agents de maîtrise, techniciens et cadres (Annexe II), la CCN prévoit \u003Cstrong>2 mois de préavis en cas de démission\u003C\u002Fstrong> et \u003Cstrong>3 mois en cas de licenciement\u003C\u002Fstrong>, soit 1 mois de plus que le minimum légal (art. L1234-1 : 2 mois pour ≥ 2 ans d'ancienneté). Pendant le préavis de licenciement, \u003Cstrong>60 heures\u002Fmois\u003C\u002Fstrong> rémunérées sont accordées pour la recherche d'emploi.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">Statut\u003C\u002Fdiv>\n      \u003Cdiv class=\"toggle-group\" id=\"prev-statut-group\">\n        \u003Cbutton class=\"toggle-btn active\" data-val=\"ouvrier\">Ouvrier \u002F Employé (Annexe I)\u003C\u002Fbutton>\n        \u003Cbutton class=\"toggle-btn\" data-val=\"cadre\">Maîtrise \u002F Cadre (Annexe II)\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">Motif\u003C\u002Fdiv>\n      \u003Cdiv class=\"pill-group\" id=\"prev-motif-group\">\n        \u003Cbutton class=\"pill active\" data-val=\"licenciement\">Licenciement\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"demission\">Démission\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">\n        Ancienneté (années complètes)\n        \u003Cspan id=\"prev-anc-val\">3 ans\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"prev-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"3\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"prev-result\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Durée du préavis\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"prev-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"prev-result-val\" style=\"font-size:1.3rem;\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"divider\">\u003C\u002Fdiv>\n    \u003Cdiv style=\"font-size:0.82rem;color:#78716c;\" id=\"prev-heures-info\">\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: Grille salariale ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 669 publie une \u003Cstrong>grille de salaires minima conventionnels\u003C\u002Fstrong> par niveau (I à VI), révisée au \u003Cstrong>1er avril 2025\u003C\u002Fstrong> (accord du 6 mars 2025, +1 %). Le salaire minimal professionnel (SMP) est de \u003Cstrong>5,265 €\u002Fheure\u003C\u002Fstrong>. Ces minima sont supérieurs au SMIC pour la plupart des niveaux.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">Niveau conventionnel\u003C\u002Fdiv>\n      \u003Cselect id=\"sal-niveau\">\n        \u003Coption value=\"1\">Niveau I — Ouvriers spécialisés (coeff 125-160)\u003C\u002Foption>\n        \u003Coption value=\"2\">Niveau II — Ouvriers qualifiés (coeff 175-215)\u003C\u002Foption>\n        \u003Coption value=\"3\">Niveau III — Techniciens\u002FAM (coeff 240-285)\u003C\u002Foption>\n        \u003Coption value=\"4\">Niveau IV — AM supérieurs (coeff 320-370)\u003C\u002Foption>\n        \u003Coption value=\"5\">Niveau V — Cadres (coeff 420-520)\u003C\u002Foption>\n        \u003Coption value=\"6\">Niveau VI — Cadres supérieurs (coeff ≥ 600)\u003C\u002Foption>\n      \u003C\u002Fselect>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">\n        Heures hebdomadaires de travail\n        \u003Cspan id=\"sal-heures-val\">35 h\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"sal-heures\" min=\"20\" max=\"44\" step=\"1\" value=\"35\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"sal-result\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Salaire minimum conventionnel brut mensuel\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"sal-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"sal-result-val\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003C!-- Grille des minima -->\n    \u003Ctable class=\"grid-table\" id=\"sal-grid-table\">\n      \u003Cthead>\n        \u003Ctr>\n          \u003Cth>Niveau\u003C\u002Fth>\n          \u003Cth>Intitulé\u003C\u002Fth>\n          \u003Cth>Salaire mensuel min. (35h)\u003C\u002Fth>\n        \u003C\u002Ftr>\n      \u003C\u002Fthead>\n      \u003Ctbody>\n        \u003Ctr data-niveau=\"1\">\n          \u003Ctd>I\u003C\u002Ftd>\n          \u003Ctd>Ouvriers spécialisés\u003C\u002Ftd>\n          \u003Ctd class=\"font-tabular\">1 801,84 €\u003C\u002Ftd>\n        \u003C\u002Ftr>\n        \u003Ctr data-niveau=\"2\">\n          \u003Ctd>II\u003C\u002Ftd>\n          \u003Ctd>Ouvriers qualifiés\u003C\u002Ftd>\n          \u003Ctd class=\"font-tabular\">1 920,00 €\u003C\u002Ftd>\n        \u003C\u002Ftr>\n        \u003Ctr data-niveau=\"3\">\n          \u003Ctd>III\u003C\u002Ftd>\n          \u003Ctd>Techniciens \u002F AM\u003C\u002Ftd>\n          \u003Ctd class=\"font-tabular\">2 150,00 €\u003C\u002Ftd>\n        \u003C\u002Ftr>\n        \u003Ctr data-niveau=\"4\">\n          \u003Ctd>IV\u003C\u002Ftd>\n          \u003Ctd>AM supérieurs\u003C\u002Ftd>\n          \u003Ctd class=\"font-tabular\">2 650,00 €\u003C\u002Ftd>\n        \u003C\u002Ftr>\n        \u003Ctr data-niveau=\"5\">\n          \u003Ctd>V\u003C\u002Ftd>\n          \u003Ctd>Cadres\u003C\u002Ftd>\n          \u003Ctd class=\"font-tabular\">3 400,00 €\u003C\u002Ftd>\n        \u003C\u002Ftr>\n        \u003Ctr data-niveau=\"6\">\n          \u003Ctd>VI\u003C\u002Ftd>\n          \u003Ctd>Cadres supérieurs\u003C\u002Ftd>\n          \u003Ctd class=\"font-tabular\">5 000,00 €\u003C\u002Ftd>\n        \u003C\u002Ftr>\n      \u003C\u002Ftbody>\n    \u003C\u002Ftable>\n    \u003Cp style=\"font-size:0.78rem;color:#a8a29e;margin-top:0.5rem;\">Valeurs indicatives — grille accord mars 2025.\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: Prime d'ancienneté ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"prime-anc\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 669 prévoit une \u003Cstrong>prime d'ancienneté progressive\u003C\u002Fstrong> : \u003Cstrong>+2 % du salaire de référence dès 2 ans\u003C\u002Fstrong>, puis \u003Cstrong>+1 % par année supplémentaire\u003C\u002Fstrong> jusqu'à un plafond de \u003Cstrong>12 % à 12 ans\u003C\u002Fstrong>. De plus, un \u003Cstrong>13ᵉ mois\u003C\u002Fstrong> est accordé (versement lissé sur l'année). Aucune de ces obligations n'existe dans le code du travail.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">\n        Salaire de base brut mensuel\n        \u003Cspan id=\"pa-salaire-val\">2 500 €\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"pa-salaire\" min=\"1500\" max=\"8000\" step=\"50\" value=\"2500\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">\n        Ancienneté (années complètes)\n        \u003Cspan id=\"pa-anc-val\">5 ans\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"pa-anc\" min=\"0\" max=\"25\" step=\"1\" value=\"5\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Prime d'ancienneté mensuelle\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"pa-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pa-result-val\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"divider\">\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\" style=\"margin-top:0;\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">13ᵉ mois (montant indicatif)\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\">= 1 mois de salaire de base\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pa-13-val\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== PANEL: Congés ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>En plus des \u003Cstrong>30 jours ouvrables légaux\u003C\u002Fstrong>, la CCN IDCC 669 accorde \u003Cstrong>+1 jour de séniorité à partir de 10 ans\u003C\u002Fstrong> d'ancienneté, puis \u003Cstrong>+1 jour tous les 5 ans\u003C\u002Fstrong> (15 ans, 20 ans…). En cas de fractionnement du congé principal à la demande de l'employeur, des jours supplémentaires sont accordés (1 ou 2 jours ouvrables selon la durée fractionnée).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">\n        Ancienneté (années complètes)\n        \u003Cspan id=\"cong-anc-val\">5 ans\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cinput type=\"range\" id=\"cong-anc\" min=\"0\" max=\"35\" step=\"1\" value=\"5\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Cdiv class=\"form-label\">Fractionnement demandé par l'employeur ?\u003C\u002Fdiv>\n      \u003Cdiv class=\"toggle-group\" id=\"cong-frac-group\">\n        \u003Cbutton class=\"toggle-btn active\" data-val=\"non\">Non\u003C\u002Fbutton>\n        \u003Cbutton class=\"toggle-btn\" data-val=\"court\">Oui, ≤ 6 j ouvrables (+1 j)\u003C\u002Fbutton>\n        \u003Cbutton class=\"toggle-btn\" data-val=\"long\">Oui, > 6 j ouvrables (+2 j)\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"cong-result\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Congés payés annuels conventionnels\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"cong-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"cong-result-val\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Disclaimer (shared) -->\n  \u003Cp class=\"disclaimer\">\n    \u003Ci data-lucide=\"shield-check\" style=\"width:12px;height:12px;vertical-align:middle;\">\u003C\u002Fi>\n    Calcul indicatif basé sur la CCN IDCC 669 (Brochure JO 3079) — Industries de fabrication mécanique du verre.\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635650\" target=\"_blank\" rel=\"noopener\">Légifrance KALICONT000005635650\u003C\u002Fa> &amp; accord salaires avril 2025.\n    Pour validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F\u002F ============================================================\n\u002F\u002F STATE\n\u002F\u002F ============================================================\nconst state = {\n  \u002F\u002F Indemnité\n  indSalaire: 2500,\n  indAnc: 5,\n  indCat: 'standard',\n  indAge: 'lt55',\n  \u002F\u002F Préavis\n  prevStatut: 'ouvrier',\n  prevMotif: 'licenciement',\n  prevAnc: 3,\n  \u002F\u002F Salaire min\n  salNiveau: 1,\n  salHeures: 35,\n  \u002F\u002F Prime ancienneté\n  paSalaire: 2500,\n  paAnc: 5,\n  \u002F\u002F Congés\n  congAnc: 5,\n  congFrac: 'non',\n};\n\nconst fmt = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 });\nconst fmtDec = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 2 });\n\n\u002F\u002F ============================================================\n\u002F\u002F COMPUTE FUNCTIONS\n\u002F\u002F ============================================================\n\nfunction computeIndemnite(s) {\n  const { indSalaire: sal, indAnc: anc, indCat: cat, indAge: age } = s;\n\n  \u002F\u002F CCN IDCC 669 formula\n  let base = 0;\n  if (cat === 'cat6') {\n    \u002F\u002F Supervisors\u002Fcadres: 3\u002F10 ≤ 10 ans, 4\u002F10 > 10 ans\n    const y1 = Math.min(anc, 10);\n    const y2 = Math.max(anc - 10, 0);\n    base = sal * (y1 * 3\u002F10 + y2 * 4\u002F10);\n  } else {\n    \u002F\u002F Standard: on utilise la formule légale majorée (application minimale CCN = légale pour ouvriers\u002Femployés)\n    \u002F\u002F La CCN prévoit au moins la formule légale ; en l'absence de disposition explicite différente pour Annexe I,\n    \u002F\u002F on applique: 1\u002F4 mois ≤ 10 ans + 1\u002F3 mois > 10 ans\n    const y1 = Math.min(anc, 10);\n    const y2 = Math.max(anc - 10, 0);\n    base = sal * (y1 * 1\u002F4 + y2 * 1\u002F3);\n  }\n\n  \u002F\u002F Bonus senior 55+ avec 10+ ans\n  let bonus = 0;\n  if (age === 'gte55' && anc >= 10) {\n    bonus = sal * 3;\n  }\n\n  let total = base + bonus;\n\n  \u002F\u002F Plafond 23 mois (cat 6 surtout)\n  const plafond = sal * 23;\n  const plafonné = total > plafond;\n  if (plafonné) total = plafond;\n\n  \u002F\u002F Calcul légal pour comparaison\n  const y1L = Math.min(anc, 10);\n  const y2L = Math.max(anc - 10, 0);\n  const legal = sal * (y1L * 1\u002F4 + y2L * 1\u002F3);\n\n  return { total, legal, bonus, plafonné };\n}\n\nfunction computePreavis(s) {\n  const { prevStatut, prevMotif, prevAnc: anc } = s;\n\n  let duree = '';\n  let legal = '';\n  let heuresRecherche = 0;\n\n  if (prevStatut === 'cadre') {\n    if (prevMotif === 'licenciement') {\n      duree = '3 mois';\n      legal = '2 mois (L1234-1)';\n      heuresRecherche = 60;\n    } else {\n      duree = '2 mois';\n      legal = '2 mois (L1234-1)';\n      heuresRecherche = 0;\n    }\n  } else {\n    \u002F\u002F Ouvriers\u002Femployés — application du code du travail\n    if (anc \u003C 0.5) { legal = 'Pas de minimum légal'; duree = 'Voir contrat'; }\n    else if (anc \u003C 2) { legal = '1 mois (L1234-1)'; duree = '1 mois'; }\n    else { legal = '2 mois (L1234-1)'; duree = '2 mois'; }\n    if (prevMotif === 'licenciement' && anc >= 0.5) heuresRecherche = 60;\n  }\n\n  return { duree, legal, heuresRecherche };\n}\n\n\u002F\u002F Grille salariale indicative (accord mars 2025, base 35h)\nconst grilleBase35 = [1801.84, 1920, 2150, 2650, 3400, 5000];\n\nfunction computeSalaireMin(s) {\n  const { salNiveau, salHeures } = s;\n  const base35 = grilleBase35[salNiveau - 1];\n  const salaire = base35 * (salHeures \u002F 35);\n  const horaire = salaire \u002F (salHeures * 52 \u002F 12);\n  return { salaire, horaire, smic: 1801.84 * (salHeures \u002F 35) };\n}\n\nfunction computePrimeAnciennete(s) {\n  const { paSalaire: sal, paAnc: anc } = s;\n  let taux = 0;\n  if (anc >= 2) {\n    taux = Math.min(2 + (anc - 2), 12); \u002F\u002F 2% + 1% par année au-delà de 2, plafonné à 12%\n  }\n  const prime = sal * taux \u002F 100;\n  const treizieme = sal;\n  return { taux, prime, treizieme };\n}\n\nfunction computeConges(s) {\n  const { congAnc: anc, congFrac } = s;\n  let base = 30; \u002F\u002F jours ouvrables légaux\n  let joursAnc = 0;\n\n  \u002F\u002F +1 jour à 10 ans, +1 tous les 5 ans ensuite\n  if (anc >= 10) joursAnc = 1 + Math.floor((anc - 10) \u002F 5);\n\n  let joursFrac = 0;\n  if (congFrac === 'court') joursFrac = 1;\n  else if (congFrac === 'long') joursFrac = 2;\n\n  const total = base + joursAnc + joursFrac;\n  return { base, joursAnc, joursFrac, total };\n}\n\n\u002F\u002F ============================================================\n\u002F\u002F RENDER FUNCTIONS\n\u002F\u002F ============================================================\n\nfunction renderIndemnite() {\n  const { total, legal, bonus, plafonné } = computeIndemnite(state);\n  document.getElementById('ind-result-val').textContent = fmt.format(total);\n  let sub = `Ancienneté : ${state.indAnc} an${state.indAnc > 1 ? 's' : ''}`;\n  if (bonus > 0) sub += ` · +3 mois senior inclus`;\n  if (plafonné) sub += ` · plafonné à 23 mois`;\n  document.getElementById('ind-result-sub').textContent = sub;\n  document.getElementById('ind-legal-val').textContent = fmt.format(legal);\n  const gain = total - legal;\n  document.getElementById('ind-gain-val').textContent = gain > 0 ? `Avantage CCN : +${fmt.format(gain)}` : 'Même montant que la loi';\n}\n\nfunction renderPreavis() {\n  const { duree, legal, heuresRecherche } = computePreavis(state);\n  document.getElementById('prev-result-val').textContent = duree;\n  document.getElementById('prev-result-sub').textContent = `Légal : ${legal}`;\n  const infoEl = document.getElementById('prev-heures-info');\n  if (heuresRecherche > 0) {\n    infoEl.innerHTML = `\u003Cstrong>Recherche d'emploi :\u003C\u002Fstrong> ${heuresRecherche} heures rémunérées par mois accordées pendant le préavis de licenciement (art. CCN).`;\n  } else {\n    infoEl.textContent = '';\n  }\n}\n\nfunction renderSalaireMin() {\n  const { salaire, horaire, smic } = computeSalaireMin(state);\n  document.getElementById('sal-result-val').textContent = fmt.format(salaire);\n  document.getElementById('sal-result-sub').textContent = `Soit ≈ ${fmtDec.format(horaire)}\u002Fh · SMIC pro-rata : ${fmt.format(smic)}`;\n\n  \u002F\u002F Highlight selected row\n  document.querySelectorAll('#sal-grid-table tbody tr').forEach(tr => {\n    tr.classList.toggle('highlight-row', parseInt(tr.dataset.niveau) === state.salNiveau);\n  });\n}\n\nfunction renderPrimeAnc() {\n  const { taux, prime, treizieme } = computePrimeAnciennete(state);\n  document.getElementById('pa-result-val').textContent = fmtDec.format(prime);\n  document.getElementById('pa-result-sub').textContent = taux > 0\n    ? `Taux : ${taux} % du salaire de base (ancienneté : ${state.paAnc} ans)`\n    : 'Ancienneté insuffisante (seuil : 2 ans)';\n  document.getElementById('pa-13-val').textContent = fmt.format(treizieme);\n}\n\nfunction renderConges() {\n  const { base, joursAnc, joursFrac, total } = computeConges(state);\n  document.getElementById('cong-result-val').textContent = `${total} j ouvrables`;\n  let parts = [`Base légale : ${base} j`];\n  if (joursAnc > 0) parts.push(`Séniorité : +${joursAnc} j`);\n  if (joursFrac > 0) parts.push(`Fractionnement : +${joursFrac} j`);\n  document.getElementById('cong-result-sub').textContent = parts.join(' · ');\n}\n\nfunction renderAll() {\n  renderIndemnite();\n  renderPreavis();\n  renderSalaireMin();\n  renderPrimeAnc();\n  renderConges();\n}\n\n\u002F\u002F ============================================================\n\u002F\u002F INPUT LISTENERS\n\u002F\u002F ============================================================\n\n\u002F\u002F Indemnité\ndocument.getElementById('ind-salaire').addEventListener('input', e => {\n  state.indSalaire = +e.target.value;\n  document.getElementById('ind-salaire-val').textContent = fmt.format(state.indSalaire);\n  renderIndemnite();\n});\ndocument.getElementById('ind-anc').addEventListener('input', e => {\n  state.indAnc = +e.target.value;\n  document.getElementById('ind-anc-val').textContent = `${state.indAnc} an${state.indAnc > 1 ? 's' : ''}`;\n  renderIndemnite();\n});\ndocument.getElementById('ind-cat-group').addEventListener('click', e => {\n  const btn = e.target.closest('.toggle-btn');\n  if (!btn) return;\n  state.indCat = btn.dataset.val;\n  document.querySelectorAll('#ind-cat-group .toggle-btn').forEach(b => b.classList.toggle('active', b === btn));\n  renderIndemnite();\n});\ndocument.getElementById('ind-age-group').addEventListener('click', e => {\n  const pill = e.target.closest('.pill');\n  if (!pill) return;\n  state.indAge = pill.dataset.val;\n  document.querySelectorAll('#ind-age-group .pill').forEach(p => p.classList.toggle('active', p === pill));\n  renderIndemnite();\n});\n\n\u002F\u002F Préavis\ndocument.getElementById('prev-statut-group').addEventListener('click', e => {\n  const btn = e.target.closest('.toggle-btn');\n  if (!btn) return;\n  state.prevStatut = btn.dataset.val;\n  document.querySelectorAll('#prev-statut-group .toggle-btn').forEach(b => b.classList.toggle('active', b === btn));\n  renderPreavis();\n});\ndocument.getElementById('prev-motif-group').addEventListener('click', e => {\n  const pill = e.target.closest('.pill');\n  if (!pill) return;\n  state.prevMotif = pill.dataset.val;\n  document.querySelectorAll('#prev-motif-group .pill').forEach(p => p.classList.toggle('active', p === pill));\n  renderPreavis();\n});\ndocument.getElementById('prev-anc').addEventListener('input', e => {\n  state.prevAnc = +e.target.value;\n  document.getElementById('prev-anc-val').textContent = `${state.prevAnc} an${state.prevAnc > 1 ? 's' : ''}`;\n  renderPreavis();\n});\n\n\u002F\u002F Salaire min\ndocument.getElementById('sal-niveau').addEventListener('change', e => {\n  state.salNiveau = +e.target.value;\n  renderSalaireMin();\n});\ndocument.getElementById('sal-heures').addEventListener('input', e => {\n  state.salHeures = +e.target.value;\n  document.getElementById('sal-heures-val').textContent = `${state.salHeures} h`;\n  renderSalaireMin();\n});\n\n\u002F\u002F Prime ancienneté\ndocument.getElementById('pa-salaire').addEventListener('input', e => {\n  state.paSalaire = +e.target.value;\n  document.getElementById('pa-salaire-val').textContent = fmt.format(state.paSalaire);\n  renderPrimeAnc();\n});\ndocument.getElementById('pa-anc').addEventListener('input', e => {\n  state.paAnc = +e.target.value;\n  document.getElementById('pa-anc-val').textContent = `${state.paAnc} an${state.paAnc > 1 ? 's' : ''}`;\n  renderPrimeAnc();\n});\n\n\u002F\u002F Congés\ndocument.getElementById('cong-anc').addEventListener('input', e => {\n  state.congAnc = +e.target.value;\n  document.getElementById('cong-anc-val').textContent = `${state.congAnc} an${state.congAnc > 1 ? 's' : ''}`;\n  renderConges();\n});\ndocument.getElementById('cong-frac-group').addEventListener('click', e => {\n  const btn = e.target.closest('.toggle-btn');\n  if (!btn) return;\n  state.congFrac = btn.dataset.val;\n  document.querySelectorAll('#cong-frac-group .toggle-btn').forEach(b => b.classList.toggle('active', b === btn));\n  renderConges();\n});\n\n\u002F\u002F ============================================================\n\u002F\u002F TABS\n\u002F\u002F ============================================================\n\nconst tabs = document.querySelectorAll('[data-tab]');\nconst panels = document.querySelectorAll('[data-panel]');\n\nfunction activate(id) {\n  tabs.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n  panels.forEach(p => {\n    const show = p.dataset.panel === id;\n    p.classList.toggle('visible', show);\n    p.style.display = show ? 'block' : 'none';\n  });\n  if (location.hash !== '#' + id) location.hash = id;\n  requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));\n}\n\ntabs.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\n\u002F\u002F ============================================================\n\u002F\u002F INIT\n\u002F\u002F ============================================================\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  lucide.createIcons();\n  renderAll();\n\n  const hashId = location.hash.slice(1);\n  const firstTab = tabs[0].dataset.tab;\n  const validId = document.querySelector(`[data-tab=\"${hashId}\"]`) ? hashId : firstTab;\n  activate(validId);\n});\n\n\u002F\u002F ResizeObserver → postMessage to parent iframe host\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\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-industries-de-fabrication-mecanique-du-verre-dfc567eee2.webp",[]]