[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-industrie-de-la-chaussure-et-des-articles-chaussants-fr":83,"footer-cities-fr":152},[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":126,"tool_html":146,"source":147,"category":148,"audience":149,"publish_mode":150,"hero_image":151,"hero_image_alt":85},"ccn-industrie-de-la-chaussure-et-des-articles-chaussants","CCN de l'industrie de la chaussure et des articles chaussants — calculateur complet","Calculateur CCN Industrie de la chaussure IDCC 1580 | Expert Zoom","Outil interactif couvrant indemnité de licenciement, préavis, grille salariale, congés d'ancienneté et heures supplémentaires de la CCN de l'industrie de la chaussure et des articles chaussants (IDCC 1580).","Ce calculateur couvre les 5 principales déviations de la CCN industrie de la chaussure (IDCC 1580) : indemnité de licenciement (formule CCN + plancher légal, bonification ETAM 50\u002F55 ans), durées de préavis par catégorie, grille des salaires minima 2025 (6 niveaux + 4 positions cadres), jours de congés supplémentaires d'ancienneté et contingent d'heures supplémentaires à 130 heures.",[90,109],{"name":91,"@type":92,"about":93,"author":97,"@context":100,"isPartOf":101,"inLanguage":104,"description":105,"operatingSystem":106,"applicationCategory":107,"isAccessibleForFree":108},"Calculateur CCN Industrie de la chaussure — IDCC 1580","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective nationale de l'industrie de la chaussure et des articles chaussants","Thing","IDCC 1580",{"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 indemnité de licenciement, préavis, grille salariale, congés d'ancienneté et heures supplémentaires de la convention collective nationale de l'industrie de la chaussure et des articles chaussants (IDCC 1580).","All","FinanceApplication",true,{"@type":110,"@context":100,"mainEntity":111},"FAQPage",[112,118,122],{"name":113,"@type":114,"acceptedAnswer":115},"Comment calculer l'indemnité de licenciement dans la convention collective de l'industrie de la chaussure ?","Question",{"text":116,"@type":117},"La CCN chaussure (IDCC 1580) prévoit pour les ouvriers et employés une formule à 1\u002F5 de mois de salaire par année d'ancienneté pour les 10 premières années, puis 2\u002F15 de mois par année au-delà. Si le barème légal (art. L1234-9 : 1\u002F4 + 1\u002F3 de mois) est plus favorable, c'est lui qui s'applique. Les ETAM bénéficient d'une bonification de +25 % à partir de 50 ans et +30 % à partir de 55 ans.","Answer",{"name":119,"@type":114,"acceptedAnswer":120},"Quelle est la durée du préavis dans la CCN industrie de la chaussure IDCC 1580 ?",{"text":121,"@type":117},"Pour les ouvriers : aucun préavis si moins de 2 ans d'ancienneté, puis 1 mois. Pour les ETAM et cadres : 1 mois en dessous de 2 ans d'ancienneté, 2 mois entre 2 et 5 ans, et 3 mois à partir de 5 ans d'ancienneté.",{"name":123,"@type":114,"acceptedAnswer":124},"Quelle est la grille des salaires minima de la convention chaussure en 2025 ?",{"text":125,"@type":117},"La grille 2025 comprend 6 niveaux pour ouvriers et ETAM, allant de 1 802 €\u002Fmois à environ 2 843 €\u002Fmois. Pour les cadres, 4 positions de 31 915 €\u002Fan à 54 341 €\u002Fan. Tous ces minima sont supérieurs au SMIC.",[127,128,129,131,134,137,140,143],{"a":116,"q":113},{"a":121,"q":119},{"a":130,"q":123},"La grille 2025 (accord du 8 février 2024) comprend 6 niveaux pour ouvriers et ETAM, allant de 1 802 €\u002Fmois (niveau 1, échelon 1) à environ 2 843 €\u002Fmois (niveau 6, échelon 2). Pour les cadres, 4 positions allant de 31 915 €\u002Fan (position 1) à 54 341 €\u002Fan (position 4). Tous ces minima sont supérieurs au SMIC.",{"a":132,"q":133},"Non, la convention collective nationale de l'industrie de la chaussure (IDCC 1580) ne prévoit pas de 13e mois obligatoire à l'échelon conventionnel. Cette prime peut exister dans certaines entreprises par accord d'entreprise ou usage. Il n'y a pas non plus de prime d'ancienneté conventionnelle obligatoire.","La CCN chaussure prévoit-elle un 13e mois ou une prime d'ancienneté ?",{"a":135,"q":136},"En plus des 30 jours ouvrables légaux, la CCN 1580 accorde des jours de congés supplémentaires selon l'ancienneté : +1 jour à partir de 10 ans, +2 jours à 20 ans, +3 jours à 25 ans, et +5 jours à partir de 30 ans d'ancienneté.","Combien de jours de congés payés prévoit la CCN chaussure ?",{"a":138,"q":139},"Le contingent annuel d'heures supplémentaires est fixé à 130 heures par an dans la CCN industrie de la chaussure (IDCC 1580), soit inférieur au plafond réglementaire de 220 heures. Les majorations sont de 25 % pour les heures de la 36e à la 43e heure, et de 50 % à partir de la 44e heure.","Quel est le contingent d'heures supplémentaires dans la CCN chaussure ?",{"a":141,"q":142},"La CCN prévoit 1\u002F5 de mois par an ≤ 10 ans et 2\u002F15 par an > 10 ans pour ouvriers\u002Femployés. Le code du travail prévoit 1\u002F4 de mois par an ≤ 10 ans et 1\u002F3 par an > 10 ans. La loi étant plus favorable pour les 10 premières années (1\u002F4 > 1\u002F5), c'est le barème légal qui s'applique dans la plupart des cas. Le principe de faveur garantit toujours l'application de la règle la plus avantageuse.","Quelle est la différence entre la CCN chaussure et le code du travail pour l'indemnité de licenciement ?",{"a":144,"q":145},"Oui, la CCN industrie de la chaussure s'applique à tous les salariés du secteur, y compris les temps partiels. L'indemnité de licenciement est calculée au prorata du salaire réel. Pour les congés, les jours supplémentaires d'ancienneté s'appliquent également.","La convention collective de la chaussure s'applique-t-elle aux travailleurs à temps partiel ?","\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 de la chaussure — IDCC 1580\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    :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      --text-muted: #78716c;\n      --success-bg: #f0fdf4;\n      --success-border: #bbf7d0;\n      --success-text: #166534;\n      --info-bg: #eff6ff;\n      --info-border: #bfdbfe;\n      --info-text: #1e40af;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n      --shadow: 0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.06);\n      --shadow-md: 0 4px 6px rgba(0,0,0,0.07), 0 2px 4px rgba(0,0,0,0.06);\n    }\n    body {\n      font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n      background: var(--bg);\n      color: var(--text);\n      font-size: 0.9375rem;\n      line-height: 1.5;\n    }\n    .tool-root {\n      max-width: 680px;\n      margin: 0 auto;\n      padding: 1.25rem 1rem 2rem;\n    }\n    .tool-header {\n      margin-bottom: 1.25rem;\n    }\n    .tool-header h1 {\n      font-size: 1.125rem;\n      font-weight: 700;\n      color: var(--text);\n      line-height: 1.3;\n    }\n    .idcc-badge {\n      display: inline-flex;\n      align-items: center;\n      gap: 0.3rem;\n      background: var(--accent-light);\n      color: var(--accent);\n      font-size: 0.75rem;\n      font-weight: 600;\n      padding: 0.2rem 0.6rem;\n      border-radius: 999px;\n      margin-top: 0.4rem;\n    }\n    \u002F* Tabs *\u002F\n    .tabs-nav {\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-nav::-webkit-scrollbar { display: none; }\n    .tab-btn {\n      display: flex;\n      align-items: center;\n      gap: 0.35rem;\n      padding: 0.6rem 0.85rem;\n      background: none;\n      border: none;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      cursor: pointer;\n      font-size: 0.8125rem;\n      font-weight: 500;\n      color: var(--text-muted);\n      white-space: nowrap;\n      transition: color 0.15s, border-color 0.15s;\n      border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n    }\n    .tab-btn:hover { color: var(--accent); }\n    .tab-btn.active {\n      color: var(--accent);\n      border-bottom-color: var(--accent);\n      background: var(--accent-light);\n    }\n    .tab-btn svg { width: 14px; height: 14px; flex-shrink: 0; }\n    \u002F* Panel *\u002F\n    .tab-panel { display: none; }\n    .tab-panel.active { display: block; }\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.6rem;\n      align-items: flex-start;\n      background: var(--info-bg);\n      border: 1px solid var(--info-border);\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 1rem;\n      margin-bottom: 1.25rem;\n      font-size: 0.875rem;\n      color: var(--info-text);\n      line-height: 1.5;\n    }\n    .rule-callout svg { width: 16px; height: 16px; flex-shrink: 0; margin-top: 0.15rem; }\n    \u002F* Form elements *\u002F\n    .form-group {\n      margin-bottom: 1rem;\n    }\n    .form-label {\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      font-size: 0.875rem;\n      font-weight: 500;\n      color: var(--text);\n      margin-bottom: 0.4rem;\n    }\n    .form-label-value {\n      font-weight: 700;\n      color: var(--accent);\n      font-variant-numeric: tabular-nums;\n    }\n    input[type=\"range\"] {\n      width: 100%;\n      accent-color: var(--accent);\n      cursor: pointer;\n      height: 4px;\n    }\n    .form-input {\n      width: 100%;\n      padding: 0.5rem 0.75rem;\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.875rem;\n      color: var(--text);\n      background: var(--surface);\n      transition: border-color 0.15s;\n      -webkit-appearance: none;\n    }\n    .form-input:focus {\n      outline: none;\n      border-color: var(--accent);\n      box-shadow: 0 0 0 3px rgba(37,99,235,0.12);\n    }\n    select.form-input { cursor: pointer; }\n    \u002F* Pills *\u002F\n    .pills {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 0.4rem;\n    }\n    .pill {\n      padding: 0.35rem 0.8rem;\n      border: 1.5px solid var(--border);\n      border-radius: 999px;\n      font-size: 0.8125rem;\n      font-weight: 500;\n      cursor: pointer;\n      background: var(--surface);\n      color: var(--text-muted);\n      transition: all 0.15s;\n    }\n    .pill.selected {\n      border-color: var(--accent);\n      background: var(--accent-light);\n      color: var(--accent);\n    }\n    \u002F* Result card *\u002F\n    .result-card {\n      background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);\n      color: white;\n      border-radius: var(--radius);\n      padding: 1.25rem 1.5rem;\n      margin-top: 1.25rem;\n      box-shadow: var(--shadow-md);\n    }\n    .result-card-label {\n      font-size: 0.8125rem;\n      opacity: 0.85;\n      margin-bottom: 0.25rem;\n      display: flex;\n      align-items: center;\n      gap: 0.4rem;\n    }\n    .result-card-label svg { width: 14px; height: 14px; }\n    .result-card-value {\n      font-size: 1.875rem;\n      font-weight: 800;\n      font-variant-numeric: tabular-nums;\n      line-height: 1.1;\n    }\n    .result-card-sub {\n      font-size: 0.8125rem;\n      opacity: 0.8;\n      margin-top: 0.4rem;\n    }\n    .result-detail {\n      margin-top: 0.75rem;\n      padding-top: 0.75rem;\n      border-top: 1px solid rgba(255,255,255,0.25);\n      font-size: 0.8rem;\n      opacity: 0.9;\n    }\n    .result-detail-row {\n      display: flex;\n      justify-content: space-between;\n      gap: 1rem;\n      margin-top: 0.2rem;\n    }\n    \u002F* Grid table *\u002F\n    .grid-table {\n      width: 100%;\n      border-collapse: collapse;\n      font-size: 0.8125rem;\n      margin-top: 0.75rem;\n    }\n    .grid-table th {\n      background: var(--bg);\n      padding: 0.5rem 0.75rem;\n      text-align: left;\n      font-weight: 600;\n      color: var(--text-muted);\n      border: 1px solid var(--border);\n      font-size: 0.75rem;\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n    }\n    .grid-table td {\n      padding: 0.5rem 0.75rem;\n      border: 1px solid var(--border);\n      color: var(--text);\n    }\n    .grid-table tr:nth-child(even) td { background: #fafaf9; }\n    .grid-table .highlight-row td {\n      background: var(--accent-light);\n      color: var(--accent);\n      font-weight: 600;\n    }\n    \u002F* Preavis result *\u002F\n    .preavis-result {\n      display: flex;\n      gap: 1rem;\n      margin-top: 1.25rem;\n    }\n    .preavis-card {\n      flex: 1;\n      background: var(--surface);\n      border: 1.5px solid var(--border);\n      border-radius: var(--radius);\n      padding: 1rem;\n      text-align: center;\n    }\n    .preavis-card.active-card {\n      border-color: var(--accent);\n      background: var(--accent-light);\n    }\n    .preavis-card-value {\n      font-size: 1.5rem;\n      font-weight: 800;\n      color: var(--accent);\n      font-variant-numeric: tabular-nums;\n    }\n    .preavis-card-label {\n      font-size: 0.75rem;\n      color: var(--text-muted);\n      margin-top: 0.25rem;\n    }\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      margin-top: 1.5rem;\n      padding: 0.75rem 1rem;\n      background: var(--bg);\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.78125rem;\n      color: var(--text-muted);\n      line-height: 1.5;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: underline; }\n    .hidden { display: none !important; }\n    .form-grid {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 1rem;\n    }\n    @media (max-width: 480px) {\n      .form-grid { grid-template-columns: 1fr; }\n      .preavis-result { flex-direction: column; }\n    }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\n\u003C!-- CCN IDCC 1580 — deviations detected:\n     indemnite: L1234-9 → CCN spécifique pour ouvriers\u002Femployés (1\u002F5 par an ≤10 ans + 2\u002F15 par an >10 ans),\n                          bonification pour ETAM ≥50\u002F55 ans (source: art. CCN 1580 + jurisprudence)\n     preavis: L1234-1 → catégories précisées: ouvriers (\u003C2 ans: aucun, ≥2 ans: 1 mois),\n                         ETAM et cadres (1–3 mois selon ancienneté)\n     salaire-min: SMIC → grille 6 niveaux + 4 positions cadres (accord 8 fév. 2024, Legifrance KALITEXT000049508678)\n     conges: L3141-3 → jours supplémentaires d'ancienneté (≥10 ans: +1j, ≥20 ans: +2j, ≥25 ans: +3j, ≥30 ans: +5j)\n     heures-supp: L3121-33\u002F36 → contingent annuel de 130 heures (inférieur au plafond réglementaire de 220h)\n     prime-annuelle: aucune obligation conventionnelle → SKIPPED -->\n\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Convention collective — Industrie de la chaussure et des articles chaussants\u003C\u002Fh1>\n    \u003Cdiv class=\"idcc-badge\">\n      \u003Ci data-lucide=\"tag\">\u003C\u002Fi>\n      IDCC 1580\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Tabs nav -->\n  \u003Cnav class=\"tabs-nav\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\" aria-controls=\"panel-indemnite\">\n      \u003Ci data-lucide=\"banknote\">\u003C\u002Fi> Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\" aria-controls=\"panel-preavis\">\n      \u003Ci data-lucide=\"calendar-clock\">\u003C\u002Fi> Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\" aria-controls=\"panel-salaire-min\">\n      \u003Ci data-lucide=\"grid\">\u003C\u002Fi> Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\" aria-controls=\"panel-conges\">\n      \u003Ci data-lucide=\"umbrella\">\u003C\u002Fi> Congés\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"heures-supp\" role=\"tab\" aria-controls=\"panel-heures-supp\">\n      \u003Ci data-lucide=\"clock\">\u003C\u002Fi> Heures supp.\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ======================== TAB: INDEMNITÉ ======================== -->\n  \u003Cdiv class=\"tab-panel\" id=\"panel-indemnite\" data-panel=\"indemnite\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN chaussure (IDCC 1580) prévoit une formule spécifique pour les ouvriers et employés : \u003Cstrong>1\u002F5 de mois par année ≤ 10 ans + 2\u002F15 de mois par année > 10 ans\u003C\u002Fstrong>, avec une bonification pour les ETAM âgés de 50 ans ou plus. Ces règles peuvent être moins favorables que le code du travail (1\u002F4 + 1\u002F3 mois) — dans ce cas, c'est le code du travail qui s'applique.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Salaire brut mensuel de référence\n        \u003Cspan class=\"form-label-value\" id=\"ind-sal-display\">2 500 €\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"ind-sal\" min=\"1400\" max=\"8000\" step=\"50\" value=\"2500\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Ancienneté (années complètes)\n        \u003Cspan class=\"form-label-value\" id=\"ind-anc-display\">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    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Catégorie\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"ind-categorie\">\n        \u003Cbutton class=\"pill selected\" data-val=\"ouvrier-employe\">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\n    \u003Cdiv id=\"ind-age-group\" class=\"form-group hidden\">\n      \u003Clabel class=\"form-label\">Âge du salarié (ETAM uniquement)\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"ind-age\">\n        \u003Cbutton class=\"pill selected\" data-val=\"moins50\">Moins de 50 ans\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"50-54\">50 – 54 ans (+25%)\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"55plus\">55 ans et + (+30%)\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"ind-result\" class=\"result-card\">\n      \u003Cdiv class=\"result-card-label\">\n        \u003Ci data-lucide=\"calculator\">\u003C\u002Fi>\n        Indemnité de licenciement estimée\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card-value\" id=\"ind-value\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card-sub\" id=\"ind-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"ind-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ======================== TAB: PRÉAVIS ======================== -->\n  \u003Cdiv class=\"tab-panel\" id=\"panel-preavis\" data-panel=\"preavis\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN 1580 fixe des durées de préavis précises selon la catégorie et l'ancienneté. Pour les ouvriers : aucun préavis en dessous de 2 ans, puis 1 mois. Pour les ETAM et cadres : de 1 à 3 mois selon l'ancienneté.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Catégorie professionnelle\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"prev-categorie\">\n        \u003Cbutton class=\"pill selected\" 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\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Ancienneté (années complètes)\n        \u003Cspan class=\"form-label-value\" id=\"prev-anc-display\">3 ans\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"prev-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"3\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Motif\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"prev-motif\">\n        \u003Cbutton class=\"pill selected\" data-val=\"licenciement\">Licenciement\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"demission\">Démission\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"preavis-result\">\n      \u003Cdiv class=\"preavis-card active-card\">\n        \u003Cdiv class=\"result-card-label\" style=\"justify-content:center; color: var(--accent);\">\n          \u003Ci data-lucide=\"calendar-clock\">\u003C\u002Fi>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"preavis-card-value\" id=\"prev-duree\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"preavis-card-label\" id=\"prev-duree-label\">Durée de préavis\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"preavis-card\">\n        \u003Cdiv class=\"result-card-label\" style=\"justify-content:center; color: var(--text-muted);\">\n          \u003Ci data-lucide=\"info\" style=\"color:var(--text-muted)\">\u003C\u002Fi>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"preavis-card-value\" id=\"prev-legale\" style=\"color: var(--text-muted);\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"preavis-card-label\">Code du travail\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cp style=\"font-size:0.8125rem; color:var(--text-muted); margin-top:0.75rem;\" id=\"prev-note\">\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ======================== TAB: GRILLE SALARIALE ======================== -->\n  \u003Cdiv class=\"tab-panel\" id=\"panel-salaire-min\" data-panel=\"salaire-min\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN chaussure publie une grille de salaires minima conventionnels révisée au 1er janvier 2025 (accord du 8 février 2024). Elle comprend 6 niveaux pour ouvriers\u002FETAM et 4 positions cadres, tous supérieurs au SMIC (1 801,80 €\u002Fmois en 2025).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Catégorie\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"sal-categorie\">\n        \u003Cbutton class=\"pill selected\" data-val=\"ouvrier-etam\">Ouvriers \u002F ETAM (niveaux 1-6)\u003C\u002Fbutton>\n        \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadres (positions 1-4)\u003C\u002Fbutton>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"sal-grid-ouvrier\">\n      \u003Ctable class=\"grid-table\" id=\"sal-table-ouvrier\">\n        \u003Cthead>\n          \u003Ctr>\n            \u003Cth>Niveau\u003C\u002Fth>\n            \u003Cth>Échelon\u003C\u002Fth>\n            \u003Cth>Salaire mensuel brut\u003C\u002Fth>\n            \u003Cth>Annuel brut\u003C\u002Fth>\n          \u003C\u002Ftr>\n        \u003C\u002Fthead>\n        \u003Ctbody id=\"sal-tbody-ouvrier\">\u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"sal-grid-cadre\" class=\"hidden\">\n      \u003Ctable class=\"grid-table\" id=\"sal-table-cadre\">\n        \u003Cthead>\n          \u003Ctr>\n            \u003Cth>Position\u003C\u002Fth>\n            \u003Cth>Échelon\u003C\u002Fth>\n            \u003Cth>Salaire annuel brut\u003C\u002Fth>\n            \u003Cth>Mensuel estimé\u003C\u002Fth>\n          \u003C\u002Ftr>\n        \u003C\u002Fthead>\n        \u003Ctbody id=\"sal-tbody-cadre\">\u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdiv>\n\n    \u003Cp style=\"font-size: 0.8125rem; color: var(--text-muted); margin-top: 0.75rem;\">\n      \u003Ci data-lucide=\"info\" style=\"width:12px; height:12px; display:inline; vertical-align:middle;\">\u003C\u002Fi>\n      Source : Accord du 8 février 2024 relatif aux salaires minima (Légifrance KALITEXT000049508678), applicable au 1er janvier 2025.\n    \u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ======================== TAB: CONGÉS ======================== -->\n  \u003Cdiv class=\"tab-panel\" id=\"panel-conges\" data-panel=\"conges\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN 1580 accorde des jours de congés supplémentaires d'ancienneté en plus des 30 jours ouvrables légaux : +1 jour dès 10 ans, +2 jours à 20 ans, +3 jours à 25 ans et +5 jours à partir de 30 ans d'ancienneté.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Ancienneté (années complètes)\n        \u003Cspan class=\"form-label-value\" id=\"cong-anc-display\">10 ans\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"cong-anc\" min=\"0\" max=\"35\" step=\"1\" value=\"10\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"cong-result\" class=\"result-card\">\n      \u003Cdiv class=\"result-card-label\">\n        \u003Ci data-lucide=\"umbrella\">\u003C\u002Fi>\n        Total congés annuels\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card-value\" id=\"cong-value\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card-sub\" id=\"cong-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"cong-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ======================== TAB: HEURES SUPP ======================== -->\n  \u003Cdiv class=\"tab-panel\" id=\"panel-heures-supp\" data-panel=\"heures-supp\" role=\"tabpanel\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN chaussure fixe le contingent annuel d'heures supplémentaires à \u003Cstrong>130 heures\u003C\u002Fstrong> (inférieur au plafond réglementaire de 220 h). Les majorations sont de 25 % pour les heures de la 36e à la 43e heure, et de 50 % à partir de la 44e heure. Au-delà du contingent, une contrepartie obligatoire en repos est due.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">\n        Taux horaire brut\n        \u003Cspan class=\"form-label-value\" id=\"hs-taux-display\">15,00 €\u002Fh\u003C\u002Fspan>\n      \u003C\u002Flabel>\n      \u003Cinput type=\"range\" id=\"hs-taux\" min=\"1150\" max=\"5000\" step=\"50\" value=\"1500\">\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel class=\"form-label\">\n          Heures 36e–43e (25 %)\n          \u003Cspan class=\"form-label-value\" id=\"hs-h25-display\">4 h\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-h25\" min=\"0\" max=\"8\" step=\"1\" value=\"4\">\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"form-group\">\n        \u003Clabel class=\"form-label\">\n          Heures ≥ 44e (50 %)\n          \u003Cspan class=\"form-label-value\" id=\"hs-h50-display\">0 h\u003C\u002Fspan>\n        \u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-h50\" min=\"0\" max=\"10\" step=\"1\" value=\"0\">\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv id=\"hs-result\" class=\"result-card\">\n      \u003Cdiv class=\"result-card-label\">\n        \u003Ci data-lucide=\"calculator\">\u003C\u002Fi>\n        Majoration totale estimée\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card-value\" id=\"hs-value\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-card-sub\" id=\"hs-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"hs-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cp style=\"font-size:0.8125rem; color:var(--text-muted); margin-top:0.75rem;\">\n      \u003Ci data-lucide=\"alert-triangle\" style=\"width:12px;height:12px;display:inline;vertical-align:middle;\">\u003C\u002Fi>\n      Contingent annuel : \u003Cstrong>130 heures\u003C\u002Fstrong>. Au-delà, contrepartie obligatoire en repos (art. L3121-30 C. trav.).\n    \u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Shared disclaimer -->\n  \u003Cp class=\"disclaimer\">\n    \u003Cstrong>Calcul indicatif\u003C\u002Fstrong> basé sur la convention collective nationale de l'industrie de la chaussure IDCC 1580 (Brochure JO 3163).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635436\" 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\u002F ── Salary grids ──────────────────────────────────────────────────────────\n  const GRID_OUVRIER = [\n    {niveau: 1, echelon: 1, mensuel: 1802},\n    {niveau: 1, echelon: 2, mensuel: 1816},\n    {niveau: 2, echelon: 1, mensuel: 1826},\n    {niveau: 2, echelon: 2, mensuel: 1844},\n    {niveau: 3, echelon: 1, mensuel: 1865},\n    {niveau: 3, echelon: 2, mensuel: 1873},\n    {niveau: 3, echelon: 3, mensuel: 1889},\n    {niveau: 3, echelon: 4, mensuel: 1909},\n    {niveau: 4, echelon: 1, mensuel: Math.round(22948\u002F12)},\n    {niveau: 4, echelon: 2, mensuel: Math.round(23602\u002F12)},\n    {niveau: 4, echelon: 3, mensuel: Math.round(25563\u002F12)},\n    {niveau: 5, echelon: 1, mensuel: Math.round(25811\u002F12)},\n    {niveau: 5, echelon: 2, mensuel: Math.round(27660\u002F12)},\n    {niveau: 5, echelon: 3, mensuel: Math.round(29788\u002F12)},\n    {niveau: 6, echelon: 1, mensuel: Math.round(30077\u002F12)},\n    {niveau: 6, echelon: 2, mensuel: Math.round(34113\u002F12)},\n  ];\n  const GRID_CADRE = [\n    {position: 1, echelon: 1, annuel: 31915},\n    {position: 1, echelon: 2, annuel: 34280},\n    {position: 2, echelon: 1, annuel: 39520},\n    {position: 3, echelon: 1, annuel: 45871},\n    {position: 4, echelon: 1, annuel: 54341},\n  ];\n\n  \u002F\u002F ── Formatters ─────────────────────────────────────────────────────────────\n  const fmtEUR = v => new Intl.NumberFormat('fr-FR', {style:'currency',currency:'EUR',maximumFractionDigits:0}).format(v);\n  const fmtEURDec = v => new Intl.NumberFormat('fr-FR', {style:'currency',currency:'EUR',minimumFractionDigits:2,maximumFractionDigits:2}).format(v);\n\n  \u002F\u002F ── State ─────────────────────────────────────────────────────────────────\n  const state = {\n    ind: { sal: 2500, anc: 5, categorie: 'ouvrier-employe', age: 'moins50' },\n    prev: { anc: 3, categorie: 'ouvrier', motif: 'licenciement' },\n    sal: { categorie: 'ouvrier-etam' },\n    cong: { anc: 10 },\n    hs: { taux: 1500, h25: 4, h50: 0 }\n  };\n\n  \u002F\u002F ── Compute functions ─────────────────────────────────────────────────────\n\n  function computeIndemnite(s) {\n    const sal = s.sal;\n    const anc = s.anc;\n    let base = 0;\n    \u002F\u002F CCN formula for ouvriers\u002Femployés: 1\u002F5 × sal × ans ≤10, + 2\u002F15 × sal × ans >10\n    \u002F\u002F Also compare with legal minimum: 1\u002F4 × sal × ans ≤10, + 1\u002F3 × sal × ans >10\n    \u002F\u002F Apply the more favorable\n    const ansPart1 = Math.min(anc, 10);\n    const ansPart2 = Math.max(anc - 10, 0);\n\n    \u002F\u002F CCN formula\n    const ccnBase = (sal * (1\u002F5) * ansPart1) + (sal * (2\u002F15) * ansPart2);\n    \u002F\u002F Legal minimum\n    const legalBase = (sal * (1\u002F4) * ansPart1) + (sal * (1\u002F3) * ansPart2);\n    \u002F\u002F Use the more favorable (legal minimum per art. L1234-9 if CCN is less)\n    base = Math.max(ccnBase, legalBase);\n\n    let bonus = 0;\n    let bonusLabel = '';\n\n    if (s.categorie === 'etam') {\n      if (s.age === '50-54') { bonus = base * 0.25; bonusLabel = 'bonification +25% (≥50 ans)'; }\n      else if (s.age === '55plus') { bonus = base * 0.30; bonusLabel = 'bonification +30% (≥55 ans)'; }\n    } else if (s.categorie === 'cadre') {\n      \u002F\u002F Cadres: enhanced scale up to 6 months at 35 years, cap 12 months\n      \u002F\u002F Use a progressive formula: higher of ccn or legal\n      \u002F\u002F Cadres get up to 1\u002F5 mois × année with higher cap\n      base = Math.max(ccnBase, legalBase); \u002F\u002F apply same formula with legal floor\n    }\n\n    const total = base + bonus;\n    const usedFormula = legalBase > ccnBase ? 'Code du travail (plus favorable)' : 'CCN 1580';\n\n    return { total, base, bonus, bonusLabel, usedFormula, legalBase, ccnBase };\n  }\n\n  function computePreavis(s) {\n    \u002F\u002F CCN 1580 notice periods\n    let ccnDuree = '';\n    let ccnMois = 0;\n    let legalDuree = '';\n\n    if (s.categorie === 'ouvrier') {\n      if (s.anc \u003C 2) { ccnDuree = 'Aucun préavis'; ccnMois = 0; }\n      else { ccnDuree = '1 mois'; ccnMois = 1; }\n      \u002F\u002F Legal L1234-1 for workers\n      if (s.anc \u003C 0.5) { legalDuree = 'Aucun'; }\n      else if (s.anc \u003C 2) { legalDuree = '1 mois'; }\n      else { legalDuree = '2 mois'; }\n    } else if (s.categorie === 'etam') {\n      if (s.anc \u003C 2) { ccnDuree = '1 mois'; ccnMois = 1; }\n      else if (s.anc \u003C 5) { ccnDuree = '2 mois'; ccnMois = 2; }\n      else { ccnDuree = '3 mois'; ccnMois = 3; }\n      legalDuree = s.anc \u003C 0.5 ? 'Aucun' : s.anc \u003C 2 ? '1 mois' : '2 mois';\n    } else if (s.categorie === 'cadre') {\n      if (s.anc \u003C 2) { ccnDuree = '1 mois'; ccnMois = 1; }\n      else if (s.anc \u003C 5) { ccnDuree = '2 mois'; ccnMois = 2; }\n      else { ccnDuree = '3 mois'; ccnMois = 3; }\n      legalDuree = s.anc \u003C 0.5 ? 'Aucun' : s.anc \u003C 2 ? '1 mois' : '2 mois';\n    }\n\n    \u002F\u002F For démission, same durations apply\n    const note = s.motif === 'demission'\n      ? 'En cas de démission, le même préavis s\\'applique. Il peut être raccourci par accord mutuel ou en cas de nouvelle embauche.'\n      : 'Le préavis commence à courir à compter de la notification du licenciement.';\n\n    return { ccnDuree, ccnMois, legalDuree, note };\n  }\n\n  function computeConges(anc) {\n    \u002F\u002F Base: 30 jours ouvrables (legal)\n    const base = 30;\n    let extra = 0;\n    if (anc >= 30) extra = 5;\n    else if (anc >= 25) extra = 3;\n    else if (anc >= 20) extra = 2;\n    else if (anc >= 10) extra = 1;\n    return { base, extra, total: base + extra };\n  }\n\n  function computeHS(s) {\n    const tauxHoraire = s.taux \u002F 100;\n    const maj25 = s.h25 * tauxHoraire * 0.25;\n    const maj50 = s.h50 * tauxHoraire * 0.50;\n    const totalHs = (s.h25 * tauxHoraire) + (s.h50 * tauxHoraire);\n    const totalMaj = maj25 + maj50;\n    const totalPaye = totalHs + totalMaj;\n    return { tauxHoraire, maj25, maj50, totalHs, totalMaj, totalPaye };\n  }\n\n  \u002F\u002F ── Render functions ────────────────────────────────────────────────────────\n\n  function renderIndemnite() {\n    const r = computeIndemnite(state.ind);\n    document.getElementById('ind-value').textContent = fmtEUR(r.total);\n    document.getElementById('ind-sub').textContent = `Formule appliquée : ${r.usedFormula}`;\n    const detailRows = [\n      `\u003Cdiv class=\"result-detail-row\">\u003Cspan>Base conventionnelle CCN\u003C\u002Fspan>\u003Cspan>${fmtEUR(r.ccnBase)}\u003C\u002Fspan>\u003C\u002Fdiv>`,\n      `\u003Cdiv class=\"result-detail-row\">\u003Cspan>Plancher légal (L1234-9)\u003C\u002Fspan>\u003Cspan>${fmtEUR(r.legalBase)}\u003C\u002Fspan>\u003C\u002Fdiv>`,\n    ];\n    if (r.bonusLabel) {\n      detailRows.push(`\u003Cdiv class=\"result-detail-row\">\u003Cspan>Bonification (${r.bonusLabel})\u003C\u002Fspan>\u003Cspan>+ ${fmtEUR(r.bonus)}\u003C\u002Fspan>\u003C\u002Fdiv>`);\n    }\n    document.getElementById('ind-detail').innerHTML = detailRows.join('');\n    \u002F\u002F Toggle age group\n    const agp = document.getElementById('ind-age-group');\n    agp.classList.toggle('hidden', state.ind.categorie !== 'etam');\n  }\n\n  function renderPreavis() {\n    const r = computePreavis(state.prev);\n    document.getElementById('prev-duree').textContent = r.ccnDuree;\n    document.getElementById('prev-duree-label').textContent = 'Durée CCN 1580';\n    document.getElementById('prev-legale').textContent = r.legalDuree;\n    document.getElementById('prev-note').textContent = r.note;\n  }\n\n  function renderSalaire() {\n    const cat = state.sal.categorie;\n    document.getElementById('sal-grid-ouvrier').classList.toggle('hidden', cat !== 'ouvrier-etam');\n    document.getElementById('sal-grid-cadre').classList.toggle('hidden', cat !== 'cadre');\n\n    if (cat === 'ouvrier-etam') {\n      const tbody = document.getElementById('sal-tbody-ouvrier');\n      tbody.innerHTML = GRID_OUVRIER.map(r => {\n        const annuel = r.mensuel * 12;\n        return `\u003Ctr>\n          \u003Ctd>Niveau ${r.niveau}\u003C\u002Ftd>\n          \u003Ctd>Éch. ${r.echelon}\u003C\u002Ftd>\n          \u003Ctd>${fmtEUR(r.mensuel)} \u002F mois\u003C\u002Ftd>\n          \u003Ctd>${fmtEUR(annuel)} \u002F an\u003C\u002Ftd>\n        \u003C\u002Ftr>`;\n      }).join('');\n    } else {\n      const tbody = document.getElementById('sal-tbody-cadre');\n      tbody.innerHTML = GRID_CADRE.map(r => {\n        const mensuel = Math.round(r.annuel \u002F 12);\n        return `\u003Ctr>\n          \u003Ctd>Position ${r.position}\u003C\u002Ftd>\n          \u003Ctd>Éch. ${r.echelon}\u003C\u002Ftd>\n          \u003Ctd>${fmtEUR(r.annuel)} \u002F an\u003C\u002Ftd>\n          \u003Ctd>≈ ${fmtEUR(mensuel)} \u002F mois\u003C\u002Ftd>\n        \u003C\u002Ftr>`;\n      }).join('');\n    }\n    \u002F\u002F Re-init lucide for new icons if any\n    if (window.lucide) lucide.createIcons();\n  }\n\n  function renderConges() {\n    const anc = state.cong.anc;\n    const r = computeConges(anc);\n    document.getElementById('cong-value').textContent = `${r.total} jours ouvrables`;\n    document.getElementById('cong-sub').textContent = `dont ${r.extra} jour(s) supplémentaire(s) d'ancienneté`;\n    document.getElementById('cong-detail').innerHTML = `\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan>Congés légaux (L3141-3)\u003C\u002Fspan>\u003Cspan>30 j ouvrables\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan>Jours ancienneté CCN 1580\u003C\u002Fspan>\u003Cspan>+ ${r.extra} j\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n  }\n\n  function renderHS() {\n    const r = computeHS(state.hs);\n    document.getElementById('hs-value').textContent = fmtEURDec(r.totalMaj);\n    document.getElementById('hs-sub').textContent = `Dont total brut heures supp : ${fmtEURDec(r.totalPaye)} (base + majoration)`;\n    document.getElementById('hs-detail').innerHTML = `\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan>Taux horaire brut\u003C\u002Fspan>\u003Cspan>${fmtEURDec(r.tauxHoraire)}\u002Fh\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan>Maj. 25% (h36–h43) : ${state.hs.h25} h\u003C\u002Fspan>\u003Cspan>+ ${fmtEURDec(r.maj25)}\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail-row\">\u003Cspan>Maj. 50% (≥h44) : ${state.hs.h50} h\u003C\u002Fspan>\u003Cspan>+ ${fmtEURDec(r.maj50)}\u003C\u002Fspan>\u003C\u002Fdiv>\n    `;\n  }\n\n  function renderAll() {\n    renderIndemnite();\n    renderPreavis();\n    renderSalaire();\n    renderConges();\n    renderHS();\n  }\n\n  \u002F\u002F ── Input bindings ─────────────────────────────────────────────────────────\n\n  function bindSlider(id, stateObj, key, displayId, fmt) {\n    const el = document.getElementById(id);\n    el.addEventListener('input', () => {\n      stateObj[key] = parseFloat(el.value);\n      document.getElementById(displayId).textContent = fmt(stateObj[key]);\n      renderAll();\n    });\n  }\n\n  function bindPills(containerId, stateObj, key, onChangeFn) {\n    document.getElementById(containerId).addEventListener('click', e => {\n      const pill = e.target.closest('.pill');\n      if (!pill) return;\n      document.querySelectorAll(`#${containerId} .pill`).forEach(p => p.classList.remove('selected'));\n      pill.classList.add('selected');\n      stateObj[key] = pill.dataset.val;\n      if (onChangeFn) onChangeFn();\n      renderAll();\n    });\n  }\n\n  \u002F\u002F Indemnité sliders\n  bindSlider('ind-sal', state.ind, 'sal', 'ind-sal-display', v => fmtEUR(v));\n  bindSlider('ind-anc', state.ind, 'anc', 'ind-anc-display', v => `${v} an${v > 1 ? 's' : ''}`);\n  bindPills('ind-categorie', state.ind, 'categorie');\n  bindPills('ind-age', state.ind, 'age');\n\n  \u002F\u002F Préavis sliders\n  bindSlider('prev-anc', state.prev, 'anc', 'prev-anc-display', v => `${v} an${v > 1 ? 's' : ''}`);\n  bindPills('prev-categorie', state.prev, 'categorie');\n  bindPills('prev-motif', state.prev, 'motif');\n\n  \u002F\u002F Salaire pills\n  bindPills('sal-categorie', state.sal, 'categorie');\n\n  \u002F\u002F Congés slider\n  bindSlider('cong-anc', state.cong, 'anc', 'cong-anc-display', v => `${v} an${v > 1 ? 's' : ''}`);\n\n  \u002F\u002F Heures supp sliders\n  bindSlider('hs-taux', state.hs, 'taux', 'hs-taux-display', v => `${(v\u002F100).toFixed(2).replace('.', ',')} €\u002Fh`);\n  bindSlider('hs-h25', state.hs, 'h25', 'hs-h25-display', v => `${v} h`);\n  bindSlider('hs-h50', state.hs, 'h50', 'hs-h50-display', v => `${v} h`);\n\n  \u002F\u002F ── Tab logic ──────────────────────────────────────────────────────────────\n\n  const tabBtns = document.querySelectorAll('[data-tab]');\n  const tabPanels = document.querySelectorAll('[data-panel]');\n\n  function activate(id) {\n    tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n    tabPanels.forEach(p => p.classList.toggle('active', p.dataset.panel === id));\n    if (location.hash !== '#' + id) location.hash = id;\n    requestAnimationFrame(() => {\n      window.dispatchEvent(new Event('resize'));\n    });\n  }\n\n  tabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\n  const hashTab = location.hash.slice(1);\n  const defaultTab = (hashTab && document.querySelector(`[data-tab=\"${hashTab}\"]`)) ? hashTab : tabBtns[0].dataset.tab;\n  activate(defaultTab);\n\n  \u002F\u002F ── Initial render ─────────────────────────────────────────────────────────\n  renderAll();\n\n  \u002F\u002F ── Lucide icons ───────────────────────────────────────────────────────────\n  if (window.lucide) lucide.createIcons();\n\n  \u002F\u002F ── ResizeObserver → parent iframe contract ────────────────────────────────\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-de-la-chaussure-et-des-articles-chaussants-8f2b80b9a9.webp",[]]