{"id":441,"date":"2026-06-22T08:17:14","date_gmt":"2026-06-22T08:17:14","guid":{"rendered":"https:\/\/elecrest.dreamhosters.com\/?page_id=441"},"modified":"2026-07-02T01:16:56","modified_gmt":"2026-07-02T01:16:56","slug":"about-us","status":"publish","type":"page","link":"https:\/\/elecrest.dreamhosters.com\/fr\/about-us\/","title":{"rendered":"About us"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"441\" class=\"elementor elementor-441\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-60c2633 e-flex e-con-boxed e-con e-parent\" data-id=\"60c2633\" data-element_type=\"container\" data-e-type=\"container\" id=\"pf-sec-1\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-d601978 e-con-full e-flex e-con e-child\" data-id=\"d601978\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ac2d58c elementor-widget elementor-widget-heading\" data-id=\"ac2d58c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Redefining the reliability<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ad30e2 elementor-widget elementor-widget-text-editor\" data-id=\"0ad30e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><span class=\"blur-text\" data-v-e1a6ac7c=\"\" data-v-78d1ff42=\"\"><span class=\"word\" data-v-e1a6ac7c=\"\">A\u00a0<\/span><span class=\"word\" data-v-e1a6ac7c=\"\">global\u00a0<\/span><span class=\"word\" data-v-e1a6ac7c=\"\">leader\u00a0<\/span><span class=\"word\" data-v-e1a6ac7c=\"\">in\u00a0<\/span><span class=\"word\" data-v-e1a6ac7c=\"\">intelligent\u00a0<\/span><span class=\"word\" data-v-e1a6ac7c=\"\">ultra-fast\u00a0<\/span><span class=\"word\" data-v-e1a6ac7c=\"\">charging <\/span><\/span><span class=\"blur-text\" data-v-e1a6ac7c=\"\" data-v-78d1ff42=\"\"><span class=\"sr-only\" data-v-e1a6ac7c=\"\">solutions<\/span><\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5e3e3f9 elementor-widget elementor-widget-button\" data-id=\"5e3e3f9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">LearnMore<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-bb2e816 e-con-full e-flex e-con e-child\" data-id=\"bb2e816\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-da98349 elementor-widget elementor-widget-html\" data-id=\"da98349\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\r\n<style>\r\n  #pf-bg-canvas{\r\n    position:fixed; inset:0; width:100%; height:100%;\r\n    z-index:-1; pointer-events:none; display:block;\r\n  }\r\n  html, body{ background-color:transparent; }\r\n  #pf-sec-1, #pf-sec-2, #pf-sec-3{ background-color:transparent; }\r\n<\/style>\r\n\r\n<script type=\"importmap\">\r\n{\r\n  \"imports\": {\r\n    \"three\": \"https:\/\/cdn.jsdelivr.net\/npm\/three@0.184.0\/build\/three.module.js\"\r\n  }\r\n}\r\n<\/script>\r\n\r\n<script type=\"module\">\r\nimport * as THREE from 'three';\r\nTHREE.ColorManagement.enabled = false;\r\n\r\n(function initParticleBackground(){\r\n  'use strict';\r\n  if (window.__pfBgStarted) return;\r\n  window.__pfBgStarted = true;\r\n  console.info('[pf-bg] script running. No particles? Console errors = (A) script blocked; none = (B) canvas covered.');\r\n\r\n  \/* ======================= CONFIG ======================= *\/\r\n  const CFG = {\r\n    sectionIds: ['pf-sec-1', 'pf-sec-2', 'pf-sec-3'],\r\n\r\n    cols: 240, rows: 120,\r\n    mobileCols: 150, mobileRows: 75,\r\n\r\n    \/\/ --- Himalaya silhouette (phase 1) ---\r\n    mountainCenterX: 68,   \/\/ horizontal world center (raise = further right)\r\n    mountainWidth: 145,\r\n    mountainHeight: 74,\r\n    mountainDepth: 24,     \/\/ front\/back thickness (gives 3D volume)\r\n    bobAmp: 1.6,           \/\/ small vertical float (keep small to stay readable)\r\n    bobSpeed: 0.5,\r\n    heroRotate: 0.12,      \/\/ tiny turn while scrolling through hero\r\n\r\n    \/\/ --- globe (phase 2) ---\r\n    globeRadius: 60,\r\n    globeCenterLon: 15,\r\n    globeTilt: 18,\r\n    oceanFrac: 0.22,       \/\/ few, faint ocean dots; rest are bright land\r\n    oceanSize: 0.5,        \/\/ ocean point size vs land\r\n    oceanAlpha: 0.40,      \/\/ ocean alpha vs land\r\n    globeSpin: 0.03,\r\n    globeMapUrl: 'data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAAFACAAAAAAJppLWAAATmUlEQVR42u2d65YkKwqFY8fK93\/l3T+6siouaqihAgpr1pyZ052ZCp8IXnDbXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcOggW7jtdIQ5gA2Tyu0QfnOrkMw94yS\/A3CPTPaAK8NCC1YBm6EguB+CPzVnYGa47WDP0CQew05SLrSt6b5VEZAcB7GEcKrY3JuCv6czbUkWVaXbjGZ+qLT6BB0SzVKWNgqhP39RrcghCdifnZypF4YILdamH+sb5sUlQlVNBViO4EcjsWbVz4PdGOwy1U4vnoSpXCA38Hf4lAn8W9yhUqx6GIlSowA\/fBq4GIGuj8PSUpnXlhWf+dEVeekYERuN3hQeX4UlcVg0eU0m9a3\/dvMy7KV1VQIiB9IGHteLfyOhrpXNowl\/N8DLd4r6iRvPDsya7QQWxbNJZNlQP5JSIc0dOf3B0hCgPnTkZgC\/Ja9zbc4r131KwouL0hMpTJsw3TeY8\/FWmrR3P\/lwQfKMvDGYOeT6ceeFfbwShiT9s\/fhDvVFfJtXYBhOY\/EUiNOhrk0jOwB\/Lxx1qJl9WdJawMcaZ\/FEGHCNvWfB1XsYIAqGGv5Fu\/7bBhBYNk9NxemuUyeWWw7I0Ax\/paQ79sy9D7qvPggCe52C1ej4t6jHdikS0GPiWBQhMLtIdAfxqBZ1WpHJWvipjQHbWNDP4u3p9\/IV9746WcLMMYJb\/68bcTRe8\/+8GGkN2hP9iP4kJh3ZfiMFzVwu6TT0E\/kyUJaE78x1QbwQLzyflMoUnffCFce7NYJa9bzlwPSysV3ZjACvPhYZnYZazISCoIKTOgHiKkJl3fgWRs5Os7ayGGJA9vpz3RE4pgQyfHEGWJso3ch43G5nj6I\/7cERwLmKmTVlhopa+r935aIb1rNcBPrmXbdsQT0I4tCFX1eIyydy2o1hiTErhx9c\/yOfQBFYAjCYhGMtfiKOLZ7vxd\/uLzLaiGH0lv4xgwJdaWcEkBCaWdUd0K2\/+wD12CF8dedOL9klvBfkar0P3lU883x\/RL7Y1ZW32CrGuXddoytuCbZvBA0ZWQ7R5d2QYGcUgPC8lojN+2\/egLV8b0DqAueu\/GoLVnDXKqoXs+wHiTmehUDnrziMgaAO\/h\/gufm6LRexFPvH6LCjS37sqf783LK4xILXx92wubJFtrvKNy3cERleeGUkgsDKAsQCeijIsXG8slbm0up1zNsRvacTSlsUtF2PB\/u2wEXIMlBBvXDsA20Z\/cPwyATz5Qapo4UMmmuOohhVr4YwLJX3t22wDq3OAEKcweDD4oS8YSp\/zV7gIoYW\/MH48LVl8nTX4tKfaG0A+RhAuGVOwIgCj8+l9p7iUj9EArkwg0ufRPoobnvfvM09qQ7JOLdej7m\/OSp8bQbnG\/urZiNVlrg7pOpbi4XMWv2Jg93RsKbEZELsqySGTS8lJ2ZKbCBybAV8QXCIlCeCH6H2Y0otlCM95HAsgozaWLDmc7shCTvDSZdQ7mlvSuY1ctik5Y4rBNRe5xY7dIJLvcGLSwtNLlkVKS3K1u0PyygnyfY\/euzvEpvfwNgpnxy8yHrd2ACLrwCfnJzA1HHktfPiLJtfhL3+dDEUDnvkVngWm4XEEpu8xIOMK1dzur2DZ\/1OAX6Zpmw51tW+cJZpLQFFZfIHZt+TvfuoH+1CzlqTdHJaJVKyiroBfw7rAlSsb3Ws0seUQbTgHH6\/BY1Yii5buXiQhr3YNOiLIVnp6ExQkCDwcy+E241nApmd5swrm1sxMFAew55EDxAboF8\/OL3hKE8jEDYitqKx6JyOh59uV3MQQPG4tce6JNovD59qZcgD2I1AQwFvxpIpRscB0XADg3qNR6LstC4WK9yOnAQxyDLV3NE+vGEzQ2ENOorkLbR0xNW4yJbtHBFYa1sQxcQ0ifym2J4AUrDeBzi\/iugfc2gRaXY\/kS\/PXt2dwFtUH9F3frojkx+Faj51c\/Mr4tanl3juj5FB1hB4YwQSdcwDfTlYcppQ7G3D2ugH4Xrd792YCI93gKD7g\/LX5mn1IY0X9RafFIDh\/LXSLufC7VkdFzy2ZAS8JUDV\/LZQ7GYA\/WTcuqarmjsFiVZl292D1luZ4g8UROnRF\/YUBUzmkkfm9QTMnBFCF+cAs\/pLFM7mCfucBENQC3\/9W4KE4OiKP7eh3f39bQA3WYSaJAbGJVOaIv+eePLf4dJZLtQe8X8x5pfQZPCD0DKdfz8eED0RuHmKDP\/UecKpF4RRT\/+\/C4Om9dzx\/r0oXiNP5IjZS\/gQAjp12H15n4uXGXH599NqXuoUyD0MAruACz0VgztZhNIaPT2kYp7xaFTNdFj5X9s26QD5rBC6mSjowktu2kd\/\/d\/7n9YOKU+ImJ37Ne0CM13qiBQxUZ+SLflFJfhJ+HaOF7m17QCg4EhBbU8EdP5R7a1JIscVh67JTsLADRJJMHphDxWVpSA0qxmls27JdwEd0GqbqssXAG+hQTt7ReeM7vzA2Els0csq9YD3z8c8F6fq5SuBi4b0SZCTXRQ+NGUpDZJwEs1oRfN8YFYWVKDqMmAx0mxhgjAfsMY5VzL+R5bHgn6ImJ5a5Wv3lKzhk2mbmkPEbdgEMbFiEExNeCmcVb69JH4hGyJdv7fZAxppxLhfI9PUnJD\/x3UTYNJ9CQCSYaH7fFZtZAhUAyJKWBUJ5KiUQD9FsQwMMy4KbBzOyMSArPsGbJ1G6z4YtElR0MIDVZRgopg8FVlXpABncB+nz5jc0Ow2b\/BU1jlbGd69SE1Bluhnw28rfL9ZP4CHzaHzNFfrMN0nwh1gObBhAdP8hAwDaST7waD7FV0HuBPZR\/C7bL2v8VcH6+09LJbU4SO0fmdFltboZC\/92cCaz2P1u7+9BwoZvNpmsLf9ZlVF6Hu8Bi1ekl3wHBqt0eJcYWxURLbBUQT75m1bDa9qODijydhPuu1eyW8AjJ0BKj4FZPWBOdWFodHxeF3oSD8inVBDpDy6Bn\/BpwGFa3qU6V5PXS6YjPX72wb0vEfbumzkCN3L8ki57qiL+gz\/30yaeGGXuBePVc5oCnoHdvhUPfwyAnNgTSl1MR0H9RumkvZ\/\/S30vKZf7DFSz7IHU8k0p\/H+fbSKX8LTkfMy8Bj1XPFLFcpZkdLULmR+dIQFOw4Ro5s\/ufmF6AL+jjBVtooaqqO0MwApLsfeYmHkh+jQBo2JMzLM+gVov0LvgzryHEYqDoNuYFy+F3\/LLkd8MvIyfVc6IaKulJiZGPPCjgJ7UPAmHqoZlg4qBFi\/0gBDNO3\/maRwjpoErY2p2gPtO1Hj9W3171TUsTXnA0PtHQ\/eEh5RYr7xqx6xPPL1sQslc9JOvpWGugEjzNzYTVnI0FPXs4vHYh2BOt2vyBbk\/9LssyxHbwpDC62UjMh6Q+p7uEBxjRVlwr8grPkRzqv\/0nkGGWKd1ToscBT89GqvMA3Y8Jo7wKivT96H5+znTD0GMWE3B+MBe0fzy3gwIK46XMQ47hJTFcihsXe7WHWITyDg0NW0p5B+POehnwILMGAAf9oRLWoe6WGZ5AKMmmP4uMGogibYP71U7DkBVD9VETprOfzCd+eFxY59C2fUOfQUqf18c5ynZ0FxPVHp+AjM\/Esy0oyHMAqdh4m7w\/38OWuLgcWl2mk\/gVFYhDprGmBqrwDIbz5aoLYKbX700u6b\/wh5Q2eCQ2v4RPfKIbVgxOdWvZV6NAAVt6EkgRLoa34YagaDyKvlqC8l3JKEne2Du6YpRRQwNvBec9kGz4YlXxw5aDnxghA808WB18vI2Z2IQ6Du0+F1nUBOE23gxPbqXzgHBCgT6WXjM7NU72OHFfw5a+rKyuBs4NRRaf+10uIgDCWSNbbIvbN1fuYu8ODvq9o3dF9MZAPTHITZX2rBT0RzVQCTOmh+\/sbuD2k0xx\/uEiyGOSmQBqG8GE72RzGN5UI29FJ6FH8tb9ukUlQP4nQLw+LcOd5WS\/HHIfSVDHhBf94entGPRWrpA1vWOv+juwf8NWV+wNAXnX+HiBAii61+PfwR\/Ohyhxd3WEC8oZLFarAJkbBwB2vq5m\/MLyFPSegRmdyM5P\/yVxRyzC74bVKAUgRjez675XPpPsEB9wDE5KWR+VsYuzCquuKVPp55eBoID+JoEdPxddIKzx24OiAcAOR6KFQBsT2DoSii1m+V3DTBGoETtO3sxoPDMieN1FVQFp1Ju4ZwiUzC+WM4DqjhfrKC5570kDf5vEQ84cnBDu1NgsA6D2NK9SQA59V4bxn8zKTYTr+EBLe0Od70Scrjuxlzd9B3uu9Okq3ECJYHIWA+urHoSUq0NK0XNMah5yfVL8JI5d2yV3RPRM\/I3spmJIh4jX2RZxQMO6yq1G+O23MJbKy50di3B+FmGvzEFT9Tz93h9BHdtEf126RbJgsdkdKbCkcg8i189\/W34oKMW99XUzyHWrfkkpDSBnJ4cDgOzJYLLAbh1flrEQFB9fUGJj2P0uIX8XZphm93khZKQUV2nenAZm41PJxa+N9jBeOyI3Nx6HgDZwRVoaKLIE\/AIZ2k8A3hNRBItLydwaQB7dZ\/K+XvKaX+Kct8PzOChxGrFQsO+NH9qdvVg4veQcTFxdg9IE7bnpt8MTD5Tg4c\/v7X+4FOLFq4dwB4qoAU38FB9iIm6CferMaGw0WNAOy5QmEDmv1seedSp+v1Sg0fyLVw5tzAHV78KEZmEj84z3wkaXIie8cEkkT6dEwq2G194rh9l2po0YHwaGlTndej\/GQi+8zIT95f+PlH\/5KsD6ACe0g6eUooURH\/cRa+6Z8zEJucz\/YvRJmLABxSfk4lzShL0gY\/9Wu8wwhDTm45Tv5UBH\/nBqWIjq\/RgU1PUjwpNI8viBWVW+sDVPSAmHFOt1ILHJjKWUp\/y4QkBxHT8mZh2mP43qFHwZ2md6uWP0Mff4+5djexOjsYZVd8DeIHiHVwYwDYEQit\/ugdU06qIKychUG1uakKP3dS2dgyo2QFCS0\/S2xl82VCzHhCz80s9I4lhB4iS0RY7m2B3Cp6MwONTwao9OdsGurvdcBlqEaTQZ8f0g01v\/ZmOATFPtombzaF3GNUVbCPaR5C2nQ3UNCpUqQq6NYsGY4UbzGfBmPVdTEw88o9fYX4dsD4SFCgGvlw+\/9x1Pw\/o2fxrD1fpDYFJhp\/CakCsbQV1cDnuNKPvhIiGptDoF1nzETiAM8x8NNuAxPmx5KqNx4Ca7C3NX59NGKQ65gCqdLDyhRJafhyIo707IKI\/oGrnjd0+PvUUvEZlYuOWwJR7wTOlH6uOj4\/T59IsGKi4SvVx+vQ1ye4oKSdwd\/4kW4RQC2FYO3QA7eAeCMwhd85WKB\/fnQjVPnH6UNI9oIuoOIBiHhe2musAurgHnCHo8KBTVXP3ZfiDMpPCCVxqCoayH\/UtmbUAhLfHAfRM2GVVAN0BjmoVVhuiVN5LmtJ68k30LqpewgM6f69ai4Jmw5BthnlAKGsfDGkTZdr284Dujjvi973v3LIgz8ct7vQVtDbNHmbXSNEMDKroHy1pmY9UMFWVMa+fp2PTMx8\/80W4Kn2iWueo+I2ZPaDjNFjryP74NAC2jkhchmT3Bx+4z8ufiwXTTbwQ7Q5QrXZhMD\/zGVi78lHxYcy7Duj49dcwv\/+Nengn9YCO31AzoNJumHInxOEzonFMnoS46CX2D1nTHtBXYVQYoTAM5KkEzlxTMOjzr3Y\/wJ8PYIKA6fn4kMswKxTVJP77y8ZjwOt5SZ+UTSQimMNn0BNgNWZA7V+e6jCC8yeXh5RYaxYAiVe7QS4i3uJio91+j5w\/y8myL0S7iCbL06wDuvez6P8sA+grLlO4iYkWot0H+swl7AIdQXuy+2BycQBbOECsxt8cQbBnwaYJtN9rXwf0UeddeD8FefjnHtDFZeUY8OYb3Sm6BxTKCH2PxGPA0dS5u3MPqMcDurgHdB\/osgKAvhTjAGqaex1BB1AUQgfQxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxWVxmfYACf1wjAMoSZ\/z5wDKsef4OYBy+Dl6lmR3\/laU+hd9Wt8\/xGT4TdWlXs863xSVo7lOFx9msxa2CfGr7FZsIeCKUvhiF8cwg7mshQnhK7XV+Ev6cADnWXjhK9OJVYiAA2iwM9fXjfnSdqIFSrAqgP8jHYt3g49hAxsYT0+BHCwE4H\/XR4MdOraZ7+2srz4TlgRQtEc8OjTEaiexsXkVlwbDIgCKd4lytrVTmQ7TAcjRg+rXseH310FRgxorjKj6rbjSleTz+umISZj6jGmvMif0esDCTOK8U9C\/UqBXYe3hA6GePj5sUQYmIjh8ZubgT3eqjjMFqgx+YvP0TRzChtNnOQYk+DdB4tdfoaOZ4QCaSYKbGotvm0Tnby36XluLTVMxNPii5h7d8evrFDCVceDo2cLvlck4I3pO3WDbfHLtovDkBbb7iSanbyY6tZsGzt4yU\/AUBPLhjoTLeDshBzudu94ohC\/8OadP1lzYcgncjB65vTcdDqAZALfoZW8qRpDpFe47gHAWpTzFmzieuvoXdnIs6LMTOH6msr8OGGQtdr0ajp5ZAA3YCN8bcpiiOz4Fm7QanDdLCL5KJ9V327FTjyDm5M\/FCoUOoIsohdiI+7k+OIAuYzBMXmvN2yZxcXlBI98g7Ai6SADo4tJKdleBiwPo4gC6uDiALg6gi4sD6OIAuriMkH9r0\/nkHaaEEQAAAABJRU5ErkJggg==',\r\n\r\n    \/\/ --- logo (phase 3) ---\r\n    logoUrl: 'https:\/\/elecrest.dreamhosters.com\/wp-content\/uploads\/2026\/06\/ELECREST-Logo.png',\r\n    logoText: 'ELECREST',\r\n    logoInkOnWhite: false, logoLumThreshold: 200,\r\n    logoWidth: 230, logoDepth: 8, logoOffsetX: 0, logoOffsetY: 0,\r\n\r\n    \/\/ --- look ---\r\n    pointSize: 2.8,\r\n    colorLow:  '#0a2a6b',\r\n    colorHigh: '#2ee6ff',\r\n    baseAlpha: 0.62,\r\n\r\n    \/\/ --- timing ---\r\n    stablePx: 200,\r\n    damping: 0.08\r\n  };\r\n\r\n  \/* ======================= setup ======================= *\/\r\n  const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n  const mobile = window.matchMedia('(max-width: 768px)').matches;\r\n  const COLS = mobile ? CFG.mobileCols : CFG.cols;\r\n  const ROWS = mobile ? CFG.mobileRows : CFG.rows;\r\n  const COUNT = COLS * ROWS;\r\n\r\n  const canvas = document.createElement('canvas');\r\n  canvas.id = 'pf-bg-canvas';\r\n  document.body.appendChild(canvas);\r\n\r\n  const renderer = new THREE.WebGLRenderer({ canvas, antialias:true, alpha:false });\r\n  renderer.outputColorSpace = THREE.LinearSRGBColorSpace;\r\n  if (!renderer.getContext()) console.error('[pf-bg] WebGL context FAILED.');\r\n  setTimeout(() => { const cv = document.getElementById('pf-bg-canvas');\r\n    console.info('[pf-bg] canvas:', !!cv, cv ? cv.width+'x'+cv.height : '', '| body bg:',\r\n      getComputedStyle(document.body).backgroundColor); }, 1200);\r\n\r\n  const scene  = new THREE.Scene();\r\n  const camera = new THREE.PerspectiveCamera(55, 1, 0.1, 2000);\r\n  \/\/ Hero: front-on, slightly raised, aimed right so the range sits on the right.\r\n  const CAM_HERO  = { pos:new THREE.Vector3(-10, 22, 150), tgt:new THREE.Vector3(30, 30, 0) };\r\n  const CAM_FRONT = { pos:new THREE.Vector3(0, 0, 180),    tgt:new THREE.Vector3(0, 0, 0) };\r\n  camera.position.copy(CAM_HERO.pos);\r\n  camera.lookAt(CAM_HERO.tgt);\r\n\r\n  \/* ======================= geometry & targets ======================= *\/\r\n  const positions = new Float32Array(COUNT * 3); \/\/ Himalaya silhouette\r\n  const scatter   = new Float32Array(COUNT * 3); \/\/ globe\r\n  const logo      = new Float32Array(COUNT * 3);\r\n  const randoms   = new Float32Array(COUNT);\r\n  const landFlags = new Float32Array(COUNT);     \/\/ 1 = land, 0 = ocean\r\n\r\n  \/\/ --- Himalaya \/ Everest skyline: control points (x 0..1, height 0..1) ---\r\n  const RIDGE = [\r\n    [0.00,0.05],[0.06,0.22],[0.12,0.15],[0.18,0.36],[0.24,0.27],\r\n    [0.30,0.48],[0.36,0.39],[0.42,0.66],[0.47,0.54],[0.52,1.00], \/\/ Everest summit\r\n    [0.55,0.72],[0.60,0.88],[0.66,0.60],[0.72,0.70],[0.78,0.46], \/\/ Lhotse-ish\r\n    [0.84,0.54],[0.90,0.31],[0.96,0.18],[1.00,0.06]\r\n  ];\r\n  function ridgeAt(x){\r\n    for (let i = 0; i < RIDGE.length - 1; i++){\r\n      if (x >= RIDGE[i][0] && x <= RIDGE[i+1][0]){\r\n        const t = (x - RIDGE[i][0]) \/ (RIDGE[i+1][0] - RIDGE[i][0]);\r\n        return RIDGE[i][1]*(1-t) + RIDGE[i+1][1]*t;\r\n      }\r\n    }\r\n    return RIDGE[RIDGE.length-1][1];\r\n  }\r\n  for (let k = 0; k < COUNT; k++){\r\n    const x = Math.random();\r\n    let ry = ridgeAt(x);\r\n    ry = Math.max(0.02, ry + (Math.random()-0.5)*0.035); \/\/ jagged fuzz\r\n    const y = ry * Math.pow(Math.random(), 0.8);          \/\/ denser near the ridge\r\n    positions[k*3]   = (x - 0.5) * CFG.mountainWidth + CFG.mountainCenterX;\r\n    positions[k*3+1] = y * CFG.mountainHeight;\r\n    positions[k*3+2] = (Math.random()-0.5) * CFG.mountainDepth;\r\n    randoms[k] = Math.random();\r\n  }\r\n\r\n  \/\/ --- globe math: Europe-facing, north up, slight forward tilt ---\r\n  const D2R = Math.PI\/180, TILT = CFG.globeTilt * D2R;\r\n  const GLOBE_AXIS = new THREE.Vector3(0, Math.cos(TILT), Math.sin(TILT));\r\n  function lonlatToWorld(lon, lat){\r\n    const lo = (lon - CFG.globeCenterLon)*D2R, la = lat*D2R;\r\n    const x = Math.cos(la)*Math.sin(lo), y = Math.sin(la), z = Math.cos(la)*Math.cos(lo);\r\n    const ct = Math.cos(TILT), st = Math.sin(TILT);\r\n    return [x, y*ct - z*st, y*st + z*ct];\r\n  }\r\n  function buildGlobe(landList){\r\n    const R = CFG.globeRadius, GA = Math.PI*(3 - Math.sqrt(5));\r\n    const oceanN = landList ? Math.floor(COUNT * CFG.oceanFrac) : COUNT;\r\n    for (let k = 0; k < COUNT; k++){\r\n      let lon, lat, isLand = 0;\r\n      if (k < oceanN || !landList){\r\n        const t = (k + 0.5)\/COUNT;\r\n        lat = 90 - Math.acos(1 - 2*t)\/D2R;\r\n        lon = ((GA*k)\/D2R) % 360 - 180;\r\n      } else {\r\n        const p = landList[(Math.random()*landList.length)|0];\r\n        lon = p[0]; lat = p[1]; isLand = 1;\r\n      }\r\n      const w = lonlatToWorld(lon, lat);\r\n      const rr = R + (Math.random()-0.5)*1.5;\r\n      scatter[k*3] = w[0]*rr; scatter[k*3+1] = w[1]*rr; scatter[k*3+2] = w[2]*rr;\r\n      landFlags[k] = isLand;\r\n    }\r\n  }\r\n  buildGlobe(null); \/\/ placeholder faint sphere until the map loads\r\n\r\n  \/\/ --- logo sampler ---\r\n  function sampleToLogo(srcCanvas){\r\n    const w = srcCanvas.width, h = srcCanvas.height;\r\n    const data = srcCanvas.getContext('2d').getImageData(0,0,w,h).data;\r\n    const step = Math.max(1, Math.floor(Math.sqrt((w*h)\/(COUNT*3))));\r\n    const pts = [];\r\n    for (let y = 0; y < h; y += step) for (let x = 0; x < w; x += step){\r\n      const idx = (y*w + x)*4, a = data[idx+3];\r\n      const lum = (data[idx]+data[idx+1]+data[idx+2])\/3;\r\n      const ink = CFG.logoInkOnWhite ? (a>40 && lum<CFG.logoLumThreshold) : (a>40);\r\n      if (ink) pts.push(x, y);\r\n    }\r\n    const aspect = w\/h, worldW = CFG.logoWidth, worldH = worldW\/aspect;\r\n    for (let k = 0; k < COUNT; k++){\r\n      let px = w\/2, py = h\/2;\r\n      if (pts.length){\r\n        const j = (Math.random()*(pts.length>>1)|0)*2;\r\n        px = pts[j] + (Math.random()-0.5)*step; py = pts[j+1] + (Math.random()-0.5)*step;\r\n      }\r\n      logo[k*3]   = (px\/w - 0.5)*worldW + CFG.logoOffsetX;\r\n      logo[k*3+1] = (0.5 - py\/h)*worldH + CFG.logoOffsetY;\r\n      logo[k*3+2] = (Math.random()-0.5)*CFG.logoDepth;\r\n    }\r\n  }\r\n  (function buildTextLogo(){\r\n    const cv = document.createElement('canvas'); cv.width = 1280; cv.height = 240;\r\n    const ctx = cv.getContext('2d');\r\n    ctx.fillStyle = '#ffffff'; ctx.font = '900 150px Inter, Arial, sans-serif';\r\n    ctx.textAlign = 'center'; ctx.textBaseline = 'middle';\r\n    ctx.fillText(CFG.logoText, 640, 120); sampleToLogo(cv);\r\n  })();\r\n\r\n  const geo = new THREE.BufferGeometry();\r\n  geo.setAttribute('position', new THREE.BufferAttribute(positions, 3));\r\n  geo.setAttribute('aScatter', new THREE.BufferAttribute(scatter, 3));\r\n  geo.setAttribute('aLogo',    new THREE.BufferAttribute(logo, 3));\r\n  geo.setAttribute('aRand',    new THREE.BufferAttribute(randoms, 1));\r\n  geo.setAttribute('aLand',    new THREE.BufferAttribute(landFlags, 1));\r\n\r\n  function loadImage(url, onCanvas){\r\n    if (!url) return;\r\n    const im = new Image();\r\n    if (!url.startsWith('data:')) im.crossOrigin = 'anonymous';\r\n    im.onload = () => {\r\n      const cv = document.createElement('canvas');\r\n      cv.width = im.naturalWidth; cv.height = im.naturalHeight;\r\n      cv.getContext('2d').drawImage(im, 0, 0);\r\n      try { onCanvas(cv); } catch (e) { console.warn('[pf-bg] sampling failed', url, e); }\r\n    };\r\n    im.onerror = () => console.warn('[pf-bg] image failed', url);\r\n    im.src = url;\r\n  }\r\n  loadImage(CFG.globeMapUrl, (cv) => {\r\n    const w = cv.width, h = cv.height;\r\n    const data = cv.getContext('2d').getImageData(0,0,w,h).data;\r\n    const step = Math.max(1, Math.floor(Math.sqrt((w*h)\/(COUNT*2))));\r\n    const land = [];\r\n    for (let y = 0; y < h; y += step) for (let x = 0; x < w; x += step){\r\n      if (data[(y*w + x)*4] > 100) land.push([(x\/w)*360 - 180, 90 - (y\/h)*180]);\r\n    }\r\n    if (land.length){\r\n      buildGlobe(land);\r\n      geo.getAttribute('aScatter').needsUpdate = true;\r\n      geo.getAttribute('aLand').needsUpdate = true;\r\n    }\r\n  });\r\n  loadImage(CFG.logoUrl, (cv) => { sampleToLogo(cv); geo.getAttribute('aLogo').needsUpdate = true; });\r\n\r\n  \/* ======================= shader ======================= *\/\r\n  const uniforms = {\r\n    uTime:{value:0}, uM1:{value:0}, uM2:{value:0}, uDrift:{value:0}, uHeroRot:{value:0},\r\n    uGlobeSpin:{value: reduce?0:CFG.globeSpin}, uGlobeAxis:{value:GLOBE_AXIS},\r\n    uCenterX:{value:CFG.mountainCenterX}, uMountainHeight:{value:CFG.mountainHeight},\r\n    uBobAmp:{value: reduce?0:CFG.bobAmp}, uBobSpeed:{value:CFG.bobSpeed},\r\n    uSize:{value:CFG.pointSize}, uPixelRatio:{value:Math.min(window.devicePixelRatio,2)},\r\n    uOceanSize:{value:CFG.oceanSize}, uOceanAlpha:{value:CFG.oceanAlpha},\r\n    uBaseAlpha:{value:CFG.baseAlpha},\r\n    uColLow:{value:new THREE.Color(CFG.colorLow)}, uColHigh:{value:new THREE.Color(CFG.colorHigh)}\r\n  };\r\n\r\n  const HELPERS = `\r\n    vec3 rotAxis(vec3 p, vec3 k, float a){ \/\/ Rodrigues rotation around unit axis k\r\n      float c=cos(a), s=sin(a);\r\n      return p*c + cross(k,p)*s + k*dot(k,p)*(1.0-c);\r\n    }`;\r\n\r\n  const vert = `\r\n    attribute vec3 aScatter;\r\n    attribute vec3 aLogo;\r\n    attribute float aRand;\r\n    attribute float aLand;\r\n    uniform float uTime, uM1, uM2, uHeroRot, uGlobeSpin, uDrift, uCenterX,\r\n                  uMountainHeight, uBobAmp, uBobSpeed, uSize, uPixelRatio,\r\n                  uOceanSize, uOceanAlpha;\r\n    uniform vec3 uGlobeAxis;\r\n    varying float vHeight;\r\n    varying float vFog;\r\n    varying float vAlpha;\r\n    ${HELPERS}\r\n\r\n    void main(){\r\n      \/\/ ---- Himalaya silhouette (position already holds x, height, depth) ----\r\n      vec3 terr = position;\r\n      terr.y += sin(uTime*uBobSpeed + aRand*6.2831) * uBobAmp;   \/\/ small float\r\n      vec2 rc = terr.xz - vec2(uCenterX, 0.0);                   \/\/ tiny scroll turn\r\n      float ca = cos(uHeroRot), sa = sin(uHeroRot);\r\n      terr.xz = vec2(rc.x*ca - rc.y*sa, rc.x*sa + rc.y*ca) + vec2(uCenterX, 0.0);\r\n\r\n      \/\/ ---- globe: slow spin around its tilted axis ----\r\n      vec3 scat = rotAxis(aScatter, normalize(uGlobeAxis), uDrift * uTime * uGlobeSpin);\r\n\r\n      \/\/ ---- staggered morph ----\r\n      float s1 = clamp((uM1 - aRand*0.2)\/0.8, 0.0, 1.0); s1 = s1*s1*(3.0-2.0*s1);\r\n      float s2 = clamp((uM2 - aRand*0.2)\/0.8, 0.0, 1.0); s2 = s2*s2*(3.0-2.0*s2);\r\n      vec3 pos = mix(terr, scat, s1);\r\n      pos = mix(pos, aLogo, s2);\r\n\r\n      \/\/ color by mountain height; biased bright once morphed\r\n      vHeight = clamp(position.y \/ uMountainHeight, 0.0, 1.0);\r\n      vHeight = mix(vHeight, 0.85, max(s1, s2));\r\n\r\n      \/\/ ocean dimming (only while the globe is showing)\r\n      float globeW   = s1 * (1.0 - s2);\r\n      float oceanMsk = (1.0 - aLand) * globeW;\r\n      float dimSize  = mix(1.0, uOceanSize, oceanMsk);\r\n      vAlpha         = mix(1.0, uOceanAlpha, oceanMsk);\r\n\r\n      vec4 mv = modelViewMatrix * vec4(pos, 1.0);\r\n      vFog = smoothstep(360.0, 60.0, -mv.z);\r\n      gl_PointSize = uSize * uPixelRatio * (150.0 \/ -mv.z) * (0.6 + 0.8*aRand) * dimSize;\r\n      gl_Position = projectionMatrix * mv;\r\n    }`;\r\n\r\n  const frag = `\r\n    precision mediump float;\r\n    uniform vec3 uColLow, uColHigh;\r\n    uniform float uBaseAlpha;\r\n    varying float vHeight;\r\n    varying float vFog;\r\n    varying float vAlpha;\r\n    void main(){\r\n      vec2 c = gl_PointCoord - 0.5;\r\n      float r = dot(c, c);\r\n      if (r > 0.25) discard;\r\n      float a = smoothstep(0.25, 0.0, r) * vFog * uBaseAlpha * vAlpha;\r\n      if (a < 0.01) discard;\r\n      gl_FragColor = vec4(mix(uColLow, uColHigh, vHeight), a);\r\n    }`;\r\n\r\n  const material = new THREE.ShaderMaterial({\r\n    uniforms, vertexShader: vert, fragmentShader: frag,\r\n    transparent: true, depthTest: false, depthWrite: false,\r\n    blending: THREE.AdditiveBlending\r\n  });\r\n  scene.add(new THREE.Points(geo, material));\r\n\r\n  \/* ======================= scroll anchors & timing ======================= *\/\r\n  const clamp = (v,a,b) => Math.min(Math.max(v,a),b);\r\n  const sstep = (e0,e1,x) => { e1 = Math.max(e1, e0+1); const t = clamp((x-e0)\/(e1-e0),0,1); return t*t*(3-2*t); };\r\n\r\n  let offs = null;\r\n  function measure(){\r\n    const g = id => document.getElementById(id);\r\n    const s1 = g(CFG.sectionIds[0]), s2 = g(CFG.sectionIds[1]), s3 = g(CFG.sectionIds[2]);\r\n    const y = window.scrollY || window.pageYOffset;\r\n    if (s1 && s2 && s3){\r\n      offs = {\r\n        t1: s1.getBoundingClientRect().top + y, h1: s1.offsetHeight,\r\n        t2: s2.getBoundingClientRect().top + y, h2: s2.offsetHeight,\r\n        t3: s3.getBoundingClientRect().top + y, h3: s3.offsetHeight\r\n      };\r\n    } else {\r\n      const vh = window.innerHeight;\r\n      offs = { t1:0, h1:vh, t2:vh, h2:vh, t3:vh*2, h3:vh };\r\n    }\r\n  }\r\n  window.addEventListener('resize', () => { measure(); resize(); });\r\n  window.addEventListener('load', measure);\r\n  setTimeout(measure, 600);\r\n  measure();\r\n\r\n  \/* ======================= sizing ======================= *\/\r\n  function resize(){\r\n    const w = window.innerWidth, h = window.innerHeight;\r\n    renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\r\n    renderer.setSize(w, h, false);\r\n    uniforms.uPixelRatio.value = Math.min(window.devicePixelRatio, 2);\r\n    camera.aspect = w \/ h; camera.updateProjectionMatrix();\r\n  }\r\n  resize();\r\n\r\n  \/* ======================= render loop ======================= *\/\r\n  const clock = new THREE.Clock();\r\n  const camPos = new THREE.Vector3(), camTgt = new THREE.Vector3();\r\n  const k = CFG.damping, S = CFG.stablePx;\r\n  const maxRot = reduce ? 0 : CFG.heroRotate;\r\n\r\n  renderer.setAnimationLoop(() => {\r\n    uniforms.uTime.value = clock.getElapsedTime();\r\n    if (!offs) measure();\r\n\r\n    const vh = window.innerHeight;\r\n    const y  = window.scrollY || window.pageYOffset;\r\n    const a1 = offs.t1 + offs.h1\/2 - vh\/2;\r\n    const a2 = offs.t2 + offs.h2\/2 - vh\/2;\r\n    const a3 = offs.t3 + offs.h3\/2 - vh\/2;\r\n\r\n    const m1 = sstep(a1 + S, a2 - S, y);\r\n    const m2 = sstep(a2 + S, a3 - S, y);\r\n    const drift = clamp(m1 * (1 - m2), 0, 1);\r\n    const rot = clamp((y - a1) \/ Math.max(a2 - a1, 1), 0, 1) * maxRot;\r\n\r\n    uniforms.uM1.value      += (m1 - uniforms.uM1.value) * k;\r\n    uniforms.uM2.value      += (m2 - uniforms.uM2.value) * k;\r\n    uniforms.uDrift.value   += (drift - uniforms.uDrift.value) * k;\r\n    uniforms.uHeroRot.value += (rot - uniforms.uHeroRot.value) * k;\r\n\r\n    const camF = uniforms.uM1.value;\r\n    camPos.copy(CAM_HERO.pos).lerp(CAM_FRONT.pos, camF);\r\n    camTgt.copy(CAM_HERO.tgt).lerp(CAM_FRONT.tgt, camF);\r\n    camera.position.copy(camPos);\r\n    camera.lookAt(camTgt);\r\n\r\n    renderer.render(scene, camera);\r\n  });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-97d669f e-flex e-con-boxed e-con e-parent\" data-id=\"97d669f\" data-element_type=\"container\" data-e-type=\"container\" id=\"pf-sec-2\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2749a19 elementor-widget elementor-widget-heading\" data-id=\"2749a19\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">About Elecrest<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d5e7ec8 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"d5e7ec8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>We are not an ordinary charging equipment company. Elecrest is a deep tech company based on first-principles engineering. We deconstruct the energy conversion and transmission chain to the essential level of semiconductor physics and power grid dynamics.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-dc9fba8 e-flex e-con-boxed e-con e-parent\" data-id=\"dc9fba8\" data-element_type=\"container\" data-e-type=\"container\" id=\"pf-sec-3\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-01d99e9 elementor-widget elementor-widget-heading\" data-id=\"01d99e9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">OUR COMPANY<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ee1b8e5 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"ee1b8e5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>In 2026, Elecrest was founded in the Netherlands. We originated from an insight: the real bottleneck of global electrification is not energy itself, but the systemic and widely overlooked intelligent gaps in its flow process. While the industry is content with assembling components, we are committed to a full-stack reconstruction from material interfaces and power topologies to network protocols, using the laws of physics as the only standard to eliminate inherent losses at every link.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-10618fd elementor-widget elementor-widget-button\" data-id=\"10618fd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Learn more<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Redefining the reliability A\u00a0global\u00a0leader\u00a0in\u00a0intelligent\u00a0ultra-fast\u00a0charging solutions LearnMore About Elecrest We are not an ordinary charging equipment company. Elecrest is a deep tech company based on first-principles engineering. We deconstruct the energy conversion and transmission chain to the essential level of semiconductor physics and power grid dynamics. OUR COMPANY In 2026, Elecrest was founded in the Netherlands. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-441","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/elecrest.dreamhosters.com\/fr\/wp-json\/wp\/v2\/pages\/441","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elecrest.dreamhosters.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elecrest.dreamhosters.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elecrest.dreamhosters.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/elecrest.dreamhosters.com\/fr\/wp-json\/wp\/v2\/comments?post=441"}],"version-history":[{"count":10,"href":"https:\/\/elecrest.dreamhosters.com\/fr\/wp-json\/wp\/v2\/pages\/441\/revisions"}],"predecessor-version":[{"id":962,"href":"https:\/\/elecrest.dreamhosters.com\/fr\/wp-json\/wp\/v2\/pages\/441\/revisions\/962"}],"wp:attachment":[{"href":"https:\/\/elecrest.dreamhosters.com\/fr\/wp-json\/wp\/v2\/media?parent=441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}