{"id":2485,"date":"2026-05-24T14:50:02","date_gmt":"2026-05-24T14:50:02","guid":{"rendered":"https:\/\/millepiani.com\/assistance-et-maintenance\/"},"modified":"2026-09-14T18:14:08","modified_gmt":"2026-09-14T18:14:08","slug":"assistance-et-maintenance","status":"publish","type":"page","link":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/","title":{"rendered":"Assistance et maintenance"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2485\" class=\"elementor elementor-2485 elementor-414\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-50cfe3a e-con-full e-flex e-con e-parent\" data-id=\"50cfe3a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-19b6665 elementor-widget elementor-widget-html\" data-id=\"19b6665\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"mp-maint-page\">\r\n\r\n  <!-- HERO -->\r\n  <section class=\"mp-maint-hero\" id=\"top\">\r\n    <div class=\"mp-maint-hero-bg\"><\/div>\r\n    <div class=\"mp-maint-hero-overlay\"><\/div>\r\n\r\n    <div class=\"mp-maint-hero-content mp-reveal\">\r\n      <p class=\"mp-kicker\">Millepiani Service<\/p>\r\n\r\n      <h1>Assistance et<br\/>maintenance<\/h1>\r\n\r\n      <p>\r\n Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers<br\/>m\u00e9caniques. Un support technique con\u00e7u pour garantir s\u00e9curit\u00e9, tranquillit\u00e9, continuit\u00e9<br\/>de service, rapidit\u00e9 d\u2019intervention et constance des performances de l\u2019installation.\r\n      <\/p>\r\n\r\n      <a href=\"#preventivo\" class=\"mp-outline-btn\">Demander des informations<\/a>\r\n    <\/div>\r\n\r\n    <a href=\"#assistenza-manutenzione\" class=\"mp-scroll-arrow\" aria-label=\"Scorri alla sezione successiva\">\r\n      <span><\/span>\r\n    <\/a>\r\n  <\/section>\r\n\r\n\r\n  <!-- INTRO + 6 RIQUADRI -->\r\n  <section class=\"mp-maint-intro\" id=\"assistenza-manutenzione\">\r\n    <div class=\"mp-container\">\r\n\r\n      <div class=\"mp-section-heading mp-reveal\">\r\n        <p>Pourquoi choisir<\/p>\r\n        <h2>Assistance et maintenance<br\/>des ascenseurs<\/h2>\r\n      <\/div>\r\n\r\n      <div class=\"mp-intro-text mp-reveal\">\r\n        <p>\r\n Le bon fonctionnement d\u2019une installation garantit s\u00e9curit\u00e9 et tranquillit\u00e9 aux personnes<br\/>et assure leur libert\u00e9 de mouvement. Millepiani Service propose un service structur\u00e9 afin<br\/>de r\u00e9duire les d\u00e9sagr\u00e9ments, de maintenir des performances constantes et de pr\u00e9venir<br\/>d\u2019\u00e9ventuels probl\u00e8mes gr\u00e2ce \u00e0 des contr\u00f4les p\u00e9riodiques. \r\n        <\/p>\r\n      <\/div>\r\n\r\n      <div class=\"mp-features-grid\">\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M12 3l7 4v5c0 5-3.5 8-7 9-3.5-1-7-4-7-9V7l7-4z\"><\/path>\r\n              <path d=\"M9 12l2 2 4-5\"><\/path>\r\n            <\/path><\/path><\/svg>\r\n          <\/span>\r\n          <h3>S\u00e9curit\u00e9<\/h3>\r\n          <p>Une maintenance appropri\u00e9e permet de pr\u00e9server l\u2019efficacit\u00e9 et la s\u00e9curit\u00e9 de l\u2019installation dans le temps.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle>\r\n              <path d=\"M12 7v5l3 2\"><\/path>\r\n            <\/path><\/svg>\r\n          <\/span>\r\n          <h3>Assistance 24h\/24<\/h3>\r\n          <p>Un centre d\u2019appels op\u00e9rationnel 24h\/24 pour traiter les demandes rapidement.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle>\r\n              <path d=\"M3 12h18\"><\/path>\r\n              <path d=\"M12 3a9 9 0 0 1 0 18\"><\/path>\r\n              <path d=\"M12 3a9 9 0 0 0 0 18\"><\/path>\r\n            <\/path><\/path><\/path><\/svg>\r\n          <\/span>\r\n          <h3>Couverture nationale<\/h3>\r\n          <p>Les demandes sont transmises au technicien de secteur afin de garantir une intervention rapide.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M4 19h16\"><\/path>\r\n              <path d=\"M7 16V8a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v8\"><\/path>\r\n              <path d=\"M10 10h4\"><\/path>\r\n              <path d=\"M10 13h4\"><\/path>\r\n            <\/path><\/path><\/path><\/path><\/svg>\r\n          <\/span>\r\n          <h3>Modernisation des installations<\/h3>\r\n          <p>Maintenance, modernisation et am\u00e9lioration, y compris pour les installations utilisant des technologies plus anciennes.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M13 2L4 14h7l-1 8 10-13h-7V2z\"><\/path>\r\n            <\/path><\/svg>\r\n          <\/span>\r\n          <h3>Technologie et \u00e9conomies<\/h3>\r\n          <p>Des \u00e9quipements \u00e9lectroniques et num\u00e9riques pour r\u00e9duire la consommation et les co\u00fbts de maintenance.<\/p>\r\n        <\/article>\r\n\r\n        <article class=\"mp-feature-card mp-reveal\">\r\n          <span class=\"mp-feature-icon\">\r\n            <svg viewbox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M16 21v-2a4 4 0 0 0-8 0v2\"><\/path>\r\n              <circle cx=\"12\" cy=\"7\" r=\"4\"><\/circle>\r\n              <path d=\"M20 8v6\"><\/path>\r\n              <path d=\"M23 11h-6\"><\/path>\r\n            <\/path><\/path><\/path><\/svg>\r\n          <\/span>\r\n          <h3>Professionnalisme<\/h3>\r\n          <p>Des op\u00e9rateurs et partenaires qualifi\u00e9s pour un service global, rapide et efficace.<\/p>\r\n        <\/article>\r\n\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n\r\n  <!-- SEZIONE SPECIALE -->\r\n  <section class=\"mp-service-lab\" id=\"service-lab\">\r\n    <canvas class=\"mp-service-lab-canvas\" id=\"mpServiceLabCanvas\" aria-hidden=\"true\"><\/canvas>\r\n\r\n    <div class=\"mp-service-lab-bg\"><\/div>\r\n    <div class=\"mp-service-lab-grid\"><\/div>\r\n\r\n    <div class=\"mp-service-lab-inner\">\r\n\r\n      <div class=\"mp-service-lab-head mp-reveal\">\r\n        <p class=\"mp-service-lab-kicker\" id=\"mpServiceLabKicker\">Centre d\u2019appels 24h\/24<\/p>\r\n\r\n        <h2 id=\"mpServiceLabTitle\">\r\n La demande est<br\/>prise en charge\r\n        <\/h2>\r\n\r\n        <p id=\"mpServiceLabText\">\r\n Le service op\u00e9rationnel 24h\/24 re\u00e7oit l\u2019appel et active le processus d\u2019assistance pour les<br\/>ascenseurs, monte-charges et escaliers m\u00e9caniques.\r\n        <\/p>\r\n\r\n        <div class=\"mp-service-lab-tags\" id=\"mpServiceLabTags\">\r\n          Assistance 24h\/24\r\nRapidit\u00e9\r\nPrise en charge\r\n        <\/div>\r\n      <\/div>\r\n\r\n\r\n      <!-- PULSANTI IN ALTO -->\r\n      <div class=\"mp-service-controls mp-reveal\">\r\n\r\n        <div class=\"mp-service-control-block\">\r\n          <div class=\"mp-service-control-label\">\r\n            <span>01<\/span>\r\nType d\u2019installation\r\n          <\/div>\r\n\r\n          <div class=\"mp-service-plant-switch\" aria-label=\"Seleziona tipo impianto\">\r\n            <button class=\"is-active\" type=\"button\" data-plant=\"lift\" aria-pressed=\"true\">\r\n              <span>01<\/span>\r\nAscenseurs\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-plant=\"goods\" aria-pressed=\"false\">\r\n              <span>02<\/span>\r\nMonte-charges\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-plant=\"escalator\" aria-pressed=\"false\">\r\n              <span>03<\/span>\r\nEscaliers m\u00e9caniques\r\n            <\/button>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"mp-service-control-block\">\r\n          <div class=\"mp-service-control-label\">\r\n            <span>02<\/span>\r\n\u00c9tape du service\r\n          <\/div>\r\n\r\n          <div class=\"mp-service-phase-switch\" aria-label=\"Seleziona fase servizio\">\r\n            <button class=\"is-active\" type=\"button\" data-phase=\"call\" aria-pressed=\"true\">\r\n              <span>01<\/span>\r\nAppel\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-phase=\"technician\" aria-pressed=\"false\">\r\n              <span>02<\/span>\r\nTechnicien\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-phase=\"diagnosis\" aria-pressed=\"false\">\r\n              <span>03<\/span>\r\nDiagnostic\r\n            <\/button>\r\n\r\n            <button type=\"button\" data-phase=\"check\" aria-pressed=\"false\">\r\n              <span>04<\/span>\r\nContr\u00f4le\r\n            <\/button>\r\n          <\/div>\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n\r\n      <!-- CONTENUTO DINAMICO -->\r\n      <div class=\"mp-service-lab-stage mp-reveal\">\r\n\r\n        <div class=\"mp-service-model-area\">\r\n          <div class=\"mp-service-model-frame\" id=\"mpServiceModelFrame\">\r\n            <canvas id=\"mpServiceThreeCanvas\" class=\"mp-service-three-canvas\" aria-label=\"Modello 3D servizio assistenza\"><\/canvas>\r\n\r\n            <div class=\"mp-service-floating-status\">\r\n              Syst\u00e8me actif\r\n<strong id=\"mpFloatingMetric\">24\/24<\/strong>\r\n            <\/div>\r\n\r\n            <div class=\"mp-model-caption\">\r\n              Installation\r\n<strong id=\"mpModelCaption\">Ascenseur<\/strong>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"mp-service-info-area\">\r\n          <div class=\"mp-service-info-card\" id=\"mpServiceInfoCard\">\r\n            <p>Appel<\/p>\r\n            <h3>Demande prise en charge<\/h3>\r\n            <span>\r\n Le centre d\u2019appels op\u00e9rationnel 24h\/24 re\u00e7oit la demande et lance le processus d\u2019assistance<br\/>afin de r\u00e9duire les d\u00e9sagr\u00e9ments au minimum.\r\n            <\/span>\r\n          <\/div>\r\n\r\n          <div class=\"mp-service-check-panel\">\r\n            <p>Processus de service<\/p>\r\n\r\n            <div class=\"mp-service-check is-active\" data-check=\"request\">\r\n              <i><\/i>\r\n              <span>Prise en charge<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mp-service-check\" data-check=\"dispatch\">\r\n              <i><\/i>\r\n              <span>Technicien de secteur<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mp-service-check\" data-check=\"diagnosis\">\r\n              <i><\/i>\r\n              <span>Diagnostic technique<\/span>\r\n            <\/div>\r\n\r\n            <div class=\"mp-service-check\" data-check=\"prevention\">\r\n              <i><\/i>\r\n              <span>Contr\u00f4les p\u00e9riodiques<\/span>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"mp-service-metrics\" id=\"mpServiceMetrics\">\r\n            <div>\r\n              <span>S\u00e9curit\u00e9<\/span>\r\n              <i><em><\/em><\/i>\r\n            <\/div>\r\n\r\n            <div>\r\n              <span>Continuit\u00e9<\/span>\r\n              <i><em><\/em><\/i>\r\n            <\/div>\r\n\r\n            <div>\r\n              <span>Fiabilit\u00e9<\/span>\r\n              <i><em><\/em><\/i>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n  <\/section>\r\n\r\n\r\n<\/div>\r\n\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/gsap\/3.12.5\/gsap.min.js\"><\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2371314 elementor-widget elementor-widget-shortcode\" data-id=\"2371314\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><section class=\"section mp-quote-section\" id=\"preventivo\">\r\n  <div class=\"mp-quote-bg\"><\/div>\r\n  <div class=\"mp-quote-overlay\"><\/div>\r\n\r\n  <div class=\"mp-quote-inner\">\r\n    <div class=\"mp-quote-info\">\r\n      <p class=\"mp-quote-kicker\">Contactez-nous<\/p>\r\n\r\n      <h2 class=\"mp-quote-title\">\r\n        Demandez un<br>\r\n        devis<br>\r\n        gratuit\r\n      <\/h2>\r\n\r\n      <p class=\"mp-quote-description\">\r\n        Vous \u00eates int\u00e9ress\u00e9 par nos produits ou vous recherchez une solution\r\n        personnalis\u00e9e, sp\u00e9cialement con\u00e7ue pour vous ? N'h\u00e9sitez pas \u00e0\r\n        nous contacter : nous sommes \u00e0 votre disposition pour vous accompagner\r\n        et vous guider dans le choix de la solution la mieux adapt\u00e9e \u00e0 vos besoins.\r\n      <\/p>\r\n\r\n      <div class=\"mp-quote-contacts\">\r\n        <a href=\"tel:+390296690901\" class=\"mp-quote-contact\">\r\n          <span class=\"mp-quote-contact-icon\">\r\n            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2A19.86 19.86 0 0 1 11.19 19 19.5 19.5 0 0 1 5 12.81 19.86 19.86 0 0 1 2.08 4.18 2 2 0 0 1 4.06 2h3a2 2 0 0 1 2 1.72c.12.9.33 1.78.62 2.63a2 2 0 0 1-.45 2.11L8 9.69a16 16 0 0 0 6.31 6.31l1.23-1.23a2 2 0 0 1 2.11-.45c.85.29 1.73.5 2.63.62A2 2 0 0 1 22 16.92z\"><\/path>\r\n            <\/svg>\r\n          <\/span>\r\n\r\n          <span>\r\n            <strong>T\u00e9l\u00e9phone<\/strong>\r\n            +39 02 96690901\r\n          <\/span>\r\n        <\/a>\r\n\r\n        <a href=\"mailto:info@millepiani.com\" class=\"mp-quote-contact\">\r\n          <span class=\"mp-quote-contact-icon\">\r\n            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z\"><\/path>\r\n              <path d=\"m22 6-10 7L2 6\"><\/path>\r\n            <\/svg>\r\n          <\/span>\r\n\r\n          <span>\r\n            <strong>E-mail<\/strong>\r\n            info@millepiani.com\r\n          <\/span>\r\n        <\/a>\r\n\r\n        <div class=\"mp-quote-contact\">\r\n          <span class=\"mp-quote-contact-icon\">\r\n            <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n              <path d=\"M21 10c0 7-9 12-9 12S3 17 3 10a9 9 0 1 1 18 0z\"><\/path>\r\n              <circle cx=\"12\" cy=\"10\" r=\"3\"><\/circle>\r\n            <\/svg>\r\n          <\/span>\r\n\r\n          <span>\r\n            <strong>Bureau<\/strong>\r\n            Via Della Longura, 21 Misinto MB\r\n          <\/span>\r\n        <\/div>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"mp-quote-form-card\">\r\n      <form\r\n        class=\"mp-quote-form\"\r\n        id=\"mpQuoteForm\"\r\n        enctype=\"multipart\/form-data\"\r\n        data-success-url=\"\/grazie\/\"\r\n        novalidate\r\n      >\r\n        <div\r\n          class=\"mp-form-status\"\r\n          id=\"mpFormStatus\"\r\n          aria-live=\"polite\"\r\n        ><\/div>\r\n\r\n        <!-- Pi\u00e8ge antispam -->\r\n        <input\r\n          type=\"text\"\r\n          name=\"website\"\r\n          tabindex=\"-1\"\r\n          autocomplete=\"off\"\r\n          aria-hidden=\"true\"\r\n          style=\"position:absolute;left:-9999px;opacity:0;height:0;width:0;\"\r\n        >\r\n\r\n        <div class=\"mp-form-grid\">\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"text\"\r\n              name=\"name\"\r\n              id=\"mpName\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"given-name\"\r\n            >\r\n            <label for=\"mpName\">Pr\u00e9nom *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"text\"\r\n              name=\"surname\"\r\n              id=\"mpSurname\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"family-name\"\r\n            >\r\n            <label for=\"mpSurname\">Nom *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"email\"\r\n              name=\"email\"\r\n              id=\"mpEmail\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"email\"\r\n            >\r\n            <label for=\"mpEmail\">E-mail *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"tel\"\r\n              name=\"phone\"\r\n              id=\"mpPhone\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"tel\"\r\n            >\r\n            <label for=\"mpPhone\">Num\u00e9ro de t\u00e9l\u00e9phone<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <select name=\"role\" id=\"mpRole\">\r\n              <option value=\"\" selected>S\u00e9lectionnez<\/option>\r\n              <option value=\"progettista\">Concepteur<\/option>\r\n              <option value=\"impresa_di_costruzioni\">\r\n                Entreprise de construction\r\n              <\/option>\r\n              <option value=\"proprietario_edificio\">\r\n                Propri\u00e9taire de l'immeuble\r\n              <\/option>\r\n              <option value=\"amministratore_edificio\">\r\n                Gestionnaire de l'immeuble\r\n              <\/option>\r\n              <option value=\"consulente_ascensori\">\r\n                Consultant en ascenseurs\r\n              <\/option>\r\n              <option value=\"ente_pubblico\">Organisme public<\/option>\r\n              <option value=\"cerco_lavoro\">Je recherche un emploi<\/option>\r\n              <option value=\"utente_passeggero\">\r\n                Utilisateur\/Passager\r\n              <\/option>\r\n              <option value=\"studente\">\u00c9tudiant<\/option>\r\n              <option value=\"altro\">Autre<\/option>\r\n            <\/select>\r\n\r\n            <label for=\"mpRole\">Quel est votre r\u00f4le ?<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"text\"\r\n              name=\"company\"\r\n              id=\"mpCompany\"\r\n              placeholder=\" \"\r\n              autocomplete=\"organization\"\r\n            >\r\n            <label for=\"mpCompany\">Nom de l'entreprise<\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"mp-form-grid mp-location-grid\">\r\n          <div class=\"mp-field\">\r\n            <select\r\n              name=\"country\"\r\n              id=\"mpCountry\"\r\n              required\r\n              autocomplete=\"country-name\"\r\n            >\r\n              <option value=\"italia\" selected>Italie<\/option>\r\n              <option value=\"estero\">\u00c9tranger<\/option>\r\n            <\/select>\r\n\r\n            <label for=\"mpCountry\">Pays\/R\u00e9gion *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <select\r\n              name=\"province\"\r\n              id=\"mpProvince\"\r\n              required\r\n              autocomplete=\"address-level2\"\r\n            >\r\n              <option value=\"\" selected disabled>S\u00e9lectionnez<\/option>\r\n              <option value=\"AG\">Agrigente<\/option>\r\n              <option value=\"AL\">Alexandrie<\/option>\r\n              <option value=\"AN\">Anc\u00f4ne<\/option>\r\n              <option value=\"AO\">Aoste<\/option>\r\n              <option value=\"AR\">Arezzo<\/option>\r\n              <option value=\"AP\">Ascoli Piceno<\/option>\r\n              <option value=\"AT\">Asti<\/option>\r\n              <option value=\"AV\">Avellino<\/option>\r\n              <option value=\"BA\">Bari<\/option>\r\n              <option value=\"BT\">Barletta-Andria-Trani<\/option>\r\n              <option value=\"BL\">Belluno<\/option>\r\n              <option value=\"BN\">B\u00e9n\u00e9vent<\/option>\r\n              <option value=\"BG\">Bergame<\/option>\r\n              <option value=\"BI\">Biella<\/option>\r\n              <option value=\"BO\">Bologne<\/option>\r\n              <option value=\"BZ\">Bolzano<\/option>\r\n              <option value=\"BS\">Brescia<\/option>\r\n              <option value=\"BR\">Brindisi<\/option>\r\n              <option value=\"CA\">Cagliari<\/option>\r\n              <option value=\"CL\">Caltanissetta<\/option>\r\n              <option value=\"CB\">Campobasso<\/option>\r\n              <option value=\"CE\">Caserte<\/option>\r\n              <option value=\"CT\">Catane<\/option>\r\n              <option value=\"CZ\">Catanzaro<\/option>\r\n              <option value=\"CH\">Chieti<\/option>\r\n              <option value=\"CO\">C\u00f4me<\/option>\r\n              <option value=\"CS\">Cosenza<\/option>\r\n              <option value=\"CR\">Cr\u00e9mone<\/option>\r\n              <option value=\"KR\">Crotone<\/option>\r\n              <option value=\"CN\">Coni<\/option>\r\n              <option value=\"EN\">Enna<\/option>\r\n              <option value=\"FM\">Fermo<\/option>\r\n              <option value=\"FE\">Ferrare<\/option>\r\n              <option value=\"FI\">Florence<\/option>\r\n              <option value=\"FG\">Foggia<\/option>\r\n              <option value=\"FC\">Forl\u00ec-Cesena<\/option>\r\n              <option value=\"FR\">Frosinone<\/option>\r\n              <option value=\"GE\">G\u00eanes<\/option>\r\n              <option value=\"GO\">Gorizia<\/option>\r\n              <option value=\"GR\">Grosseto<\/option>\r\n              <option value=\"IM\">Imperia<\/option>\r\n              <option value=\"IS\">Isernia<\/option>\r\n              <option value=\"SP\">La Spezia<\/option>\r\n              <option value=\"AQ\">L'Aquila<\/option>\r\n              <option value=\"LT\">Latina<\/option>\r\n              <option value=\"LE\">Lecce<\/option>\r\n              <option value=\"LC\">Lecco<\/option>\r\n              <option value=\"LI\">Livourne<\/option>\r\n              <option value=\"LO\">Lodi<\/option>\r\n              <option value=\"LU\">Lucques<\/option>\r\n              <option value=\"MC\">Macerata<\/option>\r\n              <option value=\"MN\">Mantoue<\/option>\r\n              <option value=\"MS\">Massa-Carrara<\/option>\r\n              <option value=\"MT\">Matera<\/option>\r\n              <option value=\"ME\">Messine<\/option>\r\n              <option value=\"MI\">Milan<\/option>\r\n              <option value=\"MO\">Mod\u00e8ne<\/option>\r\n              <option value=\"MB\">Monza et Brianza<\/option>\r\n              <option value=\"NA\">Naples<\/option>\r\n              <option value=\"NO\">Novare<\/option>\r\n              <option value=\"NU\">Nuoro<\/option>\r\n              <option value=\"OR\">Oristano<\/option>\r\n              <option value=\"PD\">Padoue<\/option>\r\n              <option value=\"PA\">Palerme<\/option>\r\n              <option value=\"PR\">Parme<\/option>\r\n              <option value=\"PV\">Pavie<\/option>\r\n              <option value=\"PG\">P\u00e9rouse<\/option>\r\n              <option value=\"PU\">Pesaro et Urbino<\/option>\r\n              <option value=\"PE\">Pescara<\/option>\r\n              <option value=\"PC\">Plaisance<\/option>\r\n              <option value=\"PI\">Pise<\/option>\r\n              <option value=\"PT\">Pistoia<\/option>\r\n              <option value=\"PN\">Pordenone<\/option>\r\n              <option value=\"PZ\">Potenza<\/option>\r\n              <option value=\"PO\">Prato<\/option>\r\n              <option value=\"RG\">Raguse<\/option>\r\n              <option value=\"RA\">Ravenne<\/option>\r\n              <option value=\"RC\">Reggio de Calabre<\/option>\r\n              <option value=\"RE\">Reggio d'\u00c9milie<\/option>\r\n              <option value=\"RI\">Rieti<\/option>\r\n              <option value=\"RN\">Rimini<\/option>\r\n              <option value=\"RM\">Rome<\/option>\r\n              <option value=\"RO\">Rovigo<\/option>\r\n              <option value=\"SA\">Salerne<\/option>\r\n              <option value=\"SS\">Sassari<\/option>\r\n              <option value=\"SV\">Savone<\/option>\r\n              <option value=\"SI\">Sienne<\/option>\r\n              <option value=\"SR\">Syracuse<\/option>\r\n              <option value=\"SO\">Sondrio<\/option>\r\n              <option value=\"SU\">Sardaigne du Sud<\/option>\r\n              <option value=\"TA\">Tarente<\/option>\r\n              <option value=\"TE\">Teramo<\/option>\r\n              <option value=\"TR\">Terni<\/option>\r\n              <option value=\"TO\">Turin<\/option>\r\n              <option value=\"TP\">Trapani<\/option>\r\n              <option value=\"TN\">Trente<\/option>\r\n              <option value=\"TV\">Tr\u00e9vise<\/option>\r\n              <option value=\"TS\">Trieste<\/option>\r\n              <option value=\"UD\">Udine<\/option>\r\n              <option value=\"VA\">Var\u00e8se<\/option>\r\n              <option value=\"VE\">Venise<\/option>\r\n              <option value=\"VB\">Verbano-Cusio-Ossola<\/option>\r\n              <option value=\"VC\">Verceil<\/option>\r\n              <option value=\"VR\">V\u00e9rone<\/option>\r\n              <option value=\"VV\">Vibo Valentia<\/option>\r\n              <option value=\"VI\">Vicence<\/option>\r\n              <option value=\"VT\">Viterbe<\/option>\r\n              <option value=\"ESTERO\">Province \u00e0 l'\u00e9tranger<\/option>\r\n            <\/select>\r\n\r\n            <label for=\"mpProvince\">Province *<\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-field\">\r\n            <input\r\n              type=\"text\"\r\n              name=\"city\"\r\n              id=\"mpCity\"\r\n              placeholder=\" \"\r\n              required\r\n              autocomplete=\"address-level2\"\r\n            >\r\n            <label for=\"mpCity\">Ville *<\/label>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"mp-field mp-field-full\">\r\n          <select\r\n            name=\"contact_reason\"\r\n            id=\"mpContactReason\"\r\n            required\r\n          >\r\n            <option value=\"\" selected disabled>S\u00e9lectionnez<\/option>\r\n            <option value=\"nuovo_impianto\">\r\n              Installation d'un nouvel ascenseur dans un b\u00e2timent neuf\/existant\r\n            <\/option>\r\n            <option value=\"sostituzione_ascensore\">\r\n              Remplacement d'un ascenseur existant\r\n            <\/option>\r\n            <option value=\"ammodernamento_impianto\">\r\n              Modernisation d'une installation\r\n            <\/option>\r\n            <option value=\"assistenza_manutenzione\">\r\n              Je suis int\u00e9ress\u00e9 par le service d'assistance et de maintenance\r\n            <\/option>\r\n            <option value=\"ricambi\">\r\n              Pi\u00e8ces d\u00e9tach\u00e9es pour ascenseurs Millepiani\r\n            <\/option>\r\n            <option value=\"altro\">Autre<\/option>\r\n          <\/select>\r\n\r\n          <label for=\"mpContactReason\">\r\n            Pour quel sujet souhaitez-vous \u00eatre contact\u00e9 ? *\r\n          <\/label>\r\n        <\/div>\r\n\r\n        <div class=\"mp-field mp-field-full\">\r\n          <textarea\r\n            name=\"message\"\r\n            id=\"mpMessage\"\r\n            rows=\"4\"\r\n            placeholder=\" \"\r\n          ><\/textarea>\r\n\r\n          <label for=\"mpMessage\">Comment pouvons-nous vous aider ?<\/label>\r\n        <\/div>\r\n\r\n        <div class=\"mp-form-foot\">\r\n          <div class=\"mp-privacy-box\">\r\n            <label\r\n              class=\"mp-privacy-check\"\r\n              for=\"mpPrivacyAcceptance\"\r\n            >\r\n              <input\r\n                type=\"checkbox\"\r\n                name=\"privacy_acceptance\"\r\n                id=\"mpPrivacyAcceptance\"\r\n                value=\"accepted\"\r\n                required\r\n              >\r\n\r\n              <span>\r\n                J'accepte la\r\n                <a\r\n                  href=\"\/privacy-policy\/\"\r\n                  target=\"_blank\"\r\n                  rel=\"noopener noreferrer\"\r\n                >\r\n                  Politique de confidentialit\u00e9\r\n                <\/a>. *\r\n              <\/span>\r\n            <\/label>\r\n\r\n            <label\r\n              class=\"mp-privacy-check\"\r\n              for=\"mpExistingContract\"\r\n            >\r\n              <input\r\n                type=\"checkbox\"\r\n                name=\"existing_contract\"\r\n                id=\"mpExistingContract\"\r\n                value=\"yes\"\r\n              >\r\n\r\n              <span>\r\n                J'ai d\u00e9j\u00e0 un contrat en cours avec Millepiani\r\n              <\/span>\r\n            <\/label>\r\n          <\/div>\r\n\r\n          <div class=\"mp-captcha\">\r\n            <div\r\n              class=\"g-recaptcha\"\r\n              data-sitekey=\"6LfxY6ktAAAAAFBbvnofa2IpjG_zaaX5UdOtJuTS\"\r\n            ><\/div>\r\n          <\/div>\r\n\r\n          <button type=\"submit\" class=\"mp-submit-btn\">\r\n            <span>Envoyer le message<\/span>\r\n          <\/button>\r\n        <\/div>\r\n      <\/form>\r\n    <\/div>\r\n  <\/div>\r\n<\/section><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c64e18f elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-widget elementor-widget-shortcode\" data-id=\"c64e18f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>document.documentElement.classList.add(\"mp-js-ready\");\r\n\r\ndocument.addEventListener(\"DOMContentLoaded\", function () {\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Reveal animation\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const revealItems = document.querySelectorAll(\".mp-reveal\");\r\n\r\n  if (\"IntersectionObserver\" in window) {\r\n    const revealObserver = new IntersectionObserver(function (entries, observer) {\r\n      entries.forEach(function (entry) {\r\n        if (!entry.isIntersecting) return;\r\n\r\n        entry.target.classList.add(\"is-visible\");\r\n        observer.unobserve(entry.target);\r\n      });\r\n    }, {\r\n      threshold: 0.16\r\n    });\r\n\r\n    revealItems.forEach(function (item) {\r\n      revealObserver.observe(item);\r\n    });\r\n  } else {\r\n    revealItems.forEach(function (item) {\r\n      item.classList.add(\"is-visible\");\r\n    });\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Smooth scroll\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  document.querySelectorAll('a[href^=\"#\"]').forEach(function (anchor) {\r\n    anchor.addEventListener(\"click\", function (event) {\r\n      const targetId = anchor.getAttribute(\"href\");\r\n\r\n      if (!targetId || targetId === \"#\") return;\r\n\r\n      const target = document.querySelector(targetId);\r\n\r\n      if (!target) return;\r\n\r\n      event.preventDefault();\r\n\r\n      target.scrollIntoView({\r\n        behavior: \"smooth\",\r\n        block: \"start\"\r\n      });\r\n    });\r\n  });\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Service Lab language\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const pageLang = (document.documentElement.lang || \"it\")\r\n    .toLowerCase()\r\n    .split(\"-\")[0];\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Service Lab translations\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const serviceTranslations = {\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | ITALIANO\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    it: {\r\n      phases: {\r\n        call: {\r\n          kicker: \"Call Center 24\/24\",\r\n          title: \"La richiesta<br>viene presa in carico\",\r\n          text: \"Il servizio operativo 24 ore su 24 riceve la chiamata e attiva il flusso di assistenza per ascensori, montacarichi e scale mobili.\",\r\n          tags: [\"Assistenza 24\/24\", \"Tempestivit\u00e0\", \"Presa in carico\"],\r\n          cardLabel: \"Chiamata\",\r\n          cardTitle: \"Richiesta presa in carico\",\r\n          cardText: \"Il Call Center operativo 24 ore su 24 riceve la richiesta e avvia il flusso di assistenza per ridurre al minimo i disagi.\",\r\n          status: \"Sistema attivo\",\r\n          metric: \"24\/24\",\r\n          liftY: -1.25,\r\n          goodsY: -0.25,\r\n          checks: [\"request\"],\r\n          speed: 1\r\n        },\r\n\r\n        technician: {\r\n          kicker: \"Tecnico di zona\",\r\n          title: \"La richiesta<br>raggiunge il tecnico\",\r\n          text: \"Le richieste vengono veicolate al tecnico di zona per favorire interventi tempestivi e mirati sul territorio.\",\r\n          tags: [\"Tecnico di zona\", \"Territorio nazionale\", \"Intervento rapido\"],\r\n          cardLabel: \"Tecnico\",\r\n          cardTitle: \"Intervento rapido sul territorio\",\r\n          cardText: \"Il servizio indirizza la richiesta al tecnico di zona, permettendo una gestione pi\u00f9 rapida e coordinata dell\u2019intervento.\",\r\n          status: \"Tecnico avvisato\",\r\n          metric: \"ON\",\r\n          liftY: 0.05,\r\n          goodsY: 0.22,\r\n          checks: [\"request\", \"dispatch\"],\r\n          speed: 1.18\r\n        },\r\n\r\n        diagnosis: {\r\n          kicker: \"Diagnosi tecnica\",\r\n          title: \"L\u2019impianto<br>viene analizzato\",\r\n          text: \"Strumentazione elettronica e digitale supporta la lettura dello stato dell\u2019impianto e aiuta a individuare criticit\u00e0 o necessit\u00e0 di aggiornamento.\",\r\n          tags: [\"Diagnosi\", \"Tecnologia digitale\", \"Controllo\"],\r\n          cardLabel: \"Diagnosi\",\r\n          cardTitle: \"Controllo tecnico dell\u2019impianto\",\r\n          cardText: \"La diagnostica consente di analizzare il comportamento dell\u2019impianto e supportare attivit\u00e0 di manutenzione, aggiornamento e miglioramento.\",\r\n          status: \"Diagnosi attiva\",\r\n          metric: \"SCAN\",\r\n          liftY: 1.15,\r\n          goodsY: 0.58,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\"],\r\n          speed: 1.32\r\n        },\r\n\r\n        check: {\r\n          kicker: \"Verifiche periodiche\",\r\n          title: \"La sicurezza<br>si costruisce nel tempo\",\r\n          text: \"Le verifiche periodiche aiutano a mantenere costante il livello di performance dell\u2019impianto e a prevenire eventuali problematiche.\",\r\n          tags: [\"Verifiche periodiche\", \"Prevenzione\", \"Affidabilit\u00e0\"],\r\n          cardLabel: \"Verifica\",\r\n          cardTitle: \"Performance costanti nel tempo\",\r\n          cardText: \"La manutenzione programmata contribuisce a conservare sicurezza, affidabilit\u00e0 e continuit\u00e0 di servizio nel tempo.\",\r\n          status: \"Verifica periodica\",\r\n          metric: \"OK\",\r\n          liftY: -0.45,\r\n          goodsY: 0.02,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\", \"prevention\"],\r\n          speed: 0.9\r\n        }\r\n      },\r\n\r\n      plants: {\r\n        lift: {\r\n          label: \"Ascensore\"\r\n        },\r\n        goods: {\r\n          label: \"Montacarichi\"\r\n        },\r\n        escalator: {\r\n          label: \"Scala mobile\"\r\n        }\r\n      }\r\n    },\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | ENGLISH\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    en: {\r\n      phases: {\r\n        call: {\r\n          kicker: \"24\/7 Call Center\",\r\n          title: \"Your request<br>is received\",\r\n          text: \"Our 24\/7 service receives the call and activates the assistance process for lifts, goods lifts and escalators.\",\r\n          tags: [\"24\/7 Assistance\", \"Fast Response\", \"Request Management\"],\r\n          cardLabel: \"Call\",\r\n          cardTitle: \"Request received\",\r\n          cardText: \"Our 24\/7 Call Center receives the request and starts the assistance process to minimise disruption.\",\r\n          status: \"System active\",\r\n          metric: \"24\/7\",\r\n          liftY: -1.25,\r\n          goodsY: -0.25,\r\n          checks: [\"request\"],\r\n          speed: 1\r\n        },\r\n\r\n        technician: {\r\n          kicker: \"Local technician\",\r\n          title: \"The request<br>reaches the technician\",\r\n          text: \"Requests are forwarded to the local technician to ensure fast and targeted on-site assistance.\",\r\n          tags: [\"Local technician\", \"Nationwide coverage\", \"Fast response\"],\r\n          cardLabel: \"Technician\",\r\n          cardTitle: \"Fast on-site assistance\",\r\n          cardText: \"The service forwards the request to the local technician, enabling faster and more coordinated intervention management.\",\r\n          status: \"Technician notified\",\r\n          metric: \"ON\",\r\n          liftY: 0.05,\r\n          goodsY: 0.22,\r\n          checks: [\"request\", \"dispatch\"],\r\n          speed: 1.18\r\n        },\r\n\r\n        diagnosis: {\r\n          kicker: \"Technical diagnostics\",\r\n          title: \"The system<br>is analysed\",\r\n          text: \"Electronic and digital equipment supports system status monitoring and helps identify critical issues or upgrade requirements.\",\r\n          tags: [\"Diagnostics\", \"Digital technology\", \"Monitoring\"],\r\n          cardLabel: \"Diagnostics\",\r\n          cardTitle: \"Technical system inspection\",\r\n          cardText: \"Diagnostic tools make it possible to analyse system performance and support maintenance, upgrades and improvement activities.\",\r\n          status: \"Diagnostics active\",\r\n          metric: \"SCAN\",\r\n          liftY: 1.15,\r\n          goodsY: 0.58,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\"],\r\n          speed: 1.32\r\n        },\r\n\r\n        check: {\r\n          kicker: \"Periodic inspections\",\r\n          title: \"Safety<br>is built over time\",\r\n          text: \"Periodic inspections help maintain consistent system performance and prevent potential issues.\",\r\n          tags: [\"Periodic inspections\", \"Prevention\", \"Reliability\"],\r\n          cardLabel: \"Inspection\",\r\n          cardTitle: \"Consistent performance over time\",\r\n          cardText: \"Scheduled maintenance helps preserve safety, reliability and continuity of service over time.\",\r\n          status: \"Periodic inspection\",\r\n          metric: \"OK\",\r\n          liftY: -0.45,\r\n          goodsY: 0.02,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\", \"prevention\"],\r\n          speed: 0.9\r\n        }\r\n      },\r\n\r\n      plants: {\r\n        lift: {\r\n          label: \"Lift\"\r\n        },\r\n        goods: {\r\n          label: \"Goods lift\"\r\n        },\r\n        escalator: {\r\n          label: \"Escalator\"\r\n        }\r\n      }\r\n    },\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | FRAN\u00c7AIS\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    fr: {\r\n      phases: {\r\n        call: {\r\n          kicker: \"Centre d\u2019assistance 24h\/24\",\r\n          title: \"La demande<br>est prise en charge\",\r\n          text: \"Notre service op\u00e9rationnel 24h\/24 re\u00e7oit l\u2019appel et d\u00e9clenche le processus d\u2019assistance pour les ascenseurs, monte-charges et escaliers m\u00e9caniques.\",\r\n          tags: [\"Assistance 24h\/24\", \"R\u00e9activit\u00e9\", \"Prise en charge\"],\r\n          cardLabel: \"Appel\",\r\n          cardTitle: \"Demande prise en charge\",\r\n          cardText: \"Notre centre d\u2019assistance op\u00e9rationnel 24h\/24 re\u00e7oit la demande et lance le processus d\u2019intervention afin de r\u00e9duire au minimum les d\u00e9sagr\u00e9ments.\",\r\n          status: \"Syst\u00e8me actif\",\r\n          metric: \"24\/24\",\r\n          liftY: -1.25,\r\n          goodsY: -0.25,\r\n          checks: [\"request\"],\r\n          speed: 1\r\n        },\r\n\r\n        technician: {\r\n          kicker: \"Technicien local\",\r\n          title: \"La demande<br>parvient au technicien\",\r\n          text: \"Les demandes sont transmises au technicien local afin de garantir des interventions rapides et cibl\u00e9es sur le terrain.\",\r\n          tags: [\"Technicien local\", \"Couverture nationale\", \"Intervention rapide\"],\r\n          cardLabel: \"Technicien\",\r\n          cardTitle: \"Intervention rapide sur le terrain\",\r\n          cardText: \"Le service transmet la demande au technicien local, permettant une gestion plus rapide et mieux coordonn\u00e9e de l\u2019intervention.\",\r\n          status: \"Technicien inform\u00e9\",\r\n          metric: \"ON\",\r\n          liftY: 0.05,\r\n          goodsY: 0.22,\r\n          checks: [\"request\", \"dispatch\"],\r\n          speed: 1.18\r\n        },\r\n\r\n        diagnosis: {\r\n          kicker: \"Diagnostic technique\",\r\n          title: \"L\u2019installation<br>est analys\u00e9e\",\r\n          text: \"Des \u00e9quipements \u00e9lectroniques et num\u00e9riques permettent de contr\u00f4ler l\u2019\u00e9tat de l\u2019installation et d\u2019identifier les \u00e9ventuelles anomalies ou besoins de modernisation.\",\r\n          tags: [\"Diagnostic\", \"Technologie num\u00e9rique\", \"Contr\u00f4le\"],\r\n          cardLabel: \"Diagnostic\",\r\n          cardTitle: \"Contr\u00f4le technique de l\u2019installation\",\r\n          cardText: \"Le diagnostic permet d\u2019analyser le fonctionnement de l\u2019installation et d\u2019accompagner les op\u00e9rations de maintenance, de modernisation et d\u2019am\u00e9lioration.\",\r\n          status: \"Diagnostic actif\",\r\n          metric: \"SCAN\",\r\n          liftY: 1.15,\r\n          goodsY: 0.58,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\"],\r\n          speed: 1.32\r\n        },\r\n\r\n        check: {\r\n          kicker: \"Contr\u00f4les p\u00e9riodiques\",\r\n          title: \"La s\u00e9curit\u00e9<br>se construit dans le temps\",\r\n          text: \"Les contr\u00f4les p\u00e9riodiques contribuent \u00e0 maintenir un niveau de performance constant de l\u2019installation et \u00e0 pr\u00e9venir d\u2019\u00e9ventuels probl\u00e8mes.\",\r\n          tags: [\"Contr\u00f4les p\u00e9riodiques\", \"Pr\u00e9vention\", \"Fiabilit\u00e9\"],\r\n          cardLabel: \"Contr\u00f4le\",\r\n          cardTitle: \"Des performances constantes dans le temps\",\r\n          cardText: \"La maintenance programm\u00e9e contribue \u00e0 pr\u00e9server la s\u00e9curit\u00e9, la fiabilit\u00e9 et la continuit\u00e9 du service dans le temps.\",\r\n          status: \"Contr\u00f4le p\u00e9riodique\",\r\n          metric: \"OK\",\r\n          liftY: -0.45,\r\n          goodsY: 0.02,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\", \"prevention\"],\r\n          speed: 0.9\r\n        }\r\n      },\r\n\r\n      plants: {\r\n        lift: {\r\n          label: \"Ascenseur\"\r\n        },\r\n        goods: {\r\n          label: \"Monte-charge\"\r\n        },\r\n        escalator: {\r\n          label: \"Escalier m\u00e9canique\"\r\n        }\r\n      }\r\n    },\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | \u0420\u0423\u0421\u0421\u041a\u0418\u0419\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    ru: {\r\n      phases: {\r\n        call: {\r\n          kicker: \"\u041a\u043e\u043b\u043b-\u0446\u0435\u043d\u0442\u0440 24\/7\",\r\n          title: \"\u0417\u0430\u044f\u0432\u043a\u0430<br>\u043f\u0440\u0438\u043d\u044f\u0442\u0430 \u0432 \u0440\u0430\u0431\u043e\u0442\u0443\",\r\n          text: \"\u041d\u0430\u0448\u0430 \u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0443\u0442\u043e\u0447\u043d\u0430\u044f \u0441\u043b\u0443\u0436\u0431\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0432\u043e\u043d\u043e\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u043b\u0438\u0444\u0442\u043e\u0432, \u0433\u0440\u0443\u0437\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u044a\u0451\u043c\u043d\u0438\u043a\u043e\u0432 \u0438 \u044d\u0441\u043a\u0430\u043b\u0430\u0442\u043e\u0440\u043e\u0432.\",\r\n          tags: [\"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 24\/7\", \"\u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c\", \"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u044f\u0432\u043a\u0438\"],\r\n          cardLabel: \"\u0417\u0432\u043e\u043d\u043e\u043a\",\r\n          cardTitle: \"\u0417\u0430\u044f\u0432\u043a\u0430 \u043f\u0440\u0438\u043d\u044f\u0442\u0430\",\r\n          cardText: \"\u041a\u0440\u0443\u0433\u043b\u043e\u0441\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u043a\u043e\u043b\u043b-\u0446\u0435\u043d\u0442\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u0430\u044f\u0432\u043a\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u0443.\",\r\n          status: \"\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430\",\r\n          metric: \"24\/7\",\r\n          liftY: -1.25,\r\n          goodsY: -0.25,\r\n          checks: [\"request\"],\r\n          speed: 1\r\n        },\r\n\r\n        technician: {\r\n          kicker: \"\u041c\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\",\r\n          title: \"\u0417\u0430\u044f\u0432\u043a\u0430<br>\u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0443\",\r\n          text: \"\u0417\u0430\u044f\u0432\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043d\u043e\u043c\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0443, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0438 \u0446\u0435\u043b\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435.\",\r\n          tags: [\"\u041c\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\", \"\u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0435\", \"\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0432\u044b\u0435\u0437\u0434\"],\r\n          cardLabel: \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\",\r\n          cardTitle: \"\u041e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435\",\r\n          cardText: \"\u0421\u0435\u0440\u0432\u0438\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0437\u0430\u044f\u0432\u043a\u0443 \u043c\u0435\u0441\u0442\u043d\u043e\u043c\u0443 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u0443, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0438 \u0441\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0431\u043e\u0442.\",\r\n          status: \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0451\u043d\",\r\n          metric: \"ON\",\r\n          liftY: 0.05,\r\n          goodsY: 0.22,\r\n          checks: [\"request\", \"dispatch\"],\r\n          speed: 1.18\r\n        },\r\n\r\n        diagnosis: {\r\n          kicker: \"\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\",\r\n          title: \"\u041e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435<br>\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0443\",\r\n          text: \"\u042d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u044b\u0435 \u0438 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0430\u0446\u0438\u0438.\",\r\n          tags: [\"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\", \"\u0426\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438\", \"\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\"],\r\n          cardLabel: \"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\",\r\n          cardTitle: \"\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f\",\r\n          cardText: \"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f, \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\",\r\n          status: \"\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u0430\",\r\n          metric: \"SCAN\",\r\n          liftY: 1.15,\r\n          goodsY: 0.58,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\"],\r\n          speed: 1.32\r\n        },\r\n\r\n        check: {\r\n          kicker: \"\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\",\r\n          title: \"\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<br>\u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\",\r\n          text: \"\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u043e\u0441\u0442\u0438.\",\r\n          tags: [\"\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\", \"\u041f\u0440\u043e\u0444\u0438\u043b\u0430\u043a\u0442\u0438\u043a\u0430\", \"\u041d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c\"],\r\n          cardLabel: \"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\",\r\n          cardTitle: \"\u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0433\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\",\r\n          cardText: \"\u041f\u043b\u0430\u043d\u043e\u0432\u043e\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c, \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f.\",\r\n          status: \"\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\",\r\n          metric: \"OK\",\r\n          liftY: -0.45,\r\n          goodsY: 0.02,\r\n          checks: [\"request\", \"dispatch\", \"diagnosis\", \"prevention\"],\r\n          speed: 0.9\r\n        }\r\n      },\r\n\r\n      plants: {\r\n        lift: {\r\n          label: \"\u041b\u0438\u0444\u0442\"\r\n        },\r\n        goods: {\r\n          label: \"\u0413\u0440\u0443\u0437\u043e\u0432\u043e\u0439 \u043f\u043e\u0434\u044a\u0451\u043c\u043d\u0438\u043a\"\r\n        },\r\n        escalator: {\r\n          label: \"\u042d\u0441\u043a\u0430\u043b\u0430\u0442\u043e\u0440\"\r\n        }\r\n      }\r\n    }\r\n  };\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Service Lab data\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const serviceData =\r\n    serviceTranslations[pageLang] ||\r\n    serviceTranslations.it;\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | DOM\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const lab = document.querySelector(\".mp-service-lab\");\r\n  const bgCanvas = document.querySelector(\"#mpServiceLabCanvas\");\r\n  const bgCtx = bgCanvas ? bgCanvas.getContext(\"2d\") : null;\r\n\r\n  const kicker = document.querySelector(\"#mpServiceLabKicker\");\r\n  const title = document.querySelector(\"#mpServiceLabTitle\");\r\n  const text = document.querySelector(\"#mpServiceLabText\");\r\n  const tags = document.querySelector(\"#mpServiceLabTags\");\r\n  const card = document.querySelector(\"#mpServiceInfoCard\");\r\n  const floatingStatus = document.querySelector(\"#mpFloatingStatus\");\r\n  const floatingMetric = document.querySelector(\"#mpFloatingMetric\");\r\n  const modelCaption = document.querySelector(\"#mpModelCaption\");\r\n\r\n  const plantButtons = document.querySelectorAll(\"[data-plant]\");\r\n  const phaseButtons = document.querySelectorAll(\"[data-phase]\");\r\n  const checks = document.querySelectorAll(\".mp-service-check\");\r\n  const metricBars = document.querySelectorAll(\".mp-service-metrics i em\");\r\n\r\n  let currentPlant = \"lift\";\r\n  let currentPhase = \"call\";\r\n  let targetPulseSpeed = 1;\r\n  let pulseSpeed = 1;\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | UI functions\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function animateElement(element) {\r\n    if (!element) return;\r\n\r\n    if (window.gsap) {\r\n      gsap.fromTo(element,\r\n        { opacity: 0.35, y: 18 },\r\n        { opacity: 1, y: 0, duration: 0.48, ease: \"power3.out\" }\r\n      );\r\n      return;\r\n    }\r\n\r\n    element.animate([\r\n      { opacity: 0.35, transform: \"translateY(18px)\" },\r\n      { opacity: 1, transform: \"translateY(0)\" }\r\n    ], {\r\n      duration: 460,\r\n      easing: \"cubic-bezier(0.22, 1, 0.36, 1)\"\r\n    });\r\n  }\r\n\r\n  function animateMetrics() {\r\n    metricBars.forEach(function (bar) {\r\n      bar.style.transition = \"none\";\r\n      bar.style.width = \"0%\";\r\n\r\n      requestAnimationFrame(function () {\r\n        requestAnimationFrame(function () {\r\n          bar.style.transition = \"width 1150ms cubic-bezier(0.22, 1, 0.36, 1)\";\r\n          bar.style.width = \"100%\";\r\n        });\r\n      });\r\n    });\r\n  }\r\n\r\n  function centerActiveButton(button) {\r\n    if (!button || window.innerWidth > 900) return;\r\n\r\n    button.scrollIntoView({\r\n      behavior: \"smooth\",\r\n      block: \"nearest\",\r\n      inline: \"center\"\r\n    });\r\n  }\r\n\r\n  function setPhase(phaseKey) {\r\n    const phase = serviceData.phases[phaseKey];\r\n\r\n    if (!phase) return;\r\n\r\n    currentPhase = phaseKey;\r\n    targetPulseSpeed = phase.speed;\r\n\r\n    if (kicker) kicker.textContent = phase.kicker;\r\n    if (title) title.innerHTML = phase.title;\r\n    if (text) text.textContent = phase.text;\r\n    if (floatingStatus) floatingStatus.textContent = phase.status;\r\n    if (floatingMetric) floatingMetric.textContent = phase.metric;\r\n\r\n    if (tags) {\r\n      tags.innerHTML = \"\";\r\n\r\n      phase.tags.forEach(function (tag) {\r\n        const span = document.createElement(\"span\");\r\n        span.textContent = tag;\r\n        tags.appendChild(span);\r\n      });\r\n    }\r\n\r\n    if (card) {\r\n      card.innerHTML =\r\n        \"<p>\" + phase.cardLabel + \"<\/p>\" +\r\n        \"<h3>\" + phase.cardTitle + \"<\/h3>\" +\r\n        \"<span>\" + phase.cardText + \"<\/span>\";\r\n    }\r\n\r\n    checks.forEach(function (check) {\r\n      const key = check.getAttribute(\"data-check\");\r\n      check.classList.toggle(\"is-active\", phase.checks.indexOf(key) !== -1);\r\n    });\r\n\r\n    phaseButtons.forEach(function (button) {\r\n      const isActive = button.getAttribute(\"data-phase\") === phaseKey;\r\n\r\n      button.classList.toggle(\"is-active\", isActive);\r\n      button.setAttribute(\"aria-pressed\", isActive ? \"true\" : \"false\");\r\n\r\n      if (isActive) {\r\n        centerActiveButton(button);\r\n      }\r\n    });\r\n\r\n    animateMetrics();\r\n    animateElement(document.querySelector(\".mp-service-lab-head\"));\r\n    animateElement(card);\r\n\r\n    updateThreePhase();\r\n  }\r\n\r\n  function setPlant(plantKey) {\r\n    const plant = serviceData.plants[plantKey];\r\n\r\n    if (!plant) return;\r\n\r\n    currentPlant = plantKey;\r\n\r\n    plantButtons.forEach(function (button) {\r\n      const isActive = button.getAttribute(\"data-plant\") === plantKey;\r\n\r\n      button.classList.toggle(\"is-active\", isActive);\r\n      button.setAttribute(\"aria-pressed\", isActive ? \"true\" : \"false\");\r\n\r\n      if (isActive) {\r\n        centerActiveButton(button);\r\n      }\r\n    });\r\n\r\n    if (modelCaption) {\r\n      modelCaption.textContent = plant.label;\r\n    }\r\n\r\n    rebuildThreeModel();\r\n\r\n    if (window.gsap && threeRoot) {\r\n      gsap.fromTo(threeRoot.scale,\r\n        { x: 0.94, y: 0.94, z: 0.94 },\r\n        { x: 1, y: 1, z: 1, duration: 0.72, ease: \"power3.out\" }\r\n      );\r\n    }\r\n  }\r\n\r\n  plantButtons.forEach(function (button) {\r\n    button.addEventListener(\"click\", function () {\r\n      setPlant(button.getAttribute(\"data-plant\"));\r\n    });\r\n  });\r\n\r\n  phaseButtons.forEach(function (button) {\r\n    button.addEventListener(\"click\", function () {\r\n      setPhase(button.getAttribute(\"data-phase\"));\r\n    });\r\n  });\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Background canvas\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  let bgW = 0;\r\n  let bgH = 0;\r\n  let bgDpr = Math.min(window.devicePixelRatio || 1, 2);\r\n  let bgParticles = [];\r\n  let bgPackets = [];\r\n\r\n  function resizeBgCanvas() {\r\n    if (!bgCanvas || !bgCtx || !lab) return;\r\n\r\n    const rect = lab.getBoundingClientRect();\r\n\r\n    bgW = Math.max(1, rect.width);\r\n    bgH = Math.max(1, rect.height);\r\n    bgDpr = Math.min(window.devicePixelRatio || 1, 2);\r\n\r\n    bgCanvas.width = Math.floor(bgW * bgDpr);\r\n    bgCanvas.height = Math.floor(bgH * bgDpr);\r\n    bgCanvas.style.width = bgW + \"px\";\r\n    bgCanvas.style.height = bgH + \"px\";\r\n\r\n    bgCtx.setTransform(bgDpr, 0, 0, bgDpr, 0, 0);\r\n\r\n    bgParticles = [];\r\n    bgPackets = [];\r\n\r\n    const amount = Math.min(150, Math.max(70, Math.floor(bgW \/ 10)));\r\n\r\n    for (let i = 0; i < amount; i += 1) {\r\n      bgParticles.push({\r\n        x: Math.random() * bgW,\r\n        y: Math.random() * bgH,\r\n        vx: -0.16 + Math.random() * 0.32,\r\n        vy: -0.12 + Math.random() * 0.24,\r\n        r: 0.6 + Math.random() * 2.2,\r\n        alpha: 0.08 + Math.random() * 0.28,\r\n        phase: Math.random() * Math.PI * 2\r\n      });\r\n    }\r\n\r\n    for (let i = 0; i < 9; i += 1) {\r\n      bgPackets.push({\r\n        t: Math.random(),\r\n        path: i % 4,\r\n        speed: 0.0018 + Math.random() * 0.0028\r\n      });\r\n    }\r\n  }\r\n\r\n  function drawBgLine(a, b, alpha) {\r\n    const gradient = bgCtx.createLinearGradient(a.x, a.y, b.x, b.y);\r\n\r\n    gradient.addColorStop(0, \"rgba(255,255,255,0)\");\r\n    gradient.addColorStop(0.5, \"rgba(255,255,255,\" + alpha + \")\");\r\n    gradient.addColorStop(1, \"rgba(255,255,255,0)\");\r\n\r\n    bgCtx.beginPath();\r\n    bgCtx.moveTo(a.x, a.y);\r\n    bgCtx.lineTo(b.x, b.y);\r\n    bgCtx.strokeStyle = gradient;\r\n    bgCtx.lineWidth = 1;\r\n    bgCtx.stroke();\r\n  }\r\n\r\n  function drawBgCanvas(time) {\r\n    if (!bgCtx || !bgCanvas) return;\r\n\r\n    bgCtx.clearRect(0, 0, bgW, bgH);\r\n\r\n    pulseSpeed += (targetPulseSpeed - pulseSpeed) * 0.035;\r\n\r\n    const centerX = bgW * 0.56;\r\n    const centerY = bgH * 0.55;\r\n\r\n    const glow = bgCtx.createRadialGradient(\r\n      centerX,\r\n      centerY,\r\n      0,\r\n      centerX,\r\n      centerY,\r\n      Math.min(bgW, bgH) * 0.55\r\n    );\r\n\r\n    glow.addColorStop(0, \"rgba(255,255,255,0.14)\");\r\n    glow.addColorStop(0.34, \"rgba(255,255,255,0.045)\");\r\n    glow.addColorStop(1, \"rgba(255,255,255,0)\");\r\n\r\n    bgCtx.fillStyle = glow;\r\n    bgCtx.fillRect(0, 0, bgW, bgH);\r\n\r\n    bgParticles.forEach(function (p) {\r\n      p.x += p.vx * pulseSpeed;\r\n      p.y += p.vy * pulseSpeed;\r\n\r\n      p.x += Math.sin(time * 0.0006 + p.phase) * 0.08;\r\n      p.y += Math.cos(time * 0.0005 + p.phase) * 0.08;\r\n\r\n      if (p.x < -20) p.x = bgW + 20;\r\n      if (p.x > bgW + 20) p.x = -20;\r\n      if (p.y < -20) p.y = bgH + 20;\r\n      if (p.y > bgH + 20) p.y = -20;\r\n\r\n      const distance = Math.hypot(p.x - centerX, p.y - centerY);\r\n      const attraction = Math.max(0, 1 - distance \/ 420);\r\n\r\n      bgCtx.beginPath();\r\n      bgCtx.arc(p.x, p.y, p.r + attraction * 1.4, 0, Math.PI * 2);\r\n      bgCtx.fillStyle =\r\n        \"rgba(255,255,255,\" +\r\n        (p.alpha + attraction * 0.22) +\r\n        \")\";\r\n      bgCtx.fill();\r\n    });\r\n\r\n    const points = {\r\n      a: { x: bgW * 0.18, y: bgH * 0.68 },\r\n      b: { x: bgW * 0.42, y: bgH * 0.43 },\r\n      c: { x: bgW * 0.64, y: bgH * 0.52 },\r\n      d: { x: bgW * 0.82, y: bgH * 0.34 },\r\n      e: { x: bgW * 0.74, y: bgH * 0.72 }\r\n    };\r\n\r\n    drawBgLine(\r\n      points.a,\r\n      points.b,\r\n      currentPhase === \"call\" ? 0.55 : 0.12\r\n    );\r\n\r\n    drawBgLine(\r\n      points.b,\r\n      points.c,\r\n      currentPhase === \"technician\" ? 0.55 : 0.12\r\n    );\r\n\r\n    drawBgLine(\r\n      points.c,\r\n      points.d,\r\n      currentPhase === \"diagnosis\" ? 0.55 : 0.12\r\n    );\r\n\r\n    drawBgLine(\r\n      points.c,\r\n      points.e,\r\n      currentPhase === \"check\" ? 0.55 : 0.12\r\n    );\r\n\r\n    const paths = [\r\n      [points.a, points.b],\r\n      [points.b, points.c],\r\n      [points.c, points.d],\r\n      [points.c, points.e]\r\n    ];\r\n\r\n    bgPackets.forEach(function (packet) {\r\n      const path = paths[packet.path % paths.length];\r\n      const a = path[0];\r\n      const b = path[1];\r\n\r\n      packet.t += packet.speed * pulseSpeed;\r\n\r\n      if (packet.t > 1) {\r\n        packet.t = 0;\r\n        packet.path = (packet.path + 1) % paths.length;\r\n      }\r\n\r\n      const x = a.x + (b.x - a.x) * packet.t;\r\n      const y = a.y + (b.y - a.y) * packet.t;\r\n\r\n      bgCtx.beginPath();\r\n      bgCtx.arc(x, y, 3.2, 0, Math.PI * 2);\r\n      bgCtx.fillStyle = \"rgba(255,255,255,0.82)\";\r\n      bgCtx.shadowColor = \"rgba(255,255,255,0.82)\";\r\n      bgCtx.shadowBlur = 16;\r\n      bgCtx.fill();\r\n      bgCtx.shadowBlur = 0;\r\n    });\r\n\r\n    requestAnimationFrame(drawBgCanvas);\r\n  }\r\n\r\n  if (bgCtx) {\r\n    resizeBgCanvas();\r\n    window.addEventListener(\"resize\", resizeBgCanvas);\r\n    requestAnimationFrame(drawBgCanvas);\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | THREE.JS 3D models\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  const threeCanvas = document.querySelector(\"#mpServiceThreeCanvas\");\r\n  const frame = document.querySelector(\"#mpServiceModelFrame\");\r\n\r\n  let renderer;\r\n  let scene;\r\n  let camera;\r\n  let threeRoot;\r\n  let activeModelGroup;\r\n  let liftCabin3D;\r\n  let goodsCabin3D;\r\n  let escalatorSteps = [];\r\n\r\n  let activeAnimationTargets = {\r\n    liftY: -1.25,\r\n    goodsY: -0.25\r\n  };\r\n\r\n\r\n  function mat(\r\n    color,\r\n    roughness,\r\n    metalness,\r\n    opacity,\r\n    emissive,\r\n    intensity\r\n  ) {\r\n    const material = new THREE.MeshStandardMaterial({\r\n      color: color,\r\n      roughness: roughness,\r\n      metalness: metalness\r\n    });\r\n\r\n    if (opacity < 1) {\r\n      material.transparent = true;\r\n      material.opacity = opacity;\r\n      material.depthWrite = false;\r\n    }\r\n\r\n    if (emissive) {\r\n      material.emissive = new THREE.Color(emissive);\r\n      material.emissiveIntensity = intensity || 0;\r\n    }\r\n\r\n    return material;\r\n  }\r\n\r\n\r\n  function box(w, h, d, material) {\r\n    const mesh = new THREE.Mesh(\r\n      new THREE.BoxGeometry(w, h, d),\r\n      material\r\n    );\r\n\r\n    mesh.castShadow = true;\r\n    mesh.receiveShadow = true;\r\n\r\n    return mesh;\r\n  }\r\n\r\n\r\n  function cyl(r1, r2, h, material, segments) {\r\n    const mesh = new THREE.Mesh(\r\n      new THREE.CylinderGeometry(\r\n        r1,\r\n        r2,\r\n        h,\r\n        segments || 32\r\n      ),\r\n      material\r\n    );\r\n\r\n    mesh.castShadow = true;\r\n    mesh.receiveShadow = true;\r\n\r\n    return mesh;\r\n  }\r\n\r\n\r\n  function torus(radius, tube, material) {\r\n    const mesh = new THREE.Mesh(\r\n      new THREE.TorusGeometry(radius, tube, 18, 80),\r\n      material\r\n    );\r\n\r\n    mesh.castShadow = true;\r\n    mesh.receiveShadow = true;\r\n\r\n    return mesh;\r\n  }\r\n\r\n\r\n  function clearThreeRoot() {\r\n    if (!threeRoot) return;\r\n\r\n    while (threeRoot.children.length) {\r\n      const child = threeRoot.children[0];\r\n\r\n      child.traverse(function (obj) {\r\n        if (obj.geometry) {\r\n          obj.geometry.dispose();\r\n        }\r\n\r\n        if (obj.material) {\r\n          if (Array.isArray(obj.material)) {\r\n            obj.material.forEach(function (m) {\r\n              m.dispose();\r\n            });\r\n          } else {\r\n            obj.material.dispose();\r\n          }\r\n        }\r\n      });\r\n\r\n      threeRoot.remove(child);\r\n    }\r\n\r\n    activeModelGroup = null;\r\n    liftCabin3D = null;\r\n    goodsCabin3D = null;\r\n    escalatorSteps = [];\r\n  }\r\n\r\n\r\n  function createGlowSphere(radius, opacity) {\r\n    const glow = new THREE.Mesh(\r\n      new THREE.SphereGeometry(radius, 48, 48),\r\n      mat(\r\n        0xffffff,\r\n        0.2,\r\n        0,\r\n        opacity,\r\n        0xffffff,\r\n        0.2\r\n      )\r\n    );\r\n\r\n    glow.scale.set(1, 0.42, 1);\r\n\r\n    return glow;\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Lift model\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function createLiftModel() {\r\n    const group = new THREE.Group();\r\n\r\n    const black = mat(\r\n      0x111111,\r\n      0.52,\r\n      0.42,\r\n      1\r\n    );\r\n\r\n    const dark = mat(\r\n      0x1f1f1f,\r\n      0.44,\r\n      0.48,\r\n      1\r\n    );\r\n\r\n    const metal = mat(\r\n      0xdddddd,\r\n      0.28,\r\n      0.72,\r\n      1,\r\n      0xffffff,\r\n      0.06\r\n    );\r\n\r\n    const white = mat(\r\n      0xffffff,\r\n      0.20,\r\n      0.38,\r\n      1,\r\n      0xffffff,\r\n      0.12\r\n    );\r\n\r\n    const glass = mat(\r\n      0xdff7ff,\r\n      0.03,\r\n      0.02,\r\n      0.19\r\n    );\r\n\r\n    const glowMat = mat(\r\n      0xffffff,\r\n      0.22,\r\n      0.1,\r\n      0.78,\r\n      0xffffff,\r\n      0.45\r\n    );\r\n\r\n    const shaft = box(\r\n      1.75,\r\n      4.9,\r\n      1.32,\r\n      black\r\n    );\r\n\r\n    shaft.position.y = 0;\r\n    group.add(shaft);\r\n\r\n    const backPanel = box(\r\n      1.55,\r\n      4.65,\r\n      0.05,\r\n      dark\r\n    );\r\n\r\n    backPanel.position.z = -0.68;\r\n    group.add(backPanel);\r\n\r\n    const leftGlass = box(\r\n      0.05,\r\n      4.55,\r\n      1.24,\r\n      glass\r\n    );\r\n\r\n    leftGlass.position.x = -0.9;\r\n    group.add(leftGlass);\r\n\r\n    const rightGlass = box(\r\n      0.05,\r\n      4.55,\r\n      1.24,\r\n      glass\r\n    );\r\n\r\n    rightGlass.position.x = 0.9;\r\n    group.add(rightGlass);\r\n\r\n    const frontGlass = box(\r\n      1.48,\r\n      4.55,\r\n      0.045,\r\n      glass\r\n    );\r\n\r\n    frontGlass.position.z = 0.70;\r\n    group.add(frontGlass);\r\n\r\n    for (let i = 0; i < 6; i += 1) {\r\n      const floor = box(\r\n        2.95,\r\n        0.035,\r\n        1.95,\r\n        metal\r\n      );\r\n\r\n      floor.position.y = -2.1 + i * 0.84;\r\n      group.add(floor);\r\n\r\n      const led = box(\r\n        0.62,\r\n        0.025,\r\n        0.035,\r\n        glowMat\r\n      );\r\n\r\n      led.position.set(\r\n        0.62,\r\n        -1.98 + i * 0.84,\r\n        0.83\r\n      );\r\n\r\n      group.add(led);\r\n\r\n      const smallDisplay = box(\r\n        0.12,\r\n        0.12,\r\n        0.035,\r\n        glowMat\r\n      );\r\n\r\n      smallDisplay.position.set(\r\n        -0.70,\r\n        -1.90 + i * 0.84,\r\n        0.83\r\n      );\r\n\r\n      group.add(smallDisplay);\r\n    }\r\n\r\n    const railA = box(\r\n      0.035,\r\n      4.72,\r\n      0.04,\r\n      metal\r\n    );\r\n\r\n    railA.position.set(\r\n      -0.50,\r\n      0,\r\n      0.78\r\n    );\r\n\r\n    group.add(railA);\r\n\r\n    const railB = box(\r\n      0.035,\r\n      4.72,\r\n      0.04,\r\n      metal\r\n    );\r\n\r\n    railB.position.set(\r\n      0.50,\r\n      0,\r\n      0.78\r\n    );\r\n\r\n    group.add(railB);\r\n\r\n    const cableA = cyl(\r\n      0.012,\r\n      0.012,\r\n      4.65,\r\n      glowMat,\r\n      12\r\n    );\r\n\r\n    cableA.position.set(\r\n      -0.20,\r\n      0.08,\r\n      0.86\r\n    );\r\n\r\n    group.add(cableA);\r\n\r\n    const cableB = cyl(\r\n      0.012,\r\n      0.012,\r\n      4.65,\r\n      glowMat,\r\n      12\r\n    );\r\n\r\n    cableB.position.set(\r\n      0.20,\r\n      0.08,\r\n      0.86\r\n    );\r\n\r\n    group.add(cableB);\r\n\r\n    const pulleyA = torus(\r\n      0.20,\r\n      0.018,\r\n      metal\r\n    );\r\n\r\n    pulleyA.rotation.x = Math.PI \/ 2;\r\n\r\n    pulleyA.position.set(\r\n      -0.28,\r\n      2.38,\r\n      0.82\r\n    );\r\n\r\n    group.add(pulleyA);\r\n\r\n    const pulleyB = torus(\r\n      0.20,\r\n      0.018,\r\n      metal\r\n    );\r\n\r\n    pulleyB.rotation.x = Math.PI \/ 2;\r\n\r\n    pulleyB.position.set(\r\n      0.28,\r\n      2.38,\r\n      0.82\r\n    );\r\n\r\n    group.add(pulleyB);\r\n\r\n    const counterWeight = box(\r\n      0.24,\r\n      0.95,\r\n      0.16,\r\n      dark\r\n    );\r\n\r\n    counterWeight.position.set(\r\n      0.72,\r\n      0.82,\r\n      0.40\r\n    );\r\n\r\n    group.add(counterWeight);\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Lift cabin\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    liftCabin3D = new THREE.Group();\r\n\r\n    const cabinBody = box(\r\n      0.94,\r\n      0.82,\r\n      0.82,\r\n      white\r\n    );\r\n\r\n    liftCabin3D.add(cabinBody);\r\n\r\n    const cabinTop = box(\r\n      1.04,\r\n      0.08,\r\n      0.92,\r\n      metal\r\n    );\r\n\r\n    cabinTop.position.y = 0.45;\r\n    liftCabin3D.add(cabinTop);\r\n\r\n    const cabinBottom = box(\r\n      1.04,\r\n      0.08,\r\n      0.92,\r\n      metal\r\n    );\r\n\r\n    cabinBottom.position.y = -0.45;\r\n    liftCabin3D.add(cabinBottom);\r\n\r\n    const doorA = box(\r\n      0.40,\r\n      0.66,\r\n      0.035,\r\n      dark\r\n    );\r\n\r\n    doorA.position.set(\r\n      -0.21,\r\n      0,\r\n      0.43\r\n    );\r\n\r\n    liftCabin3D.add(doorA);\r\n\r\n    const doorB = box(\r\n      0.40,\r\n      0.66,\r\n      0.035,\r\n      dark\r\n    );\r\n\r\n    doorB.position.set(\r\n      0.21,\r\n      0,\r\n      0.43\r\n    );\r\n\r\n    liftCabin3D.add(doorB);\r\n\r\n    const innerLight = box(\r\n      0.54,\r\n      0.035,\r\n      0.035,\r\n      glowMat\r\n    );\r\n\r\n    innerLight.position.set(\r\n      0,\r\n      0.30,\r\n      0.47\r\n    );\r\n\r\n    liftCabin3D.add(innerLight);\r\n\r\n    const handle = box(\r\n      0.54,\r\n      0.025,\r\n      0.035,\r\n      metal\r\n    );\r\n\r\n    handle.position.set(\r\n      0,\r\n      -0.18,\r\n      0.47\r\n    );\r\n\r\n    liftCabin3D.add(handle);\r\n\r\n    liftCabin3D.position.y =\r\n      serviceData.phases[currentPhase].liftY;\r\n\r\n    group.add(liftCabin3D);\r\n\r\n    const glow = createGlowSphere(\r\n      2.25,\r\n      0.11\r\n    );\r\n\r\n    glow.position.y = 0.05;\r\n    group.add(glow);\r\n\r\n    group.rotation.y = -0.26;\r\n    group.rotation.x = 0.06;\r\n    group.position.y = 0.05;\r\n\r\n    return group;\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Goods lift model\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function createGoodsModel() {\r\n    const group = new THREE.Group();\r\n\r\n    const black = mat(\r\n      0x111111,\r\n      0.50,\r\n      0.45,\r\n      1\r\n    );\r\n\r\n    const dark = mat(\r\n      0x242424,\r\n      0.45,\r\n      0.46,\r\n      1\r\n    );\r\n\r\n    const metal = mat(\r\n      0xdcdcdc,\r\n      0.26,\r\n      0.75,\r\n      1,\r\n      0xffffff,\r\n      0.08\r\n    );\r\n\r\n    const white = mat(\r\n      0xffffff,\r\n      0.22,\r\n      0.35,\r\n      1,\r\n      0xffffff,\r\n      0.12\r\n    );\r\n\r\n    const glass = mat(\r\n      0xdff7ff,\r\n      0.05,\r\n      0.02,\r\n      0.16\r\n    );\r\n\r\n    const glowMat = mat(\r\n      0xffffff,\r\n      0.20,\r\n      0.12,\r\n      0.85,\r\n      0xffffff,\r\n      0.42\r\n    );\r\n\r\n    const base = box(\r\n      3.35,\r\n      0.14,\r\n      2.55,\r\n      black\r\n    );\r\n\r\n    base.position.y = -1.55;\r\n    group.add(base);\r\n\r\n    const platformFrame = box(\r\n      1.85,\r\n      0.16,\r\n      1.55,\r\n      metal\r\n    );\r\n\r\n    platformFrame.position.y = -0.65;\r\n    group.add(platformFrame);\r\n\r\n    goodsCabin3D = platformFrame;\r\n\r\n    const loadBox = box(\r\n      0.76,\r\n      0.52,\r\n      0.66,\r\n      dark\r\n    );\r\n\r\n    loadBox.position.set(\r\n      -0.25,\r\n      -0.28,\r\n      0.04\r\n    );\r\n\r\n    group.add(loadBox);\r\n\r\n    const loadTapeA = box(\r\n      0.78,\r\n      0.05,\r\n      0.68,\r\n      glowMat\r\n    );\r\n\r\n    loadTapeA.position.set(\r\n      -0.25,\r\n      -0.02,\r\n      0.04\r\n    );\r\n\r\n    group.add(loadTapeA);\r\n\r\n    const backPanel = box(\r\n      1.88,\r\n      1.42,\r\n      0.08,\r\n      glass\r\n    );\r\n\r\n    backPanel.position.set(\r\n      0,\r\n      0.16,\r\n      -0.78\r\n    );\r\n\r\n    group.add(backPanel);\r\n\r\n    const sideA = box(\r\n      0.08,\r\n      1.42,\r\n      1.52,\r\n      glass\r\n    );\r\n\r\n    sideA.position.set(\r\n      -0.96,\r\n      0.16,\r\n      0\r\n    );\r\n\r\n    group.add(sideA);\r\n\r\n    const sideB = box(\r\n      0.08,\r\n      1.42,\r\n      1.52,\r\n      glass\r\n    );\r\n\r\n    sideB.position.set(\r\n      0.96,\r\n      0.16,\r\n      0\r\n    );\r\n\r\n    group.add(sideB);\r\n\r\n    [-1.38, 1.38].forEach(function (x) {\r\n      [-1.08, 1.08].forEach(function (z) {\r\n        const post = cyl(\r\n          0.035,\r\n          0.035,\r\n          3.35,\r\n          metal,\r\n          18\r\n        );\r\n\r\n        post.position.set(\r\n          x,\r\n          0,\r\n          z\r\n        );\r\n\r\n        group.add(post);\r\n\r\n        const cap = box(\r\n          0.18,\r\n          0.12,\r\n          0.18,\r\n          white\r\n        );\r\n\r\n        cap.position.set(\r\n          x,\r\n          1.66,\r\n          z\r\n        );\r\n\r\n        group.add(cap);\r\n      });\r\n    });\r\n\r\n    const upperBeamA = box(\r\n      2.95,\r\n      0.08,\r\n      0.08,\r\n      metal\r\n    );\r\n\r\n    upperBeamA.position.set(\r\n      0,\r\n      1.65,\r\n      -1.08\r\n    );\r\n\r\n    group.add(upperBeamA);\r\n\r\n    const upperBeamB = box(\r\n      2.95,\r\n      0.08,\r\n      0.08,\r\n      metal\r\n    );\r\n\r\n    upperBeamB.position.set(\r\n      0,\r\n      1.65,\r\n      1.08\r\n    );\r\n\r\n    group.add(upperBeamB);\r\n\r\n    const hoist = box(\r\n      0.46,\r\n      0.30,\r\n      0.42,\r\n      white\r\n    );\r\n\r\n    hoist.position.set(\r\n      0,\r\n      1.82,\r\n      0\r\n    );\r\n\r\n    group.add(hoist);\r\n\r\n    const hookCable = cyl(\r\n      0.013,\r\n      0.013,\r\n      1.75,\r\n      glowMat,\r\n      12\r\n    );\r\n\r\n    hookCable.position.set(\r\n      0,\r\n      0.95,\r\n      0\r\n    );\r\n\r\n    group.add(hookCable);\r\n\r\n    const hook = torus(\r\n      0.12,\r\n      0.016,\r\n      metal\r\n    );\r\n\r\n    hook.rotation.x = Math.PI \/ 2;\r\n\r\n    hook.position.set(\r\n      0,\r\n      0.05,\r\n      0\r\n    );\r\n\r\n    group.add(hook);\r\n\r\n    const frontRail = box(\r\n      1.78,\r\n      0.06,\r\n      0.06,\r\n      metal\r\n    );\r\n\r\n    frontRail.position.set(\r\n      0,\r\n      0.26,\r\n      0.84\r\n    );\r\n\r\n    group.add(frontRail);\r\n\r\n    const glow = createGlowSphere(\r\n      2.35,\r\n      0.12\r\n    );\r\n\r\n    glow.position.y = 0;\r\n    group.add(glow);\r\n\r\n    group.rotation.x = 0.48;\r\n    group.rotation.z = -0.34;\r\n    group.rotation.y = -0.18;\r\n    group.position.y = -0.12;\r\n\r\n    return group;\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Escalator model\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function createEscalatorModel() {\r\n    const group = new THREE.Group();\r\n\r\n    const black = mat(\r\n      0x111111,\r\n      0.52,\r\n      0.42,\r\n      1\r\n    );\r\n\r\n    const metal = mat(\r\n      0xdedede,\r\n      0.28,\r\n      0.72,\r\n      1,\r\n      0xffffff,\r\n      0.08\r\n    );\r\n\r\n    const white = mat(\r\n      0xffffff,\r\n      0.22,\r\n      0.35,\r\n      1,\r\n      0xffffff,\r\n      0.12\r\n    );\r\n\r\n    const glass = mat(\r\n      0xdff7ff,\r\n      0.05,\r\n      0.02,\r\n      0.19\r\n    );\r\n\r\n    const glowMat = mat(\r\n      0xffffff,\r\n      0.20,\r\n      0.12,\r\n      0.85,\r\n      0xffffff,\r\n      0.46\r\n    );\r\n\r\n    const base = box(\r\n      4.45,\r\n      0.18,\r\n      1.30,\r\n      black\r\n    );\r\n\r\n    base.position.y = -0.78;\r\n    group.add(base);\r\n\r\n    const lowerLanding = box(\r\n      1.10,\r\n      0.14,\r\n      1.45,\r\n      metal\r\n    );\r\n\r\n    lowerLanding.position.set(\r\n      -2.20,\r\n      -0.66,\r\n      0\r\n    );\r\n\r\n    group.add(lowerLanding);\r\n\r\n    const upperLanding = box(\r\n      1.10,\r\n      0.14,\r\n      1.45,\r\n      metal\r\n    );\r\n\r\n    upperLanding.position.set(\r\n      2.20,\r\n      0.46,\r\n      0\r\n    );\r\n\r\n    group.add(upperLanding);\r\n\r\n    for (let i = 0; i < 16; i += 1) {\r\n      const stepGroup = new THREE.Group();\r\n\r\n      const tread = box(\r\n        0.30,\r\n        0.055,\r\n        0.94,\r\n        white\r\n      );\r\n\r\n      tread.position.y = 0;\r\n      stepGroup.add(tread);\r\n\r\n      const riser = box(\r\n        0.035,\r\n        0.12,\r\n        0.94,\r\n        metal\r\n      );\r\n\r\n      riser.position.set(\r\n        -0.16,\r\n        -0.08,\r\n        0\r\n      );\r\n\r\n      stepGroup.add(riser);\r\n\r\n      const grooveA = box(\r\n        0.30,\r\n        0.012,\r\n        0.018,\r\n        black\r\n      );\r\n\r\n      grooveA.position.set(\r\n        0,\r\n        0.033,\r\n        -0.22\r\n      );\r\n\r\n      stepGroup.add(grooveA);\r\n\r\n      const grooveB = box(\r\n        0.30,\r\n        0.012,\r\n        0.018,\r\n        black\r\n      );\r\n\r\n      grooveB.position.set(\r\n        0,\r\n        0.033,\r\n        0\r\n      );\r\n\r\n      stepGroup.add(grooveB);\r\n\r\n      const grooveC = box(\r\n        0.30,\r\n        0.012,\r\n        0.018,\r\n        black\r\n      );\r\n\r\n      grooveC.position.set(\r\n        0,\r\n        0.033,\r\n        0.22\r\n      );\r\n\r\n      stepGroup.add(grooveC);\r\n\r\n      stepGroup.position.set(\r\n        -2.00 + i * 0.27,\r\n        -0.48 + i * 0.066,\r\n        0\r\n      );\r\n\r\n      stepGroup.userData.baseX =\r\n        stepGroup.position.x;\r\n\r\n      stepGroup.userData.baseY =\r\n        stepGroup.position.y;\r\n\r\n      stepGroup.userData.index = i;\r\n\r\n      escalatorSteps.push(stepGroup);\r\n      group.add(stepGroup);\r\n    }\r\n\r\n    const glassA = box(\r\n      4.55,\r\n      0.82,\r\n      0.04,\r\n      glass\r\n    );\r\n\r\n    glassA.rotation.z = 0.25;\r\n\r\n    glassA.position.set(\r\n      0,\r\n      0.08,\r\n      0.78\r\n    );\r\n\r\n    group.add(glassA);\r\n\r\n    const glassB = box(\r\n      4.55,\r\n      0.82,\r\n      0.04,\r\n      glass\r\n    );\r\n\r\n    glassB.rotation.z = 0.25;\r\n\r\n    glassB.position.set(\r\n      0,\r\n      0.08,\r\n      -0.78\r\n    );\r\n\r\n    group.add(glassB);\r\n\r\n    const railA = cyl(\r\n      0.038,\r\n      0.038,\r\n      4.7,\r\n      glowMat,\r\n      18\r\n    );\r\n\r\n    railA.rotation.z =\r\n      Math.PI \/ 2 - 0.25;\r\n\r\n    railA.position.set(\r\n      0,\r\n      0.53,\r\n      0.86\r\n    );\r\n\r\n    group.add(railA);\r\n\r\n    const railB = cyl(\r\n      0.038,\r\n      0.038,\r\n      4.7,\r\n      glowMat,\r\n      18\r\n    );\r\n\r\n    railB.rotation.z =\r\n      Math.PI \/ 2 - 0.25;\r\n\r\n    railB.position.set(\r\n      0,\r\n      0.53,\r\n      -0.86\r\n    );\r\n\r\n    group.add(railB);\r\n\r\n    const sideSkirtA = box(\r\n      4.38,\r\n      0.12,\r\n      0.08,\r\n      metal\r\n    );\r\n\r\n    sideSkirtA.rotation.z = 0.25;\r\n\r\n    sideSkirtA.position.set(\r\n      0,\r\n      -0.18,\r\n      0.58\r\n    );\r\n\r\n    group.add(sideSkirtA);\r\n\r\n    const sideSkirtB = box(\r\n      4.38,\r\n      0.12,\r\n      0.08,\r\n      metal\r\n    );\r\n\r\n    sideSkirtB.rotation.z = 0.25;\r\n\r\n    sideSkirtB.position.set(\r\n      0,\r\n      -0.18,\r\n      -0.58\r\n    );\r\n\r\n    group.add(sideSkirtB);\r\n\r\n    const glow = createGlowSphere(\r\n      2.6,\r\n      0.12\r\n    );\r\n\r\n    glow.position.y = 0;\r\n    group.add(glow);\r\n\r\n    group.rotation.x = 0.52;\r\n    group.rotation.z = -0.34;\r\n    group.rotation.y = -0.16;\r\n    group.position.y = -0.15;\r\n\r\n    return group;\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Rebuild 3D model\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function rebuildThreeModel() {\r\n    if (!threeRoot) return;\r\n\r\n    clearThreeRoot();\r\n\r\n    let model;\r\n\r\n    if (currentPlant === \"lift\") {\r\n      model = createLiftModel();\r\n    }\r\n\r\n    if (currentPlant === \"goods\") {\r\n      model = createGoodsModel();\r\n    }\r\n\r\n    if (currentPlant === \"escalator\") {\r\n      model = createEscalatorModel();\r\n    }\r\n\r\n    if (model) {\r\n      activeModelGroup = model;\r\n      threeRoot.add(model);\r\n    }\r\n\r\n    updateThreePhase();\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Update 3D phase\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function updateThreePhase() {\r\n    const phase = serviceData.phases[currentPhase];\r\n\r\n    if (!phase) return;\r\n\r\n    activeAnimationTargets.liftY =\r\n      phase.liftY;\r\n\r\n    activeAnimationTargets.goodsY =\r\n      phase.goodsY;\r\n\r\n    if (window.gsap) {\r\n      if (liftCabin3D) {\r\n        gsap.to(\r\n          liftCabin3D.position,\r\n          {\r\n            y: phase.liftY,\r\n            duration: 1.05,\r\n            ease: \"power3.inOut\"\r\n          }\r\n        );\r\n      }\r\n\r\n      if (goodsCabin3D) {\r\n        gsap.to(\r\n          goodsCabin3D.position,\r\n          {\r\n            y: phase.goodsY,\r\n            duration: 1.05,\r\n            ease: \"power3.inOut\"\r\n          }\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Init THREE.JS\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function initThree() {\r\n    if (\r\n      !threeCanvas ||\r\n      !frame ||\r\n      !window.THREE\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    scene = new THREE.Scene();\r\n\r\n    scene.fog = new THREE.FogExp2(\r\n      0x050505,\r\n      0.052\r\n    );\r\n\r\n    camera =\r\n      new THREE.PerspectiveCamera(\r\n        38,\r\n        1,\r\n        0.1,\r\n        100\r\n      );\r\n\r\n    camera.position.set(\r\n      4.0,\r\n      2.85,\r\n      7.0\r\n    );\r\n\r\n    camera.lookAt(\r\n      0,\r\n      0,\r\n      0\r\n    );\r\n\r\n    renderer =\r\n      new THREE.WebGLRenderer({\r\n        canvas: threeCanvas,\r\n        antialias: true,\r\n        alpha: true,\r\n        powerPreference: \"high-performance\"\r\n      });\r\n\r\n    renderer.setPixelRatio(\r\n      Math.min(\r\n        window.devicePixelRatio || 1,\r\n        2\r\n      )\r\n    );\r\n\r\n    renderer.setClearColor(\r\n      0x000000,\r\n      0\r\n    );\r\n\r\n    renderer.shadowMap.enabled = true;\r\n\r\n    renderer.shadowMap.type =\r\n      THREE.PCFSoftShadowMap;\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Lights\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    const ambient =\r\n      new THREE.AmbientLight(\r\n        0xffffff,\r\n        0.56\r\n      );\r\n\r\n    scene.add(ambient);\r\n\r\n    const key =\r\n      new THREE.DirectionalLight(\r\n        0xffffff,\r\n        1.65\r\n      );\r\n\r\n    key.position.set(\r\n      4.8,\r\n      6.8,\r\n      5.2\r\n    );\r\n\r\n    key.castShadow = true;\r\n\r\n    key.shadow.mapSize.width = 2048;\r\n    key.shadow.mapSize.height = 2048;\r\n\r\n    scene.add(key);\r\n\r\n    const rim =\r\n      new THREE.PointLight(\r\n        0xffffff,\r\n        1.15,\r\n        10\r\n      );\r\n\r\n    rim.position.set(\r\n      -3.8,\r\n      2.5,\r\n      -4\r\n    );\r\n\r\n    scene.add(rim);\r\n\r\n    const front =\r\n      new THREE.PointLight(\r\n        0xffffff,\r\n        0.84,\r\n        8\r\n      );\r\n\r\n    front.position.set(\r\n      2.2,\r\n      1.2,\r\n      3.8\r\n    );\r\n\r\n    scene.add(front);\r\n\r\n    const softTop =\r\n      new THREE.PointLight(\r\n        0xffffff,\r\n        0.72,\r\n        9\r\n      );\r\n\r\n    softTop.position.set(\r\n      0,\r\n      4.5,\r\n      1.4\r\n    );\r\n\r\n    scene.add(softTop);\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Floor\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    const floor = new THREE.Mesh(\r\n      new THREE.PlaneGeometry(\r\n        10,\r\n        10\r\n      ),\r\n      new THREE.ShadowMaterial({\r\n        opacity: 0.23\r\n      })\r\n    );\r\n\r\n    floor.rotation.x =\r\n      -Math.PI \/ 2;\r\n\r\n    floor.position.y = -2.05;\r\n\r\n    floor.receiveShadow = true;\r\n\r\n    scene.add(floor);\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Root\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    threeRoot =\r\n      new THREE.Group();\r\n\r\n    scene.add(threeRoot);\r\n\r\n    rebuildThreeModel();\r\n    resizeThree();\r\n\r\n\r\n    \/*\r\n    |--------------------------------------------------------------------------\r\n    | Render loop\r\n    |--------------------------------------------------------------------------\r\n    *\/\r\n\r\n    function render(now) {\r\n      const breathing =\r\n        Math.sin(\r\n          now * 0.00075\r\n        ) * 0.018;\r\n\r\n      if (threeRoot) {\r\n        threeRoot.rotation.y +=\r\n          (\r\n            breathing -\r\n            threeRoot.rotation.y\r\n          ) * 0.035;\r\n\r\n        threeRoot.rotation.x +=\r\n          (\r\n            breathing * 0.35 -\r\n            threeRoot.rotation.x\r\n          ) * 0.035;\r\n      }\r\n\r\n      if (activeModelGroup) {\r\n        activeModelGroup.position.y +=\r\n          (\r\n            Math.sin(\r\n              now * 0.0011\r\n            ) * 0.035 -\r\n            activeModelGroup.position.y\r\n          ) * 0.025;\r\n      }\r\n\r\n      if (\r\n        liftCabin3D &&\r\n        !window.gsap\r\n      ) {\r\n        liftCabin3D.position.y +=\r\n          (\r\n            activeAnimationTargets.liftY -\r\n            liftCabin3D.position.y\r\n          ) * 0.05;\r\n      }\r\n\r\n      if (\r\n        goodsCabin3D &&\r\n        !window.gsap\r\n      ) {\r\n        goodsCabin3D.position.y +=\r\n          (\r\n            activeAnimationTargets.goodsY -\r\n            goodsCabin3D.position.y\r\n          ) * 0.05;\r\n      }\r\n\r\n      escalatorSteps.forEach(function (step) {\r\n        const t =\r\n          now * 0.00032 +\r\n          step.userData.index * 0.13;\r\n\r\n        step.position.x =\r\n          step.userData.baseX +\r\n          Math.sin(t) * 0.055;\r\n\r\n        step.position.y =\r\n          step.userData.baseY +\r\n          Math.sin(t) * 0.014;\r\n      });\r\n\r\n      renderer.render(\r\n        scene,\r\n        camera\r\n      );\r\n\r\n      requestAnimationFrame(render);\r\n    }\r\n\r\n    requestAnimationFrame(render);\r\n  }\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Resize THREE.JS\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  function resizeThree() {\r\n    if (\r\n      !renderer ||\r\n      !camera ||\r\n      !threeCanvas\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    const rect =\r\n      threeCanvas.getBoundingClientRect();\r\n\r\n    if (\r\n      !rect.width ||\r\n      !rect.height\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    renderer.setSize(\r\n      rect.width,\r\n      rect.height,\r\n      false\r\n    );\r\n\r\n    camera.aspect =\r\n      rect.width \/ rect.height;\r\n\r\n    camera.updateProjectionMatrix();\r\n  }\r\n\r\n  window.addEventListener(\r\n    \"resize\",\r\n    resizeThree\r\n  );\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Start THREE.JS\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  initThree();\r\n\r\n\r\n  \/*\r\n  |--------------------------------------------------------------------------\r\n  | Initial state\r\n  |--------------------------------------------------------------------------\r\n  *\/\r\n\r\n  setPlant(\"lift\");\r\n  setPhase(\"call\");\r\n\r\n});<\/script><\/div>\n\t\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>Millepiani Service Assistance etmaintenance Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliersm\u00e9caniques. Un support technique con\u00e7u pour garantir s\u00e9curit\u00e9, tranquillit\u00e9, continuit\u00e9de service, rapidit\u00e9 d\u2019intervention et constance des performances de l\u2019installation. Demander des informations Pourquoi choisir Assistance et maintenancedes ascenseurs Le bon fonctionnement d\u2019une installation garantit s\u00e9curit\u00e9 et tranquillit\u00e9 aux personneset assure leur libert\u00e9 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-2485","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers m\u00e9caniques : centre d\u2019appels 24h\/24, techniciens qualifi\u00e9s et interventions rapides.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"millepiani.com -\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Assistance et maintenance des ascenseurs | Millepiani\" \/>\n\t\t<meta property=\"og:description\" content=\"Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers m\u00e9caniques : centre d\u2019appels 24h\/24, techniciens qualifi\u00e9s et interventions rapides.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-05-24T14:50:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-14T18:14:08+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Assistance et maintenance des ascenseurs | Millepiani\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers m\u00e9caniques : centre d\u2019appels 24h\/24, techniciens qualifi\u00e9s et interventions rapides.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/assistance-et-maintenance\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/assistance-et-maintenance\\\/#listItem\",\"name\":\"Assistance et maintenance\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/assistance-et-maintenance\\\/#listItem\",\"position\":2,\"name\":\"Assistance et maintenance\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/#organization\",\"name\":\"millepiani.com\",\"url\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/assistance-et-maintenance\\\/#webpage\",\"url\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/assistance-et-maintenance\\\/\",\"name\":\"Assistance et maintenance des ascenseurs | Millepiani\",\"description\":\"Services d\\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers m\\u00e9caniques : centre d\\u2019appels 24h\\\/24, techniciens qualifi\\u00e9s et interventions rapides.\",\"inLanguage\":\"fr-FR\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/assistance-et-maintenance\\\/#breadcrumblist\"},\"datePublished\":\"2026-05-24T14:50:02+00:00\",\"dateModified\":\"2026-09-14T18:14:08+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/\",\"name\":\"millepiani.com\",\"inLanguage\":\"fr-FR\",\"publisher\":{\"@id\":\"https:\\\/\\\/millepiani.com\\\/fr\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Assistance et maintenance des ascenseurs | Millepiani","description":"Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers m\u00e9caniques : centre d\u2019appels 24h\/24, techniciens qualifi\u00e9s et interventions rapides.","canonical_url":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/millepiani.com\/fr\/#listItem","position":1,"name":"Home","item":"https:\/\/millepiani.com\/fr\/","nextItem":{"@type":"ListItem","@id":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/#listItem","name":"Assistance et maintenance"}},{"@type":"ListItem","@id":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/#listItem","position":2,"name":"Assistance et maintenance","previousItem":{"@type":"ListItem","@id":"https:\/\/millepiani.com\/fr\/#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/millepiani.com\/fr\/#organization","name":"millepiani.com","url":"https:\/\/millepiani.com\/fr\/"},{"@type":"WebPage","@id":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/#webpage","url":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/","name":"Assistance et maintenance des ascenseurs | Millepiani","description":"Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers m\u00e9caniques : centre d\u2019appels 24h\/24, techniciens qualifi\u00e9s et interventions rapides.","inLanguage":"fr-FR","isPartOf":{"@id":"https:\/\/millepiani.com\/fr\/#website"},"breadcrumb":{"@id":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/#breadcrumblist"},"datePublished":"2026-05-24T14:50:02+00:00","dateModified":"2026-09-14T18:14:08+00:00"},{"@type":"WebSite","@id":"https:\/\/millepiani.com\/fr\/#website","url":"https:\/\/millepiani.com\/fr\/","name":"millepiani.com","inLanguage":"fr-FR","publisher":{"@id":"https:\/\/millepiani.com\/fr\/#organization"}}]},"og:locale":"fr_FR","og:site_name":"millepiani.com -","og:type":"article","og:title":"Assistance et maintenance des ascenseurs | Millepiani","og:description":"Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers m\u00e9caniques : centre d\u2019appels 24h\/24, techniciens qualifi\u00e9s et interventions rapides.","og:url":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/","article:published_time":"2026-05-24T14:50:02+00:00","article:modified_time":"2026-09-14T18:14:08+00:00","twitter:card":"summary_large_image","twitter:title":"Assistance et maintenance des ascenseurs | Millepiani","twitter:description":"Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers m\u00e9caniques : centre d\u2019appels 24h\/24, techniciens qualifi\u00e9s et interventions rapides."},"aioseo_meta_data":{"post_id":"2485","title":"Assistance et maintenance des ascenseurs | Millepiani","description":"Services d\u2019assistance et de maintenance pour ascenseurs, monte-charges et escaliers m\u00e9caniques : centre d\u2019appels 24h\/24, techniciens qualifi\u00e9s et interventions rapides.","keywords":null,"keyphrases":{"focus":{"keyphrase":"manutenzione ascensori","score":0,"analysis":[]},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-09-14 18:07:17","updated":"2026-09-14 18:34:32","focus_keyword":"manutenzione ascensori","additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/millepiani.com\/fr\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAssistance et maintenance\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/millepiani.com\/fr\/"},{"label":"Assistance et maintenance","link":"https:\/\/millepiani.com\/fr\/assistance-et-maintenance\/"}],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/millepiani.com\/fr\/wp-json\/wp\/v2\/pages\/2485","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/millepiani.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/millepiani.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/millepiani.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/millepiani.com\/fr\/wp-json\/wp\/v2\/comments?post=2485"}],"version-history":[{"count":4,"href":"https:\/\/millepiani.com\/fr\/wp-json\/wp\/v2\/pages\/2485\/revisions"}],"predecessor-version":[{"id":2491,"href":"https:\/\/millepiani.com\/fr\/wp-json\/wp\/v2\/pages\/2485\/revisions\/2491"}],"wp:attachment":[{"href":"https:\/\/millepiani.com\/fr\/wp-json\/wp\/v2\/media?parent=2485"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}