{"id":2347,"date":"2020-10-29T19:24:03","date_gmt":"2020-10-29T19:24:03","guid":{"rendered":"https:\/\/staging.ezsign.ca\/prix\/forfaits-moyennes-et-grandes-entreprises\/api\/"},"modified":"2026-02-25T15:17:13","modified_gmt":"2026-02-25T15:17:13","slug":"api","status":"publish","type":"page","link":"https:\/\/www.ezsign.com\/fr\/api\/","title":{"rendered":"API"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2347\" class=\"elementor elementor-2347 elementor-2215\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e4e7a4f e-con-full ms-back e-flex e-con e-parent\" data-id=\"e4e7a4f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-76e1c20 elementor-widget elementor-widget-heading\" data-id=\"76e1c20\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Connectez eZsign \u00e0 vos outils<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-98af1e1 elementor-widget elementor-widget-text-editor\" data-id=\"98af1e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Int\u00e9grations populaires :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-3876eda e-con-full e-flex e-con e-child\" data-id=\"3876eda\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-4f77ffd e-con-full e-flex e-con e-child\" data-id=\"4f77ffd\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-29d2b4b elementor-widget elementor-widget-image\" data-id=\"29d2b4b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"500\" src=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/2.png2_.png\" class=\"attachment-full size-full wp-image-27777\" alt=\"\" srcset=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/2.png2_.png 800w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/2.png2_-300x188.png 300w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/2.png2_-768x480.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-dab8e17 e-con-full e-flex e-con e-child\" data-id=\"dab8e17\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0c9ce5f elementor-widget elementor-widget-image\" data-id=\"0c9ce5f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"500\" data-src=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/1.png2_.png\" class=\"attachment-large size-large wp-image-27779 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/1.png2_.png 800w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/1.png2_-300x188.png 300w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/1.png2_-768x480.png 768w\" data-sizes=\"auto\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 800px; --smush-placeholder-aspect-ratio: 800\/500;\" data-original-sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e793066 e-con-full e-flex e-con e-child\" data-id=\"e793066\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-efcd9e0 elementor-widget elementor-widget-image\" data-id=\"efcd9e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/hopem.com\/en\/property-management-software\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"500\" data-src=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/4.png2_.png\" class=\"attachment-large size-large wp-image-27781 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/4.png2_.png 800w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/4.png2_-300x188.png 300w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/4.png2_-768x480.png 768w\" data-sizes=\"auto\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 800px; --smush-placeholder-aspect-ratio: 800\/500;\" data-original-sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f25e51f e-con-full e-flex e-con e-child\" data-id=\"f25e51f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-48468ca elementor-widget elementor-widget-image\" data-id=\"48468ca\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.viridem.ca\/en\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"500\" data-src=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/3.png2_.png\" class=\"attachment-large size-large wp-image-27783 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/3.png2_.png 800w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/3.png2_-300x188.png 300w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/3.png2_-768x480.png 768w\" data-sizes=\"auto\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 800px; --smush-placeholder-aspect-ratio: 800\/500;\" data-original-sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7b88018 e-con-full e-flex e-con e-child\" data-id=\"7b88018\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-57d2acc elementor-widget elementor-widget-image\" data-id=\"57d2acc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/pgsolutions.com\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"500\" data-src=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/5.png2_.png\" class=\"attachment-large size-large wp-image-27785 lazyload\" alt=\"\" data-srcset=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/5.png2_.png 800w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/5.png2_-300x188.png 300w, https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/5.png2_-768x480.png 768w\" data-sizes=\"auto\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 800px; --smush-placeholder-aspect-ratio: 800\/500;\" data-original-sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-462f436 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"462f436\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-21cbb17\" data-id=\"21cbb17\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a0097d8 elementor-widget elementor-widget-heading\" data-id=\"a0097d8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\"><a href=\"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/\">Retour aux options de forfaits<\/a><\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-19d0a33 elementor-widget elementor-widget-heading\" data-id=\"19d0a33\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">API<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-006f3d2 elementor-widget elementor-widget-text-editor\" data-id=\"006f3d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span class=\"a_GcMg\">Pour acc\u00e9der \u00e0 l\u2019API, vous devez poss\u00e9der un compte entreprise au co\u00fbt mensuel de 222.80$. Ce compte vous donne automatiquement 10 <\/span><span class=\"a_GcMg\">utilisateurs eZsign et 100 dossiers mensuels compl\u00e9t\u00e9s via l\u2019API.<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ade1394 elementor-widget elementor-widget-html\" data-id=\"ade1394\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- Styles for underline and popup -->\r\n\r\n<style>\r\n  \/* Your existing styles... *\/\r\n\r\n  @media (max-width: 570px) {\r\n    .custom-popup {\r\n      width: 70% !important;\r\n      padding: 15px;\r\n      font-size: 14px;\r\n      line-height: 20px;\r\n      \r\n    }\r\n\r\n    .popup-link {\r\n      font-size: 14px;\r\n      line-height: 20px;\r\n    }\r\n\r\n    .popup-close {\r\n      font-size: 18px;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<style>\r\n  .popup-link {\r\n    text-decoration: underline;\r\n    cursor: pointer;\r\n    color: inherit !important;\r\n    font-weight: bold !important;\r\n  }\r\n  .popup-link {\r\n  text-decoration: underline;\r\n  cursor: pointer;\r\n  color: inherit;\r\n  display: inline !important;\r\n  visibility: visible !important;\r\n}\r\n\r\n  .custom-popup {\r\n    display: none;\r\n    position: fixed;\r\n    z-index: 9999;\r\n    top: 50%;\r\n    left: 50%;\r\n    transform: translate(-50%, -50%);\r\n    width: 90%;\r\n    max-width: 500px;\r\n    background: white;\r\n    padding: 20px;\r\n    border-radius: 10px;\r\n    box-shadow: 0 0 15px rgba(0,0,0,0.3);\r\n  }\r\n\r\n  .popup-overlay {\r\n    display: none;\r\n    position: fixed;\r\n    z-index: 9998;\r\n    top: 0;\r\n    left: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    background: rgba(0,0,0,0.5);\r\n  }\r\n\r\n  .popup-close {\r\n    text-align: right;\r\n    margin-top: -10px;\r\n    margin-bottom: 10px;\r\n    cursor: pointer;\r\n    font-weight: bold;\r\n  }\r\n<\/style>\r\n\r\n<!-- Paragraph with clickable popup words -->\r\n<p style=\"font-weight:bold;\">Qu\u2019est\u2011ce qu\u2019un dossier ?<\/p>\r\n<p>\r\n  Un dossier regroupe un ou plusieurs documents \u00e0 faire signer. Vous pouvez y mettre plusieurs fichiers et signataires\u202f; la facturation se fait par\r\ndossier, pas par document individuel. Le forfait Entreprise API comprend 100 dossiers API compl\u00e9t\u00e9s par mois, qu\u2019ils proviennent d\u2019une int\u00e9gration, d\u2019un\r\n\r\n  <span class=\"popup-link\" onclick=\"openPopup('popup1')\">envoi group\u00e9<\/span> \r\n  ou d\u2019un \r\n  <span class=\"popup-link\" onclick=\"openPopup('popup2')\">lien partag\u00e9<\/span>.\r\n  <span >\r\nVous pouvez en cr\u00e9er autant que vous le souhaitez ; au-del\u00e0 de 100 dossiers API mensuels, les dossiers\r\nsuppl\u00e9mentaires sont factur\u00e9s selon le tableau ci-dessous.\r\n<\/span>\r\n\r\n  \r\n<\/p>\r\n\r\n<!-- Popup 1: Envoi group\u00e9 -->\r\n<div id=\"popup1\" class=\"custom-popup\">\r\n  <div class=\"popup-close\" onclick=\"closePopup()\">\u2716<\/div>\r\n  <p>\r\n    L\u2019envoi group\u00e9 vous permet de faire signer un m\u00eame document \u00e0\r\n    plusieurs personnes en quelques clics. Chaque destinataire re\u00e7oit sa\r\n    propre copie personnalis\u00e9e, avec son nom et ses informations.\r\n  <\/p>\r\n  <p>\r\n    Par exemple, vous pouvez envoyer un formulaire de consentement \u00e0\r\n    200 employ\u00e9s en une seule op\u00e9ration. eZsign cr\u00e9e automatiquement\r\n    200 dossiers distincts et suit chaque signature s\u00e9par\u00e9ment.\r\n  <\/p>\r\n<\/div>\r\n\r\n<!-- Popup 2: Lien partag\u00e9 -->\r\n<div id=\"popup2\" class=\"custom-popup\">\r\n  <div class=\"popup-close\" onclick=\"closePopup()\">\u2716<\/div>\r\n  <p>\r\n    Un lien partag\u00e9 vous permet de rendre un document accessible \u00e0 la signature via\r\n    un simple lien web, sans avoir \u00e0 conna\u00eetre les courriels des signataires \u00e0 l\u2019avance.\r\n  <\/p>\r\n  <p>\r\n    Par exemple, vous pouvez publier un formulaire d\u2019inscription sur votre site web\r\n    ou votre intranet. Chaque personne qui clique sur le lien acc\u00e8de \u00e0 une version\r\n    unique du document \u00e0 compl\u00e9ter et signer. eZsign cr\u00e9e automatiquement un\r\n    nouveau dossier pour chaque soumission, avec un suivi complet.\r\n  <\/p>\r\n<\/div>\r\n\r\n<!-- Overlay background -->\r\n<div id=\"popupOverlay\" class=\"popup-overlay\" onclick=\"closePopup()\"><\/div>\r\n\r\n<!-- JavaScript to open\/close popup -->\r\n<script>\r\n  function openPopup(id) {\r\n    document.getElementById(id).style.display = 'block';\r\n    document.getElementById('popupOverlay').style.display = 'block';\r\n  }\r\n  function closePopup() {\r\n    document.querySelectorAll('.custom-popup').forEach(p => p.style.display = 'none');\r\n    document.getElementById('popupOverlay').style.display = 'none';\r\n  }\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-afa0e01 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"afa0e01\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6df015f\" data-id=\"6df015f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-fec5827 elementor-widget elementor-widget-heading\" data-id=\"fec5827\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><b>Tarification des dossiers API<\/b><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d884bd0 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d884bd0\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-7140e22\" data-id=\"7140e22\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-91bfa85 cs-te elementor-widget elementor-widget-html\" data-id=\"91bfa85\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\r\n  \/* Clickable link with icon *\/\r\n  .popup-link-666 {\r\n    cursor: pointer;\r\n    color: white !important;\r\n    font-size: 16px;\r\n    line-height: 22px;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 0px;\r\n  }\r\n\r\n  \/* Small circle icon *\/\r\n  .info-icon-666 {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 18px;\r\n    height: 18px;\r\n    background-color: #435363;\r\n    color: white;\r\n    border-radius: 50%;\r\n    font-size: 12px;\r\n    font-weight: bold;\r\n  }\r\n\r\n  \/* Popup styling *\/\r\n  .custom-popup-666 {\r\n    display: none;\r\n    position: fixed;\r\n    z-index: 9999;\r\n    top: 50%;\r\n    left: 50%;\r\n    transform: translate(-50%, -50%);\r\n    width: 90%;\r\n    max-width: 500px;\r\n    background: white;\r\n    padding: 20px;\r\n    border-radius: 10px;\r\n    box-shadow: 0 0 15px rgba(0,0,0,0.3);\r\n    text-align: left;\r\n  }\r\n\r\n  \/* Dark overlay *\/\r\n  .popup-overlay-666 {\r\n    display: none;\r\n    position: fixed;\r\n    z-index: 9998;\r\n    top: 0;\r\n    left: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    background: rgba(0,0,0,0.5);\r\n  }\r\n\r\n  \/* Close button *\/\r\n  .popup-close-666 {\r\n    text-align: right;\r\n    margin-top: -10px;\r\n    margin-bottom: 10px;\r\n    cursor: pointer;\r\n    font-weight: bold;\r\n    font-size: 18px;\r\n  }\r\n\r\n  \/* Mobile adjustments *\/\r\n  @media (max-width: 600px) {\r\n    .custom-popup-666 {\r\n      width: 70% !important;\r\n      padding: 15px;\r\n      font-size: 14px;\r\n      line-height: 20px;\r\n    }\r\n    .popup-link-666 {\r\n      font-size: 14px;\r\n      line-height: 20px;\r\n    }\r\n    .popup-close-666 {\r\n      font-size: 18px;\r\n    }\r\n    .popup-link-666 {\r\n    cursor: pointer;\r\n    color: white !important;\r\n    font-size: 10px !important;\r\n    line-height: 22px;\r\n    display: inline-flex;\r\n    gap: 8px;\r\n    \r\n  }\r\n  }\r\n<\/style>\r\n\r\n<!-- Clickable text + icon -->\r\n<span class=\"popup-link-666\" onclick=\"openPopup666('popup-666')\">\r\n <span>Nombre de dossiers <u>compl\u00e9t\u00e9s<\/u> par mois<\/span>\r\n  <span class=\"info-icon-666\">?<\/span>\r\n<\/span>\r\n\r\n<!-- Popup content -->\r\n<div id=\"popup-666\" class=\"custom-popup-666\">\r\n  <div class=\"popup-close-666\" onclick=\"closePopup666()\">\u2716<\/div>\r\n  <p><strong>Qu\u2019est-ce qu\u2019un dossier ?<\/strong><\/p>\r\n  <p>\r\nUn dossier regroupe un ou plusieurs documents \u00e0 faire signer.\r\nVous pouvez y mettre plusieurs fichiers et signataires\u202f; la\r\nfacturation se fait par dossier, pas par document individuel. \r\n  <\/p>\r\n  <p>\r\n    Le\r\nforfait Entreprise API comprend 100 dossiers API par mois, qu\u2019ils\r\nproviennent d\u2019une int\u00e9gration, d\u2019un envoi group\u00e9 ou d\u2019un lien\r\npartag\u00e9 .\r\n  <\/p>\r\n<\/div>\r\n\r\n<!-- Background overlay -->\r\n<div id=\"popupOverlay-666\" class=\"popup-overlay-666\" onclick=\"closePopup666()\"><\/div>\r\n\r\n<!-- Script -->\r\n<script>\r\n  function openPopup666(id) {\r\n    document.getElementById(id).style.display = 'block';\r\n    document.getElementById('popupOverlay-666').style.display = 'block';\r\n  }\r\n  function closePopup666() {\r\n    document.querySelectorAll('.custom-popup-666').forEach(p => p.style.display = 'none');\r\n    document.getElementById('popupOverlay-666').style.display = 'none';\r\n  }\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-009d0b6\" data-id=\"009d0b6\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5763cb2 elementor-widget elementor-widget-heading\" data-id=\"5763cb2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Nombre de dossiers inclus<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-00ce2aa\" data-id=\"00ce2aa\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d349190 elementor-widget elementor-widget-heading\" data-id=\"d349190\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Prix mensuel<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-25 elementor-top-column elementor-element elementor-element-5fad3f1\" data-id=\"5fad3f1\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e394fcd cs-te elementor-widget elementor-widget-html\" data-id=\"e394fcd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\r\n  \/* Unique Namespace: ez-tooltip- *\/\r\n  .ez-tooltip-wrapper {\r\n    height: 100%; \r\n    width: 100%;\r\n    position: relative;\r\n    display: flex;\r\n    align-items: center;\r\n  }\r\n\r\n  .ez-tooltip-trigger {\r\n    position: relative;\r\n    display: flex;\r\n    align-items: center;\r\n    height: 100%;\r\n    width: 100%;\r\n    cursor: pointer;\r\n    box-sizing: border-box;\r\n    padding-right: 22px; \/* Space for the corner icon *\/\r\n  }\r\n\r\n  .ez-tooltip-text {\r\n    color: white !important;\r\n    font-size: 14px;\r\n    line-height: 1.2;\r\n    word-wrap: break-word;\r\n    user-select: none;\r\n    text-align: left;\r\n  }\r\n\r\n  .ez-tooltip-icon {\r\n    position: absolute;\r\n    top: 0;\r\n    right: 0;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 16px;\r\n    height: 16px;\r\n    background-color: #3f4d5a;\r\n    color: white;\r\n    font-size: 11px;\r\n    font-weight: bold;\r\n    border-radius: 50%;\r\n    font-family: Arial, sans-serif;\r\n  }\r\n\r\n  \/* Modal Styles *\/\r\n  .ez-tooltip-modal {\r\n    display: none;\r\n    position: fixed;\r\n    z-index: 100000; \/* Higher than most elements *\/\r\n    top: 50%;\r\n    left: 50%;\r\n    transform: translate(-50%, -50%);\r\n    width: 85%;\r\n    max-width: 380px;\r\n    background: white;\r\n    padding: 20px;\r\n    border-radius: 10px;\r\n    box-shadow: 0 10px 30px rgba(0,0,0,0.5);\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  .ez-tooltip-modal p {\r\n    margin: 0 0 12px;\r\n    color: #333 !important;\r\n    font-size: 14px;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  .ez-tooltip-overlay {\r\n    display: none;\r\n    position: fixed;\r\n    z-index: 99999;\r\n    top: 0;\r\n    left: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    background: rgba(0,0,0,0.7);\r\n  }\r\n\r\n  .ez-tooltip-close {\r\n    text-align: right;\r\n    cursor: pointer;\r\n    font-size: 22px;\r\n    color: #e5322d;\r\n    font-weight: bold;\r\n    margin-bottom: 5px;\r\n    line-height: 1;\r\n  }\r\n\r\n  @media (max-width: 600px) {\r\n    .ez-tooltip-text { font-size: 10px; }\r\n    .ez-tooltip-modal { width: 90%; padding: 18px; }\r\n  }\r\n<\/style>\r\n\r\n<div class=\"ez-tooltip-wrapper\">\r\n  <div class=\"ez-tooltip-trigger\" onclick=\"openEzTooltip('ez-modal-4')\">\r\n    <span class=\"ez-tooltip-text\">Prix par dossier compl\u00e9t\u00e9 suppl\u00e9mentaire<\/span>\r\n    <span class=\"ez-tooltip-icon\">?<\/span>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div id=\"ez-modal-4\" class=\"ez-tooltip-modal\">\r\n  <div class=\"ez-tooltip-close\" onclick=\"closeEzTooltip()\">\u00d7<\/div>\r\n  <p><strong>Qu\u2019est-ce qu\u2019un document compl\u00e9t\u00e9 ?<\/strong><\/p>\r\n  <p>\r\n    Nous ne comptons un document (PDF, Word, etc.) que\r\n    lorsqu\u2019il est enti\u00e8rement sign\u00e9 par toutes les parties ;\r\n    c\u2019est \u00e0 ce moment-l\u00e0 qu\u2019il d\u00e9clenche la tarification.\r\n  <\/p>\r\n<\/div>\r\n\r\n<div id=\"ez-tooltip-overlay-bg\" class=\"ez-tooltip-overlay\" onclick=\"closeEzTooltip()\"><\/div>\r\n\r\n<script>\r\n  function openEzTooltip(id) {\r\n    const modal = document.getElementById(id);\r\n    const overlay = document.getElementById('ez-tooltip-overlay-bg');\r\n    if(modal && overlay) {\r\n      modal.style.display = 'block';\r\n      overlay.style.display = 'block';\r\n    }\r\n  }\r\n\r\n  function closeEzTooltip() {\r\n    document.querySelectorAll('.ez-tooltip-modal').forEach(m => m.style.display = 'none');\r\n    const overlay = document.getElementById('ez-tooltip-overlay-bg');\r\n    if(overlay) overlay.style.display = 'none';\r\n  }\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-db79c61 e-flex e-con-boxed e-con e-parent\" data-id=\"db79c61\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-2e0cd32 e-con-full e-flex e-con e-child\" data-id=\"2e0cd32\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-337b02f e-con-full cs-tab1 e-flex e-con e-child\" data-id=\"337b02f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-442818b elementor-widget elementor-widget-html\" data-id=\"442818b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- Styles -->\r\n<style>\r\n  \/* Your existing styles... *\/\r\n  @media (max-width: 600px) {\r\n    .custom-popup-66 {\r\n      width: 70% !important;\r\n      padding: 15px;\r\n      font-size: 14px !important;\r\n      line-height: 20px;\r\n    }\r\n    .popup-link-66{\r\n        font-size: px !important;\r\n    }\r\n\r\n    .popup-link-66 {\r\n      font-size: 14px !important;\r\n      line-height: 20px;\r\n    }\r\n\r\n    .popup-close {\r\n      font-size: 18px;\r\n    }\r\n  }\r\n<\/style>\r\n \r\n<style>\r\n  .popup-link-66 {\r\n    cursor: pointer;\r\n    color: inherit;\r\n    display: inline !important;\r\n    visibility: visible !important;\r\n    opacity: 1 !important;\r\n    font-size: 16px !important;\r\n  }\r\n\r\n  .custom-popup-66 {\r\n    display: none;\r\n    position: fixed;\r\n    z-index: 9999;\r\n    top: 50%;\r\n    left: 50%;\r\n    transform: translate(-50%, -50%);\r\n    width: 90%;\r\n    max-width: 500px;\r\n    background: white;\r\n    padding: 20px;\r\n    border-radius: 10px;\r\n    box-shadow: 0 0 15px rgba(0,0,0,0.3);\r\n  }\r\n\r\n  .popup-overlay-66 {\r\n    display: none;\r\n    position: fixed;\r\n    z-index: 9998;\r\n    top: 0;\r\n    left: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    background: rgba(0,0,0,0.5);\r\n  }\r\n\r\n  .popup-close-66 {\r\n    text-align: right;\r\n    margin-top: -10px;\r\n    margin-bottom: 10px;\r\n    cursor: pointer;\r\n    font-weight: bold;\r\n  }\r\n<\/style>\r\n\r\n<!-- Paragraph with popup trigger -->\r\n<p>\r\n  <span class=\"popup-link-66\" onclick=\"openPopup66()\"><\/span>\r\n<\/p>\r\n\r\n<!-- Popup content -->\r\n<div id=\"popup66\" class=\"custom-popup-66\">\r\n  <div class=\"popup-close-66\" onclick=\"closePopup66()\">\u2716<\/div>\r\n  <p>\r\n   Pour acc\u00e9der \u00e0 l\u2019API, vous devez poss\u00e9der un compte entreprise au co\u00fbt mensuel de 222.80$. Ce compte vous donne automatiquement 10 utilisateurs eZsign et 100 dossiers mensuels compl\u00e9t\u00e9s via l\u2019API.\r\n  <\/p>\r\n<\/div>\r\n\r\n<!-- Overlay background -->\r\n<div id=\"popupOverlay66\" class=\"popup-overlay-66\" onclick=\"closePopup66()\"><\/div>\r\n\r\n<!-- JavaScript -->\r\n<script>\r\n  function openPopup66() {\r\n    document.getElementById('popup66').style.display = 'block';\r\n    document.getElementById('popupOverlay66').style.display = 'block';\r\n  }\r\n\r\n  function closePopup66() {\r\n    document.getElementById('popup66').style.display = 'none';\r\n    document.getElementById('popupOverlay66').style.display = 'none';\r\n  }\r\n<\/script>\r\n\r\n<div class=\"popup-trigger-flex\" onclick=\"openPopup66()\">\r\n <span class=\"info-icon-666\">?<\/span>\r\n  <span class=\"popup-link-66\">**1 \u2013 100 ***<\/span>\r\n<\/div>\r\n\r\n<style>\r\n  .popup-trigger-flex {\r\n    display: flex;\r\n    flex-direction: row-reverse; \/* icon on right, text on left *\/\r\n    align-items: center;\r\n    justify-content: space-between; \/* space between icon and text *\/\r\n    cursor: pointer;\r\n  }\r\n\r\n  .info-icon {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 24px;\r\n    height: 24px;\r\n    background-color: #3f4d5a;\r\n    color: white;\r\n    font-size: 16px;\r\n    font-weight: bold;\r\n    border-radius: 50%;\r\n    font-family: Arial, sans-serif;\r\n  }\r\n\r\n  .popup-link-66 {\r\n    font-size: 16px;\r\n    color: inherit;\r\n    opacity: 1 !important;\r\n    display: inline !important;\r\n  }\r\n  @media (max-width: 425px){\r\n      .popup-link-66{\r\n          font-size: 14px !important;\r\n      }\r\n  }\r\n<\/style>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-eceb473 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"eceb473\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">101 - 200<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">201 - 350<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">351 - 600<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">601 - 1 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1 101 - 2 600<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">2 601 - 5 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">5 101 - 10 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">10 101 - 25 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">25 101 - 50 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">50 101 - et plus<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-563e75f e-con-full e-flex e-con e-child\" data-id=\"563e75f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-fe20548 e-con-full e-flex e-con e-child\" data-id=\"fe20548\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-59ff2be elementor-widget elementor-widget-heading\" data-id=\"59ff2be\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Les 100 premiers dossiers compl\u00e9t\u00e9s sont inclus<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e5b6c88 e-con-full e-flex e-con e-child\" data-id=\"e5b6c88\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-8523c07 e-con-full e-flex e-con e-child\" data-id=\"8523c07\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1c923ef elementor-mobile-align-center cs-tab elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"1c923ef\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">200<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">350<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">600<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">2 600<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">5 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">10 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">25 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">50 100<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-4e9d1ba e-con-full e-flex e-con e-child\" data-id=\"4e9d1ba\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4847503 elementor-mobile-align-center elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"4847503\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">0 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">180 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">438 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">810.50 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1 485,50 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">3 300,50 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">6 025,50 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">10 925,50 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">24 275,50 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">45 525,50 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0e28ae1 e-con-full e-flex e-con e-child\" data-id=\"0e28ae1\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4cbc361 elementor-mobile-align-center elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"4cbc361\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1,80 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1,72 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1,49 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1,35 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1,21 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1,09 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">0,98 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">0,89 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">0,85 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">0,80 $<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e2788da elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"e2788da\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-21437ba\" data-id=\"21437ba\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d566442 elementor-widget elementor-widget-heading\" data-id=\"d566442\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\"><b>Simulateur de tarification API<\/b><\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-0a1fa79 e-flex e-con-boxed e-con e-parent\" data-id=\"0a1fa79\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cac4b92 elementor-widget elementor-widget-html\" data-id=\"cac4b92\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"fr\" data-theme=\"light\">\r\n\r\n<head>\r\n    <meta charset=\"UTF-8\" \/>\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" \/>\r\n    <title>Calculateur eZsign<\/title>\r\n\r\n    <!-- Link to the stylesheet (same folder) -->\r\n<\/head>\r\n\r\n<body>\r\n    <!--\r\n    App bar\r\n    - Contains the app title, info (pricing) button, compare button,\r\n      theme toggle and language toggle.\r\n    - You may remove the logo <img> if you don't have the file.\r\n  -->\r\n    <div class=\"appbar\">\r\n        <img decoding=\"async\" data-src=\".\/logo-ezsign.png\" alt=\"eZsign\" onerror=\"this.style.display='none'\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" class=\"lazyload\">\r\n        <div id=\"title\" class=\"app-title\">Calculateur eZsign<\/div>\r\n        <button id=\"infoBtn\" class=\"icon-btn\" title=\"Tarifs\">i<\/button>\r\n        <button id=\"compareBtn\" class=\"chip\">Comparer<\/button>\r\n        <button id=\"themeBtn\" class=\"chip\">Th\u00e8me clair<\/button>\r\n        <button id=\"langBtn\" class=\"lang-btn\">EN<\/button>\r\n    <\/div>\r\n\r\n    <!--\r\n    Main Layout:\r\n    - Inline compare button (adds more columns)\r\n    - Lanes container: 1\u20133 columns, each a complete simulator\r\n  -->\r\n    <main class=\"container cs-en-custom\">\r\n        <div class=\"inline-toolbar\">\r\n            <button id=\"inlineCompareBtn\" class=\"chip btn-ghost\">\r\n                + Comparer (ajouter une colonne)\r\n            <\/button>\r\n        <\/div>\r\n\r\n        <!-- JS will populate lanes here -->\r\n        <div id=\"lanes\" class=\"lanes\"><\/div>\r\n    <\/main>\r\n\r\n    <!-- Pricing modal (shows tables) -->\r\n    <div id=\"pricingModal\" class=\"modal\" aria-hidden=\"true\">\r\n        <div class=\"backdrop\" data-close><\/div>\r\n        <div class=\"dialog\" role=\"dialog\" aria-modal=\"true\">\r\n            <div class=\"head\">\r\n                <h3 id=\"pricingTitle\">Tarifs<\/h3>\r\n                <button class=\"close-x\" data-close>&times;<\/button>\r\n            <\/div>\r\n            <div id=\"pricingBody\" class=\"body\"><\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- Compare modal (table-style comparison) -->\r\n    <div id=\"compareModal\" class=\"modal\" aria-hidden=\"true\">\r\n        <div class=\"backdrop\" data-close><\/div>\r\n        <div class=\"dialog\" role=\"dialog\" aria-modal=\"true\">\r\n            <div class=\"head\">\r\n                <h3 id=\"compareTitle\">Comparer les forfaits<\/h3>\r\n                <button class=\"close-x\" data-close>&times;<\/button>\r\n            <\/div>\r\n            <div id=\"compareBody\" class=\"body\"><\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- Link to the JavaScript (same folder) -->\r\n\r\n<\/body>\r\n\r\n<\/html>\r\n\r\n\r\n<style>\r\n    \/* ==========================================================================\r\n   THEME TOKENS \/ CSS VARIABLES\r\n   ========================================================================== *\/\r\n    :root {\r\n        --brand-primary: #e63946;\r\n        --brand-primary-600: #d62839;\r\n        --brand-bg: #fff;\r\n        --card-bg: #fff;\r\n        --output-bg: #fff;\r\n        --brand-soft: #fff5f5;\r\n        --brand-border: #f5c2c7;\r\n        --note-bg: #fff8f8;\r\n        --ink: #2d2d2d;\r\n        --ink-muted: #666;\r\n        --ok: #16a34a;\r\n        --ok-b: #bbf7d0;\r\n        --warn: #d97706;\r\n        --warn-b: #fde68a;\r\n        --shadow: 0 8px 24px rgba(0, 0, 0, .06);\r\n        --radius: 14px;\r\n    }\r\n\r\n    html[data-theme=\"dark\"] {\r\n        --brand-bg: #0A0F1C;\r\n        --card-bg: #0f172a;\r\n        --output-bg: #0b1220;\r\n        --brand-soft: #0b1220;\r\n        --brand-border: #23324A;\r\n        --note-bg: rgba(59, 130, 246, .06);\r\n        --ink: #E5E7EB;\r\n        --ink-muted: #94a3b8;\r\n        --shadow: 0 10px 30px rgba(0, 0, 0, .25);\r\n    }\r\n\r\n    \/* Base *\/\r\n    * {\r\n        box-sizing: border-box\r\n    }\r\n\r\n    html,\r\n    body {\r\n        height: 100%;\r\n        background: var(--brand-bg);\r\n        color: var(--ink);\r\n        font-family: Inter, system-ui, Segoe UI, Roboto, Arial\r\n    }\r\n\r\n    body {\r\n        margin: 0;\r\n        min-height: 100vh\r\n    }\r\n\r\n    \/* ==========================================================================\r\n   TOP BAR\r\n   ========================================================================== *\/\r\n    .appbar {\r\n        background: var(--brand-primary);\r\n        color: #fff;\r\n        padding: 14px 22px;\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 12px;\r\n        position: sticky;\r\n        top: 0;\r\n        z-index: 10;\r\n        box-shadow: 0 2px 10px rgba(0, 0, 0, .06)\r\n    }\r\n\r\n    div.appbar {\r\n        display: none;\r\n    }\r\n\r\n    .appbar img {\r\n        height: 32px;\r\n        width: auto;\r\n        display: block\r\n    }\r\n\r\n    .app-title {\r\n        \/* clamp() scales title a bit on small screens *\/\r\n        font-weight: 700;\r\n        font-size: clamp(16px, 1.8vw, 18px);\r\n        margin-right: auto\r\n    }\r\n\r\n    .chip,\r\n    .lang-btn,\r\n    .icon-btn {\r\n        background: #fff;\r\n        color: #a61b26;\r\n        border: 1px solid #fecdd3;\r\n        padding: 6px 10px;\r\n        border-radius: 999px;\r\n        cursor: pointer;\r\n        font-weight: 600\r\n    }\r\n\r\n    .chip:hover,\r\n    .lang-btn:hover,\r\n    .icon-btn:hover {\r\n        background: #fff5f5\r\n    }\r\n\r\n    .icon-btn {\r\n        width: 32px;\r\n        height: 32px;\r\n        display: grid;\r\n        place-items: center;\r\n        font-weight: 800;\r\n        padding: 0\r\n    }\r\n\r\n    \/* ==========================================================================\r\n   PAGE LAYOUT\r\n   - The lanes grid is responsive:\r\n     \u2022 Desktop: 1\u20133 columns (controlled by .cols-2 \/ .cols-3)\r\n     \u2022 Tablets: auto-fit columns down to ~360px\r\n     \u2022 Phones: forced to 1 column (stacked)\r\n   ========================================================================== *\/\r\n    .container {\r\n        max-width: 1640px;\r\n        margin: 28px auto;\r\n        padding: 0 20px;\r\n        display: grid;\r\n        gap: 18px\r\n    }\r\n\r\n    .inline-toolbar {\r\n        display: flex;\r\n        gap: 10px;\r\n        flex-wrap: wrap\r\n    }\r\n\r\n    .btn-ghost {\r\n        background: transparent;\r\n        color: var(--brand-primary);\r\n        border: 1px solid var(--brand-border)\r\n    }\r\n\r\n    .btn-ghost:hover {\r\n        background: var(--brand-soft)\r\n    }\r\n\r\n    \/* --- Default (large screens): use explicit column counts --- *\/\r\n    .lanes {\r\n        display: grid;\r\n        grid-template-columns: repeat(1, minmax(520px, 1fr));\r\n        gap: 18px\r\n    }\r\n\r\n    .lanes.cols-2 {\r\n        grid-template-columns: repeat(2, minmax(520px, 1fr))\r\n    }\r\n\r\n    .lanes.cols-3 {\r\n        grid-template-columns: repeat(3, minmax(500px, 1fr))\r\n    }\r\n\r\n    .lane-title {\r\n        font-weight: 800;\r\n        color: var(--brand-primary);\r\n        margin: 2px 0 0 2px\r\n    }\r\n\r\n    \/* --- Medium screens (\u22641200px): auto-fit as many ~360px columns as we can --- *\/\r\n    @media (max-width:1200px) {\r\n\r\n        .lanes,\r\n        .lanes.cols-2,\r\n        .lanes.cols-3 {\r\n            grid-template-columns: repeat(auto-fit, minmax(360px, 1fr));\r\n        }\r\n    }\r\n\r\n    \/* --- Small screens (\u2264700px): always stack to one column --- *\/\r\n    @media (max-width:700px) {\r\n\r\n        .lanes,\r\n        .lanes.cols-2,\r\n        .lanes.cols-3 {\r\n            grid-template-columns: 1fr;\r\n        }\r\n    }\r\n\r\n    \/* Cards *\/\r\n    .card {\r\n        background: var(--card-bg);\r\n        border: 1px solid var(--brand-border);\r\n        border-radius: var(--radius);\r\n        padding: 18px;\r\n        box-shadow: var(--shadow)\r\n    }\r\n\r\n    .card h2 {\r\n        margin: 6px 0 10px;\r\n        color: var(--brand-primary);\r\n        font-size: 18px\r\n    }\r\n\r\n    .sub {\r\n        color: var(--ink-muted);\r\n        font-size: 14px;\r\n        margin-top: -2px\r\n    }\r\n\r\n    .note {\r\n        margin-top: 10px;\r\n        font-size: 13px;\r\n        color: var(--ink);\r\n        background: var(--note-bg);\r\n        border: 1px dashed var(--brand-border);\r\n        padding: 10px 12px;\r\n        border-radius: 10px\r\n    }\r\n\r\n    \/* ==========================================================================\r\n   FORM CONTROLS\r\n   - Collapses 4 \u2192 2 \u2192 1 columns on narrower screens\r\n   ========================================================================== *\/\r\n    .controls {\r\n        display: grid;\r\n        grid-template-columns: 1fr 1fr 1fr auto;\r\n        gap: 10px;\r\n        align-items: end;\r\n        margin-top: 12px\r\n    }\r\n\r\n    @media (max-width:1100px) {\r\n        .controls {\r\n            grid-template-columns: 1fr 1fr\r\n        }\r\n\r\n        .controls .btn {\r\n            grid-column: 1\/-1\r\n        }\r\n    }\r\n\r\n    @media (max-width:640px) {\r\n        .controls {\r\n            grid-template-columns: 1fr\r\n        }\r\n    }\r\n\r\n    .field label {\r\n        display: block;\r\n        font-size: 13px;\r\n        color: var(--ink-muted);\r\n        margin-bottom: 6px\r\n    }\r\n\r\n    .field input[type=number],\r\n    .field select {\r\n        width: 100%;\r\n        padding: 10px 12px;\r\n        font-size: 16px;\r\n        border: 1px solid var(--brand-border);\r\n        border-radius: 10px;\r\n        background: #fff;\r\n        color: #222;\r\n        transition: border-color .15s, box-shadow .15s\r\n    }\r\n\r\n    html[data-theme=\"dark\"] .field input[type=number],\r\n    html[data-theme=\"dark\"] .field select {\r\n        background: #0b1220;\r\n        color: #E5E7EB\r\n    }\r\n\r\n    .field input[type=number]:focus,\r\n    .field select:focus {\r\n        border-color: var(--brand-primary);\r\n        box-shadow: 0 0 0 3px rgba(230, 57, 70, .15)\r\n    }\r\n\r\n    .btn {\r\n        padding: 11px 16px;\r\n        border-radius: 10px;\r\n        border: none;\r\n        background: var(--brand-primary);\r\n        color: #fff;\r\n        font-weight: 600;\r\n        cursor: pointer;\r\n        transition: background .2s\r\n    }\r\n\r\n    .btn:hover {\r\n        background: var(--brand-primary-600)\r\n    }\r\n\r\n    \/* ==========================================================================\r\n   KPIs \/ TOTAL BANNER\r\n   ========================================================================== *\/\r\n    .kpi-row {\r\n        display: grid;\r\n        grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n        gap: 10px;\r\n        margin: 12px 0 6px\r\n    }\r\n\r\n    .kpi {\r\n        background: var(--brand-soft);\r\n        border: 1px solid var(--brand-border);\r\n        border-radius: 10px;\r\n        padding: 12px\r\n    }\r\n\r\n    .kpi .label {\r\n        font-size: 12px;\r\n        color: var(--ink-muted)\r\n    }\r\n\r\n    .kpi .value {\r\n        font-weight: 700;\r\n        font-size: 18px;\r\n        margin-top: 4px\r\n    }\r\n\r\n    .total {\r\n        margin-top: 12px;\r\n        padding: 12px;\r\n        border-radius: 10px;\r\n        font-weight: 800;\r\n        background: #f0fdf4;\r\n        color: var(--ok);\r\n        border: 1px solid var(--ok-b)\r\n    }\r\n\r\n    .total.warn {\r\n        background: #fff7ed;\r\n        border-color: var(--warn-b);\r\n        color: var(--warn)\r\n    }\r\n\r\n    \/* Simulation output *\/\r\n    .output {\r\n        white-space: pre-wrap;\r\n        font-family: ui-monospace, Menlo, Consolas, monospace;\r\n        background: var(--output-bg);\r\n        border: 1px solid var(--brand-border);\r\n        border-radius: 12px;\r\n        padding: 16px;\r\n        line-height: 1.6;\r\n        color: var(--ink)\r\n    }\r\n\r\n    \/* ==========================================================================\r\n   MODALS\r\n   - Scale down on phones (nearly full screen)\r\n   ========================================================================== *\/\r\n    .modal {\r\n        position: fixed;\r\n        inset: 0;\r\n        display: none\r\n    }\r\n\r\n    .modal.open {\r\n        display: block\r\n    }\r\n\r\n    .modal .backdrop {\r\n        position: absolute;\r\n        inset: 0;\r\n        background: rgba(0, 0, 0, .35)\r\n    }\r\n\r\n    .modal .dialog {\r\n        position: absolute;\r\n        left: 50%;\r\n        top: 50%;\r\n        transform: translate(-50%, -50%);\r\n        width: min(1100px, 92vw);\r\n        max-height: 85vh;\r\n        overflow: auto;\r\n        background: var(--card-bg);\r\n        color: var(--ink);\r\n        border: 1px solid var(--brand-border);\r\n        border-radius: 14px;\r\n        box-shadow: var(--shadow)\r\n    }\r\n\r\n    @media (max-width:640px) {\r\n        .modal .dialog {\r\n            width: 96vw;\r\n            max-height: 92vh;\r\n            border-radius: 10px;\r\n        }\r\n    }\r\n\r\n    .modal .head {\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 12px;\r\n        justify-content: space-between;\r\n        padding: 14px 16px;\r\n        border-bottom: 1px solid var(--brand-border);\r\n        background: var(--brand-soft)\r\n    }\r\n\r\n    .modal .head h3 {\r\n        margin: 0;\r\n        color: var(--brand-primary)\r\n    }\r\n\r\n    .close-x {\r\n        border: none;\r\n        background: transparent;\r\n        color: var(--ink);\r\n        font-size: 20px;\r\n        cursor: pointer;\r\n        padding: 6px 10px;\r\n        border-radius: 8px\r\n    }\r\n\r\n    .close-x:hover {\r\n        background: rgba(0, 0, 0, .06)\r\n    }\r\n\r\n    .modal .body {\r\n        padding: 16px\r\n    }\r\n\r\n    \/* Pricing tables *\/\r\n    .price-table {\r\n        width: 100%;\r\n        border-collapse: separate;\r\n        border-spacing: 0\r\n    }\r\n\r\n    .price-table th {\r\n        background: var(--brand-primary);\r\n        color: #fff;\r\n        text-align: left;\r\n        padding: 10px 12px;\r\n        font-weight: 700\r\n    }\r\n\r\n    .price-table td {\r\n        padding: 10px 12px;\r\n        border-left: 1px solid var(--brand-border);\r\n        border-bottom: 1px solid var(--brand-border)\r\n    }\r\n\r\n    .price-table th:first-child {\r\n        border-top-left-radius: 8px\r\n    }\r\n\r\n    .price-table th:last-child {\r\n        border-top-right-radius: 8px\r\n    }\r\n\r\n    .price-table tr:last-child td:first-child {\r\n        border-bottom-left-radius: 8px\r\n    }\r\n\r\n    .price-table tr:last-child td:last-child {\r\n        border-bottom-right-radius: 8px\r\n    }\r\n\r\n    .muted {\r\n        color: var(--ink-muted);\r\n        font-size: 13px\r\n    }\r\n\r\n    .badge {\r\n        display: inline-block;\r\n        padding: 3px 8px;\r\n        border-radius: 999px;\r\n        border: 1px solid var(--ok-b);\r\n        background: #f0fdf4;\r\n        color: var(--ok);\r\n        font-weight: 700;\r\n        font-size: 12px\r\n    }\r\n<\/style>\r\n\r\n\r\n\r\n\r\n<script>\r\n    \/* =============================================================================\r\n   eZsign Calculator \u2014 app.js\r\n   -----------------------------------------------------------------------------\r\n   High-level structure:\r\n   1) Static pricing data and API tiers\r\n   2) i18n (French\/English) for all UI text\r\n   3) Cost helpers:\r\n      - apiCostBreakdown(files, account)\r\n      - userCostBreakdown(users, account)\r\n      These both return \"tier-aware\" breakdowns (previous tier base + in-tier count \u00d7 rate).\r\n   4) buildSimulationHTML(): produces the narrative and all totals used by the UI\r\n   5) Inline lanes UI: create\/update 1\u20133 columns, wire events, run simulations\r\n   6) Pricing modal: tables adapt to visible plans; Enterprise shows API table\r\n   7) Compare modal: simple side-by-side numeric comparison\r\n   8) Language & Theme toggles; bootstrapping\r\n   ============================================================================= *\/\r\n\r\n\r\n    \/* =============================================================================\r\n       1) PRICING DATA\r\n       -----------------------------------------------------------------------------\r\n       - ACCOUNTS describes the three plans: Enterprise, Business Basic, Business Pro\r\n       - Each plan has:\r\n           - base: monthly base price\r\n           - includesUsers: users included in the base (10)\r\n           - includesFiles: API files included in base (Enterprise only: 100)\r\n           - apiAvailable: whether API is offered by the plan\r\n           - userSegments: array of [upperLimit, rate] for progressive pricing\r\n             Example: [20, 20.26] means from 11\u201320 users the rate is 20.26 per user.\r\n       - API_TIERS is similar but for API files (Enterprise only).\r\n       ============================================================================= *\/\r\n\r\n    \/\/ old prices for reference \r\n    \/\/ const ACCOUNTS = {\r\n    \/\/     enterprise: {\r\n    \/\/         key: 'enterprise',\r\n    \/\/         name_fr: 'Entreprise',\r\n    \/\/         name_en: 'Enterprise',\r\n    \/\/         base: 212.20,\r\n    \/\/         includesFiles: 100,     \/\/ 100 API files included in base\r\n    \/\/         includesUsers: 10,      \/\/ 10 users included in base\r\n    \/\/         apiAvailable: true,\r\n    \/\/         \/\/ Each tuple is [upperLimit, pricePerAdditionalUser]\r\n    \/\/         userSegments: [\r\n    \/\/             [20, 20.26], [50, 19.20], [100, 18.14], [250, 17.19],\r\n    \/\/             [500, 16.28], [1000, 15.44], [Infinity, 14.58],\r\n    \/\/         ],\r\n    \/\/     },\r\n    \/\/     basic: {\r\n    \/\/         key: 'basic',\r\n    \/\/         name_fr: 'Business Basic',\r\n    \/\/         name_en: 'Business Basic',\r\n    \/\/         base: 116.70,\r\n    \/\/         includesFiles: 0,\r\n    \/\/         includesUsers: 10,\r\n    \/\/         apiAvailable: false,\r\n    \/\/         userSegments: [\r\n    \/\/             [20, 11.14], [50, 10.51], [100, 9.97], [250, 9.45],\r\n    \/\/             [500, 8.96], [1000, 8.49], [Infinity, 8.06],\r\n    \/\/         ],\r\n    \/\/     },\r\n    \/\/     pro: {\r\n    \/\/         key: 'pro',\r\n    \/\/         name_fr: 'Business Pro',\r\n    \/\/         name_en: 'Business Pro',\r\n    \/\/         base: 159.10,\r\n    \/\/         includesFiles: 0,\r\n    \/\/         includesUsers: 10,\r\n    \/\/         apiAvailable: false,\r\n    \/\/         userSegments: [\r\n    \/\/             [20, 15.17], [50, 14.33], [100, 13.58], [250, 12.83],\r\n    \/\/             [500, 12.14], [1000, 11.52], [Infinity, 10.93],\r\n    \/\/         ],\r\n    \/\/     },\r\n    \/\/ };\r\n    \/\/ new prices as of december 2025\r\n    const ACCOUNTS = {\r\n        enterprise: {\r\n            key: 'enterprise',\r\n            name_fr: 'Entreprise',\r\n            name_en: 'Enterprise',\r\n            base: 222.80,          \/\/ base price (up to 10 users)\r\n            includesFiles: 100,    \/\/ 100 API files included in base\r\n            includesUsers: 10,     \/\/ 10 users included in base\r\n            apiAvailable: true,\r\n            \/\/ [upper limit of tier, price per additional user]\r\n            userSegments: [\r\n                [20, 21.27],     \/\/ 11\u201320\r\n                [50, 20.16],     \/\/ 21\u201350\r\n                [100, 19.05],    \/\/ 51\u2013100\r\n                [250, 18.05],    \/\/ 101\u2013250\r\n                [500, 17.09],    \/\/ 251\u2013500\r\n                [1000, 16.21],   \/\/ 501\u20131000\r\n                [Infinity, 15.31], \/\/ 1001+\r\n            ],\r\n        },\r\n\r\n        basic: {\r\n            key: 'basic',\r\n            name_fr: 'Affaires de Base',\r\n            name_en: 'Business Basic',\r\n            base: 122.50,        \/\/ base price (up to 10 users)\r\n            includesFiles: 0,\r\n            includesUsers: 10,\r\n            apiAvailable: false,\r\n            userSegments: [\r\n                [20, 11.70],     \/\/ 11\u201320\r\n                [50, 11.04],     \/\/ 21\u201350\r\n                [100, 10.47],    \/\/ 51\u2013100\r\n                [250, 9.92],     \/\/ 101\u2013250\r\n                [500, 9.41],     \/\/ 251\u2013500\r\n                [1000, 8.91],    \/\/ 501\u20131000\r\n                [Infinity, 8.46], \/\/ 1001+\r\n            ],\r\n        },\r\n\r\n        pro: {\r\n            key: 'pro',\r\n            name_fr: 'Affaires Pro',\r\n            name_en: 'Business Pro',\r\n            base: 167.10,        \/\/ base price (up to 10 users)\r\n            includesFiles: 0,\r\n            includesUsers: 10,\r\n            apiAvailable: false,\r\n            userSegments: [\r\n                [20, 15.93],     \/\/ 11\u201320\r\n                [50, 15.05],     \/\/ 21\u201350\r\n                [100, 14.26],    \/\/ 51\u2013100\r\n                [250, 13.47],    \/\/ 101\u2013250\r\n                [500, 12.75],    \/\/ 251\u2013500\r\n                [1000, 12.10],   \/\/ 501\u20131000\r\n                [Infinity, 11.48], \/\/ 1001+\r\n            ],\r\n        },\r\n    };\r\n\r\n\r\n\r\n    \/* API tiers for Enterprise\u2019s files.\r\n       Tuple: [upperLimit, baseAtLimit, pricePerAdditionalFile]\r\n       - baseAtLimit = total cost up to that tier limit (used to accumulate cost)\r\n       - pricePerAdditionalFile = marginal price within the tier\r\n    *\/\r\n    \/\/ const API_TIERS = [\r\n    \/\/     [100, 0.00, 0.00],  \/\/ 1\u2013100 (free, included in Enterprise)\r\n    \/\/     [200, 180.00, 1.80],\r\n    \/\/     [350, 438.00, 1.72],\r\n    \/\/     [600, 810.50, 1.49],\r\n    \/\/     [1100, 1485.50, 1.35],\r\n    \/\/     [2600, 3300.50, 1.21],\r\n    \/\/     [5100, 6025.50, 1.09],\r\n    \/\/     [10100, 10925.50, 0.98],\r\n    \/\/     [Infinity, 10925.50, 0.89],\r\n    \/\/ ];\r\n    const API_TIERS = [\r\n        [100, 0.00, 0.00],  \/\/ 1\u2013100 (included)\r\n        [200, 180.00, 1.80],\r\n        [350, 438.00, 1.72],\r\n        [600, 810.50, 1.49],\r\n        [1100, 1485.50, 1.35],\r\n        [2600, 3300.50, 1.21],\r\n        [5100, 6025.50, 1.09],\r\n        [10100, 10925.50, 0.98],\r\n        [25100, 24275.50, 0.89],\r\n        [50100, 45525.50, 0.85],\r\n        [Infinity, 45525.50, 0.80],\r\n    ];\r\n\r\n\r\n\r\n    \/* =============================================================================\r\n       2) I18N \u2014 Translations and formatting setup\r\n       -----------------------------------------------------------------------------\r\n       - LANG and THEME are persisted in localStorage so the app remembers settings\r\n       - t[...] contains all UI strings used throughout the app\r\n       - fmtMoney \/ fmtNumber ensure correct locale formatting for currency and ints\r\n       ============================================================================= *\/\r\n    \/\/ let LANG = localStorage.getItem('ez_lang') || 'fr';\r\n    let LANG = 'fr';\r\n    (function () {\r\n        const path = window.location.pathname.toLowerCase();\r\n\r\n        if (path.includes('\/fr')) {\r\n            LANG = 'fr';\r\n        } else if (path.includes('\/en')) {\r\n            LANG = 'en';\r\n        }\r\n\r\n        \/\/ DO NOT persist language\r\n        localStorage.removeItem('ez_lang');\r\n    })();\r\n\r\n\r\n    let THEME = localStorage.getItem('ez_theme') || 'light';\r\n\r\n    let moneyFmt = new Intl.NumberFormat(LANG === 'fr' ? 'fr-CA' : 'en-CA', { style: 'currency', currency: 'CAD' });\r\n    let numFmt = new Intl.NumberFormat(LANG === 'fr' ? 'fr-CA' : 'en-CA');\r\n\r\n    const t = {\r\n        fr: {\r\n            title: 'Calculateur eZsign',\r\n            inlineCompare1: '+ Comparer (ajouter une colonne)',\r\n            inlineCompare2: '+ Ajouter une troisi\u00e8me colonne',\r\n            inlineCompare3: '\u21ba Revenir \u00e0 une seule',\r\n            choose: 'Choisissez le type de compte, puis entrez le nombre d\u2019utilisateurs (et de dossiers API si le plan le permet).',\r\n            params: 'Param\u00e8tres', quick: 'R\u00e9sum\u00e9 rapide', details: 'D\u00e9tails de la simulation',\r\n            acct: 'Type de compte', files: 'Nombre de dossiers (par mois)', users: 'Nombre d\u2019utilisateurs', calc: 'Calculer',\r\n            note_ent: 'Le plan <b>Entreprise<\/b> inclut <b>10 utilisateurs<\/b> et <b>100 dossiers API<\/b>.',\r\n            note_np: 'Les plans <b>Business Basic<\/b> et <b>Business Pro<\/b> incluent <b>10 utilisateurs<\/b> et ne proposent pas l\u2019API.',\r\n            k_files: 'Dossiers envoy\u00e9s', k_api: 'Frais API', k_users: 'Utilisateurs', k_userfees: 'Frais utilisateurs', k_total: 'Total mensuel',\r\n            empty: 'Aucun calcul encore. Entrez les param\u00e8tres et cliquez \u00ab Calculer \u00bb.',\r\n            sim: 'SIMULATION',\r\n            line2: (n, b, iu, if_) => `Vous utilisez le forfait <b>${n}<\/b> \u00e0 ${fmtMoney(b)}\/mois, incluant ${iu} utilisateur${iu > 1 ? 's' : ''}${if_ > 0 ? ` et ${if_} dossiers API par mois` : ''}.`,\r\n            noneFiles: (inc) => `Comme ${inc} dossiers sont inclus, aucun frais d\u2019API.`,\r\n            mustPayFiles: (x, inc) => `Comme ${inc} dossiers sont inclus, vous devez payer pour ${x} ${x === 1 ? 'dossier suppl\u00e9mentaire' : 'dossiers suppl\u00e9mentaires'}.`,\r\n            tierFiles: (f, pb, c, r, pl, lim) => `Dossiers: palier ${pl + 1}\u2013${lim}. Base palier: ${fmtMoney(pb)}; ${c} restants (${f}-${pl}) \u00e0 ${fmtMoney(r)}\/dossier = ${fmtMoney(pb + c * r)}.`,\r\n            month: 'Calcul des frais mensuels',\r\n            entRow: (n, b, iu, if_) => `Forfait ${n} = ${fmtMoney(b)}\/mois (inclut ${iu} utilisateur${iu > 1 ? 's' : ''}${if_ > 0 ? ` et ${if_} dossiers` : ''})`,\r\n            apiRow: (pb, c, r) => `Frais API = ${fmtMoney(pb)} + ${c} \u00d7 ${fmtMoney(r)} = ${fmtMoney(pb + c * r)}`,\r\n            usersNone: (inc) => `Comme ${inc} utilisateur${inc > 1 ? 's' : ''} sont inclus, aucun frais utilisateurs.`,\r\n            usersMust: (x) => `Vous avez des frais pour ${x} ${x === 1 ? 'utilisateur suppl\u00e9mentaire' : 'utilisateurs suppl\u00e9mentaires'}.`,\r\n            usersTier: (u, monthlyAtPrev, c, r, pl, lim) => `Utilisateurs: palier ${pl + 1}\u2013${lim}. Base palier: ${fmtMoney(monthlyAtPrev)}; ${c} restants (${u}-${pl}) \u00e0 ${fmtMoney(r)}\/utilisateur = ${fmtMoney(monthlyAtPrev + c * r)}.`,\r\n            usersRow: (baseTier, c, r) => `Frais utilisateurs = ${fmtMoney(baseTier)} + ${c} \u00d7 ${fmtMoney(r)} = ${fmtMoney(baseTier + c * r)}`,\r\n            total: 'TOTAL MENSUEL = ',\r\n            themeLight: 'Th\u00e8me clair', themeDark: 'Th\u00e8me sombre',\r\n            infoTitle: 'Tarifs eZsign',\r\n            compareTop: 'Comparer', compareTitle: 'Comparer les forfaits',\r\n            thPlan: 'Forfait', thBase: 'Base', thUsers: 'Utilisateurs', thUserFees: 'Frais utilisateurs', thApiFees: 'Frais API', thTotal: 'Total',\r\n            andUp: 'et plus'\r\n        },\r\n        en: {\r\n            title: 'eZsign Calculator',\r\n            inlineCompare1: '+ Compare (add column)',\r\n            inlineCompare2: '+ Add third column',\r\n            inlineCompare3: '\u21ba Back to single',\r\n            choose: 'Choose the account type, then enter the number of users (and API files if the plan allows it).',\r\n            params: 'Parameters', quick: 'Quick summary', details: 'Simulation details',\r\n            acct: 'Account type', files: 'Number of files (per month)', users: 'Number of users', calc: 'Calculate',\r\n            note_ent: 'The <b>Enterprise<\/b> plan includes <b>10 users<\/b> and <b>100 API files<\/b>.',\r\n            note_np: 'The <b>Business Basic<\/b> and <b>Business Pro<\/b> plans include <b>10 users<\/b> and do not offer the API.',\r\n            k_files: 'Files sent', k_api: 'API fees', k_users: 'Users', k_userfees: 'User fees', k_total: 'Monthly total',\r\n            empty: 'No calculation yet. Enter parameters and click \u201cCalculate\u201d.',\r\n            sim: 'SIMULATION',\r\n            line2: (n, b, iu, if_) => `You\u2019re using the <b>${n}<\/b> plan at ${fmtMoney(b)}\/month, including ${iu} user${iu > 1 ? 's' : ''}${if_ > 0 ? ` and ${if_} API files per month` : ''}.`,\r\n            noneFiles: (inc) => `Since ${inc} files are included, there are no API fees.`,\r\n            mustPayFiles: (x, inc) => `Since ${inc} files are included, you need to pay for ${x} additional ${x === 1 ? 'file' : 'files'}.`,\r\n            tierFiles: (f, pb, c, r, pl, lim) => `Files: tier ${pl + 1}\u2013${lim}. Base tier: ${fmtMoney(pb)}; ${c} remaining (${f}-${pl}) at ${fmtMoney(r)}\/file = ${fmtMoney(pb + c * r)}.`,\r\n            month: 'Monthly fees calculation',\r\n            entRow: (n, b, iu, if_) => `${n} plan = ${fmtMoney(b)}\/month (includes ${iu} user${iu > 1 ? 's' : ''}${if_ > 0 ? ` and ${if_} files` : ''})`,\r\n            apiRow: (pb, c, r) => `API fees = ${fmtMoney(pb)} + ${c} \u00d7 ${fmtMoney(r)} = ${fmtMoney(pb + c * r)}`,\r\n            usersNone: (inc) => `Since ${inc} user${inc > 1 ? 's' : ''} are included, there are no user fees.`,\r\n            usersMust: (x) => `You have fees for ${x} additional ${x === 1 ? 'user' : 'users'}.`,\r\n            usersTier: (u, monthlyAtPrev, c, r, pl, lim) => `Users: tier ${pl + 1}\u2013${lim}. Base tier: ${fmtMoney(monthlyAtPrev)}; ${c} remaining (${u}-${pl}) at ${fmtMoney(r)}\/user = ${fmtMoney(monthlyAtPrev + c * r)}.`,\r\n            usersRow: (baseTier, c, r) => `User fees = ${fmtMoney(baseTier)} + ${c} \u00d7 ${fmtMoney(r)} = ${fmtMoney(baseTier + c * r)}`,\r\n            total: 'MONTHLY TOTAL = ',\r\n            themeLight: 'Light theme', themeDark: 'Dark theme',\r\n            infoTitle: 'eZsign Pricing',\r\n            compareTop: 'Compare', compareTitle: 'Compare plans',\r\n            thPlan: 'Plan', thBase: 'Base', thUsers: 'Users', thUserFees: 'User fees', thApiFees: 'API fees', thTotal: 'Total',\r\n            andUp: 'and up'\r\n        }\r\n    };\r\n    \/\/ Helpers to format values using the current locale\r\n    const fmtMoney = n => moneyFmt.format(n);\r\n    const fmtNumber = n => numFmt.format(n);\r\n\r\n\r\n    \/* =============================================================================\r\n       3) COST HELPERS (tier math)\r\n       -----------------------------------------------------------------------------\r\n       These functions do *not* talk to the DOM. They purely compute money\/tiers.\r\n       -----------------------------------------------------------------------------\r\n       apiCostBreakdown(files, account) returns:\r\n         - prevLimit: lower bound of the current tier (e.g., 200)\r\n         - prevBase:  cumulative cost up to prevLimit\r\n         - inTierCount: files - prevLimit\r\n         - rate: price per additional file in current tier\r\n         - apiTotal: total API fees for the given number of files\r\n       userCostBreakdown(users, account) is analogous for user fees.\r\n       ============================================================================= *\/\r\n    function apiCostBreakdown(files, account) {\r\n        if (!account.apiAvailable) {\r\n            \/\/ Plans without API always have zero API fees.\r\n            return { files: 0, prevLimit: 0, prevBase: 0, inTierCount: 0, rate: 0, apiTotal: 0 };\r\n        }\r\n\r\n        files = Math.max(0, Math.floor(Number(files) || 0));\r\n        \/\/ If files are within the included block, free.\r\n        if (files <= account.includesFiles) {\r\n            return { files, prevLimit: account.includesFiles, prevBase: 0, inTierCount: 0, rate: 0, apiTotal: 0 };\r\n        }\r\n\r\n        \/\/ Find the first tier where files <= tier.limit\r\n        for (let i = 1; i < API_TIERS.length; i++) {\r\n            const [limit, baseAtLimit, rate] = API_TIERS[i];\r\n            if (files <= limit) {\r\n                const prevLimit = API_TIERS[i - 1][0];\r\n                const prevBase = API_TIERS[i - 1][1];\r\n                const inTierCount = files - prevLimit;\r\n                const apiTotal = prevBase + inTierCount * rate;\r\n                return { files, prevLimit, prevBase, inTierCount, rate, apiTotal };\r\n            }\r\n        }\r\n    }\r\n\r\n    function userCostBreakdown(users, account) {\r\n        users = Math.max(0, Math.floor(Number(users) || 0));\r\n        const inc = account.includesUsers;\r\n\r\n        \/\/ If within included users, no extra user fees.\r\n        if (users <= inc) {\r\n            return { users, prevLimit: inc, prevBase: 0, inTierCount: 0, rate: 0, userTotal: 0 };\r\n        }\r\n\r\n        \/\/ We accumulate extras tier-by-tier until we find the current tier.\r\n        let prevLimit = inc;  \/\/ lower bound for the current tier\r\n        let prevBase = 0;    \/\/ cumulative extras cost up to prevLimit\r\n\r\n        for (const [limit, rate] of account.userSegments) {\r\n            if (users <= limit) {\r\n                const inTierCount = users - prevLimit;\r\n                const userTotal = prevBase + inTierCount * rate; \/\/ extras only\r\n                return { users, prevLimit, prevBase, inTierCount, rate, userTotal };\r\n            } else {\r\n                \/\/ We pass this tier completely: add its full width cost to prevBase.\r\n                prevBase += (limit - prevLimit) * rate;\r\n                prevLimit = limit;\r\n            }\r\n        }\r\n    }\r\n\r\n    \/* Small helpers to display \"tier upper bound\" nicely in narrative. *\/\r\n    function findApiTierLimit(files) {\r\n        for (const [limit] of API_TIERS) { if (files <= limit) return limit === Infinity ? '\u221e' : limit; }\r\n        return '\u221e';\r\n    }\r\n    function findUserTierLimit(users, acct) {\r\n        for (const [limit] of acct.userSegments) { if (users <= limit) return limit === Infinity ? '\u221e' : limit; }\r\n        return '\u221e';\r\n    }\r\n\r\n\r\n    \/* =============================================================================\r\n       4) buildSimulationHTML(files, users, acct)\r\n       -----------------------------------------------------------------------------\r\n       Produces:\r\n         - html: narrative (the text block shown in \"Simulation details\")\r\n         - apiTotal: API extras total\r\n         - userExtra: user extras total (ADDITIONAL ONLY)  <-- used for the \"User fees\" KPI\r\n         - userTotalWithBase: (base + extras) if ever needed elsewhere\r\n         - totalMonthly: final monthly total (base + API extras + user extras)\r\n       Notes:\r\n         - \"monthlyAtPrevLimit\" is the monthly cost at the start of the current\r\n           user tier: base + user extras up to prevLimit (used in our explanatory line).\r\n       ============================================================================= *\/\r\n    function buildSimulationHTML(files, users, acct) {\r\n        const bF = apiCostBreakdown(files, acct);\r\n        const bU = userCostBreakdown(users, acct);\r\n\r\n        const paidFiles = Math.max(0, acct.apiAvailable ? (files - acct.includesFiles) : 0);\r\n        const paidUsers = Math.max(0, users - acct.includesUsers);\r\n\r\n        const total = acct.base + bF.apiTotal + bU.userTotal;           \/\/ final monthly total\r\n        const monthlyAtPrevLimit = acct.base + bU.prevBase;             \/\/ used in explanation\r\n        const usersTotalAll = acct.base + bU.userTotal;                  \/\/ kept if needed\r\n\r\n        const name = LANG === 'fr' ? acct.name_fr : acct.name_en;\r\n        const parts = [];\r\n\r\n        \/\/ Intro line (plan, base, inclusions)\r\n        parts.push(`<b>${t[LANG].sim}<\/b>`);\r\n        parts.push(t[LANG].line2(name, acct.base, acct.includesUsers, acct.includesFiles));\r\n\r\n        \/\/ API narrative (Enterprise only)\r\n        if (acct.apiAvailable) {\r\n            if (paidFiles === 0) {\r\n                parts.push(t[LANG].noneFiles(acct.includesFiles));\r\n            } else {\r\n                parts.push(t[LANG].mustPayFiles(paidFiles, acct.includesFiles));\r\n                parts.push(\r\n                    t[LANG].tierFiles(\r\n                        files, bF.prevBase, bF.inTierCount, bF.rate, bF.prevLimit, findApiTierLimit(files)\r\n                    )\r\n                );\r\n            }\r\n        }\r\n\r\n        \/\/ Users narrative\r\n        if (paidUsers === 0) {\r\n            parts.push(t[LANG].usersNone(acct.includesUsers));\r\n        } else {\r\n            parts.push(t[LANG].usersMust(paidUsers));\r\n            parts.push(\r\n                t[LANG].usersTier(\r\n                    users, monthlyAtPrevLimit, bU.inTierCount, bU.rate, bU.prevLimit, findUserTierLimit(users, acct)\r\n                )\r\n            );\r\n        }\r\n\r\n        \/\/ Monthly fees breakdown (repeats the math with same structure)\r\n        parts.push(`<b>${t[LANG].month}<\/b>`);\r\n        parts.push(t[LANG].entRow(name, acct.base, acct.includesUsers, acct.includesFiles));\r\n        if (acct.apiAvailable) parts.push(t[LANG].apiRow(bF.prevBase, bF.inTierCount, bF.rate));\r\n        parts.push(t[LANG].usersRow(monthlyAtPrevLimit, bU.inTierCount, bU.rate));\r\n        parts.push(`<b>${t[LANG].total}${fmtMoney(total)}<\/b>`);\r\n\r\n        return {\r\n            html: parts.join('<br><br>'),\r\n            apiTotal: bF.apiTotal,\r\n            userExtra: bU.userTotal,            \/\/ << KPI shows extras only\r\n            userTotalWithBase: usersTotalAll,   \/\/ (not used for KPI but kept for flexibility)\r\n            totalMonthly: total\r\n        };\r\n    }\r\n\r\n\r\n    \/* =============================================================================\r\n       5) INLINE LANES UI (1\u20133 columns)\r\n       -----------------------------------------------------------------------------\r\n       The calculator can be shown as 1, 2 or 3 side-by-side \"lanes\".\r\n       Each lane contains:\r\n         - Parameters card\r\n         - Quick summary (KPI) card\r\n         - Simulation details card\r\n       ============================================================================= *\/\r\n    let lanesCount = 1;\r\n    const lanesEl = document.getElementById('lanes');\r\n    const inlineBtn = document.getElementById('inlineCompareBtn');\r\n\r\n    function inlineCompareLabel() {\r\n        if (lanesCount === 1) return t[LANG].inlineCompare1;\r\n        if (lanesCount === 2) return t[LANG].inlineCompare2;\r\n        return t[LANG].inlineCompare3;\r\n    }\r\n    function laneId(i, s) { return `${s}-${i}`; }\r\n    function accountOptionsHTML(sel) {\r\n        return `\r\n  <option value=\"enterprise\"${sel === 'enterprise' ? ' selected' : ''}>${LANG === 'fr' ? 'Entreprise' : 'Enterprise'}<\/option>\r\n  <option value=\"basic\"${sel === 'basic' ? ' selected' : ''}>Business Basic<\/option>\r\n  <option value=\"pro\"${sel === 'pro' ? ' selected' : ''}>Business Pro<\/option>`;\r\n    }\r\n\r\n    \/* Build a single lane\u2019s DOM (as a string), then the caller inserts it. *\/\r\n    function makeLane(i, defaults) {\r\n        const plan = defaults.plan || 'enterprise';\r\n\r\n        \/\/ Parameters card\r\n        const paramsHTML = `\r\n    <section class=\"card\">\r\n      <div class=\"lane-title\">${t[LANG].params} \u2014 ${String.fromCharCode(65 + i)}<\/div>\r\n      <div class=\"sub\">${t[LANG].choose}<\/div>\r\n      <div class=\"controls\">\r\n        <div class=\"field\">\r\n          <label for=\"${laneId(i, 'plan')}\">${t[LANG].acct}<\/label>\r\n          <select id=\"${laneId(i, 'plan')}\">${accountOptionsHTML(plan)}<\/select>\r\n        <\/div>\r\n\r\n        <!-- Files input is hidden for plans without API -->\r\n        <div class=\"field\" id=\"${laneId(i, 'filesField')}\">\r\n          <label for=\"${laneId(i, 'files')}\">${t[LANG].files}<\/label>\r\n          <input type=\"number\" id=\"${laneId(i, 'files')}\" placeholder=\"${LANG === 'fr' ? 'Ex. 350' : 'e.g., 350'}\" min=\"0\" inputmode=\"numeric\" value=\"${defaults.files ?? ''}\">\r\n        <\/div>\r\n\r\n        <div class=\"field\">\r\n          <label for=\"${laneId(i, 'users')}\">${t[LANG].users}<\/label>\r\n          <input type=\"number\" id=\"${laneId(i, 'users')}\" placeholder=\"${LANG === 'fr' ? 'Ex. 75' : 'e.g., 75'}\" min=\"1\" inputmode=\"numeric\" value=\"${defaults.users ?? 10}\">\r\n        <\/div>\r\n\r\n        <button id=\"${laneId(i, 'calc')}\" class=\"btn\">${t[LANG].calc}<\/button>\r\n      <\/div>\r\n\r\n      <div class=\"note\">${t[LANG].note_ent} ${t[LANG].note_np}<\/div>\r\n    <\/section>`;\r\n\r\n        \/\/ KPI card\r\n        const kpiHTML = `\r\n    <section class=\"card\" id=\"${laneId(i, 'kpis')}\" style=\"display:none\">\r\n      <h2>${t[LANG].quick}<\/h2>\r\n      <div class=\"kpi-row\">\r\n        <div class=\"kpi\" id=\"${laneId(i, 'kpiBlockFiles')}\">\r\n          <div class=\"label\">${t[LANG].k_files}<\/div>\r\n          <div class=\"value\" id=\"${laneId(i, 'kpiFiles')}\">\u2014<\/div>\r\n        <\/div>\r\n        <div class=\"kpi\" id=\"${laneId(i, 'kpiBlockApi')}\">\r\n          <div class=\"label\">${t[LANG].k_api}<\/div>\r\n          <div class=\"value\" id=\"${laneId(i, 'kpiApi')}\">\u2014<\/div>\r\n        <\/div>\r\n        <div class=\"kpi\">\r\n          <div class=\"label\">${t[LANG].k_users}<\/div>\r\n          <div class=\"value\" id=\"${laneId(i, 'kpiUsers')}\">\u2014<\/div>\r\n        <\/div>\r\n        <div class=\"kpi\">\r\n          <div class=\"label\">${t[LANG].k_userfees}<\/div>\r\n          <div class=\"value\" id=\"${laneId(i, 'kpiUserFees')}\">\u2014<\/div>\r\n        <\/div>\r\n        <div class=\"kpi\">\r\n          <div class=\"label\">${t[LANG].k_total}<\/div>\r\n          <div class=\"value\" id=\"${laneId(i, 'kpiTotal')}\">\u2014<\/div>\r\n        <\/div>\r\n      <\/div>\r\n      <div class=\"total\" id=\"${laneId(i, 'totalBanner')}\">${t[LANG].total}\u2014<\/div>\r\n    <\/section>`;\r\n\r\n        \/\/ Output (narrative) card\r\n        const outHTML = `\r\n    <section class=\"card\">\r\n      <h2>${t[LANG].details}<\/h2>\r\n      <div id=\"${laneId(i, 'output')}\" class=\"output\">${t[LANG].empty}<\/div>\r\n    <\/section>`;\r\n\r\n        \/\/ Wrap all three cards\r\n        const wrap = document.createElement('div');\r\n        wrap.className = 'lane';\r\n        wrap.innerHTML = paramsHTML + kpiHTML + outHTML;\r\n        return wrap;\r\n    }\r\n\r\n    \/* Ensure we have N lanes (1\u20133).\r\n       - Rebuilds the grid from scratch but preserves previous input values.\r\n    *\/\r\n    function ensureLanes(n) {\r\n        lanesCount = Math.max(1, Math.min(3, n));\r\n        lanesEl.classList.toggle('cols-2', lanesCount === 2);\r\n        lanesEl.classList.toggle('cols-3', lanesCount === 3);\r\n\r\n        \/\/ Save current input values so we can rehydrate after re-render\r\n        const prev = [];\r\n        lanesEl.querySelectorAll('.lane').forEach((lane, idx) => {\r\n            prev.push({\r\n                plan: (lane.querySelector(`#${laneId(idx, 'plan')}`) || {}).value || 'enterprise',\r\n                files: (lane.querySelector(`#${laneId(idx, 'files')}`) || {}).value,\r\n                users: (lane.querySelector(`#${laneId(idx, 'users')}`) || {}).value\r\n            });\r\n        });\r\n\r\n        lanesEl.innerHTML = '';\r\n        for (let i = 0; i < lanesCount; i++) {\r\n            lanesEl.appendChild(makeLane(i, prev[i] || { plan: 'enterprise', files: '', users: 10 }));\r\n        }\r\n\r\n        for (let i = 0; i < lanesCount; i++) wireLane(i);\r\n\r\n        inlineBtn.textContent = inlineCompareLabel();\r\n        updatePlanUIAll();\r\n    }\r\n\r\n    \/* Wire events for a given lane. *\/\r\n    function wireLane(i) {\r\n        const sel = id => document.getElementById(laneId(i, id));\r\n        const run = () => runSimulation(i);\r\n        sel('calc').addEventListener('click', run);\r\n        sel('plan').addEventListener('change', () => { updatePlanUI(i); run(); });\r\n        sel('files')?.addEventListener('input', run);\r\n        sel('users').addEventListener('input', run);\r\n    }\r\n\r\n    \/* Hide\/show fields depending on whether the chosen plan has API. *\/\r\n    function updatePlanUI(i) {\r\n        const sel = id => document.getElementById(laneId(i, id));\r\n        const a = ACCOUNTS[sel('plan').value];\r\n        sel('filesField').style.display = a.apiAvailable ? '' : 'none';\r\n        sel('kpiBlockFiles').style.display = a.apiAvailable ? '' : 'none';\r\n        sel('kpiBlockApi').style.display = a.apiAvailable ? '' : 'none';\r\n    }\r\n    function updatePlanUIAll() { for (let i = 0; i < lanesCount; i++) updatePlanUI(i); }\r\n\r\n    \/* Run a simulation for lane i and fill KPIs + narrative. *\/\r\n    function runSimulation(i) {\r\n        const sel = id => document.getElementById(laneId(i, id));\r\n        const a = ACCOUNTS[sel('plan').value];\r\n\r\n        const files = a.apiAvailable ? parseInt(sel('files').value || '0', 10) : 0;\r\n        const users = parseInt(sel('users').value || String(a.includesUsers), 10);\r\n\r\n        const kpis = document.getElementById(laneId(i, 'kpis'));\r\n        const out = sel('output');\r\n\r\n        if (isNaN(users) || users < 1) {\r\n            out.textContent = t[LANG].empty; kpis.style.display = 'none'; return;\r\n        }\r\n\r\n        const res = buildSimulationHTML(files, users, a);\r\n\r\n        \/\/ Narrative\r\n        out.innerHTML = res.html;\r\n        kpis.style.display = 'block';\r\n\r\n        \/\/ KPIs\r\n        if (a.apiAvailable) {\r\n            document.getElementById(laneId(i, 'kpiFiles')).textContent = fmtNumber(files);\r\n            document.getElementById(laneId(i, 'kpiApi')).textContent = fmtMoney(res.apiTotal);\r\n        }\r\n        document.getElementById(laneId(i, 'kpiUsers')).textContent = fmtNumber(users);\r\n        \/\/ IMPORTANT: show ADDITIONAL user fees only (not base)\r\n        document.getElementById(laneId(i, 'kpiUserFees')).textContent = fmtMoney(res.userExtra);\r\n        document.getElementById(laneId(i, 'kpiTotal')).textContent = fmtMoney(res.totalMonthly);\r\n\r\n        const banner = document.getElementById(laneId(i, 'totalBanner'));\r\n        banner.textContent = t[LANG].total + fmtMoney(res.totalMonthly);\r\n        banner.className = 'total' + ((res.apiTotal + res.userExtra) === 0 ? ' warn' : '');\r\n    }\r\n\r\n\r\n    \/* =============================================================================\r\n       6) PRICING MODAL (tables)\r\n       -----------------------------------------------------------------------------\r\n       - Adapts to which plans are visible in the inline view.\r\n       - If Enterprise is present, include the API grid.\r\n       - User tables mimic the API table structure: \"included\" row + progressive tiers.\r\n       ============================================================================= *\/\r\n    function getVisiblePlans() {\r\n        const seen = new Set();\r\n        for (let i = 0; i < lanesCount; i++) {\r\n            const el = document.getElementById(`plan-${i}`);\r\n            if (el && el.value) seen.add(el.value);\r\n        }\r\n        if (seen.size === 0) seen.add('enterprise');\r\n        return Array.from(seen);\r\n    }\r\n\r\n    \/* Build a \"user pricing table\" for a plan with API-like structure. *\/\r\n    function userTableFor(plan) {\r\n        const title = (LANG === 'fr' ? plan.name_fr : plan.name_en);\r\n\r\n        const includedLabel =\r\n            LANG === 'fr' ? 'Les 10 premiers utilisateurs sont inclus' : 'The first 10 users are included';\r\n        const includedInPlan =\r\n            LANG === 'fr' ? `Inclus dans le forfait ${title}` : `Included in the ${title} plan`;\r\n\r\n        \/\/ First row: included block\r\n        let rows = `\r\n    <tr>\r\n      <td>${includedLabel}<\/td>\r\n      <td>${fmtNumber(plan.includesUsers)}<\/td>\r\n      <td>${includedInPlan}<\/td>\r\n      <td>${fmtMoney(0)}<\/td>\r\n    <\/tr>`;\r\n\r\n        \/\/ Then each progressive tier. We display the *monthly at tier start*,\r\n        \/\/ which equals base + extras up to the lower bound of that tier.\r\n        let prevIncluded = plan.includesUsers;\r\n        let cumulativeExtras = 0;\r\n\r\n        for (const [limit, rate] of plan.userSegments) {\r\n            const range =\r\n                limit === Infinity\r\n                    ? `${fmtNumber(prevIncluded + 1)} ${t[LANG].andUp}`\r\n                    : `${fmtNumber(prevIncluded + 1)} \u2013 ${fmtNumber(limit)}`;\r\n\r\n            const monthlyAtTierStart = fmtMoney(plan.base + cumulativeExtras);\r\n\r\n            rows += `\r\n      <tr>\r\n        <td>${range}<\/td>\r\n        <td>${fmtNumber(prevIncluded)}<\/td>\r\n        <td>${monthlyAtTierStart}<\/td>\r\n        <td>${fmtMoney(rate)}<\/td>\r\n      <\/tr>`;\r\n\r\n            \/\/ Advance to next tier\r\n            const segCount = (limit === Infinity ? 0 : (limit - prevIncluded));\r\n            cumulativeExtras += segCount * rate;\r\n            prevIncluded = limit;\r\n        }\r\n\r\n        return `\r\n    <div class=\"section-title\" style=\"margin:10px 0 6px;font-weight:700;color:var(--ink);\">${title}<\/div>\r\n    <table class=\"price-table\">\r\n      <thead>\r\n        <tr>\r\n          <th>${LANG === 'fr' ? 'Paliers d\u2019utilisateurs' : 'User tiers'}<\/th>\r\n          <th>${LANG === 'fr' ? 'n. d\u2019utilisateurs inclus' : 'Number of users included'}<\/th>\r\n          <th>${LANG === 'fr' ? 'Prix mensuel' : 'Monthly price'}<\/th>\r\n          <th>${LANG === 'fr' ? 'Prix par utilisateur suppl\u00e9mentaire' : 'Price per additional user'}<\/th>\r\n        <\/tr>\r\n      <\/thead>\r\n      <tbody>${rows}<\/tbody>\r\n    <\/table>`;\r\n    }\r\n\r\n    function renderPricingTables() {\r\n        const body = document.getElementById('pricingBody');\r\n        const visible = getVisiblePlans();\r\n        const order = ['basic', 'pro', 'enterprise'];  \/\/ display order\r\n        let html = '';\r\n\r\n        \/\/ API grid only if Enterprise is on screen\r\n        if (visible.includes('enterprise')) {\r\n            let apiRows = `\r\n      <tr>\r\n        <td>**1\u2013100***<\/td>\r\n        <td>${fmtNumber(100)}<\/td>\r\n        <td>${LANG === 'fr' ? 'Inclus dans le forfait Entreprise' : 'Included in the Enterprise plan'}<\/td>\r\n        <td>${fmtMoney(0)}<\/td>\r\n      <\/tr>`;\r\n\r\n            for (let i = 1; i < API_TIERS.length; i++) {\r\n                const limit = API_TIERS[i][0];\r\n                const prev = API_TIERS[i - 1][0];\r\n                const rate = API_TIERS[i][2];\r\n                const base = API_TIERS[i - 1][1];\r\n\r\n                const range = (limit === Infinity)\r\n                    ? `${fmtNumber(prev + 1)} ${t[LANG].andUp}`\r\n                    : `${fmtNumber(prev + 1)} \u2013 ${fmtNumber(limit)}`;\r\n\r\n                apiRows += `\r\n        <tr>\r\n          <td>${range}<\/td>\r\n          <td>${fmtNumber(prev)}<\/td>\r\n          <td>${fmtMoney(base)}<\/td>\r\n          <td>${fmtMoney(rate)}<\/td>\r\n        <\/tr>`;\r\n            }\r\n\r\n            html += `\r\n      <div class=\"section-title\" style=\"margin:10px 0 6px;font-weight:700;color:var(--ink);\">\r\n        ${LANG === 'fr' ? 'API (dossiers)' : 'API (files)'}\r\n      <\/div>\r\n      <table class=\"price-table\">\r\n        <thead>\r\n          <tr>\r\n            <th>${LANG === 'fr' ? 'Nombre de dossiers compl\u00e9t\u00e9s par mois' : 'Number of completed folders per month'}<\/th>\r\n            <th>${LANG === 'fr' ? 'Nombre de dossiers inclus' : 'Number of envelopes included'}<\/th>\r\n            <th>${LANG === 'fr' ? 'Prix mensuel' : 'Monthly price'}<\/th>\r\n            <th>${LANG === 'fr' ? 'Prix par dossier compl\u00e9t\u00e9 suppl\u00e9mentaire' : 'Price per additional completed folders'}<\/th>\r\n          <\/tr>\r\n        <\/thead>\r\n        <tbody>${apiRows}<\/tbody>\r\n      <\/table>`;\r\n        }\r\n\r\n        \/\/ User tables for visible plans\r\n        for (const key of order) if (visible.includes(key)) html += userTableFor(ACCOUNTS[key]);\r\n\r\n        html += `\r\n    <p class=\"muted\" style=\"margin-top:10px\">\r\n      ${LANG === 'fr'\r\n                ? 'Contenu ajust\u00e9 selon les forfaits visibles \u00e0 l\u2019\u00e9cran. La grille API appara\u00eet seulement si le forfait Entreprise est pr\u00e9sent.'\r\n                : 'Content adapts to the plans visible on screen. The API grid appears only when Enterprise is present.'}\r\n    <\/p>`;\r\n\r\n        document.getElementById('pricingTitle').textContent = t[LANG].infoTitle;\r\n        body.innerHTML = html;\r\n    }\r\n\r\n\r\n    \/* =============================================================================\r\n       7) COMPARE MODAL\r\n       -----------------------------------------------------------------------------\r\n       - Uses the inputs from lane A (first column) to compute totals for all plans\r\n       - Shows base, users, additional user fees, API fees (if any), and total\r\n       - Highlights the best total with a badge\r\n       ============================================================================= *\/\r\n    function renderCompareModal() {\r\n        const body = document.getElementById('compareBody');\r\n        document.getElementById('compareTitle').textContent = t[LANG].compareTitle;\r\n\r\n        const files = parseInt((document.getElementById('files-0') || {}).value || '0', 10);\r\n        const users = parseInt((document.getElementById('users-0') || {}).value || '10', 10);\r\n\r\n        const rows = [], results = [];\r\n        for (const key of ['basic', 'pro', 'enterprise']) {\r\n            const p = ACCOUNTS[key]; const F = p.apiAvailable ? files : 0, U = users;\r\n            const bF = apiCostBreakdown(F, p), bU = userCostBreakdown(U, p);\r\n            const total = p.base + bF.apiTotal + bU.userTotal;\r\n            results.push({ key, total });\r\n\r\n            \/\/ \"User fees\" column shows ADDITIONAL user fees only (to match KPI semantics).\r\n            rows.push(`<tr>\r\n      <td>${LANG === 'fr' ? p.name_fr : p.name_en}<\/td>\r\n      <td>${fmtMoney(p.base)}<\/td>\r\n      <td>${fmtNumber(U)}<\/td>\r\n      <td>${fmtMoney(bU.userTotal)}<\/td>\r\n      <td>${p.apiAvailable ? fmtMoney(bF.apiTotal) : '\u2014'}<\/td>\r\n      <td data-t=\"${total}\">${fmtMoney(total)}<\/td>\r\n    <\/tr>`);\r\n        }\r\n\r\n        const best = results.reduce((a, b) => a.total < b.total ? a : b);\r\n\r\n        body.innerHTML = `\r\n    <table class=\"price-table\">\r\n      <thead><tr>\r\n        <th>${t[LANG].thPlan}<\/th>\r\n        <th>${t[LANG].thBase}<\/th>\r\n        <th>${t[LANG].thUsers}<\/th>\r\n        <th>${t[LANG].thUserFees}<\/th>\r\n        <th>${t[LANG].thApiFees}<\/th>\r\n        <th>${t[LANG].thTotal}<\/th>\r\n      <\/tr><\/thead>\r\n      <tbody>${rows.join('')}<\/tbody>\r\n    <\/table>\r\n    <p class=\"muted\" style=\"margin-top:8px\">\r\n      ${LANG === 'fr' ? 'Comparaison bas\u00e9e sur la colonne A.' : 'Comparison uses column A inputs.'}\r\n      <span class=\"badge\">${LANG === 'fr' ? 'Meilleur prix' : 'Best price'}<\/span> :\r\n      ${LANG === 'fr' ? ACCOUNTS[best.key].name_fr : ACCOUNTS[best.key].name_en}\r\n    <\/p>`;\r\n\r\n        \/\/ Visually mark the best total\r\n        body.querySelectorAll('td[data-t]').forEach(td => {\r\n            if (Number(td.dataset.t) === best.total) {\r\n                td.innerHTML = `<span class=\"badge\">${fmtMoney(best.total)}<\/span>`;\r\n            }\r\n        });\r\n    }\r\n\r\n\r\n    \/* =============================================================================\r\n       8) LANGUAGE \/ THEME & BOOTSTRAP\r\n       -----------------------------------------------------------------------------\r\n       Simple toggles with localStorage persistence. Re-render when language changes.\r\n       ============================================================================= *\/\r\n    function setTheme(theme) {\r\n        THEME = theme;\r\n        localStorage.setItem('ez_theme', THEME);\r\n        document.documentElement.setAttribute('data-theme', THEME);\r\n        document.getElementById('themeBtn').textContent =\r\n            THEME === 'dark' ? t[LANG].themeDark : t[LANG].themeLight;\r\n    }\r\n\r\n    function setLang(lang) {\r\n        LANG = lang;\r\n        localStorage.setItem('ez_lang', LANG);\r\n\r\n        \/\/ Rebuild formatters for the new locale\r\n        moneyFmt = new Intl.NumberFormat(LANG === 'fr' ? 'fr-CA' : 'en-CA', { style: 'currency', currency: 'CAD' });\r\n        numFmt = new Intl.NumberFormat(LANG === 'fr' ? 'fr-CA' : 'en-CA');\r\n\r\n        \/\/ Update static labels\r\n        document.getElementById('title').textContent = t[LANG].title;\r\n        document.getElementById('compareBtn').textContent = t[LANG].compareTop;\r\n        document.getElementById('themeBtn').textContent = THEME === 'dark' ? t[LANG].themeDark : t[LANG].themeLight;\r\n        document.getElementById('langBtn').textContent = LANG === 'fr' ? 'EN' : 'FR';\r\n        inlineBtn.textContent = inlineCompareLabel();\r\n\r\n        \/\/ Re-render lanes with existing values, and refresh modals if open\r\n        ensureLanes(lanesCount);\r\n        if (document.getElementById('pricingModal').classList.contains('open')) renderPricingTables();\r\n        if (document.getElementById('compareModal').classList.contains('open')) renderCompareModal();\r\n    }\r\n\r\n    \/* Wire top-bar buttons *\/\r\n    document.getElementById('langBtn').onclick = () => setLang(LANG === 'fr' ? 'en' : 'fr');\r\n    document.getElementById('themeBtn').onclick = () => setTheme(THEME === 'light' ? 'dark' : 'light');\r\n    document.getElementById('infoBtn').onclick = () => {\r\n        renderPricingTables();\r\n        const m = document.getElementById('pricingModal');\r\n        m.classList.add('open'); m.setAttribute('aria-hidden', 'false');\r\n    };\r\n    document.getElementById('compareBtn').onclick = () => {\r\n        renderCompareModal();\r\n        const m = document.getElementById('compareModal');\r\n        m.classList.add('open'); m.setAttribute('aria-hidden', 'false');\r\n    };\r\n\r\n    \/* Inline compare button: cycles 1 \u2192 2 \u2192 3 \u2192 1 columns *\/\r\n    inlineBtn.onclick = () => {\r\n        const next = (lanesCount === 1) ? 2 : (lanesCount === 2) ? 3 : 1;\r\n        ensureLanes(next);\r\n    };\r\n\r\n    \/* Initial boot *\/\r\n    setTheme(THEME);\r\n    setLang(LANG);\r\n    ensureLanes(1);\r\n\r\n    \/* Modal close handlers *\/\r\n    document.querySelectorAll('[data-close]').forEach(el => el.addEventListener('click', () => {\r\n        const m = el.closest('.modal'); m.classList.remove('open'); m.setAttribute('aria-hidden', 'true');\r\n    }));\r\n    document.querySelectorAll('.modal .backdrop').forEach(el => el.addEventListener('click', () => {\r\n        const m = el.closest('.modal'); m.classList.remove('open'); m.setAttribute('aria-hidden', 'true');\r\n    }));\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-38aad78 elementor-align-center elementor-widget elementor-widget-button\" data-id=\"38aad78\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/github.com\/eZmaxinc\/eZmax-API\" target=\"_blank\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Documentation API<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Connectez eZsign \u00e0 vos outils Int\u00e9grations populaires : Retour aux options de forfaits API Pour acc\u00e9der \u00e0 l\u2019API, vous devez poss\u00e9der un compte entreprise au co\u00fbt mensuel de 222.80$. Ce compte vous donne automatiquement 10 utilisateurs eZsign et 100 dossiers mensuels compl\u00e9t\u00e9s via l\u2019API. Qu\u2019est\u2011ce qu\u2019un dossier ? Un dossier regroupe un ou plusieurs documents [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"content-type":"","footnotes":""},"class_list":["post-2347","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.1 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>API - eZsign<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"API\" \/>\n<meta property=\"og:description\" content=\"Connectez eZsign \u00e0 vos outils Int\u00e9grations populaires : Retour aux options de forfaits API Pour acc\u00e9der \u00e0 l\u2019API, vous devez poss\u00e9der un compte entreprise\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/\" \/>\n<meta property=\"og:site_name\" content=\"eZsign\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ezsign.ca\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-25T15:17:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/2.png2_.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/api\\\/\",\"url\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/tarifications\\\/forfaits-moyennes-et-grandes-entreprises\\\/api\\\/\",\"name\":\"API - eZsign\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/tarifications\\\/forfaits-moyennes-et-grandes-entreprises\\\/api\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/tarifications\\\/forfaits-moyennes-et-grandes-entreprises\\\/api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.ezsign.com\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/2.png2_.png\",\"datePublished\":\"2020-10-29T19:24:03+00:00\",\"dateModified\":\"2026-02-25T15:17:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/tarifications\\\/forfaits-moyennes-et-grandes-entreprises\\\/api\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/tarifications\\\/forfaits-moyennes-et-grandes-entreprises\\\/api\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/tarifications\\\/forfaits-moyennes-et-grandes-entreprises\\\/api\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.ezsign.com\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/2.png2_.png\",\"contentUrl\":\"https:\\\/\\\/www.ezsign.com\\\/wp-content\\\/uploads\\\/2025\\\/08\\\/2.png2_.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/tarifications\\\/forfaits-moyennes-et-grandes-entreprises\\\/api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/\",\"name\":\"eZsign\",\"description\":\"Fast and easy e-signature solution\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/#organization\",\"name\":\"EZsign - Fast and easy e-signature solution\",\"url\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.ezsign.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/eZsign_logo_4C2x1.png\",\"contentUrl\":\"https:\\\/\\\/www.ezsign.com\\\/wp-content\\\/uploads\\\/2024\\\/06\\\/eZsign_logo_4C2x1.png\",\"width\":294,\"height\":116,\"caption\":\"EZsign - Fast and easy e-signature solution\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ezsign.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/ezsign.ca\",\"https:\\\/\\\/www.instagram.com\\\/ezsign.ca\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/ezsign\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC-s2lR6CKIoBciOQ2A8WpCQ\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"API - eZsign","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/","og_locale":"fr_FR","og_type":"article","og_title":"API","og_description":"Connectez eZsign \u00e0 vos outils Int\u00e9grations populaires : Retour aux options de forfaits API Pour acc\u00e9der \u00e0 l\u2019API, vous devez poss\u00e9der un compte entreprise","og_url":"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/","og_site_name":"eZsign","article_publisher":"https:\/\/www.facebook.com\/ezsign.ca","article_modified_time":"2026-02-25T15:17:13+00:00","og_image":[{"url":"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/2.png2_.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.ezsign.com\/fr\/api\/","url":"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/","name":"API - eZsign","isPartOf":{"@id":"https:\/\/www.ezsign.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/#primaryimage"},"image":{"@id":"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/2.png2_.png","datePublished":"2020-10-29T19:24:03+00:00","dateModified":"2026-02-25T15:17:13+00:00","breadcrumb":{"@id":"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/#primaryimage","url":"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/2.png2_.png","contentUrl":"https:\/\/www.ezsign.com\/wp-content\/uploads\/2025\/08\/2.png2_.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.ezsign.com\/fr\/tarifications\/forfaits-moyennes-et-grandes-entreprises\/api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ezsign.com\/fr\/"},{"@type":"ListItem","position":2,"name":"API"}]},{"@type":"WebSite","@id":"https:\/\/www.ezsign.com\/fr\/#website","url":"https:\/\/www.ezsign.com\/fr\/","name":"eZsign","description":"Fast and easy e-signature solution","publisher":{"@id":"https:\/\/www.ezsign.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ezsign.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.ezsign.com\/fr\/#organization","name":"EZsign - Fast and easy e-signature solution","url":"https:\/\/www.ezsign.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.ezsign.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/www.ezsign.com\/wp-content\/uploads\/2024\/06\/eZsign_logo_4C2x1.png","contentUrl":"https:\/\/www.ezsign.com\/wp-content\/uploads\/2024\/06\/eZsign_logo_4C2x1.png","width":294,"height":116,"caption":"EZsign - Fast and easy e-signature solution"},"image":{"@id":"https:\/\/www.ezsign.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ezsign.ca","https:\/\/www.instagram.com\/ezsign.ca\/","https:\/\/www.linkedin.com\/company\/ezsign","https:\/\/www.youtube.com\/channel\/UC-s2lR6CKIoBciOQ2A8WpCQ"]}]}},"_links":{"self":[{"href":"https:\/\/www.ezsign.com\/fr\/wp-json\/wp\/v2\/pages\/2347","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ezsign.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.ezsign.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.ezsign.com\/fr\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ezsign.com\/fr\/wp-json\/wp\/v2\/comments?post=2347"}],"version-history":[{"count":0,"href":"https:\/\/www.ezsign.com\/fr\/wp-json\/wp\/v2\/pages\/2347\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.ezsign.com\/fr\/wp-json\/wp\/v2\/media?parent=2347"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}