[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-entreprises-du-paysage-fr":83,"footer-cities-fr":147},[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":141,"source":142,"category":143,"audience":144,"publish_mode":145,"hero_image":146,"hero_image_alt":85},"ccn-entreprises-du-paysage","CCN des entreprises du paysage — calculateur complet","Calculateur CCN Entreprises du Paysage IDCC 7018 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement (fin de chantier × 2), les préavis, la grille salariale 2026, les congés et les heures supplémentaires de la CCN paysage (IDCC 7018).","Ce calculateur couvre les 5 grandes déviations de la convention collective des entreprises du paysage (IDCC 7018) par rapport au Code du travail : l'indemnité de fin de chantier (double de la légale, sans ancienneté minimale), les préavis graduels par ancienneté, la grille salariale 2026 (avenant n°46), les jours de congés supplémentaires hors saison, et le contingent d'heures supplémentaires étendu à 350 h\u002Fan.",[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 Entreprises du Paysage — IDCC 7018","WebApplication",{"name":94,"@type":95,"identifier":96,"alternateName":97},"Convention collective des entreprises du paysage","Thing","IDCC 7018","CCN paysage — Brochure JO 3617",{"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 (fin de chantier × 2), les préavis, la grille salariale, les congés payés et les heures supplémentaires de la convention collective des entreprises du paysage (IDCC 7018).","All","FinanceApplication",true,[111,114,117,120,123,126,129,132,135,138],{"a":112,"q":113},"La convention collective des entreprises du paysage (IDCC 7018) prévoit une indemnité de fin de chantier égale au double de l'indemnité légale de licenciement (art. L1234-9), et ce sans condition minimale d'ancienneté. Pour un salarié avec 5 ans d'ancienneté et 2 500 € de salaire mensuel, cela représente environ 3 125 € brut (vs 1 562 € pour un licenciement ordinaire).","Quelle est l'indemnité de fin de chantier dans la CCN des entreprises du paysage ?",{"a":115,"q":116},"La CCN paysage (IDCC 7018) fixe des préavis graduels : 1 jour ouvré pour moins d'un mois d'ancienneté, 1 semaine entre 1 et 6 mois, 1 mois entre 6 mois et 2 ans, et 2 mois au-delà de 2 ans d'ancienneté. Les salariés ayant plus de 6 mois d'ancienneté bénéficient de 3 jours payés pour chercher un emploi pendant le préavis.","Quelle est la durée du préavis dans la convention collective paysage ?",{"a":118,"q":119},"Depuis l'avenant n°46 du 17 septembre 2025 (en vigueur le 1er janvier 2026), les salaires minima bruts mensuels vont de 1 838 € (niveau O1\u002FE1) à plus de 2 740 € pour les TAM et niveaux supérieurs. La grille comporte 4 catégories : Ouvriers (O1 à O6), Employés (E1 à E5), TAM (TAM1 à TAM4) et Cadres (forfait annuel).","Quelle est la grille des salaires minima dans la CCN paysage en 2026 ?",{"a":121,"q":122},"Non, la convention collective des entreprises du paysage n'impose pas de 13e mois ni de prime d'ancienneté obligatoire. Ces avantages peuvent être accordés par accord d'entreprise ou par le contrat de travail individuel, mais ils ne sont pas imposés par la CCN.","La CCN paysage prévoit-elle un 13e mois ou une prime d'ancienneté ?",{"a":124,"q":125},"La base est de 30 jours ouvrables comme prévu par la loi (art. L3141-3). La CCN paysage accorde des jours supplémentaires de fractionnement hors saison : +1 jour si le salarié prend entre 3 et 5 jours de congés en dehors de la période mai–octobre, et +2 jours si plus de 5 jours sont pris hors de cette période. Ces jours supplémentaires reflètent la nature saisonnière du travail paysager.","Combien de jours de congés payés prévoit la CCN des entreprises du paysage ?",{"a":127,"q":128},"La CCN des entreprises du paysage fixe un contingent annuel d'heures supplémentaires de 350 heures par salarié, contre 220 heures dans le Code du travail (art. L3121-36). Ce contingent élevé tient compte des pics saisonniers du secteur (printemps–été). Les taux de majoration restent identiques à la loi : +25 % pour les 8 premières heures supplémentaires, +50 % au-delà.","Quel est le contingent d'heures supplémentaires dans la CCN paysage ?",{"a":130,"q":131},"La CCN paysage aligne ses périodes d'essai sur les maximums légaux : 2 mois pour les ouvriers, 3 mois pour les employés et TAM, 4 mois pour les cadres. Chaque période peut être renouvelée une fois, par accord écrit signé des deux parties au moins 4 jours ouvrables avant la fin de la période initiale.","Quelles sont les périodes d'essai dans la CCN paysage ?",{"a":133,"q":134},"Oui, la CCN des entreprises du paysage comporte des dispositions spécifiques pour les arrêts de travail liés aux intempéries (pluie, neige, gel, canicule, vents violents, inondations). Les heures perdues peuvent être récupérées dans les 12 mois suivant l'événement climatique, dans le respect des règles de santé et sécurité au travail.","La CCN paysage prévoit-elle des indemnités pour intempéries ?",{"a":136,"q":137},"Oui. En cas de travail de nuit exceptionnel, la majoration est de +50 %. Pour le travail du dimanche ou des jours fériés exceptionnel, la majoration est de +100 % pour les entreprises générales du paysage, et de +50 % pour les paysagistes d'intérieur.","Le travail de nuit ou le dimanche est-il majoré dans la CCN paysage ?",{"a":139,"q":140},"Le texte officiel de la CCN paysage (IDCC 7018, brochure JO 3617) est disponible sur Légifrance (identifiant KALICONT000005635325) et via l'UNEP (Union Nationale des Entreprises du Paysage — lesentreprisesdupaysage.fr). Une version mise à jour (mai 2025) est publiée par l'UNEP sous forme de PDF officiel.","Où trouver le texte officiel de la convention collective des entreprises du paysage ?","\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 Entreprises du Paysage — IDCC 7018\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      --card: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #dbeafe;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --muted: #78716c;\n      --callout-bg: #eff6ff;\n      --callout-border: #3b82f6;\n      --result-bg: #1e3a5f;\n      --success: #15803d;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n    }\n    body {\n      background: var(--bg);\n      font-family: system-ui, -apple-system, sans-serif;\n      color: var(--text);\n      font-size: 0.9375rem;\n      line-height: 1.5;\n      padding: 1rem;\n    }\n    .tool-root { max-width: 680px; margin: 0 auto; }\n    .tool-header {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      margin-bottom: 1.25rem;\n      flex-wrap: wrap;\n      gap: 0.5rem;\n    }\n    .tool-title { font-size: 1.1rem; font-weight: 700; color: var(--text); }\n    .idcc-badge {\n      background: var(--accent-light);\n      color: var(--accent);\n      font-size: 0.75rem;\n      font-weight: 600;\n      padding: 0.25rem 0.625rem;\n      border-radius: 9999px;\n      white-space: nowrap;\n    }\n    \u002F* Tabs *\u002F\n    .tabs-bar {\n      display: flex;\n      gap: 0.25rem;\n      flex-wrap: wrap;\n      border-bottom: 2px solid var(--border);\n      margin-bottom: 1.25rem;\n    }\n    .tab-btn {\n      background: none;\n      border: none;\n      cursor: pointer;\n      font-size: 0.8125rem;\n      font-weight: 500;\n      color: var(--muted);\n      padding: 0.5rem 0.875rem;\n      border-bottom: 2px solid transparent;\n      margin-bottom: -2px;\n      border-radius: var(--radius-sm) var(--radius-sm) 0 0;\n      display: flex;\n      align-items: center;\n      gap: 0.375rem;\n      transition: color 0.15s, border-color 0.15s, background 0.15s;\n    }\n    .tab-btn:hover { color: var(--accent); background: var(--accent-light); }\n    .tab-btn.active {\n      color: var(--accent);\n      border-bottom-color: var(--accent);\n      background: var(--accent-light);\n      font-weight: 600;\n    }\n    .tab-btn svg { width: 14px; height: 14px; }\n    \u002F* Panels *\u002F\n    .panel { display: none; }\n    .panel.active { display: block; }\n    \u002F* Rule callout *\u002F\n    .rule-callout {\n      background: var(--callout-bg);\n      border-left: 3px solid var(--callout-border);\n      border-radius: 0 var(--radius-sm) var(--radius-sm) 0;\n      padding: 0.75rem 1rem;\n      margin-bottom: 1.25rem;\n      display: flex;\n      gap: 0.625rem;\n      align-items: flex-start;\n      font-size: 0.875rem;\n    }\n    .rule-callout svg { flex-shrink: 0; width: 16px; height: 16px; color: var(--callout-border); margin-top: 0.125rem; }\n    \u002F* Form elements *\u002F\n    .form-group { margin-bottom: 1rem; }\n    .form-label {\n      display: block;\n      font-size: 0.8125rem;\n      font-weight: 600;\n      color: var(--text);\n      margin-bottom: 0.375rem;\n    }\n    .form-hint { font-size: 0.75rem; color: var(--muted); margin-top: 0.25rem; }\n    .slider-row { display: flex; align-items: center; gap: 0.75rem; }\n    input[type=\"range\"] {\n      flex: 1;\n      accent-color: var(--accent);\n      height: 4px;\n      cursor: pointer;\n    }\n    .slider-val {\n      min-width: 5.5rem;\n      text-align: right;\n      font-size: 0.875rem;\n      font-weight: 600;\n      font-variant-numeric: tabular-nums;\n      color: var(--text);\n    }\n    select {\n      width: 100%;\n      padding: 0.5rem 0.75rem;\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.875rem;\n      background: var(--card);\n      color: var(--text);\n      cursor: pointer;\n    }\n    select:focus { outline: 2px solid var(--accent); outline-offset: 1px; }\n    \u002F* Pills *\u002F\n    .pills { display: flex; flex-wrap: wrap; gap: 0.5rem; }\n    .pill {\n      padding: 0.375rem 0.875rem;\n      border: 1.5px solid var(--border);\n      border-radius: 9999px;\n      font-size: 0.8125rem;\n      font-weight: 500;\n      cursor: pointer;\n      background: var(--card);\n      color: var(--muted);\n      transition: all 0.15s;\n    }\n    .pill.active {\n      background: var(--accent);\n      color: #fff;\n      border-color: var(--accent);\n    }\n    .pill:hover:not(.active) { border-color: var(--accent); color: var(--accent); }\n    \u002F* Result card *\u002F\n    .result-card {\n      background: var(--result-bg);\n      color: #fff;\n      border-radius: var(--radius);\n      padding: 1.25rem 1.5rem;\n      margin-top: 1.25rem;\n    }\n    .result-label { font-size: 0.75rem; font-weight: 500; opacity: 0.7; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.25rem; }\n    .result-value {\n      font-size: 2rem;\n      font-weight: 700;\n      font-variant-numeric: tabular-nums;\n      line-height: 1.1;\n    }\n    .result-sub { font-size: 0.8125rem; opacity: 0.75; margin-top: 0.375rem; }\n    .result-breakdown { margin-top: 0.75rem; border-top: 1px solid rgba(255,255,255,0.15); padding-top: 0.75rem; }\n    .result-row { display: flex; justify-content: space-between; font-size: 0.8125rem; opacity: 0.85; margin-bottom: 0.25rem; }\n    \u002F* Disclaimer *\u002F\n    .disclaimer {\n      margin-top: 1.5rem;\n      padding: 0.75rem 1rem;\n      background: var(--card);\n      border: 1px solid var(--border);\n      border-radius: var(--radius-sm);\n      font-size: 0.75rem;\n      color: var(--muted);\n      line-height: 1.6;\n    }\n    .disclaimer a { color: var(--accent); text-decoration: none; }\n    .disclaimer a:hover { text-decoration: underline; }\n    \u002F* Two-column grid for narrow inputs *\u002F\n    .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; }\n    @media (max-width: 480px) { .grid-2 { grid-template-columns: 1fr; } }\n    \u002F* Separator *\u002F\n    .separator { border: none; border-top: 1px solid var(--border); margin: 1rem 0; }\n    \u002F* Salary grid table *\u002F\n    .salary-table { width: 100%; border-collapse: collapse; font-size: 0.8125rem; margin-top: 0.75rem; }\n    .salary-table th {\n      background: var(--accent-light);\n      color: var(--accent);\n      font-weight: 600;\n      text-align: left;\n      padding: 0.5rem 0.625rem;\n      border-bottom: 2px solid var(--border);\n    }\n    .salary-table td { padding: 0.4375rem 0.625rem; border-bottom: 1px solid var(--border); }\n    .salary-table tr:last-child td { border-bottom: none; }\n    .salary-table tr:nth-child(even) td { background: #f5f5f4; }\n    .result-highlight { background: var(--accent-light); color: var(--accent); font-weight: 700; }\n    \u002F* Info box *\u002F\n    .info-box {\n      background: #f0fdf4;\n      border: 1px solid #bbf7d0;\n      border-radius: var(--radius-sm);\n      padding: 0.75rem 1rem;\n      font-size: 0.8125rem;\n      color: var(--success);\n      margin-top: 1rem;\n      display: flex;\n      gap: 0.5rem;\n      align-items: flex-start;\n    }\n    .info-box svg { width: 16px; height: 16px; flex-shrink: 0; margin-top: 0.125rem; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\n\u003C!-- CCN IDCC 7018 — deviations\n     indemnite: L1234-9 → même formule, MAIS \"fin de chantier\" = double indemnité sans condition d'ancienneté (art. CCN paysage)\n     preavis: L1234-1 → CCN fixe grille détaillée: \u003C1 mois=1j, 1-6 mois=1 sem, 6 mois-2 ans=1 mois, ≥2 ans=2 mois\n     salaire-min: SMIC → grille CCN avenant n°46 (sept. 2025), en vigueur 1er janv. 2026\n     conges: L3141-3 (30 jours ouvrables) → +2j si >5j hors mai-oct; +1j si 3-5j hors mai-oct\n     heures-supp: L3121-36 (contingent 220h) → contingent CCN = 350h\u002Fan -->\n\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Cdiv class=\"tool-title\">CCN Entreprises du Paysage\u003C\u002Fdiv>\n    \u003Cspan class=\"idcc-badge\">IDCC 7018\u003C\u002Fspan>\n  \u003C\u002Fdiv>\n\n  \u003Cnav class=\"tabs-bar\" role=\"tablist\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\">\n      \u003Ci data-lucide=\"calculator\">\u003C\u002Fi> Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\">\n      \u003Ci data-lucide=\"clock\">\u003C\u002Fi> Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\">\n      \u003Ci data-lucide=\"banknote\">\u003C\u002Fi> Grille salaires\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"conges\" role=\"tab\">\n      \u003Ci data-lucide=\"calendar-days\">\u003C\u002Fi> Congés\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"heures-supp\" role=\"tab\">\n      \u003Ci data-lucide=\"timer\">\u003C\u002Fi> Heures supp.\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ===== TAB: INDEMNITÉ ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN paysage prévoit une \u003Cstrong>indemnité de fin de chantier\u003C\u002Fstrong> égale au \u003Cstrong>double de l'indemnité légale de licenciement\u003C\u002Fstrong>, versée sans condition d'ancienneté. Pour un licenciement ordinaire, la formule est identique à L1234-9 (1\u002F4 mois × années ≤ 10 ans + 1\u002F3 mois × années > 10 ans).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Type de licenciement\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"i-motif-pills\">\n        \u003Cdiv class=\"pill active\" data-val=\"ordinaire\">Licenciement ordinaire\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"fin-chantier\">Fin de chantier\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"form-hint\" id=\"i-motif-hint\">Formule : 1\u002F4 mois × années (≤ 10 ans) + 1\u002F3 mois × années (> 10 ans)\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Salaire brut mensuel de référence\u003C\u002Flabel>\n      \u003Cdiv class=\"slider-row\">\n        \u003Cinput type=\"range\" id=\"i-salaire\" min=\"1600\" max=\"8000\" step=\"50\" value=\"2500\">\n        \u003Cspan class=\"slider-val\" id=\"i-salaire-val\">2 500 €\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"form-hint\">Moyenne des 12 derniers mois ou 1\u002F3 des 3 derniers mois (la plus favorable)\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Ancienneté (années complètes)\u003C\u002Flabel>\n      \u003Cdiv class=\"slider-row\">\n        \u003Cinput type=\"range\" id=\"i-anciennete\" min=\"0\" max=\"40\" step=\"1\" value=\"5\">\n        \u003Cspan class=\"slider-val\" id=\"i-anciennete-val\">5 ans\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"form-hint\" id=\"i-seniority-hint\">Ancienneté ≥ 8 mois requise pour le licenciement ordinaire\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"i-result\">\n      \u003Cdiv class=\"result-label\">Indemnité estimée\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"i-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"i-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\">\n        \u003Cdiv class=\"result-row\">\u003Cspan id=\"i-tranche1-lbl\">Tranche 1 (≤ 10 ans)\u003C\u002Fspan>\u003Cspan id=\"i-tranche1-val\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan id=\"i-tranche2-lbl\">Tranche 2 (&gt; 10 ans)\u003C\u002Fspan>\u003Cspan id=\"i-tranche2-val\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\" id=\"i-coef-row\">\u003Cspan>Coefficient fin de chantier\u003C\u002Fspan>\u003Cspan>× 2\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== TAB: PRÉAVIS ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN paysage (IDCC 7018) fixe des durées de préavis graduées selon l'ancienneté. Le Code du travail (L1234-1) ne prévoit pas de grille universelle : la CCN comble ce vide avec des seuils plus précis, plus favorables en début de carrière.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Ancienneté dans l'entreprise\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"p-anciennete-pills\">\n        \u003Cdiv class=\"pill active\" data-val=\"moins1mois\">Moins de 1 mois\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"1a6mois\">1 à 6 mois\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"6mois2ans\">6 mois à 2 ans\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"2ansplus\">2 ans et plus\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Motif\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"p-motif-pills\">\n        \u003Cdiv class=\"pill active\" data-val=\"licenciement\">Licenciement\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"demission\">Démission\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Catégorie\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"p-categorie-pills\">\n        \u003Cdiv class=\"pill active\" data-val=\"ouvrier\">Ouvrier \u002F Employé\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"cadre\">TAM \u002F Cadre\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"p-result\">\n      \u003Cdiv class=\"result-label\">Durée du préavis\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"p-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"p-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\">\n        \u003Cdiv class=\"result-row\">\u003Cspan>Jours de recherche d'emploi\u003C\u002Fspan>\u003Cspan id=\"p-jours-recherche\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"info-box\" id=\"p-special-note\" style=\"display:none;\">\n      \u003Ci data-lucide=\"check-circle\">\u003C\u002Fi>\n      \u003Cspan id=\"p-special-text\">\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== TAB: GRILLE SALAIRES ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN paysage publie une \u003Cstrong>grille de salaires minimum\u003C\u002Fstrong> par catégorie et coefficient (avenant n°46 du 17 septembre 2025, en vigueur au 1er janvier 2026), avec des minima supérieurs au SMIC pour la plupart des niveaux.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Catégorie professionnelle\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"s-categorie-pills\">\n        \u003Cdiv class=\"pill active\" data-val=\"O\">Ouvriers (O)\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"E\">Employés (E)\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"TAM\">TAM\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"CADRE\">Cadres\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\" id=\"s-niveau-group\">\n      \u003Clabel class=\"form-label\">Niveau \u002F Coefficient\u003C\u002Flabel>\n      \u003Cselect id=\"s-niveau\">\u003C\u002Fselect>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Durée hebdomadaire (heures)\u003C\u002Flabel>\n      \u003Cdiv class=\"slider-row\">\n        \u003Cinput type=\"range\" id=\"s-heures\" min=\"24\" max=\"39\" step=\"0.5\" value=\"35\">\n        \u003Cspan class=\"slider-val\" id=\"s-heures-val\">35 h\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"s-result\">\n      \u003Cdiv class=\"result-label\">Salaire minimum brut mensuel\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"s-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"s-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\">\n        \u003Cdiv class=\"result-row\">\u003Cspan>Taux horaire minimum\u003C\u002Fspan>\u003Cspan id=\"s-result-horaire\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>Base de référence (151,67 h)\u003C\u002Fspan>\u003Cspan id=\"s-result-base\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>SMIC 2026\u003C\u002Fspan>\u003Cspan>1 838,24 €\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== TAB: CONGÉS ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"conges\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN paysage prévoit \u003Cstrong>jusqu'à 2 jours supplémentaires\u003C\u002Fstrong> lorsque des congés sont pris hors période de référence (mai–octobre), afin de refléter la saisonnalité du secteur (art. 29 CCN). La base légale est 30 jours ouvrables (L3141-3).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Ancienneté (années)\u003C\u002Flabel>\n      \u003Cdiv class=\"slider-row\">\n        \u003Cinput type=\"range\" id=\"c-anciennete\" min=\"0\" max=\"30\" step=\"1\" value=\"3\">\n        \u003Cspan class=\"slider-val\" id=\"c-anciennete-val\">3 ans\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Jours pris hors période mai – octobre\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"c-hors-saison-pills\">\n        \u003Cdiv class=\"pill active\" data-val=\"0\">Aucun\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"3\">3 à 5 jours\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"6\">Plus de 5 jours\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"form-hint\">Prise hors saison donne droit à des jours de fractionnement CCN\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Temps partiel\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"c-temps-partiel-pills\">\n        \u003Cdiv class=\"pill active\" data-val=\"non\">Temps plein\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"oui\">Temps partiel\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"c-result\">\n      \u003Cdiv class=\"result-label\">Congés payés annuels\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"c-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"c-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\">\n        \u003Cdiv class=\"result-row\">\u003Cspan>Congés légaux de base\u003C\u002Fspan>\u003Cspan>30 j ouvrables\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>Jours supplémentaires CCN\u003C\u002Fspan>\u003Cspan id=\"c-extra-val\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ===== TAB: HEURES SUPP ===== -->\n  \u003Cdiv class=\"panel\" data-panel=\"heures-supp\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN paysage fixe un \u003Cstrong>contingent annuel de 350 heures\u003C\u002Fstrong> (vs 220 h légales – L3121-36) pour absorber les pics saisonniers. Les majorations restent identiques à la loi (+25 % \u002F +50 %), mais le déclenchement de la contrepartie obligatoire en repos est plus tardif.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Salaire horaire brut\u003C\u002Flabel>\n      \u003Cdiv class=\"slider-row\">\n        \u003Cinput type=\"range\" id=\"h-horaire\" min=\"11\" max=\"50\" step=\"0.5\" value=\"14\">\n        \u003Cspan class=\"slider-val\" id=\"h-horaire-val\">14,00 €\u002Fh\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Heures supplémentaires — tranche 1 (H36 à H43, max 8 h)\u003C\u002Flabel>\n      \u003Cdiv class=\"slider-row\">\n        \u003Cinput type=\"range\" id=\"h-t1\" min=\"0\" max=\"8\" step=\"0.5\" value=\"4\">\n        \u003Cspan class=\"slider-val\" id=\"h-t1-val\">4 h\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"form-hint\">Majoration +25 % (identique à L3121-36)\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Heures supplémentaires — tranche 2 (au-delà de H43)\u003C\u002Flabel>\n      \u003Cdiv class=\"slider-row\">\n        \u003Cinput type=\"range\" id=\"h-t2\" min=\"0\" max=\"20\" step=\"0.5\" value=\"0\">\n        \u003Cspan class=\"slider-val\" id=\"h-t2-val\">0 h\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"form-hint\">Majoration +50 % (identique à L3121-36)\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Total heures supp. sur l'année (cumul)\u003C\u002Flabel>\n      \u003Cdiv class=\"slider-row\">\n        \u003Cinput type=\"range\" id=\"h-cumul\" min=\"0\" max=\"400\" step=\"5\" value=\"50\">\n        \u003Cspan class=\"slider-val\" id=\"h-cumul-val\">50 h\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n      \u003Cp class=\"form-hint\">Le contingent CCN est de 350 h\u002Fan (vs 220 h légales)\u003C\u002Fp>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"form-group\">\n      \u003Clabel class=\"form-label\">Effectif entreprise\u003C\u002Flabel>\n      \u003Cdiv class=\"pills\" id=\"h-effectif-pills\">\n        \u003Cdiv class=\"pill active\" data-val=\"petit\">≤ 20 salariés\u003C\u002Fdiv>\n        \u003Cdiv class=\"pill\" data-val=\"grand\">&gt; 20 salariés\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n\n    \u003Cdiv class=\"result-card\" id=\"h-result\">\n      \u003Cdiv class=\"result-label\">Rémunération heures supp. (semaine)\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-value\" id=\"h-result-val\">—\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-sub\" id=\"h-result-sub\">\u003C\u002Fdiv>\n      \u003Cdiv class=\"result-breakdown\">\n        \u003Cdiv class=\"result-row\">\u003Cspan>Tranche 1 (+25 %)\u003C\u002Fspan>\u003Cspan id=\"h-t1-result\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>Tranche 2 (+50 %)\u003C\u002Fspan>\u003Cspan id=\"h-t2-result\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>Statut contingent annuel\u003C\u002Fspan>\u003Cspan id=\"h-contingent-status\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-row\">\u003Cspan>Repos compensateur si dépassement\u003C\u002Fspan>\u003Cspan id=\"h-repos-result\">—\u003C\u002Fspan>\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- Shared disclaimer -->\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 7018 (Brochure JO 3617 — entreprises du paysage).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635325\" target=\"_blank\" rel=\"noopener\">Légifrance\u003C\u002Fa> · Avenant n°46 (janv. 2026).\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 fmtEUR2 = v => new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(v);\n\n\u002F\u002F ─── INDEMNITÉ STATE & COMPUTE ─────────────────────────────────────────────────\nconst iState = { salaire: 2500, anciennete: 5, motif: 'ordinaire' };\nfunction computeI(s) {\n  const { salaire, anciennete, motif } = s;\n  const t1 = Math.min(anciennete, 10) * (1\u002F4) * salaire;\n  const t2 = Math.max(anciennete - 10, 0) * (1\u002F3) * salaire;\n  const base = t1 + t2;\n  const coef = motif === 'fin-chantier' ? 2 : 1;\n  const total = base * coef;\n  return { t1, t2, base, coef, total, eligible: anciennete >= 1 || motif === 'fin-chantier' };\n}\nfunction renderI() {\n  const r = computeI(iState);\n  const elVal = document.getElementById('i-result-val');\n  const elSub = document.getElementById('i-result-sub');\n  const elT1 = document.getElementById('i-tranche1-val');\n  const elT2 = document.getElementById('i-tranche2-val');\n  const elCoefRow = document.getElementById('i-coef-row');\n  if (!r.eligible) {\n    elVal.textContent = 'Non éligible';\n    elSub.textContent = 'Ancienneté insuffisante (8 mois requis pour licenciement ordinaire)';\n    elT1.textContent = '—';\n    elT2.textContent = '—';\n    elCoefRow.style.display = 'none';\n    return;\n  }\n  elVal.textContent = fmtEUR(r.total);\n  elSub.textContent = iState.motif === 'fin-chantier'\n    ? 'Fin de chantier : double de l\\'indemnité légale, sans condition d\\'ancienneté'\n    : `Formule CCN = légal L1234-9 (${iState.anciennete} an${iState.anciennete > 1 ? 's' : ''} d'ancienneté)`;\n  elT1.textContent = fmtEUR(r.t1);\n  elT2.textContent = fmtEUR(r.t2);\n  elCoefRow.style.display = iState.motif === 'fin-chantier' ? 'flex' : 'none';\n}\n\u002F\u002F Pill wiring – motif\ndocument.querySelectorAll('#i-motif-pills .pill').forEach(pill => {\n  pill.addEventListener('click', () => {\n    document.querySelectorAll('#i-motif-pills .pill').forEach(p => p.classList.remove('active'));\n    pill.classList.add('active');\n    iState.motif = pill.dataset.val;\n    const hint = document.getElementById('i-motif-hint');\n    hint.textContent = iState.motif === 'fin-chantier'\n      ? 'Fin de chantier : × 2 l\\'indemnité légale (art. CCN paysage), sans ancienneté minimale'\n      : 'Formule : 1\u002F4 mois × années (≤ 10 ans) + 1\u002F3 mois × années (> 10 ans)';\n    renderI();\n  });\n});\ndocument.getElementById('i-salaire').addEventListener('input', e => {\n  iState.salaire = +e.target.value;\n  document.getElementById('i-salaire-val').textContent = fmtEUR(iState.salaire);\n  renderI();\n});\ndocument.getElementById('i-anciennete').addEventListener('input', e => {\n  iState.anciennete = +e.target.value;\n  document.getElementById('i-anciennete-val').textContent = `${iState.anciennete} an${iState.anciennete > 1 ? 's' : ''}`;\n  renderI();\n});\nrenderI();\n\n\u002F\u002F ─── PRÉAVIS STATE & COMPUTE ──────────────────────────────────────────────────\nconst pState = { anciennete: '6mois2ans', motif: 'licenciement', categorie: 'ouvrier' };\nfunction computeP(s) {\n  const { anciennete, motif, categorie } = s;\n  \u002F\u002F CCN paysage grille préavis\n  const grid = {\n    'moins1mois': { label: '1 jour ouvré', jours_recherche: null },\n    '1a6mois':    { label: '1 semaine',     jours_recherche: null },\n    '6mois2ans':  { label: '1 mois',         jours_recherche: 3 },\n    '2ansplus':   { label: '2 mois',         jours_recherche: 3 },\n  };\n  const row = grid[anciennete];\n  let label = row.label;\n  let note = '';\n  \u002F\u002F démission : même durée sauf O1\u002FE1 qui ne s'applique que si catégorie ouvrier et 2ans+\n  if (motif === 'demission' && anciennete === '2ansplus' && categorie === 'ouvrier') {\n    label = '1 mois (démission — catégorie O1\u002FE1 : réduit à 1 mois)';\n    note = 'Pour les postes O1\u002FE1, le préavis de démission est réduit à 1 mois.';\n  }\n  const joursRecherche = anciennete === '6mois2ans' || anciennete === '2ansplus' ? 3 : null;\n  return { label, joursRecherche, note };\n}\nfunction renderP() {\n  const r = computeP(pState);\n  document.getElementById('p-result-val').textContent = r.label;\n  document.getElementById('p-result-sub').textContent =\n    `${pState.motif === 'licenciement' ? 'Licenciement' : 'Démission'} — ${pState.categorie === 'cadre' ? 'TAM\u002FCadre' : 'Ouvrier\u002FEmployé'}`;\n  document.getElementById('p-jours-recherche').textContent =\n    r.joursRecherche ? `${r.joursRecherche} jours payés` : 'Aucun';\n  const noteEl = document.getElementById('p-special-note');\n  if (r.note) {\n    noteEl.style.display = 'flex';\n    document.getElementById('p-special-text').textContent = r.note;\n  } else {\n    noteEl.style.display = 'none';\n  }\n}\nfunction wirePills(groupId, stateKey, stateObj, callback) {\n  document.querySelectorAll(`#${groupId} .pill`).forEach(pill => {\n    pill.addEventListener('click', () => {\n      document.querySelectorAll(`#${groupId} .pill`).forEach(p => p.classList.remove('active'));\n      pill.classList.add('active');\n      stateObj[stateKey] = pill.dataset.val;\n      callback();\n    });\n  });\n}\nwirePills('p-anciennete-pills', 'anciennete', pState, renderP);\nwirePills('p-motif-pills', 'motif', pState, renderP);\nwirePills('p-categorie-pills', 'categorie', pState, renderP);\nrenderP();\n\n\u002F\u002F ─── SALAIRE MIN STATE & COMPUTE ──────────────────────────────────────────────\n\u002F\u002F Grille avenant n°46, vigueur 1er janvier 2026 (taux horaires bruts)\nconst SALARY_GRID = {\n  O: [\n    { code: 'O1', label: 'O1 — Ouvrier sans qualification', taux: 12.13 },\n    { code: 'O2', label: 'O2 — Ouvrier qualifié 1', taux: 12.38 },\n    { code: 'O3', label: 'O3 — Ouvrier qualifié 2', taux: 12.70 },\n    { code: 'O4', label: 'O4 — Ouvrier qualifié 3', taux: 13.08 },\n    { code: 'O5', label: 'O5 — Ouvrier hautement qualifié', taux: 13.59 },\n    { code: 'O6', label: 'O6 — Chef d\\'équipe', taux: 14.18 },\n  ],\n  E: [\n    { code: 'E1', label: 'E1 — Employé débutant', taux: 12.13 },\n    { code: 'E2', label: 'E2 — Employé qualifié 1', taux: 12.38 },\n    { code: 'E3', label: 'E3 — Employé qualifié 2', taux: 12.83 },\n    { code: 'E4', label: 'E4 — Employé qualifié 3', taux: 13.30 },\n    { code: 'E5', label: 'E5 — Employé spécialisé', taux: 13.94 },\n  ],\n  TAM: [\n    { code: 'TAM1', label: 'TAM1 — Agent technique ou de maîtrise 1', taux: 14.85 },\n    { code: 'TAM2', label: 'TAM2 — Agent technique ou de maîtrise 2', taux: 15.68 },\n    { code: 'TAM3', label: 'TAM3 — Technicien \u002F Chef de chantier', taux: 16.72 },\n    { code: 'TAM4', label: 'TAM4 — Responsable de secteur', taux: 18.05 },\n  ],\n  CADRE: [\n    { code: 'C1', label: 'C1 — Cadre débutant (brut annuel)', taux: null, annuel: 32500 },\n    { code: 'C2', label: 'C2 — Cadre confirmé (brut annuel)', taux: null, annuel: 38000 },\n    { code: 'C3', label: 'C3 — Cadre supérieur (brut annuel)', taux: null, annuel: 46500 },\n  ],\n};\nconst sState = { categorie: 'O', niveau: 'O1', heures: 35 };\nfunction populateSNiveaux(cat) {\n  const sel = document.getElementById('s-niveau');\n  sel.innerHTML = '';\n  SALARY_GRID[cat].forEach(row => {\n    const opt = document.createElement('option');\n    opt.value = row.code;\n    opt.textContent = row.label;\n    sel.appendChild(opt);\n  });\n  sState.niveau = SALARY_GRID[cat][0].code;\n}\nfunction computeS(s) {\n  const rows = SALARY_GRID[s.categorie];\n  const row = rows.find(r => r.code === s.niveau) || rows[0];\n  const heuresMois = 151.67 * (s.heures \u002F 35);\n  if (row.annuel) {\n    return { mensuel: row.annuel \u002F 12, horaire: null, base: row.annuel \u002F 12, isCadre: true, annuel: row.annuel };\n  }\n  const horaire = row.taux;\n  const base = horaire * 151.67;\n  const mensuel = horaire * heuresMois;\n  return { mensuel, horaire, base, isCadre: false };\n}\nfunction renderS() {\n  const r = computeS(sState);\n  document.getElementById('s-result-val').textContent = fmtEUR(r.mensuel);\n  if (r.isCadre) {\n    document.getElementById('s-result-sub').textContent = `Minimum annuel brut : ${fmtEUR(r.annuel)}`;\n    document.getElementById('s-result-horaire').textContent = 'N\u002FA (forfait annuel)';\n    document.getElementById('s-result-base').textContent = fmtEUR(r.base);\n  } else {\n    document.getElementById('s-result-sub').textContent =\n      `Taux horaire : ${fmtEUR2(r.horaire)} · ${sState.heures} h\u002Fsem`;\n    document.getElementById('s-result-horaire').textContent = fmtEUR2(r.horaire);\n    document.getElementById('s-result-base').textContent = fmtEUR(r.base);\n  }\n}\nwirePills('s-categorie-pills', 'categorie', sState, () => {\n  populateSNiveaux(sState.categorie);\n  renderS();\n});\ndocument.getElementById('s-niveau').addEventListener('change', e => {\n  sState.niveau = e.target.value;\n  renderS();\n});\ndocument.getElementById('s-heures').addEventListener('input', e => {\n  sState.heures = +e.target.value;\n  document.getElementById('s-heures-val').textContent = `${sState.heures} h`;\n  renderS();\n});\npopulateSNiveaux('O');\nrenderS();\n\n\u002F\u002F ─── CONGÉS STATE & COMPUTE ───────────────────────────────────────────────────\nconst cState = { anciennete: 3, horsSaison: '0', tempsPartiel: 'non' };\nfunction computeC(s) {\n  const base = 30;\n  let extra = 0;\n  if (s.horsSaison === '3') extra = 1;\n  if (s.horsSaison === '6') extra = 2;\n  const total = base + extra;\n  const totalSemaines = (total \u002F 6).toFixed(1);\n  return { base, extra, total, totalSemaines };\n}\nfunction renderC() {\n  const r = computeC(cState);\n  document.getElementById('c-result-val').textContent = `${r.total} jours ouvrables`;\n  document.getElementById('c-result-sub').textContent =\n    r.extra > 0\n      ? `Dont ${r.extra} jour${r.extra > 1 ? 's' : ''} supplémentaire${r.extra > 1 ? 's' : ''} CCN (fractionnement hors saison)`\n      : 'Base légale — pas de jours supplémentaires CCN cette année';\n  document.getElementById('c-extra-val').textContent = `+${r.extra} j`;\n  document.getElementById('c-anciennete-val').textContent = `${cState.anciennete} an${cState.anciennete > 1 ? 's' : ''}`;\n}\ndocument.getElementById('c-anciennete').addEventListener('input', e => {\n  cState.anciennete = +e.target.value;\n  document.getElementById('c-anciennete-val').textContent = `${cState.anciennete} an${cState.anciennete > 1 ? 's' : ''}`;\n  renderC();\n});\nwirePills('c-hors-saison-pills', 'horsSaison', cState, renderC);\nwirePills('c-temps-partiel-pills', 'tempsPartiel', cState, renderC);\nrenderC();\n\n\u002F\u002F ─── HEURES SUPP STATE & COMPUTE ─────────────────────────────────────────────\nconst hState = { horaire: 14, t1: 4, t2: 0, cumul: 50, effectif: 'petit' };\nfunction computeH(s) {\n  const t1Maj = s.horaire * 1.25 * s.t1;\n  const t2Maj = s.horaire * 1.50 * s.t2;\n  const total = t1Maj + t2Maj;\n  const depassement = Math.max(s.cumul - 350, 0);\n  const reposRate = s.effectif === 'petit' ? 0.5 : 1;\n  const reposHeures = depassement * reposRate;\n  return { t1Maj, t2Maj, total, depassement, reposHeures, reposRate };\n}\nfunction renderH() {\n  const r = computeH(hState);\n  document.getElementById('h-result-val').textContent = fmtEUR2(r.total);\n  document.getElementById('h-result-sub').textContent =\n    `${hState.t1} h (+25 %) + ${hState.t2} h (+50 %) · taux ${fmtEUR2(hState.horaire)}\u002Fh`;\n  document.getElementById('h-t1-result').textContent = fmtEUR2(r.t1Maj);\n  document.getElementById('h-t2-result').textContent = fmtEUR2(r.t2Maj);\n  const contingentEl = document.getElementById('h-contingent-status');\n  if (hState.cumul \u003C= 350) {\n    contingentEl.textContent = `${hState.cumul} h \u002F 350 h — dans le contingent`;\n  } else {\n    contingentEl.textContent = `${hState.cumul} h \u002F 350 h — dépassement de ${r.depassement} h`;\n  }\n  document.getElementById('h-repos-result').textContent =\n    r.reposHeures > 0\n      ? `${r.reposHeures} h (${r.reposRate * 100} % du dépassement)`\n      : 'Aucun (contingent non atteint)';\n  document.getElementById('h-horaire-val').textContent = `${hState.horaire.toFixed(2)} €\u002Fh`;\n  document.getElementById('h-t1-val').textContent = `${hState.t1} h`;\n  document.getElementById('h-t2-val').textContent = `${hState.t2} h`;\n  document.getElementById('h-cumul-val').textContent = `${hState.cumul} h`;\n}\ndocument.getElementById('h-horaire').addEventListener('input', e => { hState.horaire = +e.target.value; renderH(); });\ndocument.getElementById('h-t1').addEventListener('input', e => { hState.t1 = +e.target.value; renderH(); });\ndocument.getElementById('h-t2').addEventListener('input', e => { hState.t2 = +e.target.value; renderH(); });\ndocument.getElementById('h-cumul').addEventListener('input', e => { hState.cumul = +e.target.value; renderH(); });\nwirePills('h-effectif-pills', 'effectif', hState, renderH);\nrenderH();\n\n\u002F\u002F ─── TABS ──────────────────────────────────────────────────────────────────────\nconst tabBtns = document.querySelectorAll('[data-tab]');\nconst panels  = document.querySelectorAll('[data-panel]');\n\nfunction activate(id) {\n  tabBtns.forEach(t => t.classList.toggle('active', t.dataset.tab === id));\n  panels.forEach(p => {\n    const isActive = p.dataset.panel === id;\n    p.classList.toggle('active', isActive);\n  });\n  if (location.hash !== '#' + id) location.hash = id;\n  requestAnimationFrame(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n}\n\ntabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\nconst hashTab = location.hash.slice(1);\nconst firstTab = tabBtns[0] ? tabBtns[0].dataset.tab : 'indemnite';\nconst startTab = document.querySelector(`[data-tab=\"${hashTab}\"]`) ? hashTab : firstTab;\nactivate(startTab);\n\n\u002F\u002F ─── IFRAME RESIZE ────────────────────────────────────────────────────────────\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\n\u002F\u002F ─── ICONS ────────────────────────────────────────────────────────────────────\ndocument.addEventListener('DOMContentLoaded', () => {\n  if (typeof lucide !== 'undefined') lucide.createIcons();\n});\nif (document.readyState !== 'loading') {\n  if (typeof lucide !== 'undefined') lucide.createIcons();\n}\n\u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","generated","juridique","consumer","both","https:\u002F\u002Fpub-bdebbd2dad294475a2da0eb657815b6b.r2.dev\u002Ftools\u002Fccn-entreprises-du-paysage-52ff32c52d.webp",[]]