fitnes: add the Fitness v2 mockup as the design reference
legacy/Fitnes v2/ is the static mockup the landing was just ported from (README points to it as the current visual reference). launch.json gains a fitnes-v2-legacy entry that serves it on :8090 for side-by-side review. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@@ -6,6 +6,12 @@
|
|||||||
"runtimeExecutable": "npm",
|
"runtimeExecutable": "npm",
|
||||||
"runtimeArgs": ["run", "dev:client"],
|
"runtimeArgs": ["run", "dev:client"],
|
||||||
"port": 5173
|
"port": 5173
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "fitnes-v2-legacy",
|
||||||
|
"runtimeExecutable": "python3",
|
||||||
|
"runtimeArgs": ["-m", "http.server", "8090", "--directory", "/Users/yp/projects/exodevices/fitnes/legacy/Fitnes v2"],
|
||||||
|
"port": 8090
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
Загрузить все файлы и папку assets в один каталог на сервере. Открываемый файл: index.html.
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Fitnes — EXO Group landing
|
||||||
|
|
||||||
|
Готовая серверная кодовая база.
|
||||||
|
|
||||||
|
## Структура
|
||||||
|
- index.html — разметка страницы
|
||||||
|
- styles.css — стили
|
||||||
|
- script.js — интерактив, конструктор, калькулятор и форма
|
||||||
|
- assets/ — локальные изображения и графика
|
||||||
|
|
||||||
|
## Размещение
|
||||||
|
Загрузите содержимое папки Fitnes на сервер, сохраняя структуру файлов. Точка входа — index.html.
|
||||||
|
|
||||||
|
Форма отправляет данные на endpoint, заданный в script.js. Перед публикацией проверьте адрес API и серверную обработку заявок.
|
||||||
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 156 KiB |
|
After Width: | Height: | Size: 67 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 73 KiB |
|
After Width: | Height: | Size: 110 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 226 KiB |
|
After Width: | Height: | Size: 130 KiB |
|
After Width: | Height: | Size: 114 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 128 128'><rect width='128' height='128' rx='27' fill='#0A2540'/><path d='M30 29h38c22 0 37 14 37 35S90 99 68 99H30V29Zm19 18v34h18c11 0 18-7 18-17s-7-17-18-17H49Z' fill='white'/><path d='M45 58h27v12H45z' fill='#00C4B4'/></svg>
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
const FORM_ENDPOINT = '/api/leads/fitness-centers';
|
||||||
|
const devices = {
|
||||||
|
therapy: {name:'ЭкзоТерапия', role:'флагманский full-body recovery и premium-продукт', benefits:['заметный якорь зоны','восстановительный этап после нагрузки','повышает технологичность сервиса']},
|
||||||
|
magnet: {name:'ЭкзоМагнит 3 в 1', role:'medical-core для нейромышечных и опорно-двигательных маршрутов', benefits:['магнит + УВТ + инфракрасный модуль','работа по медицинскому протоколу','ядро для спортивной медицины']},
|
||||||
|
tecar: {name:'ЭкзоТекар 3 в 1', role:'активная локальная работа с тканями, фасциями и подвижностью', benefits:['TECAR + УВТ + ультразвук','инструмент специалиста','сильная связь с PT и return-to-sport']},
|
||||||
|
press: {name:'ЭкзоПресс', role:'потоковый recovery для ног после бега, leg day и нагрузки', benefits:['компрессия + тепло / холод','понятный сервис для массового спроса','легко включается в пакеты']},
|
||||||
|
hydrogen: {name:'ЭкзоВодород', role:'автономная lounge-процедура для recovery и recharge', benefits:['спокойный формат в кресле','минимальное участие оператора','отдельная причина прийти в recovery-day']}
|
||||||
|
};
|
||||||
|
const presets = {
|
||||||
|
recovery: {ids:['therapy','press','hydrogen'], title:'Recovery Start', subtitle:'Компактный вход в recovery с флагманской, потоковой и автономной процедурой.'},
|
||||||
|
sport: {ids:['magnet','tecar','press'], title:'Sport Core', subtitle:'Активное ядро для клуба с сильным PT, беговым, силовым или спортивным направлением.'},
|
||||||
|
premium: {ids:['therapy','tecar','hydrogen'], title:'Premium Mix', subtitle:'Статусная конфигурация с индивидуальной процедурой, флагманским recovery и lounge-сценарием.'}
|
||||||
|
};
|
||||||
|
let mode = 3;
|
||||||
|
let selected = new Set(presets.recovery.ids);
|
||||||
|
let currentPreset = 'recovery';
|
||||||
|
const threeImage = "assets/asset_09_cfa0f6440fb6.webp";
|
||||||
|
const fiveImage = "assets/asset_14_c3b984d644de.webp";
|
||||||
|
const cards = [...document.querySelectorAll('.device-card')];
|
||||||
|
const modeButtons = [...document.querySelectorAll('.mode-btn')];
|
||||||
|
const presetButtons = [...document.querySelectorAll('.preset-btn')];
|
||||||
|
|
||||||
|
function configString() { return [...selected].map(id => devices[id].name).join(', '); }
|
||||||
|
function uniqueBenefits(ids) {
|
||||||
|
const items = [];
|
||||||
|
ids.forEach(id => devices[id].benefits.forEach(x => { if(!items.includes(x)) items.push(x); }));
|
||||||
|
return items.slice(0,4);
|
||||||
|
}
|
||||||
|
function updateConstructor() {
|
||||||
|
const ids = [...selected];
|
||||||
|
cards.forEach(card => {
|
||||||
|
const active = selected.has(card.dataset.device);
|
||||||
|
card.classList.toggle('selected',active);
|
||||||
|
card.classList.toggle('locked',mode===5);
|
||||||
|
card.setAttribute('aria-pressed',String(active));
|
||||||
|
});
|
||||||
|
modeButtons.forEach(btn => btn.classList.toggle('active',Number(btn.dataset.mode)===mode));
|
||||||
|
document.getElementById('selectedCount').textContent=ids.length;
|
||||||
|
document.getElementById('modeCount').textContent=mode;
|
||||||
|
document.getElementById('pickerHint').textContent = mode===5 ? 'Полная линейка выбрана' : (ids.length===3 ? 'Конфигурация собрана' : `Выберите ещё ${3-ids.length}`);
|
||||||
|
document.getElementById('presetRow').style.display = mode===3 ? 'flex':'none';
|
||||||
|
presetButtons.forEach(btn=>btn.classList.toggle('active',btn.dataset.preset===currentPreset && mode===3));
|
||||||
|
const image = document.getElementById('configImage');
|
||||||
|
image.style.opacity='0';
|
||||||
|
setTimeout(()=>{ image.src=mode===5?fiveImage:threeImage; image.alt=mode===5?'Полная зона восстановления с пятью аппаратами':'Пример зоны восстановления с тремя аппаратами'; image.style.opacity='1'; },180);
|
||||||
|
document.getElementById('configTag').textContent=mode===5?'Полная EXO-платформа':'Конструктор на 3 аппарата';
|
||||||
|
document.getElementById('configNumber').textContent=mode===5?'05':String(ids.length).padStart(2,'0');
|
||||||
|
const exactPreset = Object.entries(presets).find(([_,p])=>p.ids.length===ids.length && p.ids.every(id=>selected.has(id)));
|
||||||
|
const incomplete = mode===3 && ids.length<3;
|
||||||
|
const title = mode===5 ? 'Полная зона — 5 аппаратов' : (incomplete ? `Выбрано ${ids.length} из 3 аппаратов` : (exactPreset ? `${exactPreset[1].title} — 3 аппарата` : 'Персональный микс — 3 аппарата'));
|
||||||
|
const subtitle = mode===5 ? 'Полный маршрут: active medical-core, premium recovery, потоковые и автономные процедуры.' : (incomplete ? 'Можно продолжить подбор или получить консультацию — специалист поможет собрать оптимальную конфигурацию.' : (exactPreset ? exactPreset[1].subtitle : 'Состав собран под выбранные вами приоритеты. Итоговая логика уточняется после аудита клуба.'));
|
||||||
|
document.getElementById('configTitle').textContent=title;
|
||||||
|
document.getElementById('configSubtitle').textContent=subtitle;
|
||||||
|
document.getElementById('selectedList').innerHTML=ids.map(id=>`<span class="selected-pill">${devices[id].name}</span>`).join('');
|
||||||
|
document.getElementById('configBenefits').innerHTML=uniqueBenefits(ids).map(x=>`<div class="config-benefit"><i><svg viewBox='0 0 24 24' aria-hidden='true'><path d='m5 12 4 4L19 6' fill='none' stroke='currentColor' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/></svg></i><span>${x}</span></div>`).join('');
|
||||||
|
document.getElementById('configurationInput').value=ids.length ? `${ids.length} аппарата: ${configString()}` : 'Конфигурация не выбрана — нужна консультация';
|
||||||
|
const cta=document.getElementById('configCta');
|
||||||
|
cta.style.opacity='1';cta.style.pointerEvents='auto';
|
||||||
|
}
|
||||||
|
cards.forEach(card=>card.addEventListener('click',()=>{
|
||||||
|
if(mode===5) return;
|
||||||
|
const id=card.dataset.device;
|
||||||
|
currentPreset='';
|
||||||
|
if(selected.has(id)) selected.delete(id);
|
||||||
|
else { if(selected.size>=3) selected.delete([...selected][0]); selected.add(id); }
|
||||||
|
updateConstructor();
|
||||||
|
}));
|
||||||
|
modeButtons.forEach(btn=>btn.addEventListener('click',()=>{
|
||||||
|
mode=Number(btn.dataset.mode);
|
||||||
|
if(mode===5){ selected=new Set(Object.keys(devices)); currentPreset=''; }
|
||||||
|
else { selected=new Set(presets.recovery.ids); currentPreset='recovery'; }
|
||||||
|
updateConstructor();
|
||||||
|
}));
|
||||||
|
presetButtons.forEach(btn=>btn.addEventListener('click',()=>{
|
||||||
|
mode=3;currentPreset=btn.dataset.preset;selected=new Set(presets[currentPreset].ids);updateConstructor();
|
||||||
|
}));
|
||||||
|
document.getElementById('resetConfig').addEventListener('click',()=>{mode=3;currentPreset='recovery';selected=new Set(presets.recovery.ids);updateConstructor();});
|
||||||
|
document.getElementById('configCta').addEventListener('click',()=>{const picked=configString();document.getElementById('comment').value=picked?`Интересует конфигурация: ${selected.size} аппарата — ${picked}`:'Нужна консультация по подбору конфигурации Recovery Zone';});
|
||||||
|
updateConstructor();
|
||||||
|
|
||||||
|
const header=document.getElementById('header');
|
||||||
|
const mobileCta=document.getElementById('mobileCta');
|
||||||
|
function onScroll(){header.classList.toggle('scrolled',scrollY>35);mobileCta.classList.toggle('show',scrollY>window.innerHeight*.75 && scrollY<document.body.scrollHeight-window.innerHeight*1.25)}
|
||||||
|
addEventListener('scroll',onScroll,{passive:true});onScroll();
|
||||||
|
|
||||||
|
const observer=new IntersectionObserver(entries=>entries.forEach(entry=>{if(entry.isIntersecting){entry.target.classList.add('is-visible');observer.unobserve(entry.target)}}),{threshold:.12});
|
||||||
|
document.querySelectorAll('.reveal,.market-panel').forEach(el=>observer.observe(el));
|
||||||
|
|
||||||
|
const modal=document.getElementById('imageModal'), modalImg=document.getElementById('modalImage');
|
||||||
|
document.querySelectorAll('.gallery-card').forEach(card=>card.addEventListener('click',()=>{modalImg.src=card.dataset.full;modal.classList.add('open');document.body.classList.add('locked')}));
|
||||||
|
function closeModal(){modal.classList.remove('open');document.body.classList.remove('locked')}
|
||||||
|
modal.querySelector('.modal-close').addEventListener('click',closeModal);modal.addEventListener('click',e=>{if(e.target===modal)closeModal()});addEventListener('keydown',e=>{if(e.key==='Escape')closeModal()});
|
||||||
|
|
||||||
|
function collectUtm(){const p=new URLSearchParams(location.search),o={};['utm_source','utm_medium','utm_campaign','utm_content','utm_term'].forEach(k=>{if(p.get(k))o[k]=p.get(k)});return o}
|
||||||
|
async function handleLead(event){
|
||||||
|
event.preventDefault();
|
||||||
|
const form=event.currentTarget,status=document.getElementById('formStatus'),btn=document.getElementById('submitBtn');
|
||||||
|
if(!form.checkValidity()){form.reportValidity();status.textContent='Проверьте обязательные поля и согласие.';return false}
|
||||||
|
if(form.website.value) return false;
|
||||||
|
const payload=Object.fromEntries(new FormData(form).entries());Object.assign(payload,collectUtm(),{page:'/fitness',created_at:new Date().toISOString()});
|
||||||
|
btn.disabled=true;btn.textContent='Отправляем…';status.textContent='';
|
||||||
|
try{
|
||||||
|
const res=await fetch(FORM_ENDPOINT,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(payload)});
|
||||||
|
if(!res.ok)throw new Error('HTTP '+res.status);
|
||||||
|
status.textContent='Спасибо. Заявка отправлена — специалист свяжется с вами.';status.style.color='#087F73';form.reset();updateConstructor();
|
||||||
|
window.dataLayer=window.dataLayer||[];window.dataLayer.push({event:'fitness_lead_sent',configuration:payload.configuration});
|
||||||
|
}catch(error){
|
||||||
|
localStorage.setItem('exo_fitness_lead_draft',JSON.stringify(payload));
|
||||||
|
status.textContent='Не удалось отправить форму автоматически. Данные сохранены в браузере — свяжитесь с нами по +7 939 717-80-80.';status.style.color='#A14D12';
|
||||||
|
console.warn('Lead endpoint error',error,payload);
|
||||||
|
}finally{btn.disabled=false;btn.textContent='Получить консультацию →';}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
window.handleLead=handleLead;
|
||||||
|
|
||||||
|
(function(){
|
||||||
|
const money = new Intl.NumberFormat('ru-RU',{maximumFractionDigits:0});
|
||||||
|
const val = (root, selector) => {
|
||||||
|
const el=root.querySelector(selector); if(!el) return 0;
|
||||||
|
return Number(String(el.value||'').replace(/\s/g,'').replace(',','.'))||0;
|
||||||
|
};
|
||||||
|
document.querySelectorAll('[data-econ-calc]').forEach(root=>{
|
||||||
|
const type=root.getAttribute('data-econ-calc');
|
||||||
|
const update=()=>{
|
||||||
|
let month=0, volume=0, ready=false;
|
||||||
|
if(type==='hotel'){
|
||||||
|
const programs=val(root,'#hotelPrograms'), check=val(root,'#hotelCheck'), days=val(root,'#hotelDays');
|
||||||
|
ready=programs>0&&check>0&&days>0; volume=programs*days; month=volume*check;
|
||||||
|
}else{
|
||||||
|
const programs=val(root,'#fitPrograms'), check=val(root,'#fitCheck'), days=val(root,'#fitDays');
|
||||||
|
ready=programs>0&&check>0&&days>0; volume=programs*days; month=volume*check;
|
||||||
|
}
|
||||||
|
const monthEl=root.querySelector('[data-econ-month]'), yearEl=root.querySelector('[data-econ-year]'), volumeEl=root.querySelector('[data-econ-volume]');
|
||||||
|
const paybackEl=root.querySelector('[data-econ-payback]'), roiEl=root.querySelector('[data-econ-roi]');
|
||||||
|
if(!ready){
|
||||||
|
if(monthEl) monthEl.textContent='—';
|
||||||
|
if(yearEl) yearEl.textContent='—';
|
||||||
|
if(volumeEl) volumeEl.textContent=type==='hotel'?'Введите программы и средний чек':'Введите программы в день и средний чек';
|
||||||
|
if(paybackEl) paybackEl.textContent='—';
|
||||||
|
if(roiEl) roiEl.textContent='—';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(monthEl) monthEl.textContent=money.format(month)+' ₽';
|
||||||
|
if(yearEl) yearEl.textContent=money.format(month*12)+' ₽';
|
||||||
|
if(volumeEl) volumeEl.textContent=type==='hotel'?money.format(volume)+' программ в месяц':money.format(val(root,'#fitPrograms'))+' × '+money.format(val(root,'#fitDays'))+' = '+money.format(volume)+' программ в месяц';
|
||||||
|
if(type==='fitness' && paybackEl && roiEl){
|
||||||
|
const investment=val(root,'#fitInvestment');
|
||||||
|
if(investment>0 && month>0){
|
||||||
|
const payback=investment/month;
|
||||||
|
const roi=((month*12-investment)/investment)*100;
|
||||||
|
paybackEl.textContent=(Math.round(payback*10)/10).toLocaleString('ru-RU')+' мес.';
|
||||||
|
roiEl.textContent=Math.round(roi).toLocaleString('ru-RU')+'%';
|
||||||
|
}else{
|
||||||
|
paybackEl.textContent='Укажите инвестиции';
|
||||||
|
roiEl.textContent='Укажите инвестиции';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
root.querySelectorAll('input').forEach(input=>input.addEventListener('input',update)); update();
|
||||||
|
});
|
||||||
|
})();
|
||||||
@@ -0,0 +1,438 @@
|
|||||||
|
:root {
|
||||||
|
--navy:#0A2540;
|
||||||
|
--navy-2:#061B2F;
|
||||||
|
--navy-3:#0E3352;
|
||||||
|
--navy-4:#123C5B;
|
||||||
|
--teal:#00C4B4;
|
||||||
|
--teal-2:#3BE4D6;
|
||||||
|
--teal-pale:#DDFBF7;
|
||||||
|
--orange:#FF7A1A;
|
||||||
|
--white:#FFFFFF;
|
||||||
|
--paper:#F4F8FA;
|
||||||
|
--paper-2:#EAF2F5;
|
||||||
|
--ink:#0A2540;
|
||||||
|
--muted:#61798B;
|
||||||
|
--muted-dark:#A9BFCC;
|
||||||
|
--line:rgba(10,37,64,.12);
|
||||||
|
--line-dark:rgba(255,255,255,.13);
|
||||||
|
--shadow:0 30px 90px rgba(4,28,46,.16);
|
||||||
|
--shadow-soft:0 16px 50px rgba(4,28,46,.10);
|
||||||
|
--radius-xl:34px;
|
||||||
|
--radius-lg:26px;
|
||||||
|
--radius-md:19px;
|
||||||
|
--container:1200px;
|
||||||
|
--section-y:clamp(70px,8vw,110px);
|
||||||
|
}
|
||||||
|
*{box-sizing:border-box}
|
||||||
|
html{scroll-behavior:smooth;scroll-padding-top:90px}
|
||||||
|
body{margin:0;font-family:Inter,Manrope,"Segoe UI",Arial,sans-serif;color:var(--ink);background:var(--paper);line-height:1.5;-webkit-font-smoothing:antialiased}
|
||||||
|
body.locked{overflow:hidden}
|
||||||
|
img{display:block;max-width:100%}
|
||||||
|
button,input,textarea,select{font:inherit}
|
||||||
|
button,a{-webkit-tap-highlight-color:transparent}
|
||||||
|
a{color:inherit;text-decoration:none}
|
||||||
|
h1,h2,h3,p{margin-top:0}
|
||||||
|
h1,h2,h3{letter-spacing:-.035em}
|
||||||
|
.container{width:min(calc(100% - 36px),var(--container));margin-inline:auto}
|
||||||
|
.section{padding:var(--section-y) 0;position:relative}
|
||||||
|
.section--dark{background:var(--navy-2);color:#fff}
|
||||||
|
.section--navy{background:var(--navy);color:#fff}
|
||||||
|
.section--white{background:#fff}
|
||||||
|
.eyebrow{display:inline-flex;align-items:center;gap:9px;text-transform:uppercase;letter-spacing:.13em;font-size:12px;font-weight:800;color:var(--teal);margin-bottom:18px}
|
||||||
|
.eyebrow::before{content:"";width:23px;height:2px;background:currentColor;border-radius:3px}
|
||||||
|
.section-title{font-size:clamp(34px,5vw,62px);line-height:1.01;margin-bottom:18px;max-width:920px}
|
||||||
|
.section-lead{font-size:clamp(17px,2vw,21px);line-height:1.55;color:var(--muted);max-width:760px;margin-bottom:0}
|
||||||
|
.section--dark .section-lead,.section--navy .section-lead{color:var(--muted-dark)}
|
||||||
|
.section-head{display:flex;flex-direction:column;gap:8px;margin-bottom:clamp(34px,5vw,58px)}
|
||||||
|
.label{display:inline-flex;align-items:center;gap:8px;padding:9px 13px;border:1px solid rgba(0,196,180,.35);border-radius:999px;background:rgba(0,196,180,.08);color:var(--teal-2);font-size:12px;font-weight:800;letter-spacing:.07em;text-transform:uppercase}
|
||||||
|
.label-dot{width:7px;height:7px;border-radius:50%;background:var(--teal);box-shadow:0 0 16px rgba(0,196,180,.75)}
|
||||||
|
.btn{min-height:54px;border-radius:999px;padding:0 22px;display:inline-flex;align-items:center;justify-content:center;gap:10px;font-weight:800;border:1px solid transparent;cursor:pointer;transition:transform .25s ease,box-shadow .25s ease,background .25s ease,color .25s ease,border-color .25s ease}
|
||||||
|
.btn svg{width:19px;height:19px;flex:0 0 auto}
|
||||||
|
.btn:hover{transform:translateY(-2px)}
|
||||||
|
.btn--primary{background:var(--teal);color:var(--navy-2);box-shadow:0 12px 34px rgba(0,196,180,.25)}
|
||||||
|
.btn--primary:hover{background:var(--teal-2);box-shadow:0 16px 40px rgba(0,196,180,.34)}
|
||||||
|
.btn--ghost{border-color:rgba(255,255,255,.26);color:#fff;background:rgba(255,255,255,.06);backdrop-filter:blur(12px)}
|
||||||
|
.btn--ghost:hover{border-color:rgba(255,255,255,.55);background:rgba(255,255,255,.11)}
|
||||||
|
.btn--outline{border-color:rgba(10,37,64,.2);color:var(--navy);background:#fff}
|
||||||
|
.btn--outline:hover{border-color:var(--teal)}
|
||||||
|
.reveal{opacity:0;transform:translateY(24px);transition:opacity .75s ease,transform .75s ease}
|
||||||
|
.reveal.is-visible{opacity:1;transform:none}
|
||||||
|
|
||||||
|
/* Header */
|
||||||
|
.site-header{position:fixed;z-index:50;top:0;left:0;right:0;padding:13px 0;transition:background .3s ease,box-shadow .3s ease,backdrop-filter .3s ease}
|
||||||
|
.site-header.scrolled{background:rgba(6,27,47,.88);backdrop-filter:blur(16px);box-shadow:0 10px 35px rgba(0,0,0,.15)}
|
||||||
|
.header-inner{display:flex;align-items:center;justify-content:space-between;gap:18px}
|
||||||
|
.brand{display:flex;align-items:center;gap:11px;color:#fff;min-width:max-content}
|
||||||
|
.brand-mark{width:38px;height:38px;border:2px solid #fff;border-radius:9px;display:grid;place-items:center;position:relative}
|
||||||
|
.brand-mark::before{content:"";width:18px;height:18px;border:3px solid var(--teal);border-left-color:transparent;border-radius:50%}
|
||||||
|
.brand-text strong{display:block;font-size:15px;letter-spacing:.04em;line-height:1.05}
|
||||||
|
.brand-text span{display:block;font-size:8px;opacity:.72;line-height:1.2;margin-top:3px}
|
||||||
|
.nav{display:none;gap:24px;color:rgba(255,255,255,.82);font-size:13px;font-weight:700}
|
||||||
|
.nav a:hover{color:var(--teal)}
|
||||||
|
.header-cta{min-height:42px;padding:0 16px;font-size:13px;white-space:nowrap}
|
||||||
|
|
||||||
|
/* Hero */
|
||||||
|
.hero{min-height:min(900px,100svh);padding:128px 0 42px;display:flex;align-items:flex-end;position:relative;isolation:isolate;color:#fff;overflow:hidden;background:var(--navy-2)}
|
||||||
|
.hero::before{content:"";position:absolute;inset:0;z-index:-3;background-image:url("assets/asset_02_cbf145cf201b.webp");background-size:cover;background-position:54% center;transform:scale(1.025)}
|
||||||
|
.hero::after{content:"";position:absolute;inset:0;z-index:-2;background:linear-gradient(180deg,rgba(3,20,34,.36),rgba(3,20,34,.20) 33%,rgba(3,20,34,.92) 100%),linear-gradient(90deg,rgba(3,20,34,.94) 0%,rgba(3,20,34,.75) 48%,rgba(3,20,34,.10) 100%)}
|
||||||
|
.hero-glow{position:absolute;z-index:-1;width:520px;height:520px;right:-210px;bottom:-220px;border-radius:50%;background:rgba(0,196,180,.42);filter:blur(115px)}
|
||||||
|
.hero-grid{display:grid;gap:34px;align-items:end}
|
||||||
|
.hero-copy{max-width:820px}
|
||||||
|
.hero h1{font-size:clamp(46px,7.1vw,86px);line-height:.94;margin:18px 0 24px;text-wrap:balance}
|
||||||
|
.hero h1 span{color:var(--teal-2)}
|
||||||
|
.hero-lead{max-width:700px;font-size:clamp(18px,2vw,23px);line-height:1.5;color:#D9E7EE;margin-bottom:30px}
|
||||||
|
.hero-actions{display:flex;gap:12px;flex-wrap:wrap}
|
||||||
|
.hero-facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:34px;max-width:790px}
|
||||||
|
.hero-fact{padding:16px;border-radius:18px;border:1px solid rgba(255,255,255,.17);background:rgba(6,27,47,.55);backdrop-filter:blur(14px)}
|
||||||
|
.hero-fact strong{font-size:19px;display:block;color:#fff}
|
||||||
|
.hero-fact span{font-size:12px;color:#B9CBD6}
|
||||||
|
.hero-card{display:none;padding:23px;border:1px solid rgba(255,255,255,.17);border-radius:28px;background:rgba(6,27,47,.64);backdrop-filter:blur(18px);box-shadow:0 24px 70px rgba(0,0,0,.22)}
|
||||||
|
.hero-card__title{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:18px}
|
||||||
|
.hero-card__title strong{font-size:18px}
|
||||||
|
.hero-card__steps{display:grid;gap:11px}
|
||||||
|
.hero-card__step{display:grid;grid-template-columns:31px 1fr;gap:11px;align-items:start}
|
||||||
|
.hero-card__step b{width:31px;height:31px;display:grid;place-items:center;border-radius:50%;background:rgba(0,196,180,.14);color:var(--teal);font-size:12px}
|
||||||
|
.hero-card__step span{font-size:13px;color:#CBD9E2;padding-top:5px}
|
||||||
|
.hero-scroll{margin-top:32px;display:inline-flex;align-items:center;gap:10px;color:rgba(255,255,255,.64);font-size:12px;font-weight:700}
|
||||||
|
.hero-scroll i{width:24px;height:36px;border:1px solid rgba(255,255,255,.35);border-radius:14px;position:relative}
|
||||||
|
.hero-scroll i::before{content:"";position:absolute;left:50%;top:8px;width:3px;height:7px;background:var(--teal);border-radius:3px;transform:translateX(-50%);animation:scrollDot 1.8s infinite}
|
||||||
|
@keyframes scrollDot{0%,100%{opacity:.2;transform:translate(-50%,0)}50%{opacity:1;transform:translate(-50%,9px)}}
|
||||||
|
|
||||||
|
/* Market */
|
||||||
|
.market-layout{display:grid;gap:26px}
|
||||||
|
.market-panel{border-radius:var(--radius-xl);background:#fff;box-shadow:var(--shadow-soft);border:1px solid var(--line);padding:clamp(22px,4vw,40px);overflow:hidden}
|
||||||
|
.market-panel--dark{background:var(--navy);color:#fff;border-color:transparent}
|
||||||
|
.market-chart{height:300px;display:grid;grid-template-columns:repeat(3,1fr);align-items:end;gap:14px;padding:30px 0 0;position:relative}
|
||||||
|
.market-chart::before,.market-chart::after{content:"";position:absolute;left:0;right:0;height:1px;background:rgba(10,37,64,.09)}
|
||||||
|
.market-chart::before{top:33%}.market-chart::after{top:66%}
|
||||||
|
.market-bar{height:var(--h);min-height:65px;border-radius:18px 18px 6px 6px;background:linear-gradient(180deg,var(--teal-2),var(--teal));position:relative;transform-origin:bottom;transform:scaleY(.1);opacity:.35;transition:transform 1s cubic-bezier(.2,.8,.2,1),opacity .8s}
|
||||||
|
.market-panel.is-visible .market-bar{transform:scaleY(1);opacity:1}
|
||||||
|
.market-bar:nth-child(2){background:linear-gradient(180deg,#62D4EC,#189BC4)}
|
||||||
|
.market-bar:nth-child(3){background:linear-gradient(180deg,#FFB16C,var(--orange))}
|
||||||
|
.market-bar__value{position:absolute;left:50%;top:-43px;transform:translateX(-50%);white-space:nowrap;font-size:clamp(19px,2.3vw,28px);font-weight:900;color:var(--navy)}
|
||||||
|
.market-bar__year{position:absolute;left:50%;bottom:-31px;transform:translateX(-50%);font-weight:800;font-size:13px;color:var(--muted);white-space:nowrap}
|
||||||
|
.market-bar__growth{position:absolute;left:50%;top:12px;transform:translateX(-50%);padding:6px 8px;border-radius:999px;background:rgba(255,255,255,.82);font-size:11px;font-weight:900;color:var(--navy);white-space:nowrap}
|
||||||
|
.market-note{margin-top:54px;display:flex;justify-content:space-between;gap:12px;align-items:center;color:var(--muted);font-size:12px}
|
||||||
|
.market-insights{display:grid;gap:13px;margin-top:21px}
|
||||||
|
.market-insight{display:grid;grid-template-columns:45px 1fr;gap:14px;align-items:start;padding:17px;border-radius:18px;background:rgba(255,255,255,.075);border:1px solid rgba(255,255,255,.1)}
|
||||||
|
.market-insight__num{width:45px;height:45px;display:grid;place-items:center;border-radius:14px;background:rgba(0,196,180,.14);color:var(--teal);font-size:14px;font-weight:900}
|
||||||
|
.market-insight strong{display:block;font-size:16px;margin:1px 0 4px}
|
||||||
|
.market-insight p{margin:0;color:#B6C8D4;font-size:13px}
|
||||||
|
.source-note{font-size:11px;color:var(--muted);margin-top:18px;line-height:1.5}
|
||||||
|
.source-note a{text-decoration:underline;text-underline-offset:3px}
|
||||||
|
|
||||||
|
/* Benefits */
|
||||||
|
.benefit-grid{display:grid;gap:14px}
|
||||||
|
.benefit-card{background:#fff;border:1px solid var(--line);border-radius:24px;padding:24px;box-shadow:0 12px 34px rgba(4,28,46,.05);transition:transform .3s ease,box-shadow .3s ease,border-color .3s ease}
|
||||||
|
.benefit-card:hover{transform:translateY(-5px);box-shadow:var(--shadow-soft);border-color:rgba(0,196,180,.42)}
|
||||||
|
.benefit-index{font-size:12px;color:var(--teal);font-weight:900;letter-spacing:.1em;margin-bottom:26px}
|
||||||
|
.benefit-card h3{font-size:23px;margin-bottom:10px}
|
||||||
|
.benefit-card p{color:var(--muted);font-size:14px;margin-bottom:0}
|
||||||
|
|
||||||
|
/* Constructor */
|
||||||
|
.constructor-shell{border-radius:38px;background:linear-gradient(145deg,#0A2540,#061B2F);box-shadow:var(--shadow);overflow:hidden;border:1px solid rgba(255,255,255,.08)}
|
||||||
|
.constructor-top{padding:clamp(24px,5vw,46px);border-bottom:1px solid rgba(255,255,255,.1);display:flex;flex-direction:column;gap:24px}
|
||||||
|
.mode-switch{display:grid;grid-template-columns:1fr 1fr;padding:5px;border-radius:999px;background:rgba(255,255,255,.08);max-width:430px}
|
||||||
|
.mode-btn{border:0;background:transparent;color:#AFC4D0;border-radius:999px;min-height:46px;font-weight:900;cursor:pointer;transition:.25s}
|
||||||
|
.mode-btn.active{background:var(--teal);color:var(--navy-2);box-shadow:0 8px 25px rgba(0,196,180,.22)}
|
||||||
|
.constructor-body{display:grid}
|
||||||
|
.device-picker{padding:clamp(22px,4vw,40px);border-bottom:1px solid rgba(255,255,255,.1)}
|
||||||
|
.picker-head{display:flex;justify-content:space-between;gap:14px;align-items:end;margin-bottom:21px}
|
||||||
|
.picker-head h3{font-size:clamp(25px,3vw,36px);margin-bottom:4px;color:#fff}
|
||||||
|
.picker-head p{font-size:13px;color:#AFC4D0;margin:0}
|
||||||
|
.selection-count{white-space:nowrap;font-size:12px;color:#BFD3DE;padding:8px 11px;border-radius:999px;border:1px solid rgba(255,255,255,.15)}
|
||||||
|
.selection-count strong{color:var(--teal)}
|
||||||
|
.device-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
|
||||||
|
.device-card{position:relative;min-height:170px;border:1px solid rgba(255,255,255,.11);border-radius:20px;background:rgba(255,255,255,.055);color:#fff;padding:13px;text-align:left;cursor:pointer;overflow:hidden;transition:transform .25s ease,border-color .25s ease,background .25s ease}
|
||||||
|
.device-card:hover{transform:translateY(-3px);border-color:rgba(0,196,180,.45)}
|
||||||
|
.device-card.selected{background:rgba(0,196,180,.13);border-color:var(--teal);box-shadow:inset 0 0 0 1px rgba(0,196,180,.2)}
|
||||||
|
.device-card.locked{cursor:default}
|
||||||
|
.device-card__check{position:absolute;top:11px;right:11px;width:25px;height:25px;border-radius:50%;border:1px solid rgba(255,255,255,.3);display:grid;place-items:center;color:transparent;background:rgba(6,27,47,.55);z-index:2}
|
||||||
|
.device-card__check svg{width:15px;height:15px}
|
||||||
|
.device-card.selected .device-card__check{background:var(--teal);border-color:var(--teal);color:var(--navy)}
|
||||||
|
.device-card img{height:84px;width:100%;object-fit:contain;filter:drop-shadow(0 12px 20px rgba(0,0,0,.24));margin-bottom:5px}
|
||||||
|
.device-card strong{display:block;font-size:14px;line-height:1.2}
|
||||||
|
.device-card small{display:block;color:#9DB4C1;font-size:10px;margin-top:4px;line-height:1.3}
|
||||||
|
.device-card__indications{display:block;margin-top:5px;color:#69E7DB;font-size:9px;line-height:1.35;font-weight:700}
|
||||||
|
.preset-row{display:flex;gap:8px;overflow:auto;padding-top:18px;scrollbar-width:none}
|
||||||
|
.preset-row::-webkit-scrollbar{display:none}
|
||||||
|
.preset-btn{flex:0 0 auto;border:1px solid rgba(255,255,255,.15);background:transparent;color:#BFD1DB;padding:9px 12px;border-radius:999px;font-size:11px;font-weight:800;cursor:pointer}
|
||||||
|
.preset-btn:hover,.preset-btn.active{border-color:var(--teal);color:var(--teal)}
|
||||||
|
.config-preview{padding:clamp(22px,4vw,40px);background:#fff;display:flex;flex-direction:column}
|
||||||
|
.config-render{height:clamp(230px,35vw,420px);border-radius:25px;overflow:hidden;position:relative;background:var(--navy);margin-bottom:24px}
|
||||||
|
.config-render img{width:100%;height:100%;object-fit:cover;transition:opacity .35s ease,transform .7s ease}
|
||||||
|
.config-render:hover img{transform:scale(1.025)}
|
||||||
|
.config-render__tag{position:absolute;left:14px;top:14px;padding:9px 12px;border-radius:999px;background:rgba(6,27,47,.84);backdrop-filter:blur(12px);color:#fff;font-size:11px;font-weight:900}
|
||||||
|
.config-render__note{position:absolute;right:14px;bottom:14px;max-width:230px;padding:10px 12px;border-radius:14px;background:rgba(255,255,255,.88);backdrop-filter:blur(12px);color:var(--navy);font-size:10px;line-height:1.35}
|
||||||
|
.config-title{display:flex;justify-content:space-between;gap:15px;align-items:start}
|
||||||
|
.config-title h3{font-size:clamp(27px,3.5vw,42px);margin-bottom:8px}
|
||||||
|
.config-title p{color:var(--muted);font-size:14px;margin-bottom:0}
|
||||||
|
.config-number{font-size:54px;line-height:.8;font-weight:950;color:rgba(10,37,64,.08)}
|
||||||
|
.selected-list{display:flex;flex-wrap:wrap;gap:8px;margin:22px 0}
|
||||||
|
.selected-pill{padding:9px 12px;border-radius:999px;background:var(--teal-pale);color:var(--navy);font-size:12px;font-weight:800}
|
||||||
|
.config-benefits{display:grid;gap:9px;margin-bottom:24px}
|
||||||
|
.config-benefit{display:grid;grid-template-columns:25px 1fr;gap:9px;color:var(--muted);font-size:13px}
|
||||||
|
.config-benefit i{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;background:rgba(0,196,180,.12);color:var(--teal)}
|
||||||
|
.config-benefit svg{width:13px;height:13px}
|
||||||
|
.config-actions{margin-top:auto;display:flex;gap:10px;flex-wrap:wrap}
|
||||||
|
|
||||||
|
/* Programs */
|
||||||
|
.program-strip{display:flex;gap:13px;overflow:auto;padding:3px 1px 18px;scroll-snap-type:x mandatory;scrollbar-width:none}
|
||||||
|
.program-strip::-webkit-scrollbar{display:none}
|
||||||
|
.program-card{flex:0 0 min(83vw,330px);scroll-snap-align:start;background:#fff;border:1px solid var(--line);border-radius:23px;padding:22px;min-height:215px}
|
||||||
|
.program-card__tag{display:inline-flex;padding:7px 10px;border-radius:999px;background:var(--teal-pale);color:var(--navy);font-size:10px;font-weight:900;text-transform:uppercase;letter-spacing:.06em;margin-bottom:22px}
|
||||||
|
.program-card h3{font-size:22px;margin-bottom:9px}
|
||||||
|
.program-card p{font-size:13px;color:var(--muted);margin-bottom:18px}
|
||||||
|
.program-devices{font-size:12px;font-weight:800;color:var(--navy);padding-top:15px;border-top:1px solid var(--line)}
|
||||||
|
.program-disclaimer{padding:16px 18px;border-radius:18px;background:rgba(10,37,64,.05);color:var(--muted);font-size:12px;margin-top:12px}
|
||||||
|
|
||||||
|
/* Gallery */
|
||||||
|
.gallery-grid{display:flex;gap:14px;overflow:auto;scroll-snap-type:x mandatory;scrollbar-width:none;padding-bottom:18px}
|
||||||
|
.gallery-grid::-webkit-scrollbar{display:none}
|
||||||
|
.gallery-card{flex:0 0 min(88vw,520px);scroll-snap-align:start;border-radius:28px;overflow:hidden;background:#fff;color:var(--ink);position:relative;cursor:zoom-in;box-shadow:0 16px 50px rgba(0,0,0,.18)}
|
||||||
|
.gallery-image{height:300px;overflow:hidden}
|
||||||
|
.gallery-image img{width:100%;height:100%;object-fit:cover;transition:transform .6s ease}
|
||||||
|
.gallery-card:hover .gallery-image img{transform:scale(1.035)}
|
||||||
|
.gallery-copy{padding:20px 21px 22px}
|
||||||
|
.gallery-copy h3{font-size:21px;margin-bottom:7px}
|
||||||
|
.gallery-copy p{font-size:13px;color:var(--muted);margin:0}
|
||||||
|
.gallery-badge{position:absolute;left:14px;top:14px;padding:8px 11px;border-radius:999px;background:rgba(6,27,47,.82);color:#fff;font-size:10px;font-weight:900;backdrop-filter:blur(12px)}
|
||||||
|
.gallery-hint{display:flex;align-items:center;gap:8px;color:#AEC0CC;font-size:12px;margin-top:10px}
|
||||||
|
.gallery-hint span{width:31px;height:1px;background:var(--teal)}
|
||||||
|
|
||||||
|
/* Journey & launch */
|
||||||
|
.launch-layout{display:grid;gap:22px}
|
||||||
|
.journey-card,.launch-card{border-radius:var(--radius-xl);padding:clamp(24px,4vw,40px)}
|
||||||
|
.journey-card{background:var(--navy);color:#fff}
|
||||||
|
.launch-card{background:#fff;border:1px solid var(--line);box-shadow:var(--shadow-soft)}
|
||||||
|
.journey-card h3,.launch-card h3{font-size:clamp(27px,3vw,38px);margin-bottom:7px}
|
||||||
|
.journey-card>p{color:#AFC4D0;font-size:14px}
|
||||||
|
.journey-steps{display:grid;gap:8px;margin-top:25px}
|
||||||
|
.journey-step{display:grid;grid-template-columns:42px 1fr auto;gap:12px;align-items:center;padding:13px;border-radius:17px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.08)}
|
||||||
|
.journey-step b{width:42px;height:42px;display:grid;place-items:center;border-radius:13px;background:rgba(0,196,180,.14);color:var(--teal);font-size:12px}
|
||||||
|
.journey-step strong{font-size:14px}
|
||||||
|
.journey-step span{display:none;font-size:11px;color:#AFC4D0}
|
||||||
|
.journey-step em{font-style:normal;color:var(--teal);font-size:17px}
|
||||||
|
.timeline{display:grid;gap:15px;margin-top:26px}
|
||||||
|
.timeline-item{display:grid;grid-template-columns:52px 1fr;gap:14px;position:relative}
|
||||||
|
.timeline-item:not(:last-child)::after{content:"";position:absolute;left:25px;top:50px;bottom:-18px;width:1px;background:rgba(0,196,180,.3)}
|
||||||
|
.timeline-day{width:52px;height:52px;border-radius:17px;background:var(--teal-pale);color:var(--navy);display:grid;place-items:center;text-align:center;font-size:10px;font-weight:900;line-height:1.05}
|
||||||
|
.timeline-copy{padding-top:4px}
|
||||||
|
.timeline-copy strong{font-size:15px}
|
||||||
|
.timeline-copy p{font-size:12px;color:var(--muted);margin:4px 0 0}
|
||||||
|
.pilot-kpis{display:flex;gap:8px;flex-wrap:wrap;margin-top:23px}
|
||||||
|
.pilot-kpis span{font-size:10px;font-weight:800;padding:8px 10px;border-radius:999px;background:rgba(10,37,64,.06);color:var(--navy)}
|
||||||
|
|
||||||
|
/* Why EXO */
|
||||||
|
.proof-layout{display:grid;gap:28px;align-items:center}
|
||||||
|
.proof-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
|
||||||
|
.proof-stat{border-radius:20px;padding:19px;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.1)}
|
||||||
|
.proof-stat strong{font-size:clamp(27px,4vw,44px);color:var(--teal);display:block;line-height:1}
|
||||||
|
.proof-stat span{font-size:11px;color:#AFC4D0}
|
||||||
|
.ecosystem-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-top:22px}
|
||||||
|
.ecosystem-item{padding:15px;border-radius:17px;background:rgba(255,255,255,.06);font-size:12px;color:#C6D5DE}
|
||||||
|
.ecosystem-item b{display:block;color:#fff;margin-bottom:4px}
|
||||||
|
.legal-box{border-radius:28px;background:#fff;color:var(--ink);padding:clamp(23px,4vw,36px)}
|
||||||
|
.legal-box h3{font-size:27px;margin-bottom:12px}
|
||||||
|
.legal-intro{font-size:13px;line-height:1.55;color:var(--muted);margin:0 0 18px}
|
||||||
|
.legal-option{padding:16px 0;border-top:1px solid var(--line)}
|
||||||
|
.legal-option:first-of-type{border-top:0;padding-top:0}
|
||||||
|
.legal-option strong{display:flex;align-items:center;gap:9px;font-size:15px}
|
||||||
|
.legal-option strong i{width:9px;height:9px;border-radius:50%;background:var(--teal)}
|
||||||
|
.legal-option p{font-size:12px;color:var(--muted);margin:7px 0 0}
|
||||||
|
|
||||||
|
/* CTA */
|
||||||
|
.cta-wrap{border-radius:38px;overflow:hidden;background:linear-gradient(135deg,#0A2540,#061B2F);color:#fff;box-shadow:var(--shadow);position:relative;isolation:isolate}
|
||||||
|
.cta-wrap::before{content:"";position:absolute;width:470px;height:470px;border-radius:50%;background:rgba(0,196,180,.28);filter:blur(95px);right:-180px;top:-190px;z-index:-1}
|
||||||
|
.cta-grid{display:grid}
|
||||||
|
.cta-copy{padding:clamp(28px,5vw,58px)}
|
||||||
|
.cta-copy h2{font-size:clamp(22px,2.7vw,36px);line-height:1.12;margin-bottom:20px;max-width:680px}
|
||||||
|
.cta-copy p{color:#B6C9D4;max-width:610px;font-size:16px}
|
||||||
|
.cta-list{display:grid;gap:10px;margin-top:27px}
|
||||||
|
.cta-list div{display:grid;grid-template-columns:24px 1fr;gap:9px;align-items:center;color:#D7E4EB;font-size:13px}
|
||||||
|
.cta-list i{width:23px;height:23px;border-radius:50%;display:grid;place-items:center;background:rgba(0,196,180,.15);color:var(--teal)}
|
||||||
|
.cta-list svg{width:13px;height:13px}
|
||||||
|
.lead-form{background:#fff;color:var(--ink);padding:clamp(24px,4vw,42px)}
|
||||||
|
.lead-form h3{font-size:28px;margin-bottom:8px}
|
||||||
|
.lead-form>p{color:var(--muted);font-size:13px;margin-bottom:23px}
|
||||||
|
.form-grid{display:grid;gap:12px}
|
||||||
|
.field{display:flex;flex-direction:column;gap:7px}
|
||||||
|
.field label{font-size:11px;font-weight:800;color:var(--muted)}
|
||||||
|
.field input,.field textarea,.field select{width:100%;border:1px solid rgba(10,37,64,.15);border-radius:15px;background:#F7FAFB;color:var(--ink);outline:none;padding:14px 15px;transition:border-color .2s,box-shadow .2s,background .2s}
|
||||||
|
.field input,.field select{height:51px}
|
||||||
|
.field textarea{min-height:93px;resize:vertical}
|
||||||
|
.field input:focus,.field textarea:focus,.field select:focus{border-color:var(--teal);background:#fff;box-shadow:0 0 0 4px rgba(0,196,180,.10)}
|
||||||
|
.field--full{grid-column:1/-1}
|
||||||
|
.form-consent{display:grid;grid-template-columns:18px 1fr;gap:9px;font-size:10px;color:var(--muted);margin:13px 0}
|
||||||
|
.form-consent input{margin-top:2px;accent-color:var(--teal)}
|
||||||
|
.form-submit{width:100%}
|
||||||
|
.form-status{font-size:12px;min-height:20px;margin-top:11px;color:var(--muted)}
|
||||||
|
.hp{position:absolute!important;left:-9999px!important;opacity:0!important}
|
||||||
|
|
||||||
|
/* Footer & modal */
|
||||||
|
.footer{background:#041726;color:#8FA6B4;padding:32px 0;font-size:11px}
|
||||||
|
.footer-inner{display:flex;flex-direction:column;gap:18px}
|
||||||
|
.footer-links{display:flex;gap:16px;flex-wrap:wrap}
|
||||||
|
.footer a:hover{color:#fff}
|
||||||
|
.modal{position:fixed;z-index:100;inset:0;background:rgba(2,13,22,.92);display:none;align-items:center;justify-content:center;padding:18px;backdrop-filter:blur(10px)}
|
||||||
|
.modal.open{display:flex}
|
||||||
|
.modal img{max-width:min(1500px,96vw);max-height:88vh;border-radius:22px;box-shadow:0 30px 100px rgba(0,0,0,.55)}
|
||||||
|
.modal-close{position:fixed;right:18px;top:18px;width:46px;height:46px;border-radius:50%;border:1px solid rgba(255,255,255,.25);background:rgba(255,255,255,.09);color:#fff;font-size:25px;cursor:pointer}
|
||||||
|
.mobile-cta{position:fixed;z-index:45;left:12px;right:12px;bottom:12px;display:flex;background:rgba(6,27,47,.90);backdrop-filter:blur(15px);border:1px solid rgba(255,255,255,.14);border-radius:999px;padding:6px;box-shadow:0 18px 48px rgba(0,0,0,.25);transform:translateY(130%);transition:transform .35s ease}
|
||||||
|
.mobile-cta.show{transform:none}
|
||||||
|
.mobile-cta .btn{width:100%;min-height:47px;font-size:13px}
|
||||||
|
|
||||||
|
@media(min-width:640px){
|
||||||
|
.container{width:min(calc(100% - 56px),var(--container))}
|
||||||
|
.benefit-grid{grid-template-columns:repeat(2,1fr)}
|
||||||
|
.device-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
|
||||||
|
.device-card{min-height:185px}
|
||||||
|
.program-card{flex-basis:320px}
|
||||||
|
.form-grid{grid-template-columns:1fr 1fr}
|
||||||
|
.journey-step span{display:block}
|
||||||
|
}
|
||||||
|
@media(min-width:900px){
|
||||||
|
.nav{display:flex}
|
||||||
|
.hero{min-height:860px;padding-bottom:62px}
|
||||||
|
.hero-grid{grid-template-columns:minmax(0,1fr) 315px}
|
||||||
|
.hero-card{display:block}
|
||||||
|
.market-layout{grid-template-columns:1.18fr .82fr;align-items:stretch}
|
||||||
|
.benefit-grid{grid-template-columns:repeat(4,1fr)}
|
||||||
|
.constructor-top{flex-direction:row;justify-content:space-between;align-items:end}
|
||||||
|
.constructor-body{grid-template-columns:.92fr 1.08fr}
|
||||||
|
.device-picker{border-bottom:0;border-right:1px solid rgba(255,255,255,.1)}
|
||||||
|
.device-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
|
||||||
|
.program-strip{display:grid;grid-template-columns:repeat(3,1fr);overflow:visible}
|
||||||
|
.program-card{min-width:0;min-height:225px}
|
||||||
|
.gallery-grid{display:grid;grid-template-columns:repeat(2,1fr);overflow:visible}
|
||||||
|
.gallery-card{min-width:0}
|
||||||
|
.gallery-image{height:350px}
|
||||||
|
.launch-layout{grid-template-columns:.95fr 1.05fr}
|
||||||
|
.proof-layout{grid-template-columns:1.1fr .9fr}
|
||||||
|
.cta-grid{grid-template-columns:1.03fr .97fr}
|
||||||
|
.footer-inner{flex-direction:row;justify-content:space-between;align-items:center}
|
||||||
|
.mobile-cta{display:none}
|
||||||
|
}
|
||||||
|
@media(min-width:1120px){
|
||||||
|
.constructor-body{grid-template-columns:1fr 1.18fr}
|
||||||
|
.device-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
|
||||||
|
.gallery-grid{grid-template-columns:repeat(4,1fr)}
|
||||||
|
.gallery-card{border-radius:24px}
|
||||||
|
.gallery-image{height:250px}
|
||||||
|
.gallery-copy{min-height:134px}
|
||||||
|
}
|
||||||
|
@media(max-width:520px){
|
||||||
|
.brand-text span{display:none}
|
||||||
|
.brand-text strong{font-size:14px}
|
||||||
|
.header-inner{gap:10px}
|
||||||
|
.header-cta{font-size:11px;padding:0 12px;min-height:40px}
|
||||||
|
.hero-facts{grid-template-columns:1fr}
|
||||||
|
.hero-fact{display:flex;align-items:baseline;justify-content:space-between;gap:12px}
|
||||||
|
.hero-fact strong{font-size:17px}
|
||||||
|
.hero h1{font-size:44px}
|
||||||
|
.hero-actions .btn{width:100%}
|
||||||
|
.device-card{min-height:162px}
|
||||||
|
.device-card img{height:76px}
|
||||||
|
.config-actions .btn{width:100%}
|
||||||
|
.market-chart{height:255px}
|
||||||
|
.market-bar__value{font-size:17px}
|
||||||
|
}
|
||||||
|
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}*,*::before,*::after{animation:none!important;transition:none!important}.reveal{opacity:1;transform:none}}
|
||||||
|
|
||||||
|
|
||||||
|
/* Fitness v2 refinements */
|
||||||
|
.brand{display:inline-flex;align-items:center;min-width:0}
|
||||||
|
.exo-master-logo--header{width:clamp(150px,19vw,215px);height:auto;max-height:54px;object-fit:contain;object-position:left center}
|
||||||
|
.header-actions{display:flex;align-items:center;gap:9px;margin-left:auto}
|
||||||
|
.header-call{min-height:42px;padding:0 14px;font-size:13px;white-space:nowrap}
|
||||||
|
.header-call svg{width:17px;height:17px}
|
||||||
|
.hero-fact span b{color:#fff;font-weight:850}
|
||||||
|
.terms-glossary{margin-top:18px;padding:18px 20px;border-radius:22px;background:#fff;border:1px solid var(--line);display:grid;gap:10px;box-shadow:0 12px 34px rgba(4,28,46,.04)}
|
||||||
|
.term-item{display:grid;grid-template-columns:72px 1fr;gap:12px;align-items:start;font-size:13px;color:var(--muted)}
|
||||||
|
.term-item b{color:var(--navy);font-size:12px;letter-spacing:.08em}
|
||||||
|
.program-card{display:flex;flex-direction:column;min-height:100%;padding:24px}
|
||||||
|
.program-card__tag{align-self:flex-start;max-width:100%;white-space:normal;line-height:1.25;text-align:left;margin-bottom:18px}
|
||||||
|
.program-card h3{font-size:clamp(20px,2.1vw,25px);line-height:1.15;overflow-wrap:anywhere}
|
||||||
|
.program-card p{font-size:14px;line-height:1.55;flex:1}
|
||||||
|
.program-devices{font-size:13px;line-height:1.5}
|
||||||
|
.program-devices b{color:var(--navy)}
|
||||||
|
.program-devices span{display:block;margin-top:6px;color:var(--muted);font-weight:600}
|
||||||
|
@media(min-width:900px){.program-strip{grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:16px}.program-card{min-height:410px}}
|
||||||
|
@media(max-width:760px){.header-actions{gap:7px}.header-call{width:42px;padding:0;font-size:0}.header-call svg{width:18px;height:18px}.header-cta{padding:0 13px}.exo-master-logo--header{width:145px}.term-item{grid-template-columns:62px 1fr}}
|
||||||
|
@media(max-width:520px){.exo-master-logo--header{width:128px}.header-cta{font-size:11px;padding:0 11px}.program-card{flex-basis:min(90vw,360px)}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ===== EXO economics blocks: Hotel + Fitness ===== */
|
||||||
|
.exo-econ{--ee-navy:#0A2540;--ee-deep:#061B2F;--ee-teal:#00C4B4;--ee-teal-2:#39E0D2;--ee-ice:#EAF9F7;--ee-red:#F0656B;--ee-muted:#60778B;position:relative;overflow:hidden;background:#F4FAFB;color:var(--ee-navy)}
|
||||||
|
.exo-econ::before{content:"";position:absolute;width:520px;height:520px;border-radius:50%;right:-260px;top:-270px;background:rgba(0,196,180,.13);filter:blur(18px);pointer-events:none}
|
||||||
|
.exo-econ__head{position:relative;z-index:1;display:grid;gap:14px;margin-bottom:28px;max-width:920px}
|
||||||
|
.exo-econ__eyebrow{display:flex;align-items:center;gap:10px;color:#008F84;font-size:11px;font-weight:850;letter-spacing:.095em;text-transform:uppercase}
|
||||||
|
.exo-econ__eyebrow::before{content:"";width:28px;height:2px;border-radius:3px;background:var(--ee-teal)}
|
||||||
|
.exo-econ__head h2{margin:0;color:var(--ee-navy);font-size:clamp(31px,5vw,58px);line-height:1.02;letter-spacing:-.048em}
|
||||||
|
.exo-econ__head p{max-width:860px;margin:0;color:var(--ee-muted);font-size:clamp(15px,1.55vw,19px);line-height:1.55}
|
||||||
|
.exo-econ__metrics{position:relative;z-index:1;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-bottom:14px}
|
||||||
|
.exo-econ__metric{min-width:0;padding:17px 16px;border:1px solid rgba(0,196,180,.26);border-radius:18px;background:rgba(255,255,255,.9);box-shadow:0 12px 36px rgba(4,31,50,.055)}
|
||||||
|
.exo-econ__metric strong{display:block;color:#00A99A;font-size:clamp(22px,3vw,34px);line-height:1.05;letter-spacing:-.035em;font-variant-numeric:tabular-nums}
|
||||||
|
.exo-econ__metric span{display:block;margin-top:7px;color:var(--ee-navy);font-size:12px;font-weight:760;line-height:1.32}
|
||||||
|
.exo-econ__metric small{display:block;margin-top:4px;color:var(--ee-muted);font-size:10px;line-height:1.35}
|
||||||
|
.exo-econ__compare{position:relative;z-index:1;display:grid;gap:14px}
|
||||||
|
.exo-econ__panel{min-width:0;padding:22px;border-radius:25px}
|
||||||
|
.exo-econ__panel--loss{color:#fff;background:radial-gradient(circle at 8% 0%,rgba(240,101,107,.16),transparent 30%),linear-gradient(145deg,var(--ee-deep),var(--ee-navy));box-shadow:0 24px 60px rgba(4,25,41,.16)}
|
||||||
|
.exo-econ__panel--gain{border:1px solid rgba(0,196,180,.34);background:rgba(255,255,255,.96);box-shadow:0 24px 60px rgba(4,31,50,.075)}
|
||||||
|
.exo-econ__panel-title{display:flex;align-items:center;gap:11px;margin:0 0 17px;font-size:20px;line-height:1.15;letter-spacing:-.025em}
|
||||||
|
.exo-econ__panel-title i{width:34px;height:34px;border-radius:12px;display:grid;place-items:center;font-style:normal;font-size:17px}
|
||||||
|
.exo-econ__panel--loss .exo-econ__panel-title{color:#fff}.exo-econ__panel--loss .exo-econ__panel-title i{color:#FFD7D9;background:rgba(240,101,107,.16)}
|
||||||
|
.exo-econ__panel--gain .exo-econ__panel-title{color:var(--ee-navy)}.exo-econ__panel--gain .exo-econ__panel-title i{color:#008F84;background:var(--ee-ice)}
|
||||||
|
.exo-econ__list{display:grid;gap:9px}
|
||||||
|
.exo-econ__item{display:grid;grid-template-columns:34px 1fr;gap:11px;align-items:start;padding:13px;border-radius:16px}
|
||||||
|
.exo-econ__panel--loss .exo-econ__item{border:1px solid rgba(255,255,255,.11);background:rgba(255,255,255,.045)}
|
||||||
|
.exo-econ__panel--gain .exo-econ__item{border:1px solid rgba(10,37,64,.095);background:linear-gradient(180deg,#fff,#F7FBFB)}
|
||||||
|
.exo-econ__item b{width:28px;height:28px;border-radius:10px;display:grid;place-items:center;font-size:11px}
|
||||||
|
.exo-econ__panel--loss .exo-econ__item b{color:#FFD7D9;background:rgba(240,101,107,.16)}
|
||||||
|
.exo-econ__panel--gain .exo-econ__item b{color:#008F84;background:var(--ee-ice)}
|
||||||
|
.exo-econ__item strong{display:block;margin:1px 0 4px;font-size:14px;line-height:1.25}
|
||||||
|
.exo-econ__item span{display:block;font-size:11px;line-height:1.43}
|
||||||
|
.exo-econ__panel--loss .exo-econ__item span{color:rgba(255,255,255,.65)}
|
||||||
|
.exo-econ__panel--gain .exo-econ__item span{color:var(--ee-muted)}
|
||||||
|
.exo-econ__bridge{position:relative;z-index:1;margin:14px 0;padding:16px 18px;border-radius:19px;border:1px solid rgba(0,196,180,.28);background:linear-gradient(115deg,rgba(0,196,180,.12),rgba(255,255,255,.94));display:grid;gap:10px}
|
||||||
|
.exo-econ__bridge strong{color:var(--ee-navy);font-size:16px;line-height:1.25}
|
||||||
|
.exo-econ__bridge p{margin:0;color:var(--ee-muted);font-size:11px;line-height:1.5}
|
||||||
|
.exo-econ__ops{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
|
||||||
|
.exo-econ__op{padding:11px 12px;border-radius:14px;background:#fff;border:1px solid rgba(0,196,180,.22)}
|
||||||
|
.exo-econ__op b{display:block;color:#00A99A;font-size:17px;line-height:1.05}.exo-econ__op span{display:block;margin-top:4px;color:var(--ee-muted);font-size:9px;line-height:1.25}
|
||||||
|
.exo-econ__calc{position:relative;z-index:1;margin-top:14px;padding:22px;border-radius:25px;color:#fff;background:radial-gradient(circle at 90% 0%,rgba(0,196,180,.25),transparent 34%),linear-gradient(135deg,var(--ee-navy),var(--ee-deep));box-shadow:0 25px 70px rgba(4,25,41,.18)}
|
||||||
|
.exo-econ__calc-head{display:grid;gap:6px;margin-bottom:17px}.exo-econ__calc-head span{color:var(--ee-teal-2);font-size:10px;font-weight:850;letter-spacing:.09em;text-transform:uppercase}.exo-econ__calc-head h3{margin:0;color:#fff;font-size:22px;line-height:1.15}.exo-econ__calc-head p{margin:0;color:rgba(255,255,255,.58);font-size:11px;line-height:1.45}
|
||||||
|
.exo-econ__formula-simple{display:grid;grid-template-columns:minmax(0,1fr) 24px minmax(0,1fr) 24px minmax(0,1fr) 24px minmax(0,1.12fr);gap:8px;align-items:stretch;margin:0 0 17px;padding:12px;border-radius:18px;border:1px solid rgba(0,196,180,.22);background:rgba(255,255,255,.055)}
|
||||||
|
.exo-econ__formula-step{min-width:0;display:flex;align-items:center;gap:9px;padding:10px;border-radius:13px;background:rgba(255,255,255,.055);border:1px solid rgba(255,255,255,.08)}
|
||||||
|
.exo-econ__formula-step em{flex:0 0 27px;width:27px;height:27px;border-radius:9px;display:grid;place-items:center;color:var(--ee-deep);background:var(--ee-teal-2);font-size:12px;font-style:normal;font-weight:900}
|
||||||
|
.exo-econ__formula-step span{color:rgba(255,255,255,.78);font-size:10px;font-weight:760;line-height:1.3}
|
||||||
|
.exo-econ__formula-step--result{background:linear-gradient(135deg,rgba(0,196,180,.25),rgba(0,196,180,.09));border-color:rgba(57,224,210,.34)}
|
||||||
|
.exo-econ__formula-step--result span{color:#fff}
|
||||||
|
.exo-econ__formula-op{align-self:center;color:var(--ee-teal-2);font-size:20px;text-align:center}
|
||||||
|
.exo-econ__calc-grid{display:grid;gap:13px}
|
||||||
|
.exo-econ__fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
|
||||||
|
.exo-econ__field{display:grid;gap:6px;min-width:0}.exo-econ__field label{color:rgba(255,255,255,.72);font-size:10px;font-weight:760}.exo-econ__field input{width:100%;min-width:0;height:48px;padding:0 13px;border-radius:13px;border:1px solid rgba(255,255,255,.17);outline:none;color:#fff;background:rgba(255,255,255,.075);font-size:15px;font-weight:800;font-variant-numeric:tabular-nums}.exo-econ__field input::placeholder{color:rgba(255,255,255,.28)}.exo-econ__field small{display:block;margin-top:-1px;color:rgba(255,255,255,.42);font-size:8.5px;line-height:1.3}
|
||||||
|
.exo-econ__field input:focus{border-color:var(--ee-teal);box-shadow:0 0 0 3px rgba(0,196,180,.13)}
|
||||||
|
.exo-econ__results{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}.exo-econ__result{min-width:0;padding:15px;border-radius:16px;border:1px solid rgba(0,196,180,.28);background:rgba(0,196,180,.09)}.exo-econ__result span{display:block;color:rgba(255,255,255,.56);font-size:9px;text-transform:uppercase;letter-spacing:.055em}.exo-econ__result strong{display:block;margin-top:6px;color:var(--ee-teal-2);font-size:clamp(19px,3vw,29px);line-height:1.05;letter-spacing:-.035em;white-space:nowrap;font-variant-numeric:tabular-nums}.exo-econ__result small{display:block;margin-top:4px;color:rgba(255,255,255,.48);font-size:9px;line-height:1.3}
|
||||||
|
.exo-econ__disclaimer{margin:13px 0 0;color:rgba(255,255,255,.43);font-size:9px;line-height:1.45}
|
||||||
|
.exo-econ__source-note{margin-top:14px;padding:13px 15px;border:1px solid rgba(0,196,180,.25);border-radius:14px;background:rgba(0,196,180,.07);color:rgba(255,255,255,.72);font-size:10px;line-height:1.5}.exo-econ__source-note p{margin:0}.exo-econ__source-note p+p{margin-top:5px}.exo-econ__source-note strong{color:#fff}
|
||||||
|
@media(min-width:640px){.exo-econ__metrics{grid-template-columns:repeat(4,minmax(0,1fr))}.exo-econ__ops{grid-template-columns:repeat(4,minmax(0,1fr))}.exo-econ__fields{grid-template-columns:repeat(3,minmax(0,1fr))}}
|
||||||
|
@media(min-width:900px){.exo-econ__compare{grid-template-columns:repeat(2,minmax(0,1fr))}.exo-econ__panel{padding:27px}.exo-econ__calc{padding:28px}.exo-econ__calc-grid{grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);align-items:start}.exo-econ__fields{grid-template-columns:repeat(2,minmax(0,1fr))}.exo-econ__results{align-self:stretch;grid-template-columns:repeat(2,minmax(0,1fr))}.exo-econ__result{display:flex;flex-direction:column;justify-content:center}}
|
||||||
|
@media(max-width:680px){.exo-econ__formula-simple{grid-template-columns:1fr 1fr}.exo-econ__formula-op{display:none}.exo-econ__formula-step{min-height:66px}}
|
||||||
|
@media(max-width:480px){.exo-econ__head h2{font-size:34px}.exo-econ__metric{padding:15px 13px}.exo-econ__panel{padding:18px}.exo-econ__fields,.exo-econ__results{grid-template-columns:1fr}.exo-econ__result strong{white-space:normal}.exo-econ__ops{grid-template-columns:1fr 1fr}}
|
||||||
|
|
||||||
|
|
||||||
|
/* v7 — unified compact section heading scale */
|
||||||
|
.section-title,
|
||||||
|
.exo-econ__head h2,
|
||||||
|
.cta-copy h2{
|
||||||
|
font-size:clamp(22px,2.7vw,36px)!important;
|
||||||
|
line-height:1.12!important;
|
||||||
|
letter-spacing:-.025em!important;
|
||||||
|
}
|
||||||
|
.section-title{max-width:920px}
|
||||||
|
.exo-econ__head h2{max-width:900px}
|
||||||
|
@media (max-width:640px){
|
||||||
|
.section-title,.exo-econ__head h2,.cta-copy h2{font-size:clamp(21px,7vw,30px)!important;line-height:1.16!important}
|
||||||
|
}
|
||||||