[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"footer-root-categories-fr-FR":3,"tool-content-ccn-des-organismes-de-tourisme-fr":83,"footer-cities-fr":156},[4,14,22,30,38,45,53,60,67,75],{"seo_content":5,"id":8,"name":9,"slug":10,"parentId":7,"lang":11,"_count":12},[6],{"page_slug":7},null,"cmkzhl7xm00dbulbc93h4qog5","Juridique","avocats","fr-FR",{"experts":13},8,{"seo_content":15,"id":17,"name":18,"slug":19,"parentId":7,"lang":11,"_count":20},[16],{"page_slug":7},"cmkzhl84700djulbcbv6pzu9e","Informatique","informaticiens",{"experts":21},3,{"seo_content":23,"id":25,"name":26,"slug":27,"parentId":7,"lang":11,"_count":28},[24],{"page_slug":7},"cmkzhlaos00gnulbc07i9jrco","Amélioration de la Maison","artisans",{"experts":29},4,{"seo_content":31,"id":33,"name":34,"slug":35,"parentId":7,"lang":11,"_count":36},[32],{"page_slug":7},"cmkzhlaqg00gpulbcx38bwoc2","Général","divers-generalistes",{"experts":37},0,{"seo_content":39,"id":41,"name":42,"slug":43,"parentId":7,"lang":11,"_count":44},[40],{"page_slug":7},"cmkzhlbvq00i3ulbcutdbcz50","Électronique Grand Public","techniciens-electronique",{"experts":21},{"seo_content":46,"id":48,"name":49,"slug":50,"parentId":7,"lang":11,"_count":51},[47],{"page_slug":7},"cmkzhlcaw00ilulbc38pxoogr","Santé","medecins",{"experts":52},5,{"seo_content":54,"id":56,"name":57,"slug":58,"parentId":7,"lang":11,"_count":59},[55],{"page_slug":7},"cmkzhlcmi00izulbcxva1m47f","Gestion de Patrimoine","conseillers-patrimoniaux",{"experts":21},{"seo_content":61,"id":63,"name":64,"slug":65,"parentId":7,"lang":11,"_count":66},[62],{"page_slug":7},"cmkzhldcv00jvulbcmcd5a7mk","Animaux et Vétérinaires","veterinaires",{"experts":21},{"seo_content":68,"id":70,"name":71,"slug":72,"parentId":7,"lang":11,"_count":73},[69],{"page_slug":7},"cmkzhldrr00kdulbchxfo67eg","Mécanique et Réparation","mecaniciens",{"experts":74},1,{"seo_content":76,"id":78,"name":79,"slug":80,"parentId":7,"lang":11,"_count":81},[77],{"page_slug":7},"cmkzhl9l300fbulbcv3i8q8p3","Aide aux Devoirs","professeurs-particuliers",{"experts":82},6,{"slug":84,"title":85,"page_title":86,"description":87,"content_md":88,"local_slug":84,"json_ld":89,"faq":126,"tool_html":150,"source":151,"category":152,"audience":153,"publish_mode":154,"hero_image":155,"hero_image_alt":85},"ccn-des-organismes-de-tourisme","CCN des organismes de tourisme — calculateur complet","Calculateur CCN Organismes de Tourisme IDCC 1909 | Expert Zoom","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté, le 13e mois et les heures supplémentaires de la CCN des organismes de tourisme (IDCC 1909).","Ce calculateur couvre les 5 principales règles de la convention collective des organismes de tourisme (IDCC 1909) : l'indemnité de licenciement avec doublement pour les seniors, le préavis par catégorie, la grille salariale par points (valeur 1,264 €), les primes d'ancienneté et 13e mois, et les heures supplémentaires majorées à 30%.",[90,109],{"name":91,"@type":92,"about":93,"author":97,"@context":100,"isPartOf":101,"inLanguage":104,"description":105,"operatingSystem":106,"applicationCategory":107,"isAccessibleForFree":108},"Calculateur CCN Organismes de Tourisme — IDCC 1909","WebApplication",{"name":94,"@type":95,"identifier":96},"Convention collective nationale des organismes de tourisme","Thing","IDCC 1909",{"name":98,"@type":99},"Expert-Zoom","Organization","https:\u002F\u002Fschema.org",{"url":102,"@type":103},"\u002Ffr\u002Fmagazine\u002Fjuridique\u002Fles-conventions-collectives-en-france","Article","fr","Outil interactif couvrant l'indemnité de licenciement, le préavis, la grille salariale, la prime d'ancienneté, le 13e mois et les heures supplémentaires de la convention collective des organismes de tourisme (IDCC 1909).","All","FinanceApplication",true,{"@type":110,"@context":100,"mainEntity":111},"FAQPage",[112,118,122],{"name":113,"@type":114,"acceptedAnswer":115},"Comment est calculée l'indemnité de licenciement dans la convention collective des organismes de tourisme ?","Question",{"text":116,"@type":117},"La CCN IDCC 1909 applique la formule légale (1\u002F4 de mois par année pour les 10 premières, puis 1\u002F3 au-delà), mais double l'indemnité pour les salariés de plus de 52 ans ayant au moins 20 ans d'ancienneté.","Answer",{"name":119,"@type":114,"acceptedAnswer":120},"Quelle est la durée du préavis dans la CCN organismes de tourisme ?",{"text":121,"@type":117},"1 mois pour les employés (2 mois dès 2 ans d'ancienneté), 2 mois pour les techniciens\u002Fagents de maîtrise, et 3 mois pour les cadres.",{"name":123,"@type":114,"acceptedAnswer":124},"Quelle est la grille des salaires minimaux CCN 1909 en 2026 ?",{"text":125,"@type":117},"Valeur du point : 1,264 €. Les minima vont de 1 896 € (indice 1 500) à 4 271 € (indice 3 379) pour 35 heures hebdomadaires.",[127,129,132,135,138,141,144,147],{"a":128,"q":113},"La CCN IDCC 1909 applique la formule légale (1\u002F4 de mois de salaire par année pour les 10 premières années, puis 1\u002F3 de mois au-delà), mais prévoit un avantage majeur : l'indemnité est doublée pour les salariés de plus de 52 ans ayant au moins 20 ans d'ancienneté.",{"a":130,"q":131},"Le préavis est de 1 mois pour les employés (porté à 2 mois dès 2 ans d'ancienneté), 2 mois pour les techniciens et agents de maîtrise (sans condition d'ancienneté), et 3 mois pour les cadres — ce qui est plus favorable que le maximum légal de 2 mois.","Quelle est la durée du préavis de licenciement dans la CCN organismes de tourisme ?",{"a":133,"q":134},"La valeur du point est de 1,264 € au 1er janvier 2026. Les salaires vont de 1 896 € (indice 1 500, niveau 1.1\u002F1.2) à 4 271 € (indice 3 379, niveau 3.3) par mois brut pour 35 heures. Tous les niveaux sont supérieurs au SMIC.","Quelle est la grille des salaires minimaux de la CCN 1909 en 2026 ?",{"a":136,"q":137},"Oui. La CCN 1909 prévoit une gratification annuelle d'au moins 17,5 % du salaire brut mensuel moyen des 12 derniers mois, versée à partir de 6 mois d'ancienneté. Cette prime n'est pas imposée par le code du travail — c'est une obligation purement conventionnelle.","Y a-t-il un 13e mois dans la convention collective des organismes de tourisme ?",{"a":139,"q":140},"Oui. Dès 3 ans d'ancienneté, le salarié perçoit une prime égale à 3 % de son salaire de base. Cette prime augmente de 1 point tous les 3 ans et est plafonnée à 15 % (atteint après 33 ans).","Existe-t-il une prime d'ancienneté dans la CCN tourisme IDCC 1909 ?",{"a":142,"q":143},"Les 8 premières heures supplémentaires sont majorées à 30 % (contre 25 % selon le minimum légal). Les heures suivantes sont majorées à 50 %, comme la loi. Le contingent annuel est fixé à 130 heures.","Quelle est la majoration des heures supplémentaires dans la CCN des organismes de tourisme ?",{"a":145,"q":146},"La convention collective nationale des organismes de tourisme (IDCC 1909, brochure n° 3175) s'applique aux salariés travaillant dans les structures spécialisées dans le tourisme : offices de tourisme, agences de développement touristique, syndicats d'initiative, etc.","Qu'est-ce que la CCN IDCC 1909 ?",{"a":148,"q":149},"La CCN 1909 garantit la base légale de 25 jours ouvrés (30 jours ouvrables) et ajoute 1 jour supplémentaire après 10 ans d'ancienneté dans l'entreprise.","Les congés payés sont-ils plus avantageux dans la CCN tourisme ?","\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 Organismes de Tourisme IDCC 1909\u003C\u002Ftitle>\n  \u003Cscript src=\"https:\u002F\u002Funpkg.com\u002Flucide@latest\u002Fdist\u002Fumd\u002Flucide.min.js\">\u003C\u002Fscript>\n  \u003Cstyle>\n    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n    :root {\n      --bg: #fafaf9;\n      --surface: #ffffff;\n      --border: #e7e5e4;\n      --accent: #2563eb;\n      --accent-light: #eff6ff;\n      --accent-dark: #1d4ed8;\n      --text: #1c1917;\n      --muted: #78716c;\n      --success-bg: #f0fdf4;\n      --success-border: #bbf7d0;\n      --success-text: #166534;\n      --info-bg: #eff6ff;\n      --info-border: #bfdbfe;\n      --info-text: #1e40af;\n      --radius: 0.75rem;\n      --radius-sm: 0.5rem;\n    }\n    body { font-family: system-ui, -apple-system, sans-serif; background: var(--bg); color: var(--text); font-size: 15px; line-height: 1.5; }\n    .tool-root { max-width: 720px; margin: 0 auto; padding: 1.25rem 1rem 2rem; }\n    .tool-header { margin-bottom: 1.25rem; }\n    .tool-header h1 { font-size: 1.15rem; font-weight: 700; color: var(--text); }\n    .idcc-badge { display: inline-block; background: var(--accent); color: #fff; font-size: 0.7rem; font-weight: 600; border-radius: 999px; padding: 0.15rem 0.6rem; margin-left: 0.5rem; vertical-align: middle; letter-spacing: 0.03em; }\n    .tool-header p { color: var(--muted); font-size: 0.875rem; margin-top: 0.25rem; }\n    \u002F* Tabs *\u002F\n    .tabs-nav { display: flex; gap: 0.25rem; border-bottom: 2px solid var(--border); margin-bottom: 1.25rem; overflow-x: auto; padding-bottom: 0; flex-wrap: nowrap; }\n    .tab-btn { background: none; border: none; padding: 0.6rem 0.9rem; font-size: 0.82rem; font-weight: 500; color: var(--muted); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -2px; white-space: nowrap; border-radius: var(--radius-sm) var(--radius-sm) 0 0; transition: color 0.15s, border-color 0.15s; display: flex; align-items: center; gap: 0.35rem; }\n    .tab-btn:hover { color: var(--accent); background: var(--accent-light); }\n    .tab-btn.active { color: var(--accent); border-bottom-color: var(--accent); font-weight: 600; }\n    .tab-btn svg { width: 14px; height: 14px; }\n    \u002F* Panels *\u002F\n    .tab-panel { display: none; }\n    .tab-panel.active { display: block; }\n    \u002F* Rule callout *\u002F\n    .rule-callout { background: var(--info-bg); border: 1px solid var(--info-border); border-radius: var(--radius-sm); padding: 0.75rem 1rem; margin-bottom: 1.25rem; display: flex; gap: 0.6rem; align-items: flex-start; }\n    .rule-callout svg { flex-shrink: 0; color: var(--accent); margin-top: 2px; width: 16px; height: 16px; }\n    .rule-callout p { font-size: 0.85rem; color: var(--info-text); }\n    \u002F* Card *\u002F\n    .card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1.25rem; margin-bottom: 1rem; }\n    \u002F* Form fields *\u002F\n    .field { margin-bottom: 1rem; }\n    .field label { display: block; font-size: 0.825rem; font-weight: 600; color: var(--text); margin-bottom: 0.4rem; }\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-value { font-size: 0.875rem; font-weight: 600; color: var(--accent); font-variant-numeric: tabular-nums; min-width: 5.5rem; text-align: right; }\n    select, input[type=number] { width: 100%; border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 0.5rem 0.75rem; font-size: 0.875rem; color: var(--text); background: var(--surface); }\n    select:focus, input[type=number]:focus { outline: 2px solid var(--accent); outline-offset: 1px; }\n    \u002F* Pills *\u002F\n    .pills { display: flex; flex-wrap: wrap; gap: 0.4rem; }\n    .pill { padding: 0.35rem 0.75rem; border-radius: 999px; border: 1px solid var(--border); font-size: 0.8rem; font-weight: 500; cursor: pointer; transition: all 0.15s; background: var(--surface); color: var(--muted); }\n    .pill.active { background: var(--accent); color: #fff; border-color: var(--accent); }\n    \u002F* Result *\u002F\n    .result-card { background: var(--success-bg); border: 1px solid var(--success-border); border-radius: var(--radius); padding: 1rem 1.25rem; display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }\n    .result-label { font-size: 0.875rem; font-weight: 600; color: var(--success-text); display: flex; align-items: center; gap: 0.4rem; }\n    .result-label svg { width: 16px; height: 16px; }\n    .result-value { font-size: 1.5rem; font-weight: 700; color: var(--success-text); font-variant-numeric: tabular-nums; }\n    .result-detail { font-size: 0.75rem; color: var(--muted); margin-top: 0.25rem; }\n    \u002F* Disclaimer *\u002F\n    .disclaimer { font-size: 0.75rem; color: var(--muted); margin-top: 1.5rem; padding-top: 1rem; border-top: 1px solid var(--border); line-height: 1.6; }\n    .disclaimer a { color: var(--accent); text-decoration: underline; }\n    \u002F* Two columns layout *\u002F\n    .fields-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 1rem; }\n    @media (max-width: 480px) { .fields-grid { grid-template-columns: 1fr; } }\n    \u002F* Grille table *\u002F\n    .grille-table { width: 100%; border-collapse: collapse; font-size: 0.82rem; }\n    .grille-table th { background: var(--accent-light); color: var(--accent-dark); padding: 0.4rem 0.6rem; text-align: left; font-weight: 600; border: 1px solid var(--info-border); }\n    .grille-table td { padding: 0.4rem 0.6rem; border: 1px solid var(--border); }\n    .grille-table tr:nth-child(even) td { background: var(--bg); }\n    .grille-table tr.highlight td { background: var(--success-bg); font-weight: 600; color: var(--success-text); }\n    .section-title { font-size: 0.8rem; font-weight: 700; color: var(--muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.5rem; margin-top: 0.25rem; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n\u003C!-- CCN IDCC 1909 — deviations\n     indemnite: L1234-9 → doubling for employees >52 years AND >20 years seniority (art. CCN 1909)\n     preavis: L1234-1 → employés 1→2 mois à 2 ans; techniciens 2 mois; cadres 3 mois (art. CCN 1909)\n     salaire-min: SMIC → grille par points (valeur point 1.264 €, 9 niveaux) — January 2026\n     prime-anciennete: aucune obligation légale → 3% à 3 ans + 1%\u002F3ans (max 15%) + 13e mois 17.5%\n     heures-supp: L3121-36 (25%\u002F50%) → 30%\u002F50% + nuit\u002Fdimanche\u002FJF bonifiés\n-->\n\u003Cmain class=\"tool-root\">\n  \u003Cdiv class=\"tool-header\">\n    \u003Ch1>CCN Organismes de Tourisme \u003Cspan class=\"idcc-badge\">IDCC 1909\u003C\u002Fspan>\u003C\u002Fh1>\n    \u003Cp>Calculateur des règles conventionnelles — indemnité, préavis, grille salariale, primes &amp; heures supp\u003C\u002Fp>\n  \u003C\u002Fdiv>\n\n  \u003Cnav class=\"tabs-nav\" role=\"tablist\" aria-label=\"Fonctions de la convention collective\">\n    \u003Cbutton class=\"tab-btn\" data-tab=\"indemnite\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"calculator\">\u003C\u002Fi> Indemnité\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"preavis\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"clock\">\u003C\u002Fi> Préavis\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"salaire-min\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"bar-chart-2\">\u003C\u002Fi> Grille salariale\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"prime-anciennete\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"star\">\u003C\u002Fi> Primes\n    \u003C\u002Fbutton>\n    \u003Cbutton class=\"tab-btn\" data-tab=\"heures-supp\" role=\"tab\" aria-selected=\"false\">\n      \u003Ci data-lucide=\"trending-up\">\u003C\u002Fi> Heures supp\n    \u003C\u002Fbutton>\n  \u003C\u002Fnav>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 1 — INDEMNITÉ DE LICENCIEMENT\n  ════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"indemnite\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN 1909 reprend la formule légale (1\u002F4 mois × années ≤10 ans + 1\u002F3 mois × années &gt;10 ans) mais ajoute un \u003Cstrong>doublement de l'indemnité\u003C\u002Fstrong> pour les salariés de plus de 52 ans ayant 20 ans d'ancienneté ou plus — avantage absent du code du travail (L1234-9).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire de référence brut mensuel\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"ind-salaire\" min=\"1500\" max=\"8000\" step=\"50\" value=\"2800\">\n          \u003Cspan class=\"field-value\" id=\"ind-salaire-val\">2 800 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté (années complètes)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"ind-anc\" min=\"1\" max=\"40\" step=\"1\" value=\"8\">\n          \u003Cspan class=\"field-value\" id=\"ind-anc-val\">8 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Âge du salarié\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"ind-age\" min=\"18\" max=\"70\" step=\"1\" value=\"40\">\n          \u003Cspan class=\"field-value\" id=\"ind-age-val\">40 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Motif du licenciement\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"ind-motif-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"personnel\">Personnel \u002F Économique\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"inaptitude\">Inaptitude\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\" id=\"ind-result\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">\u003Ci data-lucide=\"check-circle\">\u003C\u002Fi> Indemnité conventionnelle estimée\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"ind-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-detail\" id=\"ind-detail\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 2 — PRÉAVIS\n  ════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"preavis\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN 1909 prévoit des préavis plus favorables que le minimum légal (L1234-1) : \u003Cstrong>2 mois dès 2 ans pour les employés\u003C\u002Fstrong>, \u003Cstrong>2 mois d'emblée pour les techniciens\u002Fagents de maîtrise\u003C\u002Fstrong>, et \u003Cstrong>3 mois pour les cadres\u003C\u002Fstrong>, contre 2 mois au maximum selon la loi.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Catégorie professionnelle\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pr-cat-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"employe\">Employé\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"tam\">Technicien \u002F Agent de maîtrise\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"cadre\">Cadre\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\" id=\"pr-anc-field\">\n        \u003Clabel>Ancienneté (années)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"pr-anc\" min=\"0\" max=\"30\" step=\"1\" value=\"1\">\n          \u003Cspan class=\"field-value\" id=\"pr-anc-val\">1 an\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\" id=\"pr-result\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">\u003Ci data-lucide=\"check-circle\">\u003C\u002Fi> Durée conventionnelle du préavis\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"pr-duration\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-detail\" id=\"pr-detail\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 3 — GRILLE SALARIALE\n  ════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"salaire-min\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN 1909 établit une grille de salaires minimaux par points (valeur du point : \u003Cstrong>1,264 €\u003C\u002Fstrong> au 1er janvier 2026). Tous les niveaux sont \u003Cstrong>supérieurs au SMIC\u003C\u002Fstrong> (~1 802 €\u002Fmois). L'indice le plus bas (1 500) correspond à 1 896 €\u002Fmois.\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Niveau \u002F Classification\u003C\u002Flabel>\n        \u003Cselect id=\"sm-niveau\">\n          \u003Coption value=\"1500\">Niveau 1.1 \u002F 1.2 — indice 1 500\u003C\u002Foption>\n          \u003Coption value=\"1550\">Niveau 1.3 — indice 1 550\u003C\u002Foption>\n          \u003Coption value=\"1650\">Niveau 2.1 — indice 1 650\u003C\u002Foption>\n          \u003Coption value=\"1730\">Niveau 2.2 — indice 1 730\u003C\u002Foption>\n          \u003Coption value=\"1840\">Niveau 2.3 — indice 1 840\u003C\u002Foption>\n          \u003Coption value=\"2169\">Niveau 2.4 — indice 2 169\u003C\u002Foption>\n          \u003Coption value=\"2429\">Niveau 3.1 — indice 2 429\u003C\u002Foption>\n          \u003Coption value=\"2829\">Niveau 3.2 — indice 2 829\u003C\u002Foption>\n          \u003Coption value=\"3379\">Niveau 3.3 — indice 3 379\u003C\u002Foption>\n        \u003C\u002Fselect>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Durée hebdomadaire de travail (h)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"sm-heures\" min=\"24\" max=\"39\" step=\"0.5\" value=\"35\">\n          \u003Cspan class=\"field-value\" id=\"sm-heures-val\">35 h\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\" id=\"sm-result\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">\u003Ci data-lucide=\"check-circle\">\u003C\u002Fi> Salaire minimum conventionnel\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"sm-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-detail\" id=\"sm-detail\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\" style=\"margin-top:1rem;\">\n      \u003Cdiv class=\"section-title\">Grille complète (35h — janvier 2026)\u003C\u002Fdiv>\n      \u003Ctable class=\"grille-table\" id=\"sm-table\">\n        \u003Cthead>\n          \u003Ctr>\u003Cth>Niveau\u003C\u002Fth>\u003Cth>Indice\u003C\u002Fth>\u003Cth>Salaire brut mensuel\u003C\u002Fth>\u003C\u002Ftr>\n        \u003C\u002Fthead>\n        \u003Ctbody>\n          \u003Ctr>\u003Ctd>1.1 \u002F 1.2\u003C\u002Ftd>\u003Ctd>1 500\u003C\u002Ftd>\u003Ctd>1 896,00 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>1.3\u003C\u002Ftd>\u003Ctd>1 550\u003C\u002Ftd>\u003Ctd>1 959,20 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>2.1\u003C\u002Ftd>\u003Ctd>1 650\u003C\u002Ftd>\u003Ctd>2 085,60 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>2.2\u003C\u002Ftd>\u003Ctd>1 730\u003C\u002Ftd>\u003Ctd>2 186,72 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>2.3\u003C\u002Ftd>\u003Ctd>1 840\u003C\u002Ftd>\u003Ctd>2 325,76 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>2.4\u003C\u002Ftd>\u003Ctd>2 169\u003C\u002Ftd>\u003Ctd>2 741,62 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>3.1\u003C\u002Ftd>\u003Ctd>2 429\u003C\u002Ftd>\u003Ctd>3 070,26 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>3.2\u003C\u002Ftd>\u003Ctd>2 829\u003C\u002Ftd>\u003Ctd>3 575,86 €\u003C\u002Ftd>\u003C\u002Ftr>\n          \u003Ctr>\u003Ctd>3.3\u003C\u002Ftd>\u003Ctd>3 379\u003C\u002Ftd>\u003Ctd>4 271,06 €\u003C\u002Ftd>\u003C\u002Ftr>\n        \u003C\u002Ftbody>\n      \u003C\u002Ftable>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 4 — PRIMES (13e MOIS + ANCIENNETÉ)\n  ════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"prime-anciennete\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN 1909 oblige deux primes \u003Cstrong>sans équivalent légal\u003C\u002Fstrong> : un \u003Cstrong>13e mois\u003C\u002Fstrong> (minimum 17,5% du salaire annuel moyen, dès 6 mois d'ancienneté) et une \u003Cstrong>prime d'ancienneté progressive\u003C\u002Fstrong> (3% à 3 ans, +1% tous les 3 ans, plafonnée à 15%).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire brut mensuel de base\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"pa-salaire\" min=\"1500\" max=\"8000\" step=\"50\" value=\"2500\">\n          \u003Cspan class=\"field-value\" id=\"pa-salaire-val\">2 500 €\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Ancienneté dans l'entreprise (années)\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"pa-anc\" min=\"0\" max=\"40\" step=\"1\" value=\"5\">\n          \u003Cspan class=\"field-value\" id=\"pa-anc-val\">5 ans\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Type de prime à calculer\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"pa-type-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"both\">Les deux\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"13mois\">13e mois uniquement\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"anc\">Ancienneté uniquement\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\" id=\"pa-result\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">\u003Ci data-lucide=\"check-circle\">\u003C\u002Fi> Montant estimé des primes\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"pa-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-detail\" id=\"pa-detail\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003C!-- ═══════════════════════════════════════════════════════════\n       TAB 5 — HEURES SUPPLÉMENTAIRES\n  ════════════════════════════════════════════════════════════ -->\n  \u003Cdiv class=\"tab-panel\" data-panel=\"heures-supp\">\n    \u003Cdiv class=\"rule-callout\">\n      \u003Ci data-lucide=\"info\">\u003C\u002Fi>\n      \u003Cp>La CCN 1909 majore les 8 premières heures supplémentaires à \u003Cstrong>30%\u003C\u002Fstrong> (contre 25% au minimum légal, L3121-36). Au-delà : 50%, identique à la loi. Le contingent annuel est fixé à \u003Cstrong>130 heures\u003C\u002Fstrong>. Des majorations spécifiques s'appliquent pour le travail de nuit (100%) et les dimanches\u002Fjours fériés (50% + repos compensateur 100%).\u003C\u002Fp>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"card\">\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Salaire horaire brut\u003C\u002Flabel>\n        \u003Cdiv class=\"field-row\">\n          \u003Cinput type=\"range\" id=\"hs-horaire\" min=\"10\" max=\"60\" step=\"0.5\" value=\"18\">\n          \u003Cspan class=\"field-value\" id=\"hs-horaire-val\">18,00 €\u002Fh\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"fields-grid\">\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Heures supp (8 premières)\u003C\u002Flabel>\n          \u003Cdiv class=\"field-row\">\n            \u003Cinput type=\"range\" id=\"hs-h8\" min=\"0\" max=\"8\" step=\"0.5\" value=\"4\">\n            \u003Cspan class=\"field-value\" id=\"hs-h8-val\">4 h\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n        \u003Cdiv class=\"field\">\n          \u003Clabel>Heures supp (au-delà de 8)\u003C\u002Flabel>\n          \u003Cdiv class=\"field-row\">\n            \u003Cinput type=\"range\" id=\"hs-hplus\" min=\"0\" max=\"20\" step=\"0.5\" value=\"0\">\n            \u003Cspan class=\"field-value\" id=\"hs-hplus-val\">0 h\u003C\u002Fspan>\n          \u003C\u002Fdiv>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n      \u003Cdiv class=\"field\">\n        \u003Clabel>Type d'heures\u003C\u002Flabel>\n        \u003Cdiv class=\"pills\" id=\"hs-type-pills\">\n          \u003Cbutton class=\"pill active\" data-val=\"normal\">Heures supplémentaires\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"nuit\">Travail de nuit (21h-6h)\u003C\u002Fbutton>\n          \u003Cbutton class=\"pill\" data-val=\"dimanche\">Dimanche \u002F Jour férié\u003C\u002Fbutton>\n        \u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n    \u003Cdiv class=\"result-card\" id=\"hs-result\">\n      \u003Cdiv>\n        \u003Cdiv class=\"result-label\">\u003Ci data-lucide=\"check-circle\">\u003C\u002Fi> Complément salarial total estimé\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-value\" id=\"hs-amount\">—\u003C\u002Fdiv>\n        \u003Cdiv class=\"result-detail\" id=\"hs-detail\">\u003C\u002Fdiv>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  \u003C\u002Fdiv>\n\n  \u003Cp class=\"disclaimer\">\n    Calcul indicatif basé sur la CCN IDCC 1909 (Organismes de tourisme).\n    Source : \u003Ca href=\"https:\u002F\u002Fwww.legifrance.gouv.fr\u002Fconv_coll\u002Fid\u002FKALICONT000005635728\" target=\"_blank\" rel=\"noopener\">Legifrance — KALICONT000005635728\u003C\u002Fa>.\n    Valeur du point salarial au 01\u002F01\u002F2026 : 1,264 €.\n    Pour validation légale\n  \u003C\u002Fp>\n\u003C\u002Fmain>\n\n\u003Cscript>\n(function () {\n  'use strict';\n\n  \u002F\u002F ── Formatters ──────────────────────────────────────────────\n  const fmtEur = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR', maximumFractionDigits: 2 });\n  const fmtNum = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 2 });\n\n  \u002F\u002F ── State ───────────────────────────────────────────────────\n  const state = {\n    \u002F\u002F indemnite\n    ind: { salaire: 2800, anc: 8, age: 40, motif: 'personnel' },\n    \u002F\u002F preavis\n    pr: { cat: 'employe', anc: 1 },\n    \u002F\u002F salaire-min\n    sm: { indice: 1500, heures: 35 },\n    \u002F\u002F prime-anciennete\n    pa: { salaire: 2500, anc: 5, type: 'both' },\n    \u002F\u002F heures-supp\n    hs: { horaire: 18, h8: 4, hplus: 0, type: 'normal' },\n  };\n\n  \u002F\u002F ── Compute functions ────────────────────────────────────────\n\n  function computeInd(s) {\n    const { salaire, anc, age } = s;\n    let base = 0;\n    const tranche1 = Math.min(anc, 10);\n    const tranche2 = Math.max(0, anc - 10);\n    base = (tranche1 * (1\u002F4) + tranche2 * (1\u002F3)) * salaire;\n    let doubled = false;\n    if (age > 52 && anc >= 20) { base *= 2; doubled = true; }\n    let detail = `Base: ${fmtEur.format(tranche1 * (1\u002F4) * salaire + tranche2 * (1\u002F3) * salaire)}`;\n    if (doubled) detail += ' × 2 (doublement conventionnel ≥20 ans + >52 ans)';\n    return { amount: base, detail };\n  }\n\n  function computePr(s) {\n    const { cat, anc } = s;\n    let dur = '', detail = '';\n    if (cat === 'employe') {\n      if (anc \u003C 2) { dur = '1 mois'; detail = 'Employé — ancienneté \u003C 2 ans'; }\n      else { dur = '2 mois'; detail = 'Employé — ancienneté ≥ 2 ans'; }\n    } else if (cat === 'tam') {\n      dur = '2 mois'; detail = 'Technicien \u002F Agent de maîtrise (sans condition d\\'ancienneté)';\n    } else {\n      dur = '3 mois'; detail = 'Cadre (plus favorable que le maximum légal de 2 mois)';\n    }\n    return { dur, detail };\n  }\n\n  const POINT_VALUE = 1.264;\n  function computeSm(s) {\n    const base35 = s.indice * POINT_VALUE;\n    const adjusted = s.heures === 35 ? base35 : base35 * (s.heures \u002F 35);\n    const detail = `Indice ${s.indice} × ${POINT_VALUE} € = ${fmtEur.format(base35)} (35h)` +\n      (s.heures !== 35 ? ` → proratisé ${s.heures}h : ${fmtEur.format(adjusted)}` : '');\n    return { amount: adjusted, detail };\n  }\n\n  function computePa(s) {\n    const { salaire, anc, type } = s;\n    \u002F\u002F 13e mois: 17.5% of annual average, prorated if \u003C12 months\n    const eligible13 = anc >= 0.5; \u002F\u002F 6 months\n    const montant13 = eligible13 ? salaire * 0.175 : 0;\n    \u002F\u002F Prime ancienneté: 3% at 3 years, +1% every 3 years, max 15%\n    let pctAnc = 0;\n    if (anc >= 3) { pctAnc = Math.min(3 + Math.floor((anc - 3) \u002F 3), 15); }\n    const montantAnc = salaire * (pctAnc \u002F 100);\n\n    let amount = 0, detail = '';\n    if (type === 'both') {\n      amount = montant13 + montantAnc;\n      const parts = [];\n      if (eligible13) parts.push(`13e mois: ${fmtEur.format(montant13)}`);\n      if (pctAnc > 0) parts.push(`ancienneté ${pctAnc}%: ${fmtEur.format(montantAnc)}`);\n      detail = parts.join(' + ') || 'Aucune prime eligible (ancienneté insuffisante)';\n    } else if (type === '13mois') {\n      amount = montant13;\n      detail = eligible13 ? `17,5% × ${fmtEur.format(salaire)}` : 'Ancienneté \u003C 6 mois — non éligible';\n    } else {\n      amount = montantAnc;\n      detail = pctAnc > 0 ? `Taux ancienneté: ${pctAnc}% × ${fmtEur.format(salaire)}` : 'Ancienneté \u003C 3 ans — pas de prime';\n    }\n    return { amount, detail };\n  }\n\n  function computeHs(s) {\n    const { horaire, h8, hplus, type } = s;\n    let amount = 0, detail = '';\n    if (type === 'normal') {\n      const c1 = h8 * horaire * 0.30;\n      const c2 = hplus * horaire * 0.50;\n      amount = c1 + c2;\n      detail = `${h8}h × ${fmtNum.format(horaire)} × 30%` + (hplus > 0 ? ` + ${hplus}h × ${fmtNum.format(horaire)} × 50%` : '');\n    } else if (type === 'nuit') {\n      const totalH = h8 + hplus;\n      amount = totalH * horaire * 1.00; \u002F\u002F 100% majoration\n      detail = `Travail de nuit: ${totalH}h × ${fmtNum.format(horaire)} × 100%`;\n    } else { \u002F\u002F dimanche\u002FJF\n      const totalH = h8 + hplus;\n      amount = totalH * horaire * 0.50; \u002F\u002F 50% majoré + repos compensateur\n      detail = `Dimanche\u002FJF: ${totalH}h × ${fmtNum.format(horaire)} × 50% + repos compensateur 100%`;\n    }\n    return { amount, detail };\n  }\n\n  \u002F\u002F ── Render ────────────────────────────────────────────────────\n  function renderInd() {\n    const r = computeInd(state.ind);\n    document.getElementById('ind-amount').textContent = fmtEur.format(r.amount);\n    document.getElementById('ind-detail').textContent = r.detail;\n  }\n  function renderPr() {\n    const r = computePr(state.pr);\n    document.getElementById('pr-duration').textContent = r.dur;\n    document.getElementById('pr-detail').textContent = r.detail;\n  }\n  function renderSm() {\n    const r = computeSm(state.sm);\n    document.getElementById('sm-amount').textContent = fmtEur.format(r.amount);\n    document.getElementById('sm-detail').textContent = r.detail;\n    \u002F\u002F highlight table row\n    const rows = document.querySelectorAll('#sm-table tbody tr');\n    const indices = [1500,1550,1650,1730,1840,2169,2429,2829,3379];\n    rows.forEach((row, i) => row.classList.toggle('highlight', indices[i] === state.sm.indice));\n  }\n  function renderPa() {\n    const r = computePa(state.pa);\n    document.getElementById('pa-amount').textContent = fmtEur.format(r.amount);\n    document.getElementById('pa-detail').textContent = r.detail;\n  }\n  function renderHs() {\n    const r = computeHs(state.hs);\n    document.getElementById('hs-amount').textContent = fmtEur.format(r.amount);\n    document.getElementById('hs-detail').textContent = r.detail;\n  }\n\n  \u002F\u002F ── Slider helpers ────────────────────────────────────────────\n  function bindSlider(id, valId, stateKey, subKey, suffix, transform) {\n    const el = document.getElementById(id);\n    const vEl = document.getElementById(valId);\n    el.addEventListener('input', () => {\n      const v = parseFloat(el.value);\n      state[stateKey][subKey] = v;\n      vEl.textContent = (transform ? transform(v) : v) + suffix;\n    });\n    \u002F\u002F init display\n    const v = state[stateKey][subKey];\n    el.value = v;\n    vEl.textContent = (transform ? transform(v) : v) + suffix;\n  }\n\n  function bindPills(containerId, stateKey, subKey, renderFn) {\n    const pills = document.querySelectorAll('#' + containerId + ' .pill');\n    pills.forEach(p => {\n      p.addEventListener('click', () => {\n        pills.forEach(x => x.classList.remove('active'));\n        p.classList.add('active');\n        state[stateKey][subKey] = p.dataset.val;\n        renderFn();\n      });\n    });\n  }\n\n  \u002F\u002F ── Tabs ──────────────────────────────────────────────────────\n  const tabBtns = document.querySelectorAll('[data-tab]');\n  const tabPanels = document.querySelectorAll('[data-panel]');\n\n  function activate(id) {\n    tabBtns.forEach(t => {\n      const active = t.dataset.tab === id;\n      t.classList.toggle('active', active);\n      t.setAttribute('aria-selected', active);\n    });\n    tabPanels.forEach(p => p.classList.toggle('active', p.dataset.panel === id));\n    try { if (location.hash !== '#' + id) location.hash = id; } catch(e) {}\n    requestAnimationFrame(() => window.dispatchEvent(new Event('resize')));\n  }\n\n  tabBtns.forEach(t => t.addEventListener('click', () => activate(t.dataset.tab)));\n\n  \u002F\u002F ── Wire up inputs ────────────────────────────────────────────\n\n  \u002F\u002F Indemnite\n  bindSlider('ind-salaire','ind-salaire-val','ind','salaire',' €', v => new Intl.NumberFormat('fr-FR').format(v));\n  bindSlider('ind-anc','ind-anc-val','ind','anc', v => v \u003C= 1 ? ' an' : ' ans');\n  bindSlider('ind-age','ind-age-val','ind','age',' ans');\n  document.getElementById('ind-salaire').addEventListener('input', renderInd);\n  document.getElementById('ind-anc').addEventListener('input', renderInd);\n  document.getElementById('ind-age').addEventListener('input', renderInd);\n  bindPills('ind-motif-pills','ind','motif', renderInd);\n\n  \u002F\u002F Préavis\n  bindSlider('pr-anc','pr-anc-val','pr','anc', v => v \u003C= 1 ? ' an' : ' ans');\n  document.getElementById('pr-anc').addEventListener('input', renderPr);\n  bindPills('pr-cat-pills','pr','cat', renderPr);\n\n  \u002F\u002F Salaire min\n  document.getElementById('sm-niveau').addEventListener('change', e => {\n    state.sm.indice = parseInt(e.target.value);\n    renderSm();\n  });\n  bindSlider('sm-heures','sm-heures-val','sm','heures',' h');\n  document.getElementById('sm-heures').addEventListener('input', renderSm);\n\n  \u002F\u002F Prime ancienneté\n  bindSlider('pa-salaire','pa-salaire-val','pa','salaire',' €', v => new Intl.NumberFormat('fr-FR').format(v));\n  bindSlider('pa-anc','pa-anc-val','pa','anc', v => v \u003C= 1 ? ' an' : ' ans');\n  document.getElementById('pa-salaire').addEventListener('input', renderPa);\n  document.getElementById('pa-anc').addEventListener('input', renderPa);\n  bindPills('pa-type-pills','pa','type', renderPa);\n\n  \u002F\u002F Heures supp\n  bindSlider('hs-horaire','hs-horaire-val','hs','horaire',' €\u002Fh', v => new Intl.NumberFormat('fr-FR',{minimumFractionDigits:2,maximumFractionDigits:2}).format(v));\n  bindSlider('hs-h8','hs-h8-val','hs','h8',' h');\n  bindSlider('hs-hplus','hs-hplus-val','hs','hplus',' h');\n  document.getElementById('hs-horaire').addEventListener('input', renderHs);\n  document.getElementById('hs-h8').addEventListener('input', renderHs);\n  document.getElementById('hs-hplus').addEventListener('input', renderHs);\n  bindPills('hs-type-pills','hs','type', renderHs);\n\n  \u002F\u002F ── Iframe resize ─────────────────────────────────────────────\n  const ro = new ResizeObserver(() => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n  ro.observe(document.documentElement);\n\n  window.addEventListener('resize', () => {\n    const h = Math.max(document.documentElement.scrollHeight, document.body.scrollHeight);\n    parent.postMessage({ type: 'resize', height: h }, '*');\n  });\n\n  \u002F\u002F ── Init ──────────────────────────────────────────────────────\n  const hashTab = location.hash.slice(1);\n  const validTabs = ['indemnite','preavis','salaire-min','prime-anciennete','heures-supp'];\n  const firstTab = validTabs.includes(hashTab) ? hashTab : 'indemnite';\n  activate(firstTab);\n  renderInd();\n  renderPr();\n  renderSm();\n  renderPa();\n  renderHs();\n\n  \u002F\u002F Lucide icons\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-des-organismes-de-tourisme-9db0b87eaa.webp",[]]