[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-banques-fr":83,"footer-cities-fr":141},[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":110,"tool_html":135,"source":136,"category":137,"audience":138,"publish_mode":139,"hero_image":140,"hero_image_alt":85},"ccn-banques","CCN de la Banque — calculateur complet","Calculateur CCN Banque IDCC 2120 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté et la période d'essai de la CCN de la Banque (IDCC 2120).","Ce calculateur multi-fonctions couvre les 5 principaux avantages conventionnels de la CCN de la Banque (IDCC 2120) : indemnité de licenciement (mensualité 1\u002F13, semestres complets, plafond 15 mensualités), durée du préavis (techniciens 1-2 mois, cadres 3 mois + 2h\u002Fj recherche emploi), grille salariale (niveaux A à K), prime d'ancienneté (3%-12%) et période d'essai (techniciens 3 mois, cadres 6 mois).",[90],{"name":91,"@type":92,"about":93,"author":98,"@context":101,"isPartOf":102,"inLanguage":105,"description":106,"operatingSystem":107,"applicationCategory":108,"isAccessibleForFree":109},"Calculateur CCN de la Banque — IDCC 2120","WebApplication",{"name":94,"@type":95,"identifier":96,"alternateName":97},"Convention collective nationale de la banque","Thing","IDCC 2120","Brochure JO 3161",{"name":99,"@type":100},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":103,"@type":104},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté et la période d'essai de la convention collective de la banque (IDCC 2120, brochure 3161)","All","FinanceApplication",true,[111,114,117,120,123,126,129,132],{"a":112,"q":113},"La CCN de la banque (IDCC 2120) utilise une mensualité de référence égale à 1\u002F13 du salaire annuel brut (et non 1\u002F12). Pour les salariés embauchés depuis le 1er janvier 2002, l'indemnité est de 1\u002F5 de mensualité par semestre complet d'ancienneté, plafonnée à 15 mensualités.","Comment est calculée l'indemnité de licenciement dans la convention collective de la banque ?",{"a":115,"q":116},"Selon la CCN banque (IDCC 2120), la durée du préavis est : 1 mois pour les techniciens ayant moins de 2 ans d'ancienneté, 2 mois pour les techniciens avec 2 ans ou plus, et 3 mois pour les cadres quelle que soit leur ancienneté. De plus, la convention prévoit 2 heures par jour d'heures de recherche d'emploi rémunérées, un avantage sans équivalent légal.","Quelle est la durée du préavis en cas de licenciement dans la banque ?",{"a":118,"q":119},"La CCN banque définit une grille de 11 niveaux (A à K). Le niveau A (technicien débutant) démarre autour de 24 200 € bruts annuels, soit environ 1 862 € bruts mensuels (base 1\u002F13). Les cadres (niveaux H à K) bénéficient de minima dépassant 46 000 € annuels. Ces montants sont significativement au-dessus du SMIC.","Quels sont les salaires minima de la convention collective banque en 2026 ?",{"a":121,"q":122},"Oui, la CCN banque impose une prime d'ancienneté progressive : 3 % du salaire de base après 3 ans, 6 % après 6 ans, 9 % après 9 ans, et 12 % après 15 ans. Aucune prime d'ancienneté n'est prévue par le seul code du travail — c'est un avantage exclusivement conventionnel.","La convention collective de la banque prévoit-elle une prime d'ancienneté ?",{"a":124,"q":125},"La CCN banque prévoit des périodes d'essai supérieures aux minima légaux : 3 mois pour les techniciens des métiers de la banque (vs 2 mois légaux), renouvelables une fois pour 3 mois supplémentaires. Les cadres ont une période d'essai de 6 mois (vs 4 mois légaux), pouvant être prolongée jusqu'à 9 mois maximum.","Quelle est la période d'essai dans la convention collective de la banque ?",{"a":127,"q":128},"Pour les salariés embauchés depuis le 1er janvier 2000, le plafond est de 15 mensualités conventionnelles (1 mensualité = 1\u002F13 du salaire annuel brut). Pour les embauches antérieures au 31 décembre 1999, le plafond est de 24 × (13\u002F14,5) mensualités pour les cadres et 18 × (13\u002F14,5) mensualités pour les techniciens.","Quel est le plafond de l'indemnité de licenciement pour la CCN banque ?",{"a":130,"q":131},"Dans la plupart des cas, oui. La mensualité de base calculée sur 1\u002F13 du salaire annuel, combinée au calcul par semestres complets, peut donner un résultat plus favorable que le barème légal (1\u002F4 mois × années ≤ 10 ans, puis 1\u002F3 mois × années > 10 ans). En tout état de cause, c'est le montant le plus élevé qui s'applique.","La CCN banque est-elle plus favorable que le code du travail pour l'indemnité de licenciement ?",{"a":133,"q":134},"La CCN banque organise la durée du travail sur une base annuelle de 1 600 heures. Les heures supplémentaires sont soumises aux majorations légales (25 % ou 50 %). En cas de travail un jour férié, une majoration de 30 % s'applique en plus de la rémunération habituelle.","La convention collective de la banque couvre-t-elle les heures supplémentaires ?","\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 Banque — IDCC 2120\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n    :root {\n      --bg: #fafaf9;\n      --surface: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #eff6ff;\n      --accent-border: #bfdbfe;\n      --text: #1c1917;\n      --text-muted: #78716c;\n      --success-bg: #f0fdf4;\n      --success-border: #bbf7d0;\n      --success-text: #15803d;\n      --warning-bg: #fffbeb;\n      --warning-border: #fde68a;\n      --warning-text: #92400e;\n      --radius: 0.75rem;\n      --shadow: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.06);\n    }\n\n    body {\n      font-family: system-ui, -apple-system, sans-serif;\n      background: var(--bg);\n      color: var(--text);\n      font-size: 15px;\n      line-height: 1.5;\n      padding: 1rem;\n    }\n\n    .tool-root { max-width: 680px; margin: 0 auto; }\n\n    \u002F* Header *\u002F\n    .header {\n      display: flex;\n      align-items: flex-start;\n      justify-content: space-between;\n      gap: 1rem;\n      margin-bottom: 1.25rem;\n      padding-bottom: 1rem;\n      border-bottom: 2px solid var(--accent);\n    }\n    .header-title { font-size: 1.2rem; font-weight: 700; color: var(--text); }\n    .header-sub { font-size: 0.8rem; color: var(--text-muted); margin-top: 2px; }\n    .idcc-badge {\n      flex-shrink: 0;\n      background: var(--accent);\n      color: #fff;\n      font-size: 0.72rem;\n      font-weight: 700;\n      padding: 0.25rem 0.6rem;\n      border-radius: 99px;\n      letter-spacing: 0.04em;\n      white-space: nowrap;\n    }\n\n    \u002F* Tabs *\u002F\n    .tabs {\n      display: flex;\n      gap: 0.25rem;\n      flex-wrap: wrap;\n      margin-bottom: 1.25rem;\n      border-bottom: 2px solid var(--border);\n      padding-bottom: 0;\n    }\n    .tab-btn {\n      display: flex;\n      align-items: center;\n      gap: 0.35rem;\n      padding: 0.5rem 0.85rem;\n      border: none;\n      background: none;\n      cursor: pointer;\n      font-size: 0.85rem;\n      font-weight: 500;\n      color: var(--text-muted);\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      border-radius: var(--radius) var(--radius) 0 0;\n      transition: all 0.15s ease;\n    }\n    .tab-btn:hover { color: var(--accent); background: var(--accent-light); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); background: var(--accent-light); }\n\n    \u002F* Panel *\u002F\n    .panel { display: none; }\n    .panel.active { display: block; animation: fadeIn 0.15s ease; }\n    @keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }\n\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      display: flex;\n      gap: 0.65rem;\n      align-items: flex-start;\n      background: var(--accent-light);\n      border: 1px solid var(--accent-border);\n      border-radius: var(--radius);\n      padding: 0.85rem 1rem;\n      margin-bottom: 1.25rem;\n      font-size: 0.88rem;\n      color: #1e40af;\n    }\n    .rule-callout svg { flex-shrink: 0; margin-top: 1px; }\n\n    \u002F* Form *\u002F\n    .form-grid { display: grid; gap: 1rem; }\n    .field label {\n      display: block;\n      font-size: 0.82rem;\n      font-weight: 600;\n      color: var(--text-muted);\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n      margin-bottom: 0.4rem;\n    }\n    .field-row { display: flex; align-items: center; gap: 0.75rem; }\n    .field-row input[type=\"range\"] { flex: 1; accent-color: var(--accent); }\n    .field-val {\n      min-width: 80px;\n      text-align: right;\n      font-weight: 700;\n      font-variant-numeric: tabular-nums;\n      color: var(--text);\n      font-size: 0.95rem;\n    }\n\n    \u002F* Pill group *\u002F\n    .pills { display: flex; flex-wrap: wrap; gap: 0.4rem; }\n    .pill {\n      padding: 0.35rem 0.75rem;\n      border: 1.5px solid var(--border);\n      border-radius: 99px;\n      font-size: 0.82rem;\n      font-weight: 500;\n      cursor: pointer;\n      background: var(--surface);\n      transition: all 0.15s;\n      color: var(--text);\n    }\n    .pill:hover { border-color: var(--accent); color: var(--accent); }\n    .pill.active { border-color: var(--accent); background: var(--accent); color: #fff; }\n\n    \u002F* Select *\u002F\n    .styled-select {\n      width: 100%;\n      padding: 0.55rem 0.75rem;\n      border: 1.5px solid var(--border);\n      border-radius: 0.5rem;\n      background: var(--surface);\n      font-size: 0.9rem;\n      color: var(--text);\n      cursor: pointer;\n      outline: none;\n    }\n    .styled-select:focus { border-color: var(--accent); }\n\n    \u002F* Toggle *\u002F\n    .toggle-wrap { display: flex; align-items: center; gap: 0.75rem; font-size: 0.9rem; }\n    .toggle {\n      position: relative;\n      width: 42px;\n      height: 24px;\n      flex-shrink: 0;\n    }\n    .toggle input { opacity: 0; width: 0; height: 0; }\n    .slider-toggle {\n      position: absolute; inset: 0;\n      background: var(--border);\n      border-radius: 99px;\n      cursor: pointer;\n      transition: 0.2s;\n    }\n    .slider-toggle::before {\n      content: '';\n      position: absolute;\n      width: 18px; height: 18px;\n      left: 3px; bottom: 3px;\n      background: white;\n      border-radius: 50%;\n      transition: 0.2s;\n    }\n    .toggle input:checked + .slider-toggle { background: var(--accent); }\n    .toggle input:checked + .slider-toggle::before { transform: translateX(18px); }\n\n    \u002F* Result card *\u002F\n    .result-card {\n      background: var(--success-bg);\n      border: 1.5px solid var(--success-border);\n      border-radius: var(--radius);\n      padding: 1rem 1.25rem;\n      margin-top: 1.25rem;\n      display: flex;\n      align-items: center;\n      gap: 0.75rem;\n    }\n    .result-card svg { color: var(--success-text); flex-shrink: 0; }\n    .result-label { font-size: 0.82rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; color: var(--success-text); }\n    .result-value {\n      font-size: 1.6rem;\n      font-weight: 800;\n      font-variant-numeric: tabular-nums;\n      color: var(--success-text);\n      line-height: 1.1;\n    }\n    .result-sub { font-size: 0.78rem; color: var(--success-text); opacity: 0.75; margin-top: 1px; }\n\n    \u002F* Info boxes *\u002F\n    .info-box {\n      background: var(--warning-bg);\n      border: 1px solid var(--warning-border);\n      border-radius: 0.5rem;\n      padding: 0.65rem 0.85rem;\n      font-size: 0.82rem;\n      color: var(--warning-text);\n      margin-top: 0.75rem;\n    }\n\n    \u002F* Grid table *\u002F\n    .salary-table { width: 100%; border-collapse: collapse; font-size: 0.85rem; }\n    .salary-table th {\n      background: var(--accent-light);\n      color: var(--accent);\n      font-weight: 700;\n      padding: 0.45rem 0.75rem;\n      text-align: left;\n      font-size: 0.78rem;\n      text-transform: uppercase;\n      letter-spacing: 0.04em;\n    }\n    .salary-table td {\n      padding: 0.45rem 0.75rem;\n      border-bottom: 1px solid var(--border);\n      font-variant-numeric: tabular-nums;\n    }\n    .salary-table tr:last-child td { border-bottom: none; }\n    .salary-table tr:hover td { background: var(--accent-light); }\n    .salary-table .highlight td { font-weight: 700; background: var(--accent-light); color: var(--accent); }\n\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      margin-top: 1.5rem;\n      padding-top: 1rem;\n      border-top: 1px solid var(--border);\n      font-size: 0.78rem;\n      color: var(--text-muted);\n      line-height: 1.6;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 2120 — deviations from code du travail:\n     indemnite:      base = 1\u002F13 salaire annuel (≠ L1234-9 1\u002F12) ; calcul par semestre ; cap 15 mensualités post-2000\n     preavis:        technicien ≥2ans = 2 mois (> L1234-1 1 mois) ; cadre = 3 mois flat ; + 2h\u002Fj heures recherche emploi\n     prime-anciennete: 3%\u002F3ans 6%\u002F6ans 9%\u002F9ans 12%\u002F15ans — aucune obligation légale baseline\n     salaire-min:    grille de A à K bien au-dessus du SMIC\n     duree-essai:    technicien 3 mois (vs 2 mois légal), cadre 6 mois (vs 4 mois légal)\n     (source: Legifrance KALICONT000005635780, code.travail.gouv.fr, legisocial.fr)\n-->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"header\">\n    \u003Cdiv>\n      \u003Cdiv class=\"header-title\">Convention collective de la Banque\u003C\u002Fdiv>\n      \u003Cdiv class=\"header-sub\">Calculateur multi-fonctions — 5 outils en un\u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cspan class=\"idcc-badge\">IDCC 2120\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\n  \u003C!-- TABS -->\n  \u003Cdiv class=\"tabs\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"calculator\" style=\"width:15px;height:15px;\">\u003C\u002Fi> Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\n      \u003Ci data-lucide=\"clock\" style=\"width:15px;height:15px;\">\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:15px;height:15px;\">\u003C\u002Fi> Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-anciennete\" role=\"tab\">\n      \u003Ci data-lucide=\"trending-up\" style=\"width:15px;height:15px;\">\u003C\u002Fi> Ancienneté\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"duree-essai\" role=\"tab\">\n      \u003Ci data-lucide=\"calendar-check\" style=\"width:15px;height:15px;\">\u003C\u002Fi> Période d'essai\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== TAB 1 : INDEMNITÉ ===== -->\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>\u003Cstrong>CCN Banque :\u003C\u002Fstrong> la mensualité de référence est 1\u002F13 du salaire annuel brut (et non 1\u002F12). L'indemnité est calculée par semestre complet d'ancienneté, avec un plafond de 15 mensualités pour les embauches depuis le 1\u003Csup>er\u003C\u002Fsup> janvier 2000 — généralement plus favorable que le barème légal L1234-9.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire de base annuel brut\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"20000\" max=\"150000\" step=\"500\" value=\"42000\">\n          \u003Cspan class=\"field-val\" id=\"ind-salaire-val\">42 000 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années complètes)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"ind-anciennete\" min=\"1\" max=\"30\" step=\"1\" value=\"8\">\n          \u003Cspan class=\"field-val\" id=\"ind-anciennete-val\">8 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Date d'embauche\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-embauche-pills\">\n          \u003Cspan class=\"pill\" data-val=\"avant2000\">Avant le 1\u002F01\u002F2000\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"2000a2001\">2000–2001\u003C\u002Fspan>\n          \u003Cspan class=\"pill active\" data-val=\"depuis2002\">Depuis 2002\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Catégorie\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-categorie-pills\">\n          \u003Cspan class=\"pill active\" data-val=\"technicien\">Technicien\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"ind-result\">\n      \u003Ci data-lucide=\"euro\" style=\"width:28px;height:28px;\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Indemnité de licenciement estimée\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"ind-result-val\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"ind-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"info-box\" id=\"ind-info-box\" style=\"display:none;\">\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== TAB 2 : PRÉAVIS ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>\u003Cstrong>CCN Banque :\u003C\u002Fstrong> les techniciens avec ≥ 2 ans d'ancienneté bénéficient de 2 mois de préavis (vs 1 mois légal pour &lt; 10 ans). Les cadres ont toujours 3 mois, quelle que soit l'ancienneté. La CCN impose également 2 h\u002Fjour d'heures de recherche d'emploi rémunérées (inexistantes dans le code du travail).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pre-statut-pills\">\n          \u003Cspan class=\"pill active\" data-val=\"technicien\">Technicien\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"pre-anciennete\" min=\"0\" max=\"40\" step=\"1\" value=\"5\">\n          \u003Cspan class=\"field-val\" id=\"pre-anciennete-val\">5 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Type de rupture\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pre-rupture-pills\">\n          \u003Cspan class=\"pill active\" data-val=\"licenciement\">Licenciement\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"demission\">Démission\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"pre-result\">\n      \u003Ci data-lucide=\"clock\" style=\"width:28px;height:28px;\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Durée du préavis\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"pre-result-val\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"pre-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"info-box\" id=\"pre-hre-box\" style=\"margin-top:0.75rem; display:none;\">\u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== TAB 3 : GRILLE SALARIALE ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>\u003Cstrong>CCN Banque :\u003C\u002Fstrong> la convention publie une grille de 11 niveaux (A à K) avec des salaires minima conventionnels annuels garantis nettement au-dessus du SMIC. Les niveaux H à K correspondent aux cadres.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Niveau de classification\u003C\u002Flabel>\n        \u003Cselect class=\"styled-select\" id=\"sal-niveau\">\n          \u003Coption value=\"A\">A — Niveau 1 (entrée technicien)\u003C\u002Foption>\n          \u003Coption value=\"B\">B — Niveau 2\u003C\u002Foption>\n          \u003Coption value=\"C\">C — Niveau 3\u003C\u002Foption>\n          \u003Coption value=\"D\">D — Niveau 4\u003C\u002Foption>\n          \u003Coption value=\"E\">E — Niveau 5\u003C\u002Foption>\n          \u003Coption value=\"F\">F — Niveau 6\u003C\u002Foption>\n          \u003Coption value=\"G\">G — Niveau 7 (technicien confirmé)\u003C\u002Foption>\n          \u003Coption value=\"H\">H — Niveau 8 (cadre)\u003C\u002Foption>\n          \u003Coption value=\"I\">I — Niveau 9 (cadre)\u003C\u002Foption>\n          \u003Coption value=\"J\">J — Niveau 10 (cadre)\u003C\u002Foption>\n          \u003Coption value=\"K\">K — Niveau 11 (cadre supérieur)\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté dans le niveau (années)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"sal-anciennete\" min=\"0\" max=\"25\" step=\"5\" value=\"0\">\n          \u003Cspan class=\"field-val\" id=\"sal-anciennete-val\">0 an\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Ci data-lucide=\"trending-up\" style=\"width:28px;height:28px;\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Salaire minimum conventionnel\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"sal-result-val\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"sal-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv style=\"margin-top:1.25rem; overflow-x:auto;\">\n      \u003Ctable class=\"salary-table\" id=\"sal-table\">\n        \u003Cthead>\n          \u003Ctr>\n            \u003Cth>Niveau\u003C\u002Fth>\n            \u003Cth>Catégorie\u003C\u002Fth>\n            \u003Cth>Min. annuel (sans ancienneté)\u003C\u002Fth>\n            \u003Cth>Min. mensuel\u003C\u002Fth>\n          \u003C\u002Ftr>\n        \u003C\u002Fthead>\n        \u003Ctbody id=\"sal-tbody\">\u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== TAB 4 : PRIME ANCIENNETÉ ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"prime-anciennete\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>\u003Cstrong>CCN Banque :\u003C\u002Fstrong> la convention impose une prime d'ancienneté progressive : 3 % à 3 ans, 6 % à 6 ans, 9 % à 9 ans, 12 % à 15 ans. Aucune prime d'ancienneté n'est prévue par le code du travail — c'est un avantage conventionnel.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire de base mensuel brut\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"pa-salaire\" min=\"1800\" max=\"12000\" step=\"50\" value=\"3200\">\n          \u003Cspan class=\"field-val\" id=\"pa-salaire-val\">3 200 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"pa-anciennete\" min=\"0\" max=\"30\" step=\"1\" value=\"6\">\n          \u003Cspan class=\"field-val\" id=\"pa-anciennete-val\">6 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"pa-result\">\n      \u003Ci data-lucide=\"gift\" style=\"width:28px;height:28px;\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Prime d'ancienneté mensuelle\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"pa-result-val\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"pa-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv style=\"margin-top:1rem; background:var(--surface); border:1px solid var(--border); border-radius:var(--radius); overflow:hidden;\">\n      \u003Ctable class=\"salary-table\">\n        \u003Cthead>\n          \u003Ctr>\u003Cth>Ancienneté\u003C\u002Fth>\u003Cth>Taux\u003C\u002Fth>\u003Cth>Avantage vs base légale\u003C\u002Fth>\u003C\u002Ftr>\n        \u003C\u002Fthead>\n        \u003Ctbody>\n          \u003Ctr>\u003Ctd>&lt; 3 ans\u003C\u002Ftd>\u003Ctd>0 %\u003C\u002Ftd>\u003Ctd>—\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>3 à 5 ans\u003C\u002Ftd>\u003Ctd>3 %\u003C\u002Ftd>\u003Ctd>+3% non prévu par la loi\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>6 à 8 ans\u003C\u002Ftd>\u003Ctd>6 %\u003C\u002Ftd>\u003Ctd>+6% non prévu par la loi\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>9 à 14 ans\u003C\u002Ftd>\u003Ctd>9 %\u003C\u002Ftd>\u003Ctd>+9% non prévu par la loi\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>≥ 15 ans\u003C\u002Ftd>\u003Ctd>12 %\u003C\u002Ftd>\u003Ctd>+12% non prévu par la loi\u003C\u002Ftd>\u003C\u002Ftr>\n        \u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== TAB 5 : PÉRIODE ESSAI ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"duree-essai\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\" style=\"width:16px;height:16px;\">\u003C\u002Fi>\n      \u003Cp>\u003Cstrong>CCN Banque :\u003C\u002Fstrong> les durées légales d'essai sont majorées par la convention. Techniciens : 3 mois (vs 2 mois légaux), renouvelables 1 fois 3 mois. Cadres : 6 mois (vs 4 mois légaux), renouvelables jusqu'à 9 mois.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-grid\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Statut\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"essai-statut-pills\">\n          \u003Cspan class=\"pill active\" data-val=\"technicien\">Technicien des métiers de la banque\u003C\u002Fspan>\n          \u003Cspan class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Renouvellement envisagé ?\u003C\u002Flabel>\n        \u003Cdiv class=\"toggle-wrap\">\n          \u003Clabel class=\"toggle\">\n            \u003Cinput type=\"checkbox\" id=\"essai-renouvellement\">\n            \u003Cspan class=\"slider-toggle\">\u003C\u002Fspan>\n          \u003C\u002Flabel>\n          \u003Cspan id=\"essai-renouvellement-label\">Non\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\">\n      \u003Ci data-lucide=\"calendar-check\" style=\"width:28px;height:28px;\">\u003C\u002Fi>\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">Durée de la période d'essai\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"essai-result-val\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-sub\" id=\"essai-result-sub\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv style=\"margin-top:1rem; background:var(--surface); border:1px solid var(--border); border-radius:var(--radius); overflow:hidden;\">\n      \u003Ctable class=\"salary-table\">\n        \u003Cthead>\n          \u003Ctr>\u003Cth>Statut\u003C\u002Fth>\u003Cth>Initiale CCN\u003C\u002Fth>\u003Cth>Avec renouvellement\u003C\u002Fth>\u003Cth>Légal (initial)\u003C\u002Fth>\u003C\u002Ftr>\n        \u003C\u002Fthead>\n        \u003Ctbody>\n          \u003Ctr>\n            \u003Ctd>Technicien (CDI)\u003C\u002Ftd>\n            \u003Ctd>3 mois\u003C\u002Ftd>\n            \u003Ctd>6 mois max\u003C\u002Ftd>\n            \u003Ctd>2 mois\u003C\u002Ftd>\n          \u003C\u002Ftr>\n          \u003Ctr>\n            \u003Ctd>Cadre (CDI)\u003C\u002Ftd>\n            \u003Ctd>6 mois\u003C\u002Ftd>\n            \u003Ctd>9 mois max\u003C\u002Ftd>\n            \u003Ctd>4 mois\u003C\u002Ftd>\n          \u003C\u002Ftr>\n        \u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- DISCLAIMER -->\n  \u003Cp class=\"disclaimer\">\n    \u003Ci data-lucide=\"shield-alert\" style=\"width:13px;height:13px;vertical-align:middle;margin-right:4px;\">\u003C\u002Fi>\n    Calcul indicatif basé sur la CCN IDCC 2120 (Brochure n° 3161).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635780\u002F\" target=\"_blank\" rel=\"noopener\">Légifrance\u003C\u002Fa> •\n    \u003Ca href=\"https:\u002F\u002Fcode.travail.gouv.fr\u002Fconvention-collective\u002F2120-banque\" target=\"_blank\" rel=\"noopener\">Code du travail numérique\u003C\u002Fa>.\n    Pour validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n\u002F\u002F ============================================================\n\u002F\u002F DATA\n\u002F\u002F ============================================================\nconst SALARY_GRID = [\n  { level:'A', cat:'Technicien', annual: 24200 },\n  { level:'B', cat:'Technicien', annual: 25500 },\n  { level:'C', cat:'Technicien', annual: 27000 },\n  { level:'D', cat:'Technicien', annual: 29500 },\n  { level:'E', cat:'Technicien', annual: 32500 },\n  { level:'F', cat:'Technicien', annual: 36000 },\n  { level:'G', cat:'Technicien confirmé', annual: 40500 },\n  { level:'H', cat:'Cadre', annual: 46000 },\n  { level:'I', cat:'Cadre', annual: 54000 },\n  { level:'J', cat:'Cadre', annual: 65000 },\n  { level:'K', cat:'Cadre supérieur', annual: 80000 },\n];\n\u002F\u002F Seniority bonus on annual salary: 5 yr slabs → +2%, per 5-yr group above 0\nconst SENIOR_BONUS_ANNUAL = [0, 0.02, 0.04, 0.06, 0.08, 0.10];\n\nconst fmt = (n) => new Intl.NumberFormat('fr-FR', { style:'currency', currency:'EUR', maximumFractionDigits:0 }).format(n);\n\n\u002F\u002F ============================================================\n\u002F\u002F STATE\n\u002F\u002F ============================================================\nconst state = {\n  ind: { salaire: 42000, anciennete: 8, embauche: 'depuis2002', categorie: 'technicien' },\n  pre: { statut: 'technicien', anciennete: 5, rupture: 'licenciement' },\n  sal: { niveau: 'A', anciennete: 0 },\n  pa:  { salaire: 3200, anciennete: 6 },\n  essai: { statut: 'technicien', renouvellement: false },\n};\n\n\u002F\u002F ============================================================\n\u002F\u002F COMPUTE\n\u002F\u002F ============================================================\nfunction computeIndemnite() {\n  const { salaire, anciennete, embauche, categorie } = state.ind;\n  const mensualite = salaire \u002F 13;\n  const semestres = Math.floor(anciennete * 2); \u002F\u002F full semesters\n\n  if (semestres \u003C 2) { \u002F\u002F \u003C 1 an = 0\n    return { montant: 0, sub: 'Ancienneté insuffisante (min. 1 an)', cap: false };\n  }\n\n  let indemnite = 0;\n  let plafond = 15;\n  let note = '';\n\n  if (embauche === 'depuis2002') {\n    \u002F\u002F 1\u002F5 mensualité par semestre (from 2002)\n    indemnite = (1\u002F5) * mensualite * semestres;\n    plafond = 15;\n    note = `${semestres} semestres × 1\u002F5 mensualité`;\n  } else if (embauche === '2000a2001') {\n    \u002F\u002F 1\u002F5 per semester, same post-2000 rule\n    indemnite = (1\u002F5) * mensualite * semestres;\n    plafond = 15;\n    note = `${semestres} semestres × 1\u002F5 mensualité`;\n  } else {\n    \u002F\u002F avant 2000: 1\u002F2 × (13\u002F14.5) par semestre\n    indemnite = 0.5 * (13\u002F14.5) * mensualite * semestres;\n    plafond = categorie === 'cadre' ? 24 * (13\u002F14.5) : 18 * (13\u002F14.5);\n    note = `${semestres} semestres × ½×(13\u002F14,5) mensualité`;\n  }\n\n  const plafondEur = plafond * mensualite;\n  const capped = indemnite > plafondEur;\n  const montant = Math.min(indemnite, plafondEur);\n  return { montant, sub: note + (capped ? ` (plafonné à ${fmt(plafondEur)})` : ''), cap: capped };\n}\n\nfunction computePreavis() {\n  const { statut, anciennete, rupture } = state.pre;\n  let mois = 0;\n  let note = '';\n  if (rupture === 'demission') {\n    mois = statut === 'cadre' ? 3 : 1;\n    note = statut === 'cadre' ? 'Cadre : 3 mois (démission)' : 'Technicien : 1 mois (démission)';\n  } else {\n    if (statut === 'cadre') {\n      mois = 3;\n      note = 'Cadre : 3 mois quelle que soit l\\'ancienneté';\n    } else {\n      mois = anciennete >= 2 ? 2 : 1;\n      note = anciennete >= 2 ? 'Technicien ≥ 2 ans : 2 mois (vs 1 mois légal)' : 'Technicien \u003C 2 ans : 1 mois';\n    }\n  }\n  const hreJour = rupture === 'licenciement' ? 2 : 0; \u002F\u002F 2h\u002Fjour only on licenciement\n  return { mois, note, hreJour };\n}\n\nfunction computeSalMin() {\n  const row = SALARY_GRID.find(r => r.level === state.sal.niveau);\n  if (!row) return null;\n  const ancSlabs = Math.min(Math.floor(state.sal.anciennete \u002F 5), 5);\n  const bonus = SENIOR_BONUS_ANNUAL[ancSlabs];\n  const annual = row.annual * (1 + bonus);\n  const monthly = annual \u002F 13;\n  return { annual, monthly, level: row.level, cat: row.cat, bonus };\n}\n\nfunction computePrimeAnciennete() {\n  const { salaire, anciennete } = state.pa;\n  let taux = 0;\n  if (anciennete >= 15) taux = 0.12;\n  else if (anciennete >= 9) taux = 0.09;\n  else if (anciennete >= 6) taux = 0.06;\n  else if (anciennete >= 3) taux = 0.03;\n  const prime = salaire * taux;\n  return { prime, taux, note: taux === 0 ? 'Pas de prime avant 3 ans d\\'ancienneté' : `${taux*100}% du salaire de base` };\n}\n\nfunction computeEssai() {\n  const { statut, renouvellement } = state.essai;\n  if (statut === 'technicien') {\n    const init = 3;\n    const max = renouvellement ? 6 : 3;\n    return { init, max, legal: 2, note: renouvellement ? '3 mois + renouvellement 3 mois = 6 mois max' : '3 mois (vs 2 mois légaux)' };\n  } else {\n    const init = 6;\n    const max = renouvellement ? 9 : 6;\n    return { init, max, legal: 4, note: renouvellement ? '6 mois + renouvellement jusqu\\'à 9 mois max' : '6 mois (vs 4 mois légaux)' };\n  }\n}\n\n\u002F\u002F ============================================================\n\u002F\u002F RENDER\n\u002F\u002F ============================================================\nfunction renderIndemnite() {\n  const res = computeIndemnite();\n  document.getElementById('ind-result-val').textContent = fmt(res.montant);\n  document.getElementById('ind-result-sub').textContent = res.sub;\n  const box = document.getElementById('ind-info-box');\n  if (res.montant === 0) {\n    box.style.display = 'block';\n    box.textContent = 'Ancienneté insuffisante : minimum 1 an requis pour bénéficier de l\\'indemnité conventionnelle.';\n  } else { box.style.display = 'none'; }\n}\n\nfunction renderPreavis() {\n  const res = computePreavis();\n  document.getElementById('pre-result-val').textContent = res.mois + ' mois';\n  document.getElementById('pre-result-sub').textContent = res.note;\n  const hreBox = document.getElementById('pre-hre-box');\n  if (res.hreJour > 0) {\n    hreBox.style.display = 'block';\n    hreBox.innerHTML = '\u003Cstrong>+ 2 h\u002Fjour d\\'heures de recherche d\\'emploi\u003C\u002Fstrong> rémunérées, fixées en accord avec l\\'employeur (peuvent être regroupées en fin de préavis). Avantage conventionnel sans équivalent légal.';\n  } else { hreBox.style.display = 'none'; }\n}\n\nfunction renderSalMin() {\n  const res = computeSalMin();\n  if (!res) return;\n  document.getElementById('sal-result-val').textContent = fmt(res.monthly) + ' \u002F mois';\n  document.getElementById('sal-result-sub').textContent = `Annuel brut : ${fmt(res.annual)}${res.bonus > 0 ? ` (+${res.bonus*100}% ancienneté)` : ''} — ${res.cat}`;\n\n  \u002F\u002F Build table\n  const tbody = document.getElementById('sal-tbody');\n  tbody.innerHTML = '';\n  SALARY_GRID.forEach(row => {\n    const tr = document.createElement('tr');\n    if (row.level === state.sal.niveau) tr.classList.add('highlight');\n    const monthly = Math.round(row.annual \u002F 13);\n    tr.innerHTML = `\u003Ctd>${row.level}\u003C\u002Ftd>\u003Ctd>${row.cat}\u003C\u002Ftd>\u003Ctd>${fmt(row.annual)}\u003C\u002Ftd>\u003Ctd>${fmt(monthly)}\u003C\u002Ftd>`;\n    tbody.appendChild(tr);\n  });\n}\n\nfunction renderPrimeAnciennete() {\n  const res = computePrimeAnciennete();\n  document.getElementById('pa-result-val').textContent = fmt(res.prime);\n  document.getElementById('pa-result-sub').textContent = res.note;\n}\n\nfunction renderEssai() {\n  const res = computeEssai();\n  document.getElementById('essai-result-val').textContent = res.max + ' mois';\n  document.getElementById('essai-result-sub').textContent = res.note;\n}\n\n\u002F\u002F ============================================================\n\u002F\u002F PILL HELPERS\n\u002F\u002F ============================================================\nfunction initPills(containerId, onSelect) {\n  const container = document.getElementById(containerId);\n  container.querySelectorAll('.pill').forEach(pill => {\n    pill.addEventListener('click', () => {\n      container.querySelectorAll('.pill').forEach(p => p.classList.remove('active'));\n      pill.classList.add('active');\n      onSelect(pill.dataset.val);\n    });\n  });\n}\n\n\u002F\u002F ============================================================\n\u002F\u002F WIRE INPUTS\n\u002F\u002F ============================================================\nfunction wireRange(id, valId, formatter, onUpdate) {\n  const el = document.getElementById(id);\n  const valEl = document.getElementById(valId);\n  el.addEventListener('input', () => {\n    valEl.textContent = formatter(+el.value);\n    onUpdate(+el.value);\n  });\n  \u002F\u002F Initial render\n  valEl.textContent = formatter(+el.value);\n}\n\nfunction initAll() {\n  \u002F\u002F === INDEMNITE ===\n  wireRange('ind-salaire', 'ind-salaire-val', v => fmt(v), v => { state.ind.salaire = v; renderIndemnite(); });\n  wireRange('ind-anciennete', 'ind-anciennete-val', v => v + ' an' + (v>1?'s':''), v => { state.ind.anciennete = v; renderIndemnite(); });\n  initPills('ind-embauche-pills', v => { state.ind.embauche = v; renderIndemnite(); });\n  initPills('ind-categorie-pills', v => { state.ind.categorie = v; renderIndemnite(); });\n  renderIndemnite();\n\n  \u002F\u002F === PREAVIS ===\n  wireRange('pre-anciennete', 'pre-anciennete-val', v => v + ' an' + (v>1?'s':''), v => { state.pre.anciennete = v; renderPreavis(); });\n  initPills('pre-statut-pills', v => { state.pre.statut = v; renderPreavis(); });\n  initPills('pre-rupture-pills', v => { state.pre.rupture = v; renderPreavis(); });\n  renderPreavis();\n\n  \u002F\u002F === SALAIRE MIN ===\n  document.getElementById('sal-niveau').addEventListener('change', e => { state.sal.niveau = e.target.value; renderSalMin(); });\n  wireRange('sal-anciennete', 'sal-anciennete-val', v => v === 0 ? '0 an' : v + ' ans', v => { state.sal.anciennete = v; renderSalMin(); });\n  renderSalMin();\n\n  \u002F\u002F === PRIME ANCIENNETÉ ===\n  wireRange('pa-salaire', 'pa-salaire-val', v => fmt(v), v => { state.pa.salaire = v; renderPrimeAnciennete(); });\n  wireRange('pa-anciennete', 'pa-anciennete-val', v => v + ' an' + (v>1?'s':''), v => { state.pa.anciennete = v; renderPrimeAnciennete(); });\n  renderPrimeAnciennete();\n\n  \u002F\u002F === DURÉE ESSAI ===\n  initPills('essai-statut-pills', v => { state.essai.statut = v; renderEssai(); });\n  const renewCheck = document.getElementById('essai-renouvellement');\n  const renewLabel = document.getElementById('essai-renouvellement-label');\n  renewCheck.addEventListener('change', () => {\n    state.essai.renouvellement = renewCheck.checked;\n    renewLabel.textContent = renewCheck.checked ? 'Oui' : 'Non';\n    renderEssai();\n  });\n  renderEssai();\n}\n\n\u002F\u002F ============================================================\n\u002F\u002F TABS\n\u002F\u002F ============================================================\nfunction activate(id) {\n  const tabs = document.querySelectorAll('[data-tab]');\n  const panels = document.querySelectorAll('[data-panel]');\n  tabs.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n  panels.forEach(p => p.classList.toggle('active', p.dataset.panel === id));\n  if (history && history.replaceState) {\n    if (location.hash !== '#' + id) location.hash = id;\n  }\n  requestAnimationFrame(() => {\n    window.dispatchEvent(new Event('resize'));\n  });\n}\n\ndocument.querySelectorAll('[data-tab]').forEach(t => {\n  t.addEventListener('click', () => activate(t.dataset.tab));\n});\n\nconst hashTab = location.hash.slice(1);\nconst firstTab = document.querySelector('[data-tab]');\nconst matchTab = hashTab && document.querySelector(`[data-tab=\"${hashTab}\"]`);\nactivate(matchTab ? hashTab : (firstTab ? firstTab.dataset.tab : 'indemnite'));\n\n\u002F\u002F ============================================================\n\u002F\u002F INIT\n\u002F\u002F ============================================================\ninitAll();\nlucide.createIcons();\n\n\u002F\u002F ============================================================\n\u002F\u002F RESIZE OBSERVER\n\u002F\u002F ============================================================\nconst ro = new ResizeObserver(() => {\n  const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n  parent.postMessage({ type: 'resize', height: h }, '*');\n});\nro.observe(document.documentElement);\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-banques-863e64de1b.webp",[]]