[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-industrie-laitiere-fr":83,"footer-cities-fr":140},[4,14,22,30,38,45,53,60,67,75],{"seo_content":5,"id":8,"name":9,"slug":10,"parentId":7,"lang":11,"_count":12},[6],{"page_slug":7},null,"cmkzhl7xm00dbulbc93h4qog5","Juridique","avocats","fr-FR",{"experts":13},8,{"seo_content":15,"id":17,"name":18,"slug":19,"parentId":7,"lang":11,"_count":20},[16],{"page_slug":7},"cmkzhl84700djulbcbv6pzu9e","Informatique","informaticiens",{"experts":21},3,{"seo_content":23,"id":25,"name":26,"slug":27,"parentId":7,"lang":11,"_count":28},[24],{"page_slug":7},"cmkzhlaos00gnulbc07i9jrco","Amélioration de la Maison","artisans",{"experts":29},4,{"seo_content":31,"id":33,"name":34,"slug":35,"parentId":7,"lang":11,"_count":36},[32],{"page_slug":7},"cmkzhlaqg00gpulbcx38bwoc2","Général","divers-generalistes",{"experts":37},0,{"seo_content":39,"id":41,"name":42,"slug":43,"parentId":7,"lang":11,"_count":44},[40],{"page_slug":7},"cmkzhlbvq00i3ulbcutdbcz50","Électronique Grand Public","techniciens-electronique",{"experts":21},{"seo_content":46,"id":48,"name":49,"slug":50,"parentId":7,"lang":11,"_count":51},[47],{"page_slug":7},"cmkzhlcaw00ilulbc38pxoogr","Santé","medecins",{"experts":52},5,{"seo_content":54,"id":56,"name":57,"slug":58,"parentId":7,"lang":11,"_count":59},[55],{"page_slug":7},"cmkzhlcmi00izulbcxva1m47f","Gestion de Patrimoine","conseillers-patrimoniaux",{"experts":21},{"seo_content":61,"id":63,"name":64,"slug":65,"parentId":7,"lang":11,"_count":66},[62],{"page_slug":7},"cmkzhldcv00jvulbcmcd5a7mk","Animaux et Vétérinaires","veterinaires",{"experts":21},{"seo_content":68,"id":70,"name":71,"slug":72,"parentId":7,"lang":11,"_count":73},[69],{"page_slug":7},"cmkzhldrr00kdulbchxfo67eg","Mécanique et Réparation","mecaniciens",{"experts":74},1,{"seo_content":76,"id":78,"name":79,"slug":80,"parentId":7,"lang":11,"_count":81},[77],{"page_slug":7},"cmkzhl9l300fbulbcv3i8q8p3","Aide aux Devoirs","professeurs-particuliers",{"experts":82},6,{"slug":84,"title":85,"page_title":86,"description":87,"content_md":88,"local_slug":84,"json_ld":89,"faq":109,"tool_html":134,"source":135,"category":136,"audience":137,"publish_mode":138,"hero_image":139,"hero_image_alt":85},"ccn-industrie-laitiere","CCN de l'industrie laitière — calculateur complet","Calculateur CCN industrie laitière IDCC 112 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté, la prime annuelle et les congés supplémentaires de la CCN industrie laitière (IDCC 112).","Ce calculateur couvre les 6 principales dispositions conventionnelles de la CCN de l'industrie laitière (IDCC 112) : indemnité de licenciement par statut (ouvrier\u002Femployé ou cadre\u002FTAM), durée du préavis, grille salariale par coefficient (valeur du point 2025), prime d'ancienneté obligatoire (2 % à 12 %), prime annuelle et jours de congés supplémentaires selon l'ancienneté.",[90],{"name":91,"@type":92,"about":93,"author":97,"@context":100,"isPartOf":101,"inLanguage":104,"description":105,"operatingSystem":106,"applicationCategory":107,"isAccessibleForFree":108},"Calculateur CCN de l'industrie laitière — IDCC 112","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective nationale de l'industrie laitière","Thing","IDCC 112",{"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é, la prime annuelle et les congés supplémentaires de la convention collective de l'industrie laitière (IDCC 112).","All","FinanceApplication",true,[110,113,116,119,122,125,128,131],{"a":111,"q":112},"Pour les ouvriers et employés, la CCN industrie laitière (IDCC 112) prévoit 1\u002F10 de mois de salaire brut par année d'ancienneté pour les 5 premières années, puis 1\u002F5 de mois à partir de la 5e année, dans la limite de 8 mois. Des majorations s'appliquent selon l'âge : +20 % entre 50 et 55 ans, +10 % entre 55 et 60 ans. Pour les cadres et techniciens\u002Fagents de maîtrise, le calcul est de 1\u002F30 du salaire annuel brut par année d'ancienneté, dans la limite de 30\u002F30.","Comment calculer l'indemnité de licenciement dans la convention collective de l'industrie laitière ?",{"a":114,"q":115},"Selon l'article 15.1 de la CCN industrie laitière (IDCC 112), les ouvriers et employés bénéficient d'un préavis de 1 mois (moins de 2 ans d'ancienneté) ou 2 mois (2 ans et plus). Les techniciens et agents de maîtrise ont un préavis fixe de 2 mois. Les cadres et ingénieurs ont un préavis de 3 mois, pouvant être porté à 5 ou 6 mois par accord écrit. Durant le préavis, le salarié dispose de 50 heures payées pour recherche d'emploi.","Quelle est la durée du préavis dans la CCN industrie laitière ?",{"a":117,"q":118},"Oui, la CCN de l'industrie laitière (IDCC 112) publie une grille de salaires minimaux par coefficient. La valeur du point au 1er janvier 2025 est de 19,02 €. Le salaire mensuel brut minimum est obtenu en multipliant le coefficient de classification par la valeur du point. Les niveaux vont des opérateurs (coefficient 215) aux cadres supérieurs (coefficient 550).","La CCN industrie laitière prévoit-elle une grille de salaires ?",{"a":120,"q":121},"Oui, la CCN industrie laitière prévoit une prime d'ancienneté obligatoire (Avenant n°9 du 5 janvier 2023) : +2 % du salaire de base à partir de 2 ans d'ancienneté, +6 % à partir de 6 ans, +9 % à partir de 9 ans et +12 % à partir de 12 ans. Cette prime s'ajoute au salaire de base et n'a pas d'équivalent dans le code du travail.","Y a-t-il une prime d'ancienneté dans la convention collective de l'industrie laitière ?",{"a":123,"q":124},"Oui, la CCN de l'industrie laitière (IDCC 112) prévoit une prime annuelle obligatoire pour tout salarié ayant au moins 1 an d'ancienneté. Son montant est égal à 1 mois de salaire minimum conventionnel correspondant à la classification du salarié, calculé au prorata du temps de présence sur les 12 mois de référence.","La CCN industrie laitière prévoit-elle une prime annuelle ou un 13e mois ?",{"a":126,"q":127},"Oui, la CCN de l'industrie laitière accorde des jours de congés supplémentaires selon l'ancienneté : +2 jours à partir de 20 ans, +3 jours à partir de 25 ans et +4 jours à partir de 30 ans d'ancienneté. Ces jours s'ajoutent aux 30 jours ouvrables légaux et doivent être pris en dehors de la période légale de congés (1er mai – 31 octobre).","Y a-t-il des congés payés supplémentaires dans la CCN industrie laitière ?",{"a":129,"q":130},"La convention collective nationale de l'industrie laitière porte l'identifiant IDCC 112. Elle est consultable sur Legifrance sous la référence KALICONT000005635449. Elle couvre les salariés des entreprises relevant de la fabrication, transformation et conditionnement de produits laitiers.","Quel est l'IDCC de la convention collective de l'industrie laitière ?",{"a":132,"q":133},"Oui, la convention collective de l'industrie laitière (IDCC 112) couvre l'ensemble des activités de production et transformation laitière, incluant la fabrication de lait pasteurisé, de beurre, de fromages, de yaourts et de crèmes. Elle s'applique aux entreprises dont l'activité principale relève de cette branche professionnelle.","La CCN industrie laitière s'applique-t-elle aux fromages et yaourts ?","\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 Industrie Laitière — IDCC 112\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    \u002F* ── Design tokens ─────────────────────────────────────── *\u002F\n    :root {\n      --bg: #fafaf9;\n      --surface: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #eff6ff;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --muted: #78716c;\n      --success-bg: #f0fdf4;\n      --success-border: #bbf7d0;\n      --success-text: #166534;\n      --warn-bg: #fffbeb;\n      --warn-border: #fde68a;\n      --warn-text: #92400e;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n      font-family: system-ui, -apple-system, sans-serif;\n    }\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n    body { background: var(--bg); color: var(--text); font-size: 15px; line-height: 1.55; }\n\n    \u002F* ── Layout ─────────────────────────────────────────────── *\u002F\n    .tool-root { max-width: 720px; margin: 0 auto; padding: 1.25rem 1rem 2rem; }\n    .tool-header { margin-bottom: 1.25rem; }\n    .tool-header h1 { font-size: 1.15rem; font-weight: 700; color: var(--text); }\n    .tool-header .idcc-badge {\n      display: inline-flex; align-items: center; gap: 0.3rem;\n      background: var(--accent-light); color: var(--accent);\n      font-size: 0.75rem; font-weight: 600; padding: 0.2rem 0.55rem;\n      border-radius: 999px; margin-left: 0.5rem; vertical-align: middle;\n    }\n    .tool-header p { font-size: 0.875rem; color: var(--muted); margin-top: 0.35rem; }\n\n    \u002F* ── Tabs ───────────────────────────────────────────────── *\u002F\n    .tabs-nav {\n      display: flex; gap: 0.2rem; flex-wrap: wrap;\n      border-bottom: 2px solid var(--border);\n      margin-bottom: 1.25rem;\n    }\n    .tab-btn {\n      padding: 0.5rem 0.85rem;\n      font-size: 0.825rem; font-weight: 600;\n      border: none; background: transparent; cursor: pointer;\n      color: var(--muted); border-bottom: 2px solid transparent;\n      margin-bottom: -2px; border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n      transition: color .15s, border-color .15s;\n      display: flex; align-items: center; gap: 0.35rem;\n    }\n    .tab-btn:hover { color: var(--accent); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); }\n    .tab-btn svg { width: 14px; height: 14px; }\n\n    \u002F* ── Panel ──────────────────────────────────────────────── *\u002F\n    .tab-panel { display: none; }\n    .tab-panel.active { display: block; }\n\n    \u002F* ── Rule callout ───────────────────────────────────────── *\u002F\n    .rule-callout {\n      display: flex; gap: 0.65rem; align-items: flex-start;\n      background: var(--accent-light); border: 1px solid #bfdbfe;\n      border-radius: var(--radius); padding: 0.875rem 1rem;\n      margin-bottom: 1.25rem;\n    }\n    .rule-callout svg { width: 16px; height: 16px; color: var(--accent); flex-shrink: 0; margin-top: 2px; }\n    .rule-callout p { font-size: 0.85rem; color: #1e40af; }\n    .rule-callout strong { font-weight: 700; }\n\n    \u002F* ── Form controls ──────────────────────────────────────── *\u002F\n    .form-grid { display: grid; gap: 1rem; }\n    .form-group label {\n      display: block; font-size: 0.8rem; font-weight: 600;\n      color: var(--muted); margin-bottom: 0.35rem; letter-spacing: 0.02em;\n    }\n    .form-group .val-display {\n      display: inline-block; font-weight: 700; color: var(--text);\n      background: var(--accent-light); border-radius: 0.35rem;\n      padding: 0.1rem 0.45rem; margin-left: 0.35rem; font-size: 0.85rem;\n      font-variant-numeric: tabular-nums;\n    }\n    input[type=\"range\"] {\n      width: 100%; accent-color: var(--accent); height: 6px;\n    }\n    select {\n      width: 100%; padding: 0.5rem 0.75rem;\n      border: 1px solid var(--border); border-radius: var(--radius-sm);\n      background: var(--surface); font-size: 0.9rem; color: var(--text);\n      cursor: pointer;\n    }\n    select:focus { outline: 2px solid var(--accent); outline-offset: 1px; }\n\n    \u002F* ── Pill toggles ───────────────────────────────────────── *\u002F\n    .pills { display: flex; gap: 0.4rem; flex-wrap: wrap; }\n    .pill {\n      padding: 0.35rem 0.75rem; border-radius: 999px;\n      border: 1.5px solid var(--border); background: var(--surface);\n      font-size: 0.8rem; font-weight: 600; cursor: pointer; color: var(--muted);\n      transition: all .15s;\n    }\n    .pill.selected { background: var(--accent); border-color: var(--accent); color: #fff; }\n\n    \u002F* ── Result card ────────────────────────────────────────── *\u002F\n    .result-card {\n      margin-top: 1.25rem; padding: 1rem 1.25rem;\n      border-radius: var(--radius); border: 1.5px solid var(--success-border);\n      background: var(--success-bg);\n    }\n    .result-card .result-label { font-size: 0.8rem; font-weight: 600; color: var(--success-text); margin-bottom: 0.25rem; }\n    .result-card .result-value {\n      font-size: 1.65rem; font-weight: 800; color: var(--success-text);\n      font-variant-numeric: tabular-nums;\n    }\n    .result-card .result-detail { font-size: 0.8rem; color: var(--success-text); margin-top: 0.3rem; opacity: 0.85; }\n\n    \u002F* ── Warning card ───────────────────────────────────────── *\u002F\n    .warn-card {\n      margin-top: 1rem; padding: 0.75rem 1rem;\n      border-radius: var(--radius-sm); border: 1px solid var(--warn-border);\n      background: var(--warn-bg); font-size: 0.82rem; color: var(--warn-text);\n      display: flex; gap: 0.5rem; align-items: flex-start;\n    }\n    .warn-card svg { width: 14px; height: 14px; flex-shrink: 0; margin-top: 2px; }\n\n    \u002F* ── Separator ──────────────────────────────────────────── *\u002F\n    .sep { border: none; border-top: 1px solid var(--border); margin: 1.25rem 0; }\n\n    \u002F* ── Disclaimer ─────────────────────────────────────────── *\u002F\n    .disclaimer {\n      font-size: 0.78rem; color: var(--muted);\n      border-top: 1px solid var(--border); padding-top: 1rem; margin-top: 1.5rem;\n    }\n    .disclaimer a { color: var(--accent); }\n\n    \u002F* ── Grille table ───────────────────────────────────────── *\u002F\n    .grille-table { width: 100%; border-collapse: collapse; font-size: 0.82rem; }\n    .grille-table th {\n      background: var(--accent-light); color: var(--accent);\n      padding: 0.45rem 0.6rem; text-align: left; font-weight: 700;\n      border-bottom: 2px solid #bfdbfe;\n    }\n    .grille-table td {\n      padding: 0.4rem 0.6rem; border-bottom: 1px solid var(--border);\n      font-variant-numeric: tabular-nums;\n    }\n    .grille-table tr:last-child td { border-bottom: none; }\n    .grille-table tr:hover td { background: var(--accent-light); }\n    .grille-table td:last-child { font-weight: 700; }\n\n    \u002F* ── Salary inputs ──────────────────────────────────────── *\u002F\n    .input-row { display: flex; gap: 0.75rem; align-items: center; flex-wrap: wrap; }\n    .input-number {\n      padding: 0.45rem 0.65rem; border: 1.5px solid var(--border);\n      border-radius: var(--radius-sm); font-size: 0.9rem; width: 140px;\n      font-variant-numeric: tabular-nums;\n    }\n    .input-number:focus { outline: 2px solid var(--accent); outline-offset: 1px; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\n\u003C!-- CCN IDCC 112 — deviations\n     indemnite:    L1234-9 → 1\u002F10 mois\u002Fan (\u003C5 ans) ou 1\u002F5 mois\u002Fan (≥5 ans), plafond 8 mois, majorations âge 50-55 (+20%) et 55-60 (+10%)\n                  Cadres\u002FTAM : 1\u002F30 salaire annuel\u002Fan (max 30\u002F30)\n                  (Source : Legifrance KALICONT000005635449 art. 15.7)\n     preavis:     L1234-1 → Ouvriers\u002Femployés 1 mois (\u003C2 ans) ou 2 mois (≥2 ans) ; TAM 2 mois ; Cadres 3 mois\n                  (Source : Legifrance art. 15.1)\n     salaire-min: grille par coefficient, valeur du point 19,02 € (2025)\n                  (Source : Avenant salaires 2025 Legifrance)\n     prime-anciennete: 2% (2 ans) \u002F 6% (6 ans) \u002F 9% (9 ans) \u002F 12% (12 ans)\n                  (Source : Avenant n°9 du 5 janvier 2023 KALITEXT000047537222)\n     prime-annuelle: 1 mois salaire minimum de la classification, pro-rata\n                  (Source : art. CCN industrie laitière)\n     conges:      +2 j (20 ans) \u002F +3 j (25 ans) \u002F +4 j (30 ans) séniorité — hors période légale\n                  (Source : CCN industrie laitière congés) -->\n\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>\n      Convention collective de l'industrie laitière\n      \u003Cspan class=\"idcc-badge\">\u003Ci data-lucide=\"tag\">\u003C\u002Fi> IDCC 112\u003C\u002Fspan>\n    \u003C\u002Fh1>\n    \u003Cp>Calculateur interactif — indemnité, préavis, grille salariale, prime d'ancienneté, prime annuelle, congés.\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n  \u003C!-- TAB NAV -->\n  \u003Cnav class=\"tabs-nav\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"calculator\">\u003C\u002Fi> Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\n      \u003Ci data-lucide=\"clock\">\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\">\u003C\u002Fi> Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-anciennete\" role=\"tab\">\n      \u003Ci data-lucide=\"trending-up\">\u003C\u002Fi> Prime ancienneté\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-annuelle\" role=\"tab\">\n      \u003Ci data-lucide=\"gift\">\u003C\u002Fi> Prime annuelle\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">\n      \u003Ci data-lucide=\"sun\">\u003C\u002Fi> Congés supp.\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB 1 : INDEMNITÉ DE LICENCIEMENT -->\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003Csection class=\"tab-panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>\n        \u003Cstrong>CCN industrie laitière :\u003C\u002Fstrong> l'indemnité de licenciement varie selon le statut.\n        \u003Cstrong>Ouvriers \u002F employés :\u003C\u002Fstrong> 1\u002F10 de mois par an (moins de 5 ans) ou 1\u002F5 de mois par an (à partir de 5 ans), plafonnée à \u003Cstrong>8 mois\u003C\u002Fstrong>, avec majorations d'âge.\n        \u003Cstrong>Cadres \u002F TAM :\u003C\u002Fstrong> 1\u002F30 du salaire annuel brut par année d'ancienneté (max 30\u002F30).\n        Source : Legifrance, art. 15.7 IDCC 112.\n      \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003C!-- Statut -->\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-statut-pills\">\n          \u003Cbutton class=\"pill selected\" data-val=\"oe\">Ouvrier \u002F Employé\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"tam\">TAM \u002F Technicien\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre \u002F Ingénieur\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003C!-- Salaire brut mensuel -->\n      \u003Cdiv class=\"form-group\" id=\"ind-salaire-group\">\n        \u003Clabel>\n          Salaire brut mensuel de référence\n          \u003Cspan class=\"val-display\" id=\"ind-salaire-val\">3 000 €\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"1500\" max=\"8000\" step=\"50\" value=\"3000\">\n      \u003C\u002Fdiv>\n\n      \u003C!-- Salaire annuel brut (cadres) -->\n      \u003Cdiv class=\"form-group\" id=\"ind-salaire-annuel-group\" style=\"display:none\">\n        \u003Clabel>\n          Salaire annuel brut de référence\n          \u003Cspan class=\"val-display\" id=\"ind-salaire-annuel-val\">36 000 €\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-salaire-annuel\" min=\"20000\" max=\"120000\" step=\"500\" value=\"36000\">\n      \u003C\u002Fdiv>\n\n      \u003C!-- Ancienneté -->\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>\n          Ancienneté\n          \u003Cspan class=\"val-display\" id=\"ind-anc-val\">5 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"35\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n\n      \u003C!-- Âge (OE seulement) -->\n      \u003Cdiv class=\"form-group\" id=\"ind-age-group\">\n        \u003Clabel>\n          Âge (pour les majorations conventionnelles)\n          \u003Cspan class=\"val-display\" id=\"ind-age-val\">45 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-age\" min=\"18\" max=\"65\" step=\"1\" value=\"45\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"ind-result\">\n      \u003Cdiv class=\"result-label\">Indemnité de licenciement estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ind-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"ind-result-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB 2 : PRÉAVIS -->\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003Csection class=\"tab-panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>\n        \u003Cstrong>CCN industrie laitière (art. 15.1) :\u003C\u002Fstrong>\n        Ouvriers \u002F employés : 1 mois (moins de 2 ans) ou 2 mois (2 ans et plus).\n        Techniciens \u002F agents de maîtrise : 2 mois.\n        Cadres \u002F ingénieurs : \u003Cstrong>3 mois\u003C\u002Fstrong>, pouvant être porté à 5-6 mois par accord écrit.\n        Le salarié dispose de 50 heures payées pour recherche d'emploi pendant le préavis.\n        Plus favorable que le code du travail (L1234-1).\n      \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pre-statut-pills\">\n          \u003Cbutton class=\"pill selected\" data-val=\"oe\">Ouvrier \u002F Employé\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"tam\">TAM \u002F Technicien\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre \u002F Ingénieur\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"form-group\" id=\"pre-anc-group\">\n        \u003Clabel>\n          Ancienneté\n          \u003Cspan class=\"val-display\" id=\"pre-anc-val\">3 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pre-anc\" min=\"0\" max=\"35\" step=\"1\" value=\"3\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Type de rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pre-type-pills\">\n          \u003Cbutton class=\"pill selected\" data-val=\"licenc\">Licenciement\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"demiss\">Démission\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"pre-result\">\n      \u003Cdiv class=\"result-label\">Durée du préavis conventionnel\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pre-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pre-result-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB 3 : GRILLE SALARIALE -->\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003Csection class=\"tab-panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>\n        \u003Cstrong>CCN industrie laitière :\u003C\u002Fstrong> la grille de salaires est définie par coefficient.\n        Valeur du point au 1er janvier 2025 : \u003Cstrong>19,02 €\u003C\u002Fstrong>.\n        Le salaire mensuel brut minimum = coefficient × valeur du point ÷ 13 × 12.\n        Les niveaux sont classés selon les compétences techniques, l'autonomie et les responsabilités.\n      \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>\n          Valeur du point de référence\n          \u003Cspan class=\"val-display\" id=\"sm-point-val\">19,02 €\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"sm-point\" min=\"15\" max=\"25\" step=\"0.01\" value=\"19.02\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Durée hebdomadaire (heures)\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"sm-heures-pills\">\n          \u003Cbutton class=\"pill selected\" data-val=\"35\">35h\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"37\">37h\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"39\">39h\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cp style=\"font-size:0.82rem;color:var(--muted);margin-bottom:0.75rem\">\n      Grille indicative — coefficients représentatifs de la convention.\n      Cliquez sur une ligne pour voir le calcul détaillé.\n    \u003C\u002Fp>\n\n    \u003Ctable class=\"grille-table\" id=\"sm-table\">\n      \u003Cthead>\n        \u003Ctr>\n          \u003Cth>Niveau\u003C\u002Fth>\n          \u003Cth>Coefficient\u003C\u002Fth>\n          \u003Cth>Salaire mensuel brut (35h)\u003C\u002Fth>\n        \u003C\u002Ftr>\n      \u003C\u002Fthead>\n      \u003Ctbody id=\"sm-tbody\">\u003C\u002Ftbody>\n    \u003C\u002Ftable>\n\n    \u003Cdiv class=\"result-card\" id=\"sm-result\" style=\"display:none\">\n      \u003Cdiv class=\"result-label\">Salaire mensuel brut minimum sélectionné\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"sm-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"sm-result-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB 4 : PRIME D'ANCIENNETÉ -->\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003Csection class=\"tab-panel\" data-panel=\"prime-anciennete\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>\n        \u003Cstrong>CCN industrie laitière (Avenant n°9 du 5 janvier 2023) :\u003C\u002Fstrong>\n        prime d'ancienneté obligatoire versée en supplément du salaire de base :\n        \u003Cstrong>+2%\u003C\u002Fstrong> à 2 ans · \u003Cstrong>+6%\u003C\u002Fstrong> à 6 ans · \u003Cstrong>+9%\u003C\u002Fstrong> à 9 ans · \u003Cstrong>+12%\u003C\u002Fstrong> à 12 ans.\n        Aucun équivalent dans le code du travail — avantage purement conventionnel.\n      \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>\n          Salaire brut mensuel de base\n          \u003Cspan class=\"val-display\" id=\"pa-salaire-val\">2 500 €\u003C\u002Fspan>\n        \u003C\u002Flabel>\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        \u003Clabel>\n          Ancienneté\n          \u003Cspan class=\"val-display\" id=\"pa-anc-val\">6 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pa-anc\" min=\"0\" max=\"35\" step=\"1\" value=\"6\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"pa-result\">\n      \u003Cdiv class=\"result-label\">Prime d'ancienneté mensuelle\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pa-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pa-result-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB 5 : PRIME ANNUELLE -->\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003Csection class=\"tab-panel\" data-panel=\"prime-annuelle\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>\n        \u003Cstrong>CCN industrie laitière :\u003C\u002Fstrong> tout salarié ayant \u003Cstrong>au moins 1 an d'ancienneté\u003C\u002Fstrong>\n        bénéficie d'une prime annuelle égale à \u003Cstrong>1 mois de salaire minimum conventionnel\u003C\u002Fstrong>\n        correspondant à sa classification, calculée au prorata du temps de présence sur les 12 mois de référence.\n        Aucun équivalent légal — avantage purement conventionnel.\n      \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>\n          Salaire mensuel minimum de la classification\n          \u003Cspan class=\"val-display\" id=\"pan-salaire-val\">2 200 €\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pan-salaire\" min=\"1700\" max=\"7000\" step=\"50\" value=\"2200\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>\n          Mois de présence sur l'année de référence\n          \u003Cspan class=\"val-display\" id=\"pan-mois-val\">12 mois\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pan-mois\" min=\"1\" max=\"12\" step=\"1\" value=\"12\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>Ancienneté (au moins 1 an requis)\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pan-anc-pills\">\n          \u003Cbutton class=\"pill selected\" data-val=\"oui\">≥ 1 an\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"non\">\u003C 1 an\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"pan-result\">\n      \u003Cdiv class=\"result-label\">Prime annuelle estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pan-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pan-result-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003C!-- TAB 6 : CONGÉS SUPPLÉMENTAIRES -->\n  \u003C!-- ════════════════════════════════════════════════════════ -->\n  \u003Csection class=\"tab-panel\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>\n        \u003Cstrong>CCN industrie laitière :\u003C\u002Fstrong> au-delà des 30 jours ouvrables légaux (L3141-3),\n        les salariés bénéficient de jours supplémentaires selon leur ancienneté :\n        \u003Cstrong>+2 jours\u003C\u002Fstrong> à partir de 20 ans · \u003Cstrong>+3 jours\u003C\u002Fstrong> à partir de 25 ans · \u003Cstrong>+4 jours\u003C\u002Fstrong> à partir de 30 ans.\n        Ces jours doivent être pris en dehors de la période légale (1er mai – 31 octobre).\n      \u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel>\n          Ancienneté dans l'entreprise\n          \u003Cspan class=\"val-display\" id=\"cg-anc-val\">10 ans\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cg-anc\" min=\"0\" max=\"40\" step=\"1\" value=\"10\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"cg-result\">\n      \u003Cdiv class=\"result-label\">Total congés payés annuels (ouvrables)\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"cg-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"cg-result-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ── Shared disclaimer ────────────────────────────────── -->\n  \u003Cp class=\"disclaimer\">\n    \u003Ci data-lucide=\"shield\" style=\"width:13px;height:13px;vertical-align:-2px\">\u003C\u002Fi>\n    Calcul indicatif basé sur la CCN IDCC 112 (convention collective de l'industrie laitière).\n    Source :\n    \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635449\" target=\"_blank\" rel=\"noopener\">Legifrance KALICONT000005635449\u003C\u002Fa>.\n    Pour toute validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n  \u002F* ── State objects (one per tab) ───────────────────────── *\u002F\n  const indState  = { statut: 'oe', salaire: 3000, salaireAnnuel: 36000, anc: 5, age: 45 };\n  const preState  = { statut: 'oe', anc: 3, type: 'licenc' };\n  const smState   = { point: 19.02, heures: 35, selectedCoef: null };\n  const paState   = { salaire: 2500, anc: 6 };\n  const panState  = { salaire: 2200, mois: 12, ancSuffisant: true };\n  const cgState   = { anc: 10 };\n\n  const fmt = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 }).format(v);\n\n  \u002F* ── Grille coefficients ─────────────────────────────── *\u002F\n  const GRILLE = [\n    { niveau: 'N1 – Opérateur',                coef: 215 },\n    { niveau: 'N2 – Opérateur qualifié',        coef: 230 },\n    { niveau: 'N3 – Technicien \u002F Agent qualif', coef: 255 },\n    { niveau: 'N4 – Technicien confirmé',       coef: 280 },\n    { niveau: 'N5 – Agent de maîtrise',         coef: 315 },\n    { niveau: 'N6 – Agent de maîtrise senior',  coef: 350 },\n    { niveau: 'N7 – Cadre débutant',            coef: 400 },\n    { niveau: 'N8 – Cadre confirmé',            coef: 470 },\n    { niveau: 'N9 – Cadre supérieur',           coef: 550 },\n  ];\n\n  \u002F* ── COMPUTE functions ─────────────────────────────────── *\u002F\n  function computeInd(s) {\n    const { statut, salaire, salaireAnnuel, anc, age } = s;\n    if (anc \u003C 1) return { val: 0, detail: 'Ancienneté insuffisante (\u003C 1 an).' };\n    let montant = 0, detail = '';\n    if (statut === 'oe') {\n      const base = anc \u003C 5 ? (salaire * 1\u002F10 * anc) : (salaire * 1\u002F5 * anc);\n      const plafond = salaire * 8;\n      montant = Math.min(base, plafond);\n      let taux = anc \u003C 5 ? '1\u002F10' : '1\u002F5';\n      let majorPct = 0;\n      if (age >= 50 && age \u003C 55) majorPct = 20;\n      else if (age >= 55 && age \u003C= 60) majorPct = 10;\n      if (majorPct > 0) {\n        montant = Math.min(montant * (1 + majorPct\u002F100), plafond);\n        detail = `Base : ${fmt(Math.min(salaire*(anc \u003C 5 ? 0.1 : 0.2)*anc, plafond))} · Majoration âge +${majorPct}% = ${fmt(montant)}. Plafond 8 mois appliqué si dépassé.`;\n      } else {\n        detail = `Formule ${taux} × ${anc} an(s) = ${fmt(Math.min(salaire*(anc \u003C 5 ? 0.1 : 0.2)*anc, plafond))}. Plafond 8 mois : ${fmt(plafond)}.`;\n      }\n    } else if (statut === 'tam') {\n      montant = Math.min((salaireAnnuel \u002F 30) * anc, salaireAnnuel);\n      detail = `1\u002F30 × salaire annuel brut × ${anc} an(s) = ${fmt(montant)}. (Max 30\u002F30 du salaire annuel.)`;\n    } else { \u002F\u002F cadre\n      montant = Math.min((salaireAnnuel \u002F 30) * anc, salaireAnnuel);\n      detail = `1\u002F30 × salaire annuel brut × ${anc} an(s) = ${fmt(montant)}. (Max 30\u002F30 du salaire annuel.)`;\n    }\n    return { val: montant, detail };\n  }\n\n  function computePre(s) {\n    const { statut, anc, type } = s;\n    let duree = '', detail = '';\n    if (statut === 'oe') {\n      if (anc \u003C 2) { duree = '1 mois'; detail = 'Ancienneté \u003C 2 ans.'; }\n      else { duree = '2 mois'; detail = 'Ancienneté ≥ 2 ans.'; }\n    } else if (statut === 'tam') {\n      duree = '2 mois'; detail = 'Technicien \u002F Agent de maîtrise — durée fixe.';\n    } else {\n      duree = '3 mois'; detail = 'Cadre \u002F Ingénieur — peut être porté à 5-6 mois par accord écrit. 50 heures payées pour recherche d\\'emploi.';\n    }\n    return { duree, detail };\n  }\n\n  function computeSm(coef, point, heures) {\n    const base35 = coef * point;\n    const prorata = base35 * (heures \u002F 35);\n    return { base35, prorata };\n  }\n\n  function computePa(salaire, anc) {\n    let pct = 0;\n    if (anc >= 12) pct = 12;\n    else if (anc >= 9) pct = 9;\n    else if (anc >= 6) pct = 6;\n    else if (anc >= 2) pct = 2;\n    const montant = salaire * pct \u002F 100;\n    return { pct, montant };\n  }\n\n  function computePan(salaire, mois, ancSuffisant) {\n    if (!ancSuffisant) return { montant: 0, detail: 'Ancienneté insuffisante (\u003C 1 an) — prime non due.' };\n    const montant = salaire * (mois \u002F 12);\n    return { montant, detail: `${salaire} € × ${mois}\u002F12 mois = ${fmt(montant)}.` };\n  }\n\n  function computeCg(anc) {\n    let base = 30, extra = 0, detail = '';\n    if (anc >= 30) { extra = 4; detail = '30 j légaux + 4 j conventionnels (≥ 30 ans ancienneté).'; }\n    else if (anc >= 25) { extra = 3; detail = '30 j légaux + 3 j conventionnels (≥ 25 ans ancienneté).'; }\n    else if (anc >= 20) { extra = 2; detail = '30 j légaux + 2 j conventionnels (≥ 20 ans ancienneté).'; }\n    else { detail = '30 j légaux. Jours supplémentaires à partir de 20 ans d\\'ancienneté.'; }\n    return { total: base + extra, extra, detail };\n  }\n\n  \u002F* ── RENDER functions ──────────────────────────────────── *\u002F\n  function renderInd() {\n    const showAnnuel = indState.statut !== 'oe';\n    document.getElementById('ind-salaire-group').style.display = showAnnuel ? 'none' : '';\n    document.getElementById('ind-salaire-annuel-group').style.display = showAnnuel ? '' : 'none';\n    document.getElementById('ind-age-group').style.display = indState.statut === 'oe' ? '' : 'none';\n    const r = computeInd(indState);\n    document.getElementById('ind-result-val').textContent = fmt(r.val);\n    document.getElementById('ind-result-detail').textContent = r.detail;\n  }\n  function renderPre() {\n    const showAnc = indState.statut !== 'tam';\n    document.getElementById('pre-anc-group').style.display = preState.statut === 'oe' ? '' : 'none';\n    const r = computePre(preState);\n    document.getElementById('pre-result-val').textContent = r.duree;\n    document.getElementById('pre-result-detail').textContent = r.detail;\n  }\n  function renderSm() {\n    const tbody = document.getElementById('sm-tbody');\n    tbody.innerHTML = '';\n    GRILLE.forEach(g => {\n      const { base35 } = computeSm(g.coef, smState.point, 35);\n      const { prorata } = computeSm(g.coef, smState.point, smState.heures);\n      const tr = document.createElement('tr');\n      tr.style.cursor = 'pointer';\n      tr.dataset.coef = g.coef;\n      tr.dataset.niveau = g.niveau;\n      tr.innerHTML = `\u003Ctd>${g.niveau}\u003C\u002Ftd>\u003Ctd style=\"text-align:center\">${g.coef}\u003C\u002Ftd>\u003Ctd>${fmt(prorata)}\u003C\u002Ftd>`;\n      tr.addEventListener('click', () => {\n        smState.selectedCoef = g.coef;\n        const sel = computeSm(g.coef, smState.point, smState.heures);\n        document.getElementById('sm-result-val').textContent = fmt(sel.prorata);\n        document.getElementById('sm-result-detail').textContent = `Coef. ${g.coef} × ${smState.point.toFixed(2)} € (point) = ${fmt(sel.base35)} \u002F 35h · proratisé ${smState.heures}h = ${fmt(sel.prorata)}.`;\n        document.getElementById('sm-result').style.display = '';\n      });\n      tbody.appendChild(tr);\n    });\n  }\n  function renderPa() {\n    const r = computePa(paState.salaire, paState.anc);\n    const rv = document.getElementById('pa-result-val');\n    const rd = document.getElementById('pa-result-detail');\n    if (r.pct === 0) {\n      rv.textContent = '0 €';\n      rd.textContent = 'Ancienneté \u003C 2 ans — prime non due. Elle s\\'applique dès 2 ans.';\n    } else {\n      rv.textContent = fmt(r.montant) + ' \u002F mois';\n      rd.textContent = `Taux ${r.pct}% × ${fmt(paState.salaire)} = ${fmt(r.montant)} \u002F mois (soit ${fmt(r.montant*12)} \u002F an).`;\n    }\n  }\n  function renderPan() {\n    const r = computePan(panState.salaire, panState.mois, panState.ancSuffisant);\n    document.getElementById('pan-result-val').textContent = r.montant > 0 ? fmt(r.montant) : 'Non due';\n    document.getElementById('pan-result-detail').textContent = r.detail;\n  }\n  function renderCg() {\n    const r = computeCg(cgState.anc);\n    document.getElementById('cg-result-val').textContent = r.total + ' jours ouvrables';\n    document.getElementById('cg-result-detail').textContent = r.detail;\n  }\n\n  \u002F* ── Tab activation ────────────────────────────────────── *\u002F\n  const tabBtns   = document.querySelectorAll('.tab-btn');\n  const tabPanels = document.querySelectorAll('.tab-panel');\n\n  function activate(id) {\n    tabBtns.forEach(b => b.classList.toggle('active', b.dataset.tab === id));\n    tabPanels.forEach(p => p.classList.toggle('active', p.dataset.panel === id));\n    if (location.hash !== '#' + id) location.hash = id;\n    requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));\n    \u002F\u002F Initial render on first activation\n    if (id === 'salaire-min') renderSm();\n  }\n\n  tabBtns.forEach(b => b.addEventListener('click', () => activate(b.dataset.tab)));\n\n  \u002F\u002F Initial tab (hash or first)\n  const hashId = location.hash.slice(1);\n  const validIds = Array.from(tabBtns).map(b => b.dataset.tab);\n  activate(validIds.includes(hashId) ? hashId : validIds[0]);\n\n  \u002F* ── Pill factory ──────────────────────────────────────── *\u002F\n  function bindPills(containerId, callback) {\n    const container = document.getElementById(containerId);\n    if (!container) return;\n    container.querySelectorAll('.pill').forEach(p => {\n      p.addEventListener('click', () => {\n        container.querySelectorAll('.pill').forEach(x => x.classList.remove('selected'));\n        p.classList.add('selected');\n        callback(p.dataset.val);\n      });\n    });\n  }\n\n  \u002F* ── Tab 1: Indemnité ──────────────────────────────────── *\u002F\n  bindPills('ind-statut-pills', v => { indState.statut = v; renderInd(); });\n  bindPills('ind-statut-pills', v => {}); \u002F\u002F already done above\n\n  document.getElementById('ind-salaire').addEventListener('input', e => {\n    indState.salaire = +e.target.value;\n    document.getElementById('ind-salaire-val').textContent = fmt(indState.salaire);\n    renderInd();\n  });\n  document.getElementById('ind-salaire-annuel').addEventListener('input', e => {\n    indState.salaireAnnuel = +e.target.value;\n    document.getElementById('ind-salaire-annuel-val').textContent = fmt(indState.salaireAnnuel);\n    renderInd();\n  });\n  document.getElementById('ind-anc').addEventListener('input', e => {\n    indState.anc = +e.target.value;\n    document.getElementById('ind-anc-val').textContent = indState.anc + ' an' + (indState.anc > 1 ? 's' : '');\n    renderInd();\n  });\n  document.getElementById('ind-age').addEventListener('input', e => {\n    indState.age = +e.target.value;\n    document.getElementById('ind-age-val').textContent = indState.age + ' ans';\n    renderInd();\n  });\n\n  \u002F\u002F Re-bind statut pills properly\n  document.getElementById('ind-statut-pills').querySelectorAll('.pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.getElementById('ind-statut-pills').querySelectorAll('.pill').forEach(x => x.classList.remove('selected'));\n      p.classList.add('selected');\n      indState.statut = p.dataset.val;\n      renderInd();\n    });\n  });\n\n  renderInd();\n\n  \u002F* ── Tab 2: Préavis ──────────────────────────────────────── *\u002F\n  document.getElementById('pre-statut-pills').querySelectorAll('.pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.getElementById('pre-statut-pills').querySelectorAll('.pill').forEach(x => x.classList.remove('selected'));\n      p.classList.add('selected');\n      preState.statut = p.dataset.val;\n      renderPre();\n    });\n  });\n  document.getElementById('pre-anc').addEventListener('input', e => {\n    preState.anc = +e.target.value;\n    document.getElementById('pre-anc-val').textContent = preState.anc + ' an' + (preState.anc > 1 ? 's' : '');\n    renderPre();\n  });\n  document.getElementById('pre-type-pills').querySelectorAll('.pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.getElementById('pre-type-pills').querySelectorAll('.pill').forEach(x => x.classList.remove('selected'));\n      p.classList.add('selected');\n      preState.type = p.dataset.val;\n      renderPre();\n    });\n  });\n  renderPre();\n\n  \u002F* ── Tab 3: Grille salariale ────────────────────────────── *\u002F\n  document.getElementById('sm-point').addEventListener('input', e => {\n    smState.point = +e.target.value;\n    document.getElementById('sm-point-val').textContent = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(smState.point);\n    renderSm();\n  });\n  document.getElementById('sm-heures-pills').querySelectorAll('.pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.getElementById('sm-heures-pills').querySelectorAll('.pill').forEach(x => x.classList.remove('selected'));\n      p.classList.add('selected');\n      smState.heures = +p.dataset.val;\n      renderSm();\n    });\n  });\n\n  \u002F* ── Tab 4: Prime ancienneté ────────────────────────────── *\u002F\n  document.getElementById('pa-salaire').addEventListener('input', e => {\n    paState.salaire = +e.target.value;\n    document.getElementById('pa-salaire-val').textContent = fmt(paState.salaire);\n    renderPa();\n  });\n  document.getElementById('pa-anc').addEventListener('input', e => {\n    paState.anc = +e.target.value;\n    document.getElementById('pa-anc-val').textContent = paState.anc + ' an' + (paState.anc > 1 ? 's' : '');\n    renderPa();\n  });\n  renderPa();\n\n  \u002F* ── Tab 5: Prime annuelle ──────────────────────────────── *\u002F\n  document.getElementById('pan-salaire').addEventListener('input', e => {\n    panState.salaire = +e.target.value;\n    document.getElementById('pan-salaire-val').textContent = fmt(panState.salaire);\n    renderPan();\n  });\n  document.getElementById('pan-mois').addEventListener('input', e => {\n    panState.mois = +e.target.value;\n    document.getElementById('pan-mois-val').textContent = panState.mois + ' mois';\n    renderPan();\n  });\n  document.getElementById('pan-anc-pills').querySelectorAll('.pill').forEach(p => {\n    p.addEventListener('click', () => {\n      document.getElementById('pan-anc-pills').querySelectorAll('.pill').forEach(x => x.classList.remove('selected'));\n      p.classList.add('selected');\n      panState.ancSuffisant = p.dataset.val === 'oui';\n      renderPan();\n    });\n  });\n  renderPan();\n\n  \u002F* ── Tab 6: Congés ──────────────────────────────────────── *\u002F\n  document.getElementById('cg-anc').addEventListener('input', e => {\n    cgState.anc = +e.target.value;\n    document.getElementById('cg-anc-val').textContent = cgState.anc + ' an' + (cgState.anc > 1 ? 's' : '');\n    renderCg();\n  });\n  renderCg();\n\n  \u002F* ── ResizeObserver → iframe contract ─────────────────── *\u002F\n  lucide.createIcons();\n  const ro = new ResizeObserver(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n  ro.observe(document.documentElement);\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-industrie-laitiere-c5fa3883f1.webp",[]]