[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-maisons-d-etudiants-fr":83,"footer-cities-fr":158},[4,14,22,30,38,45,53,60,67,75],{"seo_content":5,"id":8,"name":9,"slug":10,"parentId":7,"lang":11,"_count":12},[6],{"page_slug":7},null,"cmkzhl7xm00dbulbc93h4qog5","Juridique","avocats","fr-FR",{"experts":13},8,{"seo_content":15,"id":17,"name":18,"slug":19,"parentId":7,"lang":11,"_count":20},[16],{"page_slug":7},"cmkzhl84700djulbcbv6pzu9e","Informatique","informaticiens",{"experts":21},3,{"seo_content":23,"id":25,"name":26,"slug":27,"parentId":7,"lang":11,"_count":28},[24],{"page_slug":7},"cmkzhlaos00gnulbc07i9jrco","Amélioration de la Maison","artisans",{"experts":29},4,{"seo_content":31,"id":33,"name":34,"slug":35,"parentId":7,"lang":11,"_count":36},[32],{"page_slug":7},"cmkzhlaqg00gpulbcx38bwoc2","Général","divers-generalistes",{"experts":37},0,{"seo_content":39,"id":41,"name":42,"slug":43,"parentId":7,"lang":11,"_count":44},[40],{"page_slug":7},"cmkzhlbvq00i3ulbcutdbcz50","Électronique Grand Public","techniciens-electronique",{"experts":21},{"seo_content":46,"id":48,"name":49,"slug":50,"parentId":7,"lang":11,"_count":51},[47],{"page_slug":7},"cmkzhlcaw00ilulbc38pxoogr","Santé","medecins",{"experts":52},5,{"seo_content":54,"id":56,"name":57,"slug":58,"parentId":7,"lang":11,"_count":59},[55],{"page_slug":7},"cmkzhlcmi00izulbcxva1m47f","Gestion de Patrimoine","conseillers-patrimoniaux",{"experts":21},{"seo_content":61,"id":63,"name":64,"slug":65,"parentId":7,"lang":11,"_count":66},[62],{"page_slug":7},"cmkzhldcv00jvulbcmcd5a7mk","Animaux et Vétérinaires","veterinaires",{"experts":21},{"seo_content":68,"id":70,"name":71,"slug":72,"parentId":7,"lang":11,"_count":73},[69],{"page_slug":7},"cmkzhldrr00kdulbchxfo67eg","Mécanique et Réparation","mecaniciens",{"experts":74},1,{"seo_content":76,"id":78,"name":79,"slug":80,"parentId":7,"lang":11,"_count":81},[77],{"page_slug":7},"cmkzhl9l300fbulbcv3i8q8p3","Aide aux Devoirs","professeurs-particuliers",{"experts":82},6,{"slug":84,"title":85,"page_title":86,"description":87,"content_md":88,"local_slug":84,"json_ld":89,"faq":130,"tool_html":152,"source":153,"category":154,"audience":155,"publish_mode":156,"hero_image":157,"hero_image_alt":85},"ccn-maisons-d-etudiants","CCN des maisons d'étudiants — calculateur complet","Calculateur CCN des maisons d'étudiants IDCC 1671 | Expert Zoom","Outil interactif couvrant indemnité de licenciement, préavis, grille salariale 2025, 13e mois, heures supplémentaires et congés de la CCN des maisons d'étudiants (IDCC 1671).","Ce calculateur couvre les 6 principales dérogations de la convention collective des maisons d'étudiants (IDCC 1671) : indemnité de licenciement avec prise en compte à 100 % du congé parental, durée du préavis, grille salariale 2025 (valeur du point 67,78 €), 13e mois obligatoire avec prime d'ancienneté, seuil d'heures supplémentaires à 44 h\u002Fsemaine et jours de congés supplémentaires par ancienneté.",[90,109],{"name":91,"@type":92,"about":93,"author":97,"@context":100,"isPartOf":101,"inLanguage":104,"description":105,"operatingSystem":106,"applicationCategory":107,"isAccessibleForFree":108},"Calculateur CCN des maisons d'étudiants — IDCC 1671","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective des maisons d'étudiants","Thing","IDCC 1671",{"name":98,"@type":99},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":102,"@type":103},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, le 13e mois, les heures supplémentaires et les congés payés de la convention collective des maisons d'étudiants (IDCC 1671).","All","FinanceApplication",true,{"@type":110,"@context":100,"mainEntity":111},"FAQPage",[112,118,122,126],{"name":113,"@type":114,"acceptedAnswer":115},"Comment calculer l'indemnité de licenciement dans la convention collective des maisons d'étudiants ?","Question",{"text":116,"@type":117},"La CCN des maisons d'étudiants (IDCC 1671) applique la formule légale de l'art. L1234-9 : 1\u002F4 de mois de salaire par année d'ancienneté pour les 10 premières années, puis 1\u002F3 de mois par année au-delà. Les périodes de congé parental sont comptées à 100 % dans l'ancienneté.","Answer",{"name":119,"@type":114,"acceptedAnswer":120},"Quelle est la durée du préavis dans la CCN maisons d'étudiants ?",{"text":121,"@type":117},"La CCN IDCC 1671 prévoit : 1 semaine pour une ancienneté inférieure à 6 mois, 1 mois pour 6 mois à 2 ans, et 2 mois pour 2 ans et plus.",{"name":123,"@type":114,"acceptedAnswer":124},"Y a-t-il un 13e mois obligatoire dans la CCN des maisons d'étudiants ?",{"text":125,"@type":117},"Oui, la CCN prévoit un 13e mois obligatoire versé en deux fois (50 % en juin, 50 % en décembre), complété par une prime d'ancienneté de +3 % à 3 ans, +6 % à 6 ans, plafonnée à 15 %.",{"name":127,"@type":114,"acceptedAnswer":128},"À partir de combien d'heures s'applique la majoration pour heures supplémentaires dans les maisons d'étudiants ?",{"text":129,"@type":117},"Le seuil conventionnel est de 44 h\u002Fsemaine (Avenant n°49, art. 5.1), contrairement au seuil légal de 35 h. La majoration de +25 % s'applique uniquement au-delà de 44 h.",[131,133,135,138,141,143,146,149],{"a":132,"q":113},"La CCN des maisons d'étudiants (IDCC 1671) applique la formule légale de l'art. L1234-9 : 1\u002F4 de mois de salaire par année d'ancienneté pour les 10 premières années, puis 1\u002F3 de mois par année au-delà. L'avantage conventionnel est que les périodes de congé parental sont comptées à 100 % dans l'ancienneté (contre 50 % en droit commun).",{"a":134,"q":119},"La CCN IDCC 1671 prévoit : 1 semaine de préavis pour une ancienneté inférieure à 6 mois, 1 mois pour une ancienneté de 6 mois à 2 ans, et 2 mois pour une ancienneté de 2 ans et plus. Les tranches de 6 mois à 2 ans et au-delà sont identiques à celles de l'article L1234-1 du code du travail.",{"a":136,"q":137},"La convention collective des maisons d'étudiants publie une grille de 20 classes indexée sur une valeur du point de 67,78 € (Avenant n°73 du 11 décembre 2024, applicable au 1er janvier 2025). Le salaire minimum de classe 1 (coefficient 333) est d'environ 22 570 € brut annuel, soit environ 1 881 € brut mensuel, ce qui est supérieur au SMIC.","Quelle est la grille des salaires minimums dans la CCN des maisons d'étudiants en 2025 ?",{"a":139,"q":140},"Oui, la CCN des maisons d'étudiants (IDCC 1671) prévoit un 13e mois obligatoire, versé en deux fois : 50 % en juin et 50 % en décembre. S'y ajoute une prime d'ancienneté de +3 % à partir de 3 ans d'ancienneté, +6 % à partir de 6 ans, plafonnée à 15 %.","Y a-t-il un 13e mois obligatoire dans la convention collective des maisons d'étudiants ?",{"a":142,"q":127},"Contrairement au code du travail qui fixe le seuil à 35 h\u002Fsemaine, la CCN des maisons d'étudiants (IDCC 1671, Avenant n°49 du 21 février 2012, art. 5.1) fixe le seuil des heures supplémentaires à 44 h\u002Fsemaine. Les heures entre 35 h et 44 h ne sont donc pas traitées comme des heures supplémentaires. La majoration de +25 % s'applique uniquement au-delà de 44 h.",{"a":144,"q":145},"La CCN accorde les 30 jours ouvrables légaux (5 semaines) auxquels s'ajoutent des jours d'ancienneté : +1 jour à partir de 10 ans d'ancienneté, puis +1 jour tous les 5 ans supplémentaires. Des jours de congés supplémentaires sont également prévus en cas de déménagement (2 jours tous les 3 ans).","Combien de jours de congés payés prévoit la CCN des maisons d'étudiants ?",{"a":147,"q":148},"La convention collective nationale des maisons d'étudiants, référencée IDCC 1671, est un accord collectif qui régit les conditions de travail des salariés travaillant dans les structures d'hébergement ou de services dédiés aux étudiants. Elle couvre notamment les résidences étudiantes, les foyers et les structures associatives au service du monde étudiant.","Qu'est-ce que la convention collective des maisons d'étudiants (IDCC 1671) ?",{"a":150,"q":151},"Oui, la CCN des maisons d'étudiants prévoit une majoration de +25 % pour les gardes de nuit. Cette spécificité est liée à la nature des établissements (résidences étudiantes, foyers) qui peuvent nécessiter une permanence nocturne.","La majoration pour travail de nuit est-elle prévue dans la CCN maisons d'étudiants ?","\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 Maisons d'étudiants — IDCC 1671\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: #16a34a;\n      --warning: #b45309;\n      --warning-bg: #fffbeb;\n      --warning-border: #fde68a;\n      --danger: #dc2626;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n      font-family: system-ui, -apple-system, sans-serif;\n    }\n    body { background: var(--bg); color: var(--text); min-height: 100vh; }\n    .tool-root { max-width: 720px; margin: 0 auto; padding: 1.25rem 1rem 2rem; }\n\n    \u002F* Header *\u002F\n    .tool-header { margin-bottom: 1.25rem; }\n    .tool-header h1 { font-size: 1.2rem; font-weight: 700; line-height: 1.3; }\n    .idcc-badge {\n      display: inline-flex; align-items: center; gap: 0.35rem;\n      background: var(--accent-light); color: var(--accent); border: 1px solid #bfdbfe;\n      border-radius: 9999px; font-size: 0.75rem; font-weight: 600;\n      padding: 0.2rem 0.65rem; margin-top: 0.4rem;\n    }\n\n    \u002F* Tab bar *\u002F\n    .tab-bar {\n      display: flex; gap: 0.25rem; flex-wrap: wrap;\n      border-bottom: 2px solid var(--border); margin-bottom: 1.25rem;\n    }\n    .tab-btn {\n      padding: 0.55rem 0.85rem; font-size: 0.85rem; font-weight: 500;\n      border: none; background: none; cursor: pointer; color: var(--text-muted);\n      border-bottom: 2px solid transparent; margin-bottom: -2px;\n      border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n      display: flex; align-items: center; gap: 0.35rem;\n      transition: color 0.15s, border-color 0.15s;\n    }\n    .tab-btn:hover { color: var(--accent); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); font-weight: 600; }\n\n    \u002F* Panels *\u002F\n    .panel { display: none; }\n    .panel.active { display: block; }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex; gap: 0.6rem; align-items: flex-start;\n      background: var(--accent-light); border: 1px solid #bfdbfe;\n      border-radius: var(--radius); padding: 0.85rem 1rem; margin-bottom: 1.1rem;\n    }\n    .rule-callout svg { color: var(--accent); flex-shrink: 0; margin-top: 0.1rem; }\n    .rule-callout p { font-size: 0.875rem; line-height: 1.5; color: #1e3a5f; }\n    .rule-callout strong { color: var(--accent-dark); }\n\n    .warn-callout {\n      display: flex; gap: 0.6rem; align-items: flex-start;\n      background: var(--warning-bg); border: 1px solid var(--warning-border);\n      border-radius: var(--radius); padding: 0.85rem 1rem; margin-bottom: 1.1rem;\n    }\n    .warn-callout svg { color: var(--warning); flex-shrink: 0; margin-top: 0.1rem; }\n    .warn-callout p { font-size: 0.875rem; line-height: 1.5; color: #78350f; }\n\n    \u002F* Card *\u002F\n    .card {\n      background: var(--surface); border: 1px solid var(--border);\n      border-radius: var(--radius); padding: 1.25rem; margin-bottom: 1rem;\n    }\n    .card-title { font-size: 0.8rem; font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 1rem; }\n\n    \u002F* Form elements *\u002F\n    .field { margin-bottom: 1rem; }\n    .field label { display: flex; justify-content: space-between; font-size: 0.875rem; font-weight: 500; margin-bottom: 0.4rem; }\n    .field label span { font-weight: 700; color: var(--accent); font-variant-numeric: tabular-nums; }\n    input[type=range] { width: 100%; accent-color: var(--accent); cursor: pointer; }\n    select {\n      width: 100%; padding: 0.55rem 0.75rem; border: 1px solid var(--border);\n      border-radius: var(--radius-sm); font-size: 0.875rem; background: var(--surface);\n      color: var(--text); cursor: pointer; appearance: none;\n      background-image: url(\"data:image\u002Fsvg+xml,%3Csvg xmlns='http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2378716c' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'\u002F%3E%3C\u002Fsvg%3E\");\n      background-repeat: no-repeat; background-position: right 0.6rem center; padding-right: 2rem;\n    }\n    .pills { display: flex; gap: 0.4rem; flex-wrap: wrap; }\n    .pill {\n      padding: 0.4rem 0.85rem; border: 1.5px solid var(--border); border-radius: 9999px;\n      font-size: 0.8rem; cursor: pointer; background: var(--surface); color: var(--text-muted);\n      transition: all 0.15s;\n    }\n    .pill.active { background: var(--accent); border-color: var(--accent); color: white; font-weight: 600; }\n\n    \u002F* Result *\u002F\n    .result-card {\n      background: linear-gradient(135deg, var(--accent) 0%, var(--accent-dark) 100%);\n      border-radius: var(--radius); padding: 1.25rem; color: white; margin-bottom: 1rem;\n    }\n    .result-label { font-size: 0.8rem; font-weight: 500; opacity: 0.85; margin-bottom: 0.3rem; }\n    .result-value { font-size: 2rem; font-weight: 800; font-variant-numeric: tabular-nums; line-height: 1.1; }\n    .result-sub { font-size: 0.8rem; opacity: 0.8; margin-top: 0.3rem; }\n    .result-detail { margin-top: 0.75rem; padding-top: 0.75rem; border-top: 1px solid rgba(255,255,255,0.25); font-size: 0.8rem; opacity: 0.9; }\n    .result-detail span { display: block; margin-bottom: 0.15rem; }\n\n    \u002F* Grid display *\u002F\n    .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-bottom: 1rem; }\n    @media (max-width: 480px) { .grid-2 { grid-template-columns: 1fr; } }\n    .stat-box { background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.75rem; }\n    .stat-box .stat-label { font-size: 0.75rem; color: var(--text-muted); margin-bottom: 0.2rem; }\n    .stat-box .stat-val { font-size: 1.1rem; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--accent); }\n\n    \u002F* Toggle *\u002F\n    .toggle-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1rem; }\n    .toggle-row label { font-size: 0.875rem; font-weight: 500; }\n    .toggle {\n      position: relative; display: inline-block; width: 44px; height: 24px;\n    }\n    .toggle input { opacity: 0; width: 0; height: 0; }\n    .toggle-slider {\n      position: absolute; cursor: pointer; inset: 0;\n      background: var(--border); border-radius: 9999px; transition: 0.2s;\n    }\n    .toggle-slider:before {\n      content: ''; position: absolute; left: 3px; top: 3px;\n      width: 18px; height: 18px; border-radius: 50%;\n      background: white; transition: 0.2s; box-shadow: 0 1px 3px rgba(0,0,0,0.2);\n    }\n    .toggle input:checked + .toggle-slider { background: var(--accent); }\n    .toggle input:checked + .toggle-slider:before { transform: translateX(20px); }\n\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      font-size: 0.75rem; color: var(--text-muted); line-height: 1.5;\n      border-top: 1px solid var(--border); padding-top: 0.85rem; margin-top: 0.5rem;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n\n    .section-sep { border: none; border-top: 1px solid var(--border); margin: 1rem 0; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1671 — deviations\n     salaire-min: SMIC → grille 20 classes × valeur point 67.78€ (Avenant n°73, 1er janv. 2025)\n     prime-annuelle: aucune obligation légale → 13e mois obligatoire (50% juin + 50% déc.) + prime ancienneté +3%\u002F+6% (art. CCN)\n     conges: 30j ouvrables → 30j ouvrables + jours ancienneté (+1j à 10 ans, +1j tous les 5 ans)\n     heures-supp: seuil légal 35h → seuil conventionnel 44h (Avenant n°49, 21 fév. 2012, art. 5.1) — majoration +25% au-delà de 44h seulement\n     preavis: L1234-1 → \u003C6 mois : 1 semaine ; 6 mois–2 ans : 1 mois ; ≥2 ans : 2 mois\n     indemnite: L1234-9 appliqué (1\u002F4 + 1\u002F3) + périodes congé parental comptées à 100% -->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>Convention collective des maisons d'étudiants\u003C\u002Fh1>\n    \u003Cdiv class=\"idcc-badge\">\n      \u003Ci data-lucide=\"badge-check\" style=\"width:14px;height:14px;\">\u003C\u002Fi>\n      IDCC 1671\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Tab bar -->\n  \u003Cdiv class=\"tab-bar\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"banknote\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\n      \u003Ci data-lucide=\"calendar-clock\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\">\n      \u003Ci data-lucide=\"bar-chart-2\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-annuelle\" role=\"tab\">\n      \u003Ci data-lucide=\"gift\" style=\"width:14px;height:14px;\">\u003C\u002Fi>13e mois\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"heures-supp\" role=\"tab\">\n      \u003Ci data-lucide=\"clock\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Heures supp.\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">\n      \u003Ci data-lucide=\"sun\" style=\"width:14px;height:14px;\">\u003C\u002Fi>Congés\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════\n       TAB 1 : INDEMNITÉ DE LICENCIEMENT\n       ═══════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>La CCN maisons d'étudiants applique la \u003Cstrong>formule légale L1234-9\u003C\u002Fstrong> (1\u002F4 mois\u002Fan ≤ 10 ans, 1\u002F3 mois\u002Fan > 10 ans). \u003Cstrong>Avantage conventionnel :\u003C\u002Fstrong> les périodes de congé parental sont comptées à \u003Cstrong>100 %\u003C\u002Fstrong> dans l'ancienneté (contre 50 % en droit commun).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Paramètres\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire de référence brut mensuel \u003Cspan id=\"ind-sal-val\">2 500 €\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-sal\" min=\"1200\" max=\"8000\" step=\"50\" value=\"2500\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté totale \u003Cspan id=\"ind-anc-val\">5 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"40\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>dont congé parental (comptabilisé à 100 %) \u003Cspan id=\"ind-cp-val\">0 an\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"ind-cp\" min=\"0\" max=\"10\" step=\"1\" value=\"0\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:0.5rem;\">Motif de licenciement\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-motif-pills\">\n          \u003Cdiv class=\"pill active\" data-val=\"personnel\">Motif personnel\u003C\u002Fdiv>\n          \u003Cdiv class=\"pill\" data-val=\"economique\">Motif économique\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"ind-result\">\n      \u003Cdiv class=\"result-label\">Indemnité de licenciement brute estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"ind-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-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!-- ═══════════════════════════════════════════════════\n       TAB 2 : PRÉAVIS\n       ═══════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>La CCN précise : \u003Cstrong>moins de 6 mois → 1 semaine\u003C\u002Fstrong> ; 6 mois à 2 ans → 1 mois ; 2 ans et plus → 2 mois. Les tranches de 6 mois–2 ans et ≥ 2 ans sont identiques à l'art. L1234-1.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Paramètres\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:0.5rem;\">Ancienneté\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prev-anc-pills\">\n          \u003Cdiv class=\"pill active\" data-val=\"lt6m\">Moins de 6 mois\u003C\u002Fdiv>\n          \u003Cdiv class=\"pill\" data-val=\"6m2a\">6 mois à 2 ans\u003C\u002Fdiv>\n          \u003Cdiv class=\"pill\" data-val=\"gte2a\">2 ans et plus\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:0.5rem;\">À l'initiative de\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"prev-ini-pills\">\n          \u003Cdiv class=\"pill active\" data-val=\"emp\">Employeur (licenciement)\u003C\u002Fdiv>\n          \u003Cdiv class=\"pill\" data-val=\"sal\">Salarié (démission)\u003C\u002Fdiv>\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 du préavis\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"prev-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"prev-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"prev-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════\n       TAB 3 : GRILLE SALARIALE\n       ═══════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>La CCN publie une grille de \u003Cstrong>20 classes\u003C\u002Fstrong> indexée sur une \u003Cstrong>valeur du point de 67,78 €\u003C\u002Fstrong> (Avenant n°73 du 11 décembre 2024, en vigueur au 1er janvier 2025). Le minimum conventionnel est \u003Cstrong>supérieur au SMIC\u003C\u002Fstrong>.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Paramètres\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:0.5rem;\">Classe (coefficient)\u003C\u002Flabel>\n        \u003Cselect id=\"sal-classe\">\n          \u003Coption value=\"333\">Classe 1 — Coeff. 333 (€22 570 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"340\">Classe 2 — Coeff. 340 (€23 045 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"347\">Classe 3 — Coeff. 347 (€23 520 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"357\">Classe 4 — Coeff. 357 (€24 198 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"369\">Classe 5 — Coeff. 369 (€25 012 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"383\">Classe 6 — Coeff. 383 (€25 961 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"398\">Classe 7 — Coeff. 398 (€26 977 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"415\">Classe 8 — Coeff. 415 (€28 129 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"434\">Classe 9 — Coeff. 434 (€29 417 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"455\" selected>Classe 10 — Coeff. 455 (€30 840 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"478\">Classe 11 — Coeff. 478 (€32 399 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"503\">Classe 12 — Coeff. 503 (€34 093 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"530\">Classe 13 — Coeff. 530 (€35 923 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"560\">Classe 14 — Coeff. 560 (€37 957 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"592\">Classe 15 — Coeff. 592 (€40 126 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"626\">Classe 16 — Coeff. 626 (€42 430 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"662\">Classe 17 — Coeff. 662 (€44 870 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"677\">Classe 18 — Coeff. 677 (€45 887 \u002Fan)\u003C\u002Foption>\n          \u003Coption value=\"677\">Classe 19 — Coeff. 677+ (→ négociation)\u003C\u002Foption>\n          \u003Coption value=\"677\">Classe 20 — Coeff. max (→ négociation)\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Durée hebdomadaire \u003Cspan id=\"sal-h-val\">35 h\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"sal-h\" min=\"17.5\" max=\"44\" 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      \u003Cdiv class=\"result-detail\" id=\"sal-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"grid-2\">\n      \u003Cdiv class=\"stat-box\">\n        \u003Cdiv class=\"stat-label\">Valeur du point (2025)\u003C\u002Fdiv>\n        \u003Cdiv class=\"stat-val\">67,78 €\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"stat-box\">\n        \u003Cdiv class=\"stat-label\">SMIC mensuel (ref. 2025)\u003C\u002Fdiv>\n        \u003Cdiv class=\"stat-val\">1 801,80 €\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════\n       TAB 4 : PRIME ANNUELLE \u002F 13E MOIS\n       ═══════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"prime-annuelle\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>La CCN impose un \u003Cstrong>13e mois obligatoire\u003C\u002Fstrong> versé en deux fois (50 % en juin, 50 % en décembre). S'y ajoutent une \u003Cstrong>prime d'ancienneté\u003C\u002Fstrong> (+3 % à 3 ans, +6 % à 6 ans, plafonnée à 15 %) et des majorations spécifiques. Aucune obligation équivalente dans le code du travail.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Paramètres\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire mensuel brut de base \u003Cspan id=\"pa-sal-val\">2 500 €\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pa-sal\" min=\"1200\" max=\"8000\" step=\"50\" value=\"2500\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté \u003Cspan id=\"pa-anc-val\">3 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"pa-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"3\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"toggle-row\">\n        \u003Clabel>Travail de nuit (garde)\u003C\u002Flabel>\n        \u003Clabel class=\"toggle\">\n          \u003Cinput type=\"checkbox\" id=\"pa-nuit\">\n          \u003Cspan class=\"toggle-slider\">\u003C\u002Fspan>\n        \u003C\u002Flabel>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"pa-result\">\n      \u003Cdiv class=\"result-label\">Primes annuelles estimées\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"pa-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"pa-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"pa-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════\n       TAB 5 : HEURES SUPPLÉMENTAIRES\n       ═══════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"heures-supp\">\n    \u003Cdiv class=\"warn-callout\">\n      \u003Ci data-lucide=\"alert-triangle\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>\u003Cstrong>Seuil conventionnel à 44 h\u002Fsemaine\u003C\u002Fstrong> (Avenant n°49, 21 fév. 2012, art. 5.1). Les heures entre 35 h et 44 h ne sont \u003Cstrong>pas des heures supplémentaires\u003C\u002Fstrong> dans cette CCN. La majoration de \u003Cstrong>+25 %\u003C\u002Fstrong> ne s'applique qu'au-delà de 44 h.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Paramètres\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire horaire brut \u003Cspan id=\"hs-sh-val\">14,30 €\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-sh\" min=\"10\" max=\"50\" step=\"0.10\" value=\"14.30\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Heures effectuées au-delà de 44 h\u002Fsemaine \u003Cspan id=\"hs-h-val\">4 h\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"hs-h\" min=\"0\" max=\"20\" step=\"1\" value=\"4\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel style=\"margin-bottom:0.5rem;\">Mode de compensation\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"hs-mode-pills\">\n          \u003Cdiv class=\"pill active\" data-val=\"pay\">Majoration en salaire (+25 %)\u003C\u002Fdiv>\n          \u003Cdiv class=\"pill\" data-val=\"rest\">Repos compensateur équivalent\u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"hs-result\">\n      \u003Cdiv class=\"result-label\">Compensation des heures supplémentaires\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"hs-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"hs-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"hs-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"grid-2\">\n      \u003Cdiv class=\"stat-box\">\n        \u003Cdiv class=\"stat-label\">Seuil CCN 1671\u003C\u002Fdiv>\n        \u003Cdiv class=\"stat-val\">44 h \u002F semaine\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"stat-box\">\n        \u003Cdiv class=\"stat-label\">Seuil code du travail\u003C\u002Fdiv>\n        \u003Cdiv class=\"stat-val\">35 h \u002F semaine\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════\n       TAB 6 : CONGÉS PAYÉS\n       ═══════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"panel\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>La CCN accorde les \u003Cstrong>30 jours ouvrables légaux\u003C\u002Fstrong> auxquels s'ajoutent des \u003Cstrong>jours d'ancienneté\u003C\u002Fstrong> : +1 jour dès 10 ans, puis +1 jour tous les 5 ans. Des jours supplémentaires sont prévus pour déménagement (2 jours tous les 3 ans).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"card-title\">Paramètres\u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté \u003Cspan id=\"cg-anc-val\">5 ans\u003C\u002Fspan>\u003C\u002Flabel>\n        \u003Cinput type=\"range\" id=\"cg-anc\" min=\"0\" max=\"35\" step=\"1\" value=\"5\">\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"toggle-row\">\n        \u003Clabel>Déménagement cette année\u003C\u002Flabel>\n        \u003Clabel class=\"toggle\">\n          \u003Cinput type=\"checkbox\" id=\"cg-dem\">\n          \u003Cspan class=\"toggle-slider\">\u003C\u002Fspan>\n        \u003C\u002Flabel>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"cg-result\">\n      \u003Cdiv class=\"result-label\">Droits à congés payés\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"cg-amount\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"cg-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-detail\" id=\"cg-detail\">\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Disclaimer partagé -->\n  \u003Cp class=\"disclaimer\">\n    \u003Ci data-lucide=\"shield-check\" style=\"width:12px;height:12px;vertical-align:middle;margin-right:4px;\">\u003C\u002Fi>\n    Calcul indicatif basé sur la CCN IDCC 1671 (maisons d'étudiants).\n    Sources : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635028\u002F\" target=\"_blank\" rel=\"noopener\">Legifrance\u003C\u002Fa> — Avenant n°49 (heures supp) — Avenant n°73 (salaires 2025).\n    Pour validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F\u002F ─── Formatters ────────────────────────────────────────\nconst fmtEur = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 0 }).format(v);\nconst fmtNum = v => new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 2 }).format(v);\n\n\u002F\u002F ─── State objects (one per tab) ───────────────────────\nconst stateInd = { sal: 2500, anc: 5, cp: 0, motif: 'personnel' };\nconst statePrev = { anc: 'lt6m', ini: 'emp' };\nconst stateSal = { classe: 455, h: 35 };\nconst statePa = { sal: 2500, anc: 3, nuit: false };\nconst stateHs = { sh: 14.30, h: 4, mode: 'pay' };\nconst stateCg = { anc: 5, dem: false };\n\n\u002F\u002F ─── Pill helper ───────────────────────────────────────\nfunction bindPills(groupId, stateObj, key, onChange) {\n  const pills = document.querySelectorAll('#' + groupId + ' .pill');\n  pills.forEach(p => p.addEventListener('click', () => {\n    pills.forEach(x => x.classList.remove('active'));\n    p.classList.add('active');\n    stateObj[key] = p.dataset.val;\n    onChange();\n  }));\n}\n\n\u002F\u002F ─── TAB 1: Indemnité ──────────────────────────────────\nfunction computeInd() {\n  const { sal, anc, cp, motif } = stateInd;\n  \u002F\u002F Effective ancienneté (congé parental compté à 100% déjà dans anc — on affiche juste le bonus contextuel)\n  const ancRef = anc;\n  let base = 0;\n  if (ancRef \u003C= 10) {\n    base = (sal \u002F 4) * ancRef;\n  } else {\n    base = (sal \u002F 4) * 10 + (sal \u002F 3) * (ancRef - 10);\n  }\n  document.getElementById('ind-amount').textContent = fmtEur(base);\n  document.getElementById('ind-sub').textContent = motif === 'economique' ? 'Licenciement économique — indemnité ≥ indemnité de départ à la retraite' : 'Licenciement pour motif personnel';\n  document.getElementById('ind-detail').innerHTML =\n    `\u003Cspan>Formule : 1\u002F4 mois × ${Math.min(ancRef, 10)} an(s) + 1\u002F3 mois × ${Math.max(0, ancRef - 10)} an(s)\u003C\u002Fspan>` +\n    (cp > 0 ? `\u003Cspan>Congé parental de ${cp} an(s) comptabilisé(s) à 100 % dans l'ancienneté\u003C\u002Fspan>` : '') +\n    `\u003Cspan>Salaire de référence : ${fmtEur(sal)}\u002Fmois\u003C\u002Fspan>`;\n}\n\ndocument.getElementById('ind-sal').addEventListener('input', e => {\n  stateInd.sal = +e.target.value;\n  document.getElementById('ind-sal-val').textContent = fmtEur(stateInd.sal);\n  computeInd();\n});\ndocument.getElementById('ind-anc').addEventListener('input', e => {\n  stateInd.anc = +e.target.value;\n  document.getElementById('ind-anc-val').textContent = stateInd.anc + ' an' + (stateInd.anc > 1 ? 's' : '');\n  computeInd();\n});\ndocument.getElementById('ind-cp').addEventListener('input', e => {\n  stateInd.cp = +e.target.value;\n  document.getElementById('ind-cp-val').textContent = stateInd.cp + ' an' + (stateInd.cp > 1 ? 's' : '');\n  computeInd();\n});\nbindPills('ind-motif-pills', stateInd, 'motif', computeInd);\n\n\u002F\u002F ─── TAB 2: Préavis ────────────────────────────────────\nfunction computePrev() {\n  const { anc, ini } = statePrev;\n  let duree = '', note = '';\n  if (anc === 'lt6m') { duree = '1 semaine'; note = 'Ancienneté \u003C 6 mois — délai fixé par la CCN'; }\n  else if (anc === '6m2a') { duree = '1 mois'; note = 'Ancienneté 6 mois à 2 ans — identique à L1234-1'; }\n  else { duree = '2 mois'; note = 'Ancienneté ≥ 2 ans — identique à L1234-1'; }\n  if (ini === 'sal') {\n    note += ' — préavis à l\\'initiative du salarié (démission) : mêmes durées conventionnellement';\n  }\n  document.getElementById('prev-amount').textContent = duree;\n  document.getElementById('prev-sub').textContent = note;\n  document.getElementById('prev-detail').innerHTML =\n    `\u003Cspan>Tranche CCN : ${anc === 'lt6m' ? '\u003C 6 mois → 1 semaine' : anc === '6m2a' ? '6 mois–2 ans → 1 mois' : '≥ 2 ans → 2 mois'}\u003C\u002Fspan>` +\n    `\u003Cspan>Référence : art. L1234-1 code du travail + CCN IDCC 1671\u003C\u002Fspan>`;\n}\nbindPills('prev-anc-pills', statePrev, 'anc', computePrev);\nbindPills('prev-ini-pills', statePrev, 'ini', computePrev);\n\n\u002F\u002F ─── TAB 3: Salaire minimum ────────────────────────────\n\u002F\u002F Point value 2025: 67.78€, 20 classes — coeff pairs\nconst grilleSalaires = [\n  [333, 'Classe 1'], [340, 'Classe 2'], [347, 'Classe 3'], [357, 'Classe 4'],\n  [369, 'Classe 5'], [383, 'Classe 6'], [398, 'Classe 7'], [415, 'Classe 8'],\n  [434, 'Classe 9'], [455, 'Classe 10'], [478, 'Classe 11'], [503, 'Classe 12'],\n  [530, 'Classe 13'], [560, 'Classe 14'], [592, 'Classe 15'], [626, 'Classe 16'],\n  [662, 'Classe 17'], [677, 'Classe 18'],\n];\nconst POINT_VAL = 67.78;\nconst SMIC_MONTHLY = 1801.80;\n\ndocument.getElementById('sal-classe').addEventListener('change', e => {\n  stateSal.classe = +e.target.value;\n  computeSal();\n});\ndocument.getElementById('sal-h').addEventListener('input', e => {\n  stateSal.h = +e.target.value;\n  document.getElementById('sal-h-val').textContent = fmtNum(stateSal.h) + ' h';\n  computeSal();\n});\n\nfunction computeSal() {\n  const coeffVal = stateSal.classe;\n  const annuel = coeffVal * POINT_VAL;\n  const mensuel = annuel \u002F 12;\n  const horaire = mensuel \u002F (stateSal.h * 52 \u002F 12);\n  const prorata = (stateSal.h \u002F 35) * mensuel;\n  document.getElementById('sal-amount').textContent = fmtEur(prorata) + ' \u002Fmois';\n  document.getElementById('sal-sub').textContent = `Salaire annuel : ${fmtEur(annuel)} — base ${fmtNum(stateSal.h)} h\u002Fsem`;\n  document.getElementById('sal-detail').innerHTML =\n    `\u003Cspan>Coefficient ${coeffVal} × valeur du point ${fmtNum(POINT_VAL)} € = ${fmtEur(annuel)}\u002Fan\u003C\u002Fspan>` +\n    `\u003Cspan>Soit ${fmtEur(mensuel)}\u002Fmois (base 35 h) — proratisé : ${fmtEur(prorata)}\u002Fmois\u003C\u002Fspan>` +\n    `\u003Cspan>SMIC mensuel ref. 2025 : ${fmtEur(SMIC_MONTHLY)} — écart : +${fmtEur(prorata - SMIC_MONTHLY)}\u003C\u002Fspan>`;\n}\n\n\u002F\u002F ─── TAB 4: Prime annuelle \u002F 13e mois ──────────────────\ndocument.getElementById('pa-sal').addEventListener('input', e => {\n  statePa.sal = +e.target.value;\n  document.getElementById('pa-sal-val').textContent = fmtEur(statePa.sal);\n  computePa();\n});\ndocument.getElementById('pa-anc').addEventListener('input', e => {\n  statePa.anc = +e.target.value;\n  document.getElementById('pa-anc-val').textContent = statePa.anc + ' an' + (statePa.anc > 1 ? 's' : '');\n  computePa();\n});\ndocument.getElementById('pa-nuit').addEventListener('change', e => {\n  statePa.nuit = e.target.checked;\n  computePa();\n});\n\nfunction computePa() {\n  const { sal, anc, nuit } = statePa;\n  \u002F\u002F Prime ancienneté : +3% à 3 ans, +6% à 6 ans, plafond 15%\n  let tauxAnc = 0;\n  if (anc >= 3 && anc \u003C 6) tauxAnc = 0.03;\n  else if (anc >= 6 && anc \u003C 9) tauxAnc = 0.06;\n  else if (anc >= 9 && anc \u003C 12) tauxAnc = 0.09;\n  else if (anc >= 12 && anc \u003C 15) tauxAnc = 0.12;\n  else if (anc >= 15) tauxAnc = 0.15;\n\n  const treizieme = sal; \u002F\u002F = 1 mois de salaire\n  const primeAnc = sal * tauxAnc;\n  const nuitMaj = nuit ? sal * 0.25 : 0; \u002F\u002F +25% pour garde de nuit\n  const total = treizieme + primeAnc + (nuit ? nuitMaj * 12 : 0);\n\n  document.getElementById('pa-amount').textContent = fmtEur(treizieme + primeAnc);\n  document.getElementById('pa-sub').textContent = '13e mois (juin 50 % + déc. 50 %) + prime ancienneté';\n  document.getElementById('pa-detail').innerHTML =\n    `\u003Cspan>13e mois : ${fmtEur(treizieme)} (= 1 mois de salaire)\u003C\u002Fspan>` +\n    `\u003Cspan>Prime ancienneté (${(tauxAnc * 100).toFixed(0)} %) : ${fmtEur(primeAnc)}\u003C\u002Fspan>` +\n    (nuit ? `\u003Cspan>Majoration nuit estimée : +25 % sur le salaire horaire de nuit\u003C\u002Fspan>` : '') +\n    `\u003Cspan>Versement : ${fmtEur(treizieme \u002F 2)} en juin + ${fmtEur(treizieme \u002F 2)} en décembre\u003C\u002Fspan>`;\n}\n\n\u002F\u002F ─── TAB 5: Heures supplémentaires ─────────────────────\ndocument.getElementById('hs-sh').addEventListener('input', e => {\n  stateHs.sh = +e.target.value;\n  document.getElementById('hs-sh-val').textContent = fmtNum(stateHs.sh) + ' €';\n  computeHs();\n});\ndocument.getElementById('hs-h').addEventListener('input', e => {\n  stateHs.h = +e.target.value;\n  document.getElementById('hs-h-val').textContent = stateHs.h + ' h';\n  computeHs();\n});\nbindPills('hs-mode-pills', stateHs, 'mode', computeHs);\n\nfunction computeHs() {\n  const { sh, h, mode } = stateHs;\n  const majoration = 0.25;\n  const hsComp = sh * (1 + majoration);\n  const totalSemaine = h * hsComp;\n\n  if (mode === 'pay') {\n    document.getElementById('hs-amount').textContent = fmtEur(totalSemaine) + ' \u002Fsem.';\n    document.getElementById('hs-sub').textContent = `${h} h × ${fmtNum(hsComp)} € (majoration +25 %) = ${fmtEur(totalSemaine)}\u002Fsemaine`;\n    document.getElementById('hs-detail').innerHTML =\n      `\u003Cspan>Seuil déclencheur CCN : 44 h\u002Fsemaine (art. 5.1 avenant n°49)\u003C\u002Fspan>` +\n      `\u003Cspan>Majoration conventionnelle : +25 % (identique au code du travail pour les heures ≥ 44 h)\u003C\u002Fspan>` +\n      `\u003Cspan>Salaire horaire de base : ${fmtNum(sh)} € → heure supp. : ${fmtNum(hsComp)} €\u003C\u002Fspan>` +\n      `\u003Cspan>Contingent annuel : 220 h\u003C\u002Fspan>`;\n  } else {\n    const repos = h * 1.25; \u002F\u002F +25% inclus\n    document.getElementById('hs-amount').textContent = fmtNum(repos) + ' h de repos';\n    document.getElementById('hs-sub').textContent = `Repos compensateur de remplacement (${fmtNum(repos)} h = ${h} h × 1,25)`;\n    document.getElementById('hs-detail').innerHTML =\n      `\u003Cspan>Seuil déclencheur CCN : 44 h\u002Fsemaine\u003C\u002Fspan>` +\n      `\u003Cspan>Repos = heures effectuées × 1,25 (majoration incluse)\u003C\u002Fspan>` +\n      `\u003Cspan>Mode choisi : repos en lieu et place du paiement\u003C\u002Fspan>`;\n  }\n}\n\n\u002F\u002F ─── TAB 6: Congés payés ───────────────────────────────\ndocument.getElementById('cg-anc').addEventListener('input', e => {\n  stateCg.anc = +e.target.value;\n  document.getElementById('cg-anc-val').textContent = stateCg.anc + ' an' + (stateCg.anc > 1 ? 's' : '');\n  computeCg();\n});\ndocument.getElementById('cg-dem').addEventListener('change', e => {\n  stateCg.dem = e.target.checked;\n  computeCg();\n});\n\nfunction computeCg() {\n  const { anc, dem } = stateCg;\n  const base = 30; \u002F\u002F jours ouvrables légaux\n  \u002F\u002F +1j à 10 ans, +1j tous les 5 ans : 10→+1, 15→+2, 20→+3, 25→+4, 30→+5\n  let jAnc = 0;\n  if (anc >= 10) jAnc = 1 + Math.floor((anc - 10) \u002F 5);\n  const jDem = dem ? 2 : 0;\n  const total = base + jAnc + jDem;\n\n  document.getElementById('cg-amount').textContent = total + ' jours ouvrables';\n  document.getElementById('cg-sub').textContent = `= ${(total \u002F 6).toFixed(1)} semaines de congés`;\n  document.getElementById('cg-detail').innerHTML =\n    `\u003Cspan>Base légale : 30 jours ouvrables\u003C\u002Fspan>` +\n    `\u003Cspan>Jours d'ancienneté (CCN) : +${jAnc} jour(s) ${anc >= 10 ? `(${anc} ans)` : '(seuil à 10 ans)'}\u003C\u002Fspan>` +\n    (dem ? `\u003Cspan>Déménagement (tous les 3 ans) : +2 jours\u003C\u002Fspan>` : '') +\n    `\u003Cspan>Total : ${total} jours ouvrables \u002F an\u003C\u002Fspan>`;\n}\n\n\u002F\u002F ─── TAB SYSTEM ────────────────────────────────────────\nconst tabs = document.querySelectorAll('[data-tab]');\nconst panels = document.querySelectorAll('[data-panel]');\n\nfunction activate(id) {\n  tabs.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n  panels.forEach(p => {\n    const isActive = p.dataset.panel === id;\n    p.classList.toggle('active', isActive);\n  });\n  if (location.hash !== '#' + id) location.hash = id;\n  requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));\n}\n\ntabs.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\nconst hashTab = location.hash.slice(1);\nconst firstTab = tabs[0] && tabs[0].dataset.tab;\nconst validHash = document.querySelector(`[data-tab=\"${hashTab}\"]`) ? hashTab : firstTab;\nactivate(validHash);\n\n\u002F\u002F ─── Initial compute ───────────────────────────────────\ncomputeInd();\ncomputePrev();\ncomputeSal();\ncomputePa();\ncomputeHs();\ncomputeCg();\n\n\u002F\u002F ─── Icons ─────────────────────────────────────────────\ndocument.addEventListener('DOMContentLoaded', () => lucide.createIcons());\nlucide.createIcons();\n\n\u002F\u002F ─── Iframe resize contract ────────────────────────────\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-maisons-d-etudiants-19304544e2.webp",[]]