[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-relative-aux-conditions-de-travail-du-personnel-des-fr":83,"footer-cities-fr":155},[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":127,"tool_html":149,"source":150,"category":151,"audience":152,"publish_mode":153,"hero_image":154,"hero_image_alt":85},"ccn-relative-aux-conditions-de-travail-du-personnel-des","CCN Industries Céramiques de France — calculateur complet IDCC 1558","Calculateur CCN Industries Céramiques IDCC 1558 | Expert Zoom","Outil interactif couvrant indemnité de licenciement, préavis, grille salariale, prime d'ancienneté, 13e mois et congés supplémentaires de la CCN Industries Céramiques (IDCC 1558, Brochure JO 3238).","Ce calculateur couvre les 5 principales déviations de la CCN Industries Céramiques (IDCC 1558) par rapport au code du travail : indemnité de licenciement au taux de 1\u002F3 mois dès la 1ère année, durées de préavis par catégorie, grille de salaires minima conventionnels à 20 niveaux (valeur du point 1,24 € en 2025), prime d'ancienneté obligatoire (3 % à 12 %), 13e mois obligatoire, et jours de congés supplémentaires liés à l'ancienneté.",[90,110],{"name":91,"@type":92,"about":93,"author":98,"@context":101,"isPartOf":102,"inLanguage":105,"description":106,"operatingSystem":107,"applicationCategory":108,"isAccessibleForFree":109},"Calculateur CCN Industries Céramiques de France — IDCC 1558","WebApplication",{"name":94,"@type":95,"identifier":96,"alternateName":97},"Convention collective relative aux conditions de travail du personnel des industries céramiques de France","Thing","IDCC 1558","CCN Céramiques — Brochure JO 3238",{"name":99,"@type":100},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":103,"@type":104},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement, la durée de préavis, la grille de salaires minima, la prime d'ancienneté, le 13e mois et les congés supplémentaires de la convention collective des industries céramiques de France (IDCC 1558, Brochure JO 3238).","All","FinanceApplication",true,{"@type":111,"@context":101,"mainEntity":112},"FAQPage",[113,119,123],{"name":114,"@type":115,"acceptedAnswer":116},"Comment est calculée l'indemnité de licenciement dans la convention collective des industries céramiques (IDCC 1558) ?","Question",{"text":117,"@type":118},"La CCN Industries Céramiques (IDCC 1558) prévoit une indemnité de licenciement égale à 1\u002F3 de mois de salaire brut par année d'ancienneté, dès la première année. Cette formule est plus avantageuse que le barème légal (L1234-9) qui applique 1\u002F4 mois pour les 10 premières années et 1\u002F3 mois au-delà.","Answer",{"name":120,"@type":115,"acceptedAnswer":121},"Quelle est la durée du préavis dans la CCN céramiques ?",{"text":122,"@type":118},"Pour les ouvriers et ETAM : 1 mois pour moins de 2 ans d'ancienneté, 2 mois pour 2 ans et plus. Pour les cadres : 3 mois quelle que soit l'ancienneté.",{"name":124,"@type":115,"acceptedAnswer":125},"La prime d'ancienneté est-elle obligatoire dans la CCN Industries Céramiques ?",{"text":126,"@type":118},"Oui, la CCN IDCC 1558 prévoit une prime d'ancienneté obligatoire : 3 % à 3 ans, 6 % à 6 ans, 9 % à 9 ans, 12 % à 12 ans et plus.",[128,130,132,135,137,140,143,146],{"a":129,"q":114},"La CCN Industries Céramiques (IDCC 1558) prévoit une indemnité de licenciement égale à 1\u002F3 de mois de salaire brut par année d'ancienneté, dès la première année. Cette formule est plus avantageuse que le barème légal (L1234-9) qui applique 1\u002F4 mois pour les 10 premières années et 1\u002F3 mois au-delà. L'indemnité n'est pas due en cas de faute grave ou lourde.",{"a":131,"q":120},"La durée du préavis varie selon la catégorie : pour les ouvriers et ETAM, elle est de 1 mois pour moins de 2 ans d'ancienneté, et de 2 mois pour 2 ans et plus. Pour les cadres, le préavis est de 3 mois quelle que soit l'ancienneté, que ce soit en cas de licenciement ou de démission.",{"a":133,"q":134},"Oui, la convention collective des industries céramiques publie une grille de salaires minima conventionnels avec 20 niveaux, de OE (ouvriers d'entrée) à NF (techniciens confirmés), en passant par les échelons NB, NC, ND, TAM et NF. La valeur du point est fixée à 1,24 € depuis l'accord du 14 janvier 2025, avec un salaire minimum d'entrée de 1 812,24 € brut mensuel pour 35 h\u002Fsemaine.","La CCN 1558 prévoit-elle une grille de salaires minimaux ?",{"a":136,"q":124},"Oui, la CCN IDCC 1558 prévoit une prime d'ancienneté obligatoire : 3 % du salaire de base dès 3 ans d'ancienneté, 6 % à 6 ans, 9 % à 9 ans, et 12 % à 12 ans et plus. Cette prime s'ajoute au salaire de base mensuel. Le code du travail ne prévoit aucune prime d'ancienneté minimale.",{"a":138,"q":139},"Oui, la CCN Industries Céramiques prévoit le versement obligatoire d'un 13e mois, calculé au prorata du temps de présence effectif dans l'entreprise au cours de l'année. Le code du travail ne rend pas le 13e mois obligatoire ; c'est donc un avantage propre à cette convention collective.","Le 13e mois est-il obligatoire dans la convention collective céramiques ?",{"a":141,"q":142},"Oui, en plus des 30 jours ouvrables légaux, la CCN IDCC 1558 accorde des jours de congés supplémentaires en fonction de l'ancienneté : +1 jour après 10 ans, +2 jours après 15 ans, et +3 jours après 20 ans d'ancienneté dans l'entreprise.","Y a-t-il des jours de congés supplémentaires dans la CCN Industries Céramiques ?",{"a":144,"q":145},"La convention collective relative aux conditions de travail du personnel des industries céramiques de France porte le numéro IDCC 1558 (Identifiant de la Convention Collective). Elle est référencée sous la brochure JO n° 3238 et a été signée le 6 juillet 1989. Elle couvre les secteurs de la porcelaine, de la faïence, des carrelages, des grès et des matériaux réfractaires céramiques.","Quel est le numéro IDCC de la convention collective des industries céramiques ?",{"a":147,"q":148},"La CCN Industries Céramiques prévoit une indemnité de panier (repas) pour les salariés travaillant en horaires décalés ou en équipe. Au 1er janvier 2025, cette indemnité de panier est fixée à 16 € par repas concerné. Son versement est conditionné par les critères définis dans la convention.","Quelle est l'indemnité de panier prévue par la CCN 1558 ?","\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 Céramiques — IDCC 1558\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n    :root {\n      --bg: #fafaf9;\n      --surface: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #eff6ff;\n      --accent-hover: #1d4ed8;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --success: #16a34a;\n      --success-bg: #f0fdf4;\n      --warning-bg: #fffbeb;\n      --warning-border: #fbbf24;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n    }\n\n    body {\n      font-family: system-ui, -apple-system, sans-serif;\n      background: var(--bg);\n      color: var(--text);\n      font-size: 0.9rem;\n      line-height: 1.5;\n    }\n\n    .tool-root {\n      max-width: 720px;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n    }\n\n    \u002F* Header *\u002F\n    .tool-header {\n      display: flex;\n      align-items: flex-start;\n      justify-content: space-between;\n      gap: 0.75rem;\n      margin-bottom: 1.25rem;\n    }\n    .tool-title { font-size: 1.1rem; font-weight: 700; color: var(--text); }\n    .tool-subtitle { font-size: 0.8rem; color: var(--text-muted); margin-top: 0.15rem; }\n    .idcc-badge {\n      flex-shrink: 0;\n      background: var(--accent);\n      color: #fff;\n      font-size: 0.7rem;\n      font-weight: 700;\n      padding: 0.25rem 0.6rem;\n      border-radius: 9999px;\n      letter-spacing: 0.04em;\n      white-space: nowrap;\n    }\n\n    \u002F* Tabs *\u002F\n    .tabs-bar {\n      display: flex;\n      gap: 0.25rem;\n      border-bottom: 2px solid var(--border);\n      margin-bottom: 1.25rem;\n      overflow-x: auto;\n      scrollbar-width: none;\n    }\n    .tabs-bar::-webkit-scrollbar { display: none; }\n    .tab-btn {\n      flex-shrink: 0;\n      display: flex;\n      align-items: center;\n      gap: 0.4rem;\n      padding: 0.55rem 0.85rem;\n      font-size: 0.8rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      background: transparent;\n      border: none;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      cursor: pointer;\n      border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n      transition: color 0.15s, border-color 0.15s;\n      white-space: nowrap;\n    }\n    .tab-btn:hover { color: var(--accent); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); background: var(--accent-light); }\n    .tab-btn svg { width: 14px; height: 14px; }\n\n    \u002F* Panel *\u002F\n    .panel { display: none; }\n    .panel.active { display: block; }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.6rem;\n      align-items: flex-start;\n      background: var(--accent-light);\n      border: 1px solid #bfdbfe;\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 1rem;\n      margin-bottom: 1.25rem;\n      font-size: 0.82rem;\n      color: #1e40af;\n    }\n    .rule-callout svg { flex-shrink: 0; width: 15px; height: 15px; margin-top: 0.1rem; }\n\n    \u002F* Form grid *\u002F\n    .form-grid {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 1rem;\n      margin-bottom: 1.25rem;\n    }\n    @media (max-width: 480px) { .form-grid { grid-template-columns: 1fr; } }\n    .form-col { display: flex; flex-direction: column; gap: 0.35rem; }\n    .form-col.full { grid-column: 1 \u002F -1; }\n\n    label { font-size: 0.78rem; font-weight: 600; color: var(--text-muted); }\n    .value-display {\n      font-size: 0.82rem;\n      font-weight: 700;\n      color: var(--accent);\n      min-width: 60px;\n      text-align: right;\n    }\n    .label-row { display: flex; justify-content: space-between; align-items: center; }\n\n    input[type=range] {\n      width: 100%;\n      accent-color: var(--accent);\n      cursor: pointer;\n    }\n\n    select {\n      width: 100%;\n      padding: 0.45rem 0.65rem;\n      border: 1.5px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.82rem;\n      background: var(--surface);\n      color: var(--text);\n      cursor: pointer;\n      appearance: none;\n      background-image: url(\"data:image\u002Fsvg+xml,%3Csvg xmlns='http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2378716c' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'\u002F%3E%3C\u002Fsvg%3E\");\n      background-repeat: no-repeat;\n      background-position: right 0.6rem center;\n      padding-right: 2rem;\n    }\n\n    \u002F* Pills *\u002F\n    .pills { display: flex; flex-wrap: wrap; gap: 0.4rem; }\n    .pill {\n      padding: 0.3rem 0.7rem;\n      border: 1.5px solid var(--border);\n      border-radius: 9999px;\n      font-size: 0.78rem;\n      font-weight: 500;\n      cursor: pointer;\n      background: var(--surface);\n      color: var(--text-muted);\n      transition: all 0.15s;\n    }\n    .pill.active { background: var(--accent); border-color: var(--accent); color: #fff; }\n\n    \u002F* Result *\u002F\n    .result-card {\n      background: var(--surface);\n      border: 2px solid var(--accent);\n      border-radius: var(--radius);\n      padding: 1.1rem 1.25rem;\n      margin-bottom: 1rem;\n    }\n    .result-label { font-size: 0.75rem; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 0.35rem; }\n    .result-value { font-size: 1.8rem; font-weight: 800; color: var(--accent); font-variant-numeric: tabular-nums; }\n    .result-sub { font-size: 0.78rem; color: var(--text-muted); margin-top: 0.4rem; }\n\n    .result-rows { display: flex; flex-direction: column; gap: 0.4rem; margin-top: 0.5rem; }\n    .result-row { display: flex; justify-content: space-between; font-size: 0.8rem; padding: 0.3rem 0; border-bottom: 1px solid var(--border); }\n    .result-row:last-child { border-bottom: none; font-weight: 700; color: var(--accent); }\n\n    \u002F* Salary table *\u002F\n    .salary-table { width: 100%; border-collapse: collapse; font-size: 0.78rem; margin-bottom: 1rem; }\n    .salary-table th { background: var(--accent); color: #fff; padding: 0.4rem 0.6rem; text-align: left; font-weight: 600; }\n    .salary-table td { padding: 0.3rem 0.6rem; border-bottom: 1px solid var(--border); }\n    .salary-table tr:nth-child(even) td { background: #f5f5f4; }\n    .salary-table tr.highlight td { background: #dbeafe; font-weight: 700; }\n\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      margin-top: 1.5rem;\n      padding: 0.75rem 1rem;\n      background: var(--warning-bg);\n      border: 1px solid var(--warning-border);\n      border-radius: var(--radius-sm);\n      font-size: 0.75rem;\n      color: #78716c;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: underline; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1558 — deviations:\n     indemnite: L1234-9 baseline → 1\u002F3 mois × toutes années dès 1ère année (source: CCN IDCC 1558 art. licenciement)\n     preavis: L1234-1 baseline → ouvriers\u002FETAM 1 mois (\u003C2 ans) \u002F 2 mois (≥2 ans); cadres 3 mois (source: CCN 1558)\n     salaire-min: SMIC baseline → grille 20 niveaux OE→NF avec valeur du point 1,24 € (accord 2025)\n     prime-anciennete: aucun minimum légal → 3%\u002F6%\u002F9%\u002F12% selon ancienneté (CCN 1558)\n     conges: L3141-3 30j ouvrables → +1j (10 ans) \u002F +2j (15 ans) \u002F +3j (20 ans) (CCN 1558) -->\n\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Cdiv>\n      \u003Cdiv class=\"tool-title\">Calculateur — Industries Céramiques de France\u003C\u002Fdiv>\n      \u003Cdiv class=\"tool-subtitle\">Convention collective nationale · Brochure JO n° 3238\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cspan class=\"idcc-badge\">IDCC 1558\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\n  \u003Cnav class=\"tabs-bar\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"banknote\">\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=\"award\">\u003C\u002Fi> Ancienneté\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">\n      \u003Ci data-lucide=\"calendar\">\u003C\u002Fi> Congés\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003C!-- TAB 1 — INDEMNITÉ DE LICENCIEMENT                 -->\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003Csection class=\"panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Industries Céramiques (IDCC 1558) prévoit une indemnité de licenciement égale à \u003Cstrong>1\u002F3 de mois de salaire brut par année d'ancienneté, dès la première année\u003C\u002Fstrong>, plus favorable que le barème légal (L1234-9 : 1\u002F4 mois × années ≤ 10 ans + 1\u002F3 mois × années > 10 ans).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-col\">\n        \u003Cdiv class=\"label-row\">\n          \u003Clabel for=\"ind-salaire\">Salaire brut mensuel de référence\u003C\u002Flabel>\n          \u003Cspan class=\"value-display\" id=\"ind-salaire-val\">2 500 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"1400\" max=\"8000\" step=\"50\" value=\"2500\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-col\">\n        \u003Cdiv class=\"label-row\">\n          \u003Clabel for=\"ind-anciennete\">Ancienneté (années)\u003C\u002Flabel>\n          \u003Cspan class=\"value-display\" id=\"ind-anc-val\">5 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"ind-anciennete\" min=\"1\" max=\"40\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-col full\">\n        \u003Clabel>Motif du licenciement\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-motif-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"other\">Cause réelle et sérieuse\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"eco\">Licenciement économique\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"inaptitude\">Inaptitude\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"faute\">Faute grave \u002F lourde\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"ind-result\">\n      \u003Cdiv class=\"result-label\">Indemnité conventionnelle\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ind-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"ind-formula\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\" id=\"ind-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003C!-- TAB 2 — PRÉAVIS                                   -->\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003Csection class=\"panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN IDCC 1558 fixe des durées spécifiques de préavis : \u003Cstrong>ouvriers\u002FETAM : 1 mois (moins de 2 ans) ou 2 mois (2 ans et plus) ; cadres : 3 mois\u003C\u002Fstrong> quelle que soit l'ancienneté.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-col\">\n        \u003Clabel>Catégorie professionnelle\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prev-cat-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"ouvrier\">Ouvrier \u002F Employé\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"etam\">ETAM\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-col\">\n        \u003Cdiv class=\"label-row\">\n          \u003Clabel for=\"prev-anciennete\">Ancienneté (années)\u003C\u002Flabel>\n          \u003Cspan class=\"value-display\" id=\"prev-anc-val\">3 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"prev-anciennete\" min=\"0\" max=\"40\" step=\"1\" value=\"3\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-col\">\n        \u003Clabel>Type\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prev-type-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"licenciement\">Licenciement\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"demission\">Démission\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"prev-result\">\n      \u003Cdiv class=\"result-label\">Durée de préavis\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"prev-duration\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"prev-detail\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003C!-- TAB 3 — GRILLE SALARIALE                          -->\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003Csection class=\"panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Industries Céramiques publie une grille de \u003Cstrong>salaires minima conventionnels\u003C\u002Fstrong> par niveau et échelon (valeur du point 1,24 € au 1ᵉʳ janvier 2025). Ces minimaux s'appliquent à 35 h\u002Fsemaine et remplacent le SMIC si supérieurs.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-col\">\n        \u003Clabel for=\"sal-niveau\">Niveau \u002F Catégorie\u003C\u002Flabel>\n        \u003Cselect id=\"sal-niveau\">\n          \u003Coption value=\"OE-NA\">OE — Niveau A (entrée)\u003C\u002Foption>\n          \u003Coption value=\"OE-E2\">OE — Niveau A Échelon 2\u003C\u002Foption>\n          \u003Coption value=\"NB-E1\">NB — Niveau B Échelon 1\u003C\u002Foption>\n          \u003Coption value=\"NB-E2\">NB — Niveau B Échelon 2\u003C\u002Foption>\n          \u003Coption value=\"NB-E3\">NB — Niveau B Échelon 3\u003C\u002Foption>\n          \u003Coption value=\"NC-E1\">NC — Niveau C Échelon 1\u003C\u002Foption>\n          \u003Coption value=\"NC-E2\">NC — Niveau C Échelon 2\u003C\u002Foption>\n          \u003Coption value=\"NC-E3\">NC — Niveau C Échelon 3\u003C\u002Foption>\n          \u003Coption value=\"NC-E4\">NC — Niveau C Échelon 4\u003C\u002Foption>\n          \u003Coption value=\"ND-E1\">ND — Niveau D Échelon 1\u003C\u002Foption>\n          \u003Coption value=\"ND-E2\">ND — Niveau D Échelon 2\u003C\u002Foption>\n          \u003Coption value=\"ND-E3\">ND — Niveau D Échelon 3\u003C\u002Foption>\n          \u003Coption value=\"ND-E4\">ND — Niveau D Échelon 4\u003C\u002Foption>\n          \u003Coption value=\"TAM-NE\">TAM — Niveau E (Technicien)\u003C\u002Foption>\n          \u003Coption value=\"TAM-E2\">TAM — Niveau E Échelon 2\u003C\u002Foption>\n          \u003Coption value=\"TAM-E3\">TAM — Niveau E Échelon 3\u003C\u002Foption>\n          \u003Coption value=\"TAM-E4\">TAM — Niveau E Échelon 4\u003C\u002Foption>\n          \u003Coption value=\"NF-E1\">NF — Niveau F Échelon 1\u003C\u002Foption>\n          \u003Coption value=\"NF-E2\">NF — Niveau F Échelon 2\u003C\u002Foption>\n          \u003Coption value=\"NF-E3\">NF — Niveau F Échelon 3\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-col\">\n        \u003Cdiv class=\"label-row\">\n          \u003Clabel for=\"sal-heures\">Heures hebdomadaires\u003C\u002Flabel>\n          \u003Cspan class=\"value-display\" id=\"sal-heures-val\">35 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"sal-heures\" min=\"17.5\" max=\"48\" step=\"0.5\" value=\"35\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"sal-result\">\n      \u003Cdiv class=\"result-label\">Salaire minimum conventionnel\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"sal-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"sal-sub\">—\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Ctable class=\"salary-table\" id=\"sal-table\">\n      \u003Cthead>\n        \u003Ctr>\u003Cth>Niveau\u003C\u002Fth>\u003Cth>Catégorie\u003C\u002Fth>\u003Cth>Salaire brut mensuel (35h)\u003C\u002Fth>\u003C\u002Ftr>\n      \u003C\u002Fthead>\n      \u003Ctbody id=\"sal-table-body\">\u003C\u002Ftbody>\n    \u003C\u002Ftable>\n  \u003C\u002Fsection>\n\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003C!-- TAB 4 — PRIME D'ANCIENNETÉ & 13E MOIS             -->\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003Csection class=\"panel\" data-panel=\"prime-anciennete\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Industries Céramiques prévoit une \u003Cstrong>prime d'ancienneté obligatoire\u003C\u002Fstrong> (3 % à 3 ans, 6 % à 6 ans, 9 % à 9 ans, 12 % à 12 ans) et un \u003Cstrong>13ᵉ mois obligatoire\u003C\u002Fstrong> versé au prorata du temps de présence — deux avantages absents du code du travail.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-col\">\n        \u003Cdiv class=\"label-row\">\n          \u003Clabel for=\"anc-salaire\">Salaire brut mensuel de base\u003C\u002Flabel>\n          \u003Cspan class=\"value-display\" id=\"anc-salaire-val\">2 200 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"anc-salaire\" min=\"1400\" max=\"8000\" step=\"50\" value=\"2200\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-col\">\n        \u003Cdiv class=\"label-row\">\n          \u003Clabel for=\"anc-anciennete\">Ancienneté (années)\u003C\u002Flabel>\n          \u003Cspan class=\"value-display\" id=\"anc-anc-val\">6 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"anc-anciennete\" min=\"0\" max=\"40\" step=\"1\" value=\"6\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-col\">\n        \u003Cdiv class=\"label-row\">\n          \u003Clabel for=\"anc-mois\">Mois de présence dans l'année (13ᵉ mois)\u003C\u002Flabel>\n          \u003Cspan class=\"value-display\" id=\"anc-mois-val\">12 mois\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"anc-mois\" min=\"1\" max=\"12\" step=\"1\" value=\"12\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"anc-result\">\n      \u003Cdiv class=\"result-label\">Primes annuelles\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\">\n        \u003Cdiv class=\"result-row\">\u003Cspan>Prime d'ancienneté mensuelle\u003C\u002Fspan>\u003Cspan id=\"anc-prime-mensuel\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>Prime d'ancienneté annuelle\u003C\u002Fspan>\u003Cspan id=\"anc-prime-annual\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>13ᵉ mois (prorata)\u003C\u002Fspan>\u003Cspan id=\"anc-treize\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>Total primes annuelles\u003C\u002Fspan>\u003Cspan id=\"anc-total\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003C!-- TAB 5 — CONGÉS PAYÉS                              -->\n  \u003C!-- ══════════════════════════════════════════════════ -->\n  \u003Csection class=\"panel\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN Industries Céramiques accorde des \u003Cstrong>jours de congés supplémentaires liés à l'ancienneté\u003C\u002Fstrong> : +1 jour à 10 ans, +2 jours à 15 ans, +3 jours à 20 ans — au-delà des 30 jours ouvrables légaux (L3141-3).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-col\">\n        \u003Cdiv class=\"label-row\">\n          \u003Clabel for=\"cong-anciennete\">Ancienneté (années)\u003C\u002Flabel>\n          \u003Cspan class=\"value-display\" id=\"cong-anc-val\">12 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"cong-anciennete\" min=\"0\" max=\"40\" step=\"1\" value=\"12\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-col\">\n        \u003Clabel>Travail à temps partiel\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"cong-partiel-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"no\">Temps plein\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"yes\">Temps partiel\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-col\" id=\"cong-partiel-col\" style=\"display:none\">\n        \u003Cdiv class=\"label-row\">\n          \u003Clabel for=\"cong-quotite\">Quotité (% temps plein)\u003C\u002Flabel>\n          \u003Cspan class=\"value-display\" id=\"cong-quotite-val\">80 %\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n        \u003Cinput type=\"range\" id=\"cong-quotite\" min=\"10\" max=\"99\" step=\"1\" value=\"80\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"cong-result\">\n      \u003Cdiv class=\"result-label\">Congés payés annuels\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-rows\">\n        \u003Cdiv class=\"result-row\">\u003Cspan>Congés légaux (L3141-3)\u003C\u002Fspan>\u003Cspan>30 j. ouvrables\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>Jours supplémentaires CCN\u003C\u002Fspan>\u003Cspan id=\"cong-extra\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>Total ouvrables\u003C\u002Fspan>\u003Cspan id=\"cong-total\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan id=\"cong-total-label\">Équivalent jours ouvrés\u003C\u002Fspan>\u003Cspan id=\"cong-ouvres\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fsection>\n\n  \u003C!-- Disclaimer partagé -->\n  \u003Cp class=\"disclaimer\">\n    \u003Ci data-lucide=\"triangle-alert\" style=\"width:12px;height:12px;vertical-align:middle;margin-right:4px;\">\u003C\u002Fi>\n    Calcul indicatif basé sur la CCN IDCC 1558 (Brochure JO n° 3238) et l'accord salarial du 14 janvier 2025.\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635944\" target=\"_blank\" rel=\"noopener\">Légifrance\u003C\u002Fa>.\n    Pour toute validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F* ────────────────────────────────────────────────\n   SALARY GRID — CCN 1558 (janvier 2025)\n   Source: accord du 14 jan 2025, valeur point 1,24 €\n   ──────────────────────────────────────────────── *\u002F\nconst SALARY_GRID = [\n  { key: 'OE-NA',  label: 'OE', echelon: 'Niveau A', amount: 1812.24 },\n  { key: 'OE-E2',  label: 'OE', echelon: 'Niveau A E2', amount: 1819.68 },\n  { key: 'NB-E1',  label: 'NB', echelon: 'Niveau B E1', amount: 1829.60 },\n  { key: 'NB-E2',  label: 'NB', echelon: 'Niveau B E2', amount: 1842.00 },\n  { key: 'NB-E3',  label: 'NB', echelon: 'Niveau B E3', amount: 1854.40 },\n  { key: 'NC-E1',  label: 'NC', echelon: 'Niveau C E1', amount: 1866.80 },\n  { key: 'NC-E2',  label: 'NC', echelon: 'Niveau C E2', amount: 1891.60 },\n  { key: 'NC-E3',  label: 'NC', echelon: 'Niveau C E3', amount: 1928.80 },\n  { key: 'NC-E4',  label: 'NC', echelon: 'Niveau C E4', amount: 1978.40 },\n  { key: 'ND-E1',  label: 'ND', echelon: 'Niveau D E1', amount: 2028.00 },\n  { key: 'ND-E2',  label: 'ND', echelon: 'Niveau D E2', amount: 2090.00 },\n  { key: 'ND-E3',  label: 'ND', echelon: 'Niveau D E3', amount: 2152.00 },\n  { key: 'ND-E4',  label: 'ND', echelon: 'Niveau D E4', amount: 2214.00 },\n  { key: 'TAM-NE', label: 'TAM', echelon: 'Niveau E', amount: 2288.40 },\n  { key: 'TAM-E2', label: 'TAM', echelon: 'Niveau E E2', amount: 2362.80 },\n  { key: 'TAM-E3', label: 'TAM', echelon: 'Niveau E E3', amount: 2437.20 },\n  { key: 'TAM-E4', label: 'TAM', echelon: 'Niveau E E4', amount: 2511.60 },\n  { key: 'NF-E1',  label: 'NF', echelon: 'Niveau F E1', amount: 2598.40 },\n  { key: 'NF-E2',  label: 'NF', echelon: 'Niveau F E2', amount: 2685.20 },\n  { key: 'NF-E3',  label: 'NF', echelon: 'Niveau F E3', amount: 2772.00 },\n];\n\nconst fmt = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 }).format(v);\nconst fmtD = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(v);\n\n\u002F* ────────────────────────────────────────────────\n   STATE\n   ──────────────────────────────────────────────── *\u002F\nconst state = {\n  ind: { salaire: 2500, anciennete: 5, motif: 'other' },\n  prev: { cat: 'ouvrier', anciennete: 3, type: 'licenciement' },\n  sal: { niveau: 'OE-NA', heures: 35 },\n  anc: { salaire: 2200, anciennete: 6, mois: 12 },\n  cong: { anciennete: 12, partiel: 'no', quotite: 80 },\n};\n\n\u002F* ────────────────────────────────────────────────\n   COMPUTE\n   ──────────────────────────────────────────────── *\u002F\nfunction computeInd() {\n  const { salaire, anciennete, motif } = state.ind;\n  if (motif === 'faute') return null;\n  \u002F\u002F CCN: 1\u002F3 mois × toutes années (dès la 1ère)\n  const amount = (salaire \u002F 3) * anciennete;\n  \u002F\u002F Legal baseline for comparison\n  const legal = anciennete \u003C= 10\n    ? (salaire \u002F 4) * anciennete\n    : (salaire \u002F 4) * 10 + (salaire \u002F 3) * (anciennete - 10);\n  return { amount, legal, anciennete, salaire };\n}\n\nfunction computePrev() {\n  const { cat, anciennete, type } = state.prev;\n  let months;\n  if (cat === 'cadre') {\n    months = 3;\n  } else {\n    \u002F\u002F ouvrier or etam\n    if (type === 'demission') {\n      months = anciennete \u003C 2 ? 1 : 2;\n    } else {\n      \u002F\u002F licenciement\n      months = anciennete \u003C 2 ? 1 : 2;\n    }\n  }\n  return { months };\n}\n\nfunction computeSal() {\n  const { niveau, heures } = state.sal;\n  const row = SALARY_GRID.find(r => r.key === niveau);\n  if (!row) return null;\n  const amount = row.amount * (heures \u002F 35);\n  return { amount, base35: row.amount, heures };\n}\n\nfunction computeAnc() {\n  const { salaire, anciennete, mois } = state.anc;\n  let pct = 0;\n  if (anciennete >= 12) pct = 12;\n  else if (anciennete >= 9) pct = 9;\n  else if (anciennete >= 6) pct = 6;\n  else if (anciennete >= 3) pct = 3;\n  const mensuelle = salaire * pct \u002F 100;\n  const annuelle = mensuelle * 12;\n  const treize = salaire * (mois \u002F 12);\n  return { pct, mensuelle, annuelle, treize, total: annuelle + treize };\n}\n\nfunction computeCong() {\n  const { anciennete, partiel, quotite } = state.cong;\n  let extra = 0;\n  if (anciennete >= 20) extra = 3;\n  else if (anciennete >= 15) extra = 2;\n  else if (anciennete >= 10) extra = 1;\n  let total = 30 + extra;\n  const ouvres = Math.round(total * 5 \u002F 6);\n  return { extra, total, ouvres };\n}\n\n\u002F* ────────────────────────────────────────────────\n   RENDER\n   ──────────────────────────────────────────────── *\u002F\nfunction renderInd() {\n  const result = computeInd();\n  if (!result) {\n    document.getElementById('ind-amount').textContent = '0 €';\n    document.getElementById('ind-formula').textContent = 'Aucune indemnité en cas de faute grave ou lourde.';\n    document.getElementById('ind-detail').innerHTML = '';\n    return;\n  }\n  const { amount, legal, anciennete, salaire } = result;\n  document.getElementById('ind-amount').textContent = fmtD(amount);\n  document.getElementById('ind-formula').textContent =\n    `1\u002F3 × ${fmt(salaire)} × ${anciennete} an${anciennete > 1 ? 's' : ''}`;\n  const gain = amount - legal;\n  document.getElementById('ind-detail').innerHTML = `\n    \u003Cdiv class=\"result-row\">\u003Cspan>Barème légal (L1234-9)\u003C\u002Fspan>\u003Cspan>${fmtD(legal)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan>Gain conventionnel\u003C\u002Fspan>\u003Cspan style=\"color:var(--success)\">+${fmtD(gain)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    \u003Cdiv class=\"result-row\">\u003Cspan>Indemnité CCN 1558\u003C\u002Fspan>\u003Cspan>${fmtD(amount)}\u003C\u002Fspan>\u003C\u002Fdiv>\n  `;\n}\n\nfunction renderPrev() {\n  const { months } = computePrev();\n  const label = months === 1 ? '1 mois' : months === 3 ? '3 mois' : '2 mois';\n  document.getElementById('prev-duration').textContent = label;\n  const { cat, anciennete, type } = state.prev;\n  let detail = '';\n  if (cat === 'cadre') {\n    detail = 'Cadres : 3 mois de préavis (licenciement ou démission), quel que soit l\\'ancienneté.';\n  } else {\n    detail = `${cat === 'etam' ? 'ETAM' : 'Ouvrier\u002FEmployé'}, ${anciennete} an${anciennete > 1 ? 's' : ''} d'ancienneté — ${type} : ${label}.`;\n  }\n  document.getElementById('prev-detail').textContent = detail;\n}\n\nfunction renderSal() {\n  const result = computeSal();\n  if (!result) return;\n  const { amount, base35, heures } = result;\n  document.getElementById('sal-amount').textContent = fmtD(amount);\n  document.getElementById('sal-sub').textContent =\n    heures === 35\n      ? `Salaire minimum conventionnel à temps plein (35 h\u002Fsemaine) — accord jan. 2025`\n      : `Base 35 h : ${fmtD(base35)} — proratisé pour ${heures} h\u002Fsem.`;\n\n  \u002F\u002F Build table with highlight on selected row\n  const tbody = document.getElementById('sal-table-body');\n  tbody.innerHTML = SALARY_GRID.map(row => {\n    const hi = row.key === state.sal.niveau ? ' class=\"highlight\"' : '';\n    return `\u003Ctr${hi}>\u003Ctd>${row.label}\u003C\u002Ftd>\u003Ctd>${row.echelon}\u003C\u002Ftd>\u003Ctd>${fmtD(row.amount)}\u003C\u002Ftd>\u003C\u002Ftr>`;\n  }).join('');\n}\n\nfunction renderAnc() {\n  const { pct, mensuelle, annuelle, treize, total } = computeAnc();\n  document.getElementById('anc-prime-mensuel').textContent = pct > 0 ? `${fmtD(mensuelle)} (${pct} %)` : '—';\n  document.getElementById('anc-prime-annual').textContent = pct > 0 ? fmtD(annuelle) : '—';\n  document.getElementById('anc-treize').textContent = fmtD(treize);\n  document.getElementById('anc-total').textContent = fmtD(total);\n}\n\nfunction renderCong() {\n  const { extra, total, ouvres } = computeCong();\n  document.getElementById('cong-extra').textContent = `+${extra} j.`;\n  document.getElementById('cong-total').textContent = `${total} j. ouvrables`;\n  document.getElementById('cong-ouvres').textContent = `≈ ${ouvres} j. ouvrés`;\n}\n\nfunction renderAll() { renderInd(); renderPrev(); renderSal(); renderAnc(); renderCong(); }\n\n\u002F* ────────────────────────────────────────────────\n   TABS\n   ──────────────────────────────────────────────── *\u002F\nconst tabBtns = document.querySelectorAll('[data-tab]');\nconst panels = document.querySelectorAll('[data-panel]');\n\nfunction activate(id) {\n  tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n  panels.forEach(p => p.classList.toggle('active', p.dataset.panel === id));\n  if (location.hash !== '#' + id) location.hash = id;\n  requestAnimationFrame(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n}\n\ntabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\nconst hashTab = location.hash.slice(1);\nconst defaultTab = (hashTab && document.querySelector(`[data-tab=\"${hashTab}\"]`)) ? hashTab : 'indemnite';\nactivate(defaultTab);\n\n\u002F* ────────────────────────────────────────────────\n   EVENT LISTENERS — INDEMNITÉ\n   ──────────────────────────────────────────────── *\u002F\nconst indSalaireEl = document.getElementById('ind-salaire');\nconst indAncEl = document.getElementById('ind-anciennete');\n\nindSalaireEl.addEventListener('input', () => {\n  state.ind.salaire = +indSalaireEl.value;\n  document.getElementById('ind-salaire-val').textContent = fmt(state.ind.salaire);\n  renderInd();\n});\nindAncEl.addEventListener('input', () => {\n  state.ind.anciennete = +indAncEl.value;\n  document.getElementById('ind-anc-val').textContent = `${state.ind.anciennete} ans`;\n  renderInd();\n});\ndocument.getElementById('ind-motif-pills').addEventListener('click', e => {\n  const pill = e.target.closest('[data-val]');\n  if (!pill) return;\n  document.querySelectorAll('#ind-motif-pills .pill').forEach(p => p.classList.remove('active'));\n  pill.classList.add('active');\n  state.ind.motif = pill.dataset.val;\n  renderInd();\n});\n\n\u002F\u002F Init displays\ndocument.getElementById('ind-salaire-val').textContent = fmt(state.ind.salaire);\ndocument.getElementById('ind-anc-val').textContent = `${state.ind.anciennete} ans`;\n\n\u002F* ────────────────────────────────────────────────\n   EVENT LISTENERS — PRÉAVIS\n   ──────────────────────────────────────────────── *\u002F\nconst prevAncEl = document.getElementById('prev-anciennete');\n\ndocument.getElementById('prev-cat-pills').addEventListener('click', e => {\n  const pill = e.target.closest('[data-val]');\n  if (!pill) return;\n  document.querySelectorAll('#prev-cat-pills .pill').forEach(p => p.classList.remove('active'));\n  pill.classList.add('active');\n  state.prev.cat = pill.dataset.val;\n  renderPrev();\n});\nprevAncEl.addEventListener('input', () => {\n  state.prev.anciennete = +prevAncEl.value;\n  document.getElementById('prev-anc-val').textContent = `${state.prev.anciennete} ans`;\n  renderPrev();\n});\ndocument.getElementById('prev-type-pills').addEventListener('click', e => {\n  const pill = e.target.closest('[data-val]');\n  if (!pill) return;\n  document.querySelectorAll('#prev-type-pills .pill').forEach(p => p.classList.remove('active'));\n  pill.classList.add('active');\n  state.prev.type = pill.dataset.val;\n  renderPrev();\n});\n\ndocument.getElementById('prev-anc-val').textContent = `${state.prev.anciennete} ans`;\n\n\u002F* ────────────────────────────────────────────────\n   EVENT LISTENERS — SALAIRE MIN\n   ──────────────────────────────────────────────── *\u002F\ndocument.getElementById('sal-niveau').addEventListener('change', e => {\n  state.sal.niveau = e.target.value;\n  renderSal();\n});\nconst salHeuresEl = document.getElementById('sal-heures');\nsalHeuresEl.addEventListener('input', () => {\n  state.sal.heures = +salHeuresEl.value;\n  document.getElementById('sal-heures-val').textContent = `${state.sal.heures} h`;\n  renderSal();\n});\ndocument.getElementById('sal-heures-val').textContent = `${state.sal.heures} h`;\n\n\u002F* ────────────────────────────────────────────────\n   EVENT LISTENERS — ANCIENNETÉ\n   ──────────────────────────────────────────────── *\u002F\nconst ancSalaireEl = document.getElementById('anc-salaire');\nconst ancAncEl = document.getElementById('anc-anciennete');\nconst ancMoisEl = document.getElementById('anc-mois');\n\nancSalaireEl.addEventListener('input', () => {\n  state.anc.salaire = +ancSalaireEl.value;\n  document.getElementById('anc-salaire-val').textContent = fmt(state.anc.salaire);\n  renderAnc();\n});\nancAncEl.addEventListener('input', () => {\n  state.anc.anciennete = +ancAncEl.value;\n  document.getElementById('anc-anc-val').textContent = `${state.anc.anciennete} ans`;\n  renderAnc();\n});\nancMoisEl.addEventListener('input', () => {\n  state.anc.mois = +ancMoisEl.value;\n  document.getElementById('anc-mois-val').textContent = `${state.anc.mois} mois`;\n  renderAnc();\n});\ndocument.getElementById('anc-salaire-val').textContent = fmt(state.anc.salaire);\ndocument.getElementById('anc-anc-val').textContent = `${state.anc.anciennete} ans`;\ndocument.getElementById('anc-mois-val').textContent = `${state.anc.mois} mois`;\n\n\u002F* ────────────────────────────────────────────────\n   EVENT LISTENERS — CONGÉS\n   ──────────────────────────────────────────────── *\u002F\nconst congAncEl = document.getElementById('cong-anciennete');\nconst congQuotiteEl = document.getElementById('cong-quotite');\n\ncongAncEl.addEventListener('input', () => {\n  state.cong.anciennete = +congAncEl.value;\n  document.getElementById('cong-anc-val').textContent = `${state.cong.anciennete} ans`;\n  renderCong();\n});\ndocument.getElementById('cong-partiel-pills').addEventListener('click', e => {\n  const pill = e.target.closest('[data-val]');\n  if (!pill) return;\n  document.querySelectorAll('#cong-partiel-pills .pill').forEach(p => p.classList.remove('active'));\n  pill.classList.add('active');\n  state.cong.partiel = pill.dataset.val;\n  document.getElementById('cong-partiel-col').style.display = pill.dataset.val === 'yes' ? '' : 'none';\n  renderCong();\n});\ncongQuotiteEl.addEventListener('input', () => {\n  state.cong.quotite = +congQuotiteEl.value;\n  document.getElementById('cong-quotite-val').textContent = `${state.cong.quotite} %`;\n  renderCong();\n});\ndocument.getElementById('cong-anc-val').textContent = `${state.cong.anciennete} ans`;\n\n\u002F* ────────────────────────────────────────────────\n   INITIAL RENDER + ICONS\n   ──────────────────────────────────────────────── *\u002F\nrenderAll();\nlucide.createIcons();\n\n\u002F* ────────────────────────────────────────────────\n   RESIZE OBSERVER (iframe contract)\n   ──────────────────────────────────────────────── *\u002F\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-relative-aux-conditions-de-travail-du-personnel-des-7d1b8bec75.webp",[]]