Claude Opus 5.5
Интерактивная 3D-модель электровелосипеда OBLT с функцией "рентгеновского" проявления внутренних деталей при наведении курсора
Промпт
# Заголовок e-bike OBLT
Полноэкранный тёмный кинематографичный заголовок продукта e-bike для бренда **OBLT**, созданный в React (клиентский компонент) с использованием чистого CSS и интерактивного эффекта «рентгеновского» прожектора, следующего за курсором: при перемещении мыши внешняя фотография велосипеда стирается, открывая находящуюся под ней внутреннюю структуру из карбона и редуктора. Создан только с помощью React (без библиотек анимации).
## Технологический стек (фактически импортируемые библиотеки)
- Только React — `useRef`, `useState` и тип `MouseEvent`. Без framer-motion, без GSAP, без библиотеки иконок. Вся анимация написана вручную с помощью CSS keyframes + встроенного CSS `mask-image`.
- SVG-иконка (стрелка CTA) встроена вручную, а не взята из библиотеки.
## Шрифты и глобальные стили
- Единственный шрифт Google, импортируемый внутри блока `<style>`:
```
@import url('https://fonts.googleapis.com/css2?family=Almarai:wght@300;400;700;800&display=swap');
```
- Стек шрифтов: `"Almarai","Helvetica Neue",Helvetica,Arial,sans-serif`.
- `-webkit-font-smoothing: antialiased`. `box-sizing: border-box` применяется к корневому элементу и всем дочерним элементам (область действия ограничена `.vt-header`, глобальные стили не используются).
## Контейнер секции
- Корневой `<header className="vt-header">` — элемент, отслеживающий движение мыши (обработчики: `onMouseEnter`, `onMouseMove`, `onMouseLeave`).
- Стили: `position: relative; display: flex; flex-direction: column; min-height: 100vh; overflow: hidden; padding: 32px 56px 44px; background-color: #272727; color: #fff;`.
- Внутренний вертикальный поток: верхняя навигация, затем гибкий отступ «сцена», затем нижний контент, закреплённый у основания.
## Структура по секциям
### 1. Фоновый слой с эффектом проявления (`.vt-bg`, absolute inset:0, z-index 0, pointer-events:none)
Три наложенных друг на друга слоя:
- **Базовое внешнее изображение** (`.vt-bg-img`): полноразмерная фотография велосипеда снаружи, `object-fit: cover; object-position: center;`, заполняет слой. `user-select:none`, `-webkit-user-drag:none`, `referrerPolicy="no-referrer"`.
- **Рентгеновский слой** (`.vt-bg-xray`, z-index 1): содержит изображение велосипеда в рентгеновском виде/с внутренними компонентами (тот же размер `cover/center`). Этот слой маскируется радиальным градиентом, зависящим от положения курсора (см. раздел «Анимации»). `will-change: -webkit-mask-image, mask-image;` и `transition: -webkit-mask-image .12s linear, mask-image .12s linear;`.
- **Затемняющая вуаль** (`.vt-bg-veil`, z-index 2): вертикальный градиент затемнения, чтобы текст оставался читаемым сверху и снизу:
```
linear-gradient(180deg, rgba(39,38,38,.62) 0%, rgba(39,38,38,.10) 26%, rgba(39,38,38,.10) 60%, rgba(39,38,38,.82) 100%)
```
### 2. Верхняя навигация (`.vt-nav`, z-index 30)
- `display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 24px;`.
- **Логотип** (слева, `.vt-logo`): текст `OBLT`, за которым следует span с `.`. `font-size: 28px; font-weight: 700; letter-spacing: 0.5px; color: #E0E1CC;` (точка также имеет цвет `#E0E1CC`).
- **Центральное меню** (`.vt-menu`, gap 40px): три ссылки — `E-bikes`, `Features`, `Connect`. Для каждой: `font-size: 16px; font-weight: 400; letter-spacing: .3px; color: #E0E1CC; opacity: .85; transition: opacity .2s ease;` при наведении → opacity 1.
- **Правая группа** (`.vt-nav-right`, gap 18px): ссылка explore в верхнем регистре и кнопка-гамбургер.
- Текст ссылки `.vt-explore`: `Explore the bike` — `font-size: 14px; font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase; color: #E0E1CC;` при наведении → opacity .65.
- **Гамбургер** (`.vt-burger`, скрыт на десктопе): 34×34px, три полосы `#E0E1CC` размером 22×2px, радиус 2px, расстояние 5px. В состоянии `.open`: полоса 1 — `translateY(7px) rotate(45deg)`, полоса 2 — `opacity:0`, полоса 3 — `translateY(-7px) rotate(-45deg)`. Переход `transform .25s ease, opacity .2s ease`.
- **Мобильное выпадающее меню** (`.vt-mobile-menu`, отображается только при `menuOpen`): абсолютно позиционируется под навигацией (`top:100%; margin-top:16px; z-index:40`), `background: rgba(20,19,19,.97); backdrop-filter: blur(10px); border: 1px solid rgba(255,255,255,.1); border-radius: 16px; padding: 8px 18px;`. Ссылки (`E-bikes`, `Features`, `Connect`, `Explore the bike`): `color:#E0E1CC; font-size:18px; padding:14px 4px; border-bottom:1px solid rgba(255,255,255,.08)`; у последней ссылки `border-bottom:none; font-weight:700`. Каждая ссылка закрывает меню по клику.
### 3. Отступ сцены (`.vt-stage`, z-index 30, `flex: 1 1 0%`)
- `display: flex; align-items: flex-start; justify-content: flex-end; padding-top: 22px;`. В текущей разметке это пустой отступ с `aria-hidden` (стили пульсирующей точки `.vt-hint` существуют в CSS, но сам элемент подсказки не отображается).
- (Справочно: `.vt-hint` оформлен как подпись в верхнем регистре размером 11px/600 и круглая точка диаметром 36px, `border:1px solid rgba(46,211,176,.5); color:#2ed3b1;`, с анимацией `vtPulse 1.8s ease-in-out infinite`.)
### 4. Нижний контент (`.vt-bottom`, z-index 30)
Сетка из 12 колонок: `grid-template-columns: repeat(12, 1fr); align-items: end; gap: 18px 32px;`.
- **Заголовок** (`.vt-headline`, `grid-column: 1 / span 8`): `<h1>`, содержащий компонент поочерёдного появления слов. Стили h1: `color: #E0E1CC; font-weight: 500; font-size: clamp(36px, 7vw, 116px); line-height: 0.85; letter-spacing: -0.07em; white-space: nowrap; margin:0;`. Текст: **Ready For The Ride**.
- **Правый блок** (`.vt-right`, `grid-column: 9 / span 4; align-self: end; transform: translateY(22px);`):
- Абзац (дословно): `An integrated gearbox, battery, and motor engineered in carbon and built to be seen. Every system, in the open.` Стили: `font-size: 16px; line-height: 1.2; color: rgba(225,224,204,.7);` появляется с помощью `vtFadeUp .8s cubic-bezier(.16,1,.3,1) both` с задержкой анимации `animation-delay: .5s`.
- **Кнопка CTA** (`.vt-cta`): текст **Reserve yours** и круглая стрелка. Пилюля: `color:#000; background:#E0E1CC; border:none; border-radius:9999px; padding:6px 6px 6px 22px; font-size: clamp(14px, 1vw, 16px); font-weight:500; display:inline-flex; align-items:center; gap:10px;`. Анимируется через `vtFadeUp .8s cubic-bezier(.16,1,.3,1) both`, `animation-delay: .7s`. При наведении → `gap: 14px`. Внутренний круг `.circ`: 40×40px, `border-radius:50%; background:#000;`, содержит SVG (`stroke="#E0E1CC"`); при наведении на кнопку `.circ` увеличивается до `1.1` (`transition: transform .25s ease`).
## Ресурсы (все URL)
- Внешняя фотография (базовый слой): `https://cdn.jiro.build/ARS/OBLT%20E%20Bike/bike-exterior.png`
- Фотография в рентгеновском виде / внутренних компонентов (проявляемый слой): `https://cdn.jiro.build/ARS/OBLT%20E%20Bike/bike-xray-original.png`
- Иконка стрелки CTA: встроенный SVG, 16×16, `viewBox="0 0 24 24"`, `stroke="currentColor"`, `stroke-width="2.2"`, закруглённые окончания и соединения, path:
```
M5 12h14M13 6l6 6-6 6
```
## Анимации
### Рентгеновский прожектор, следующий за курсором (ключевая интеракция)
- Состояния: `hovering` (bool) и `pos` ({x,y} в пикселях относительно ограничивающего прямоугольника секции). `handleMove` вычисляет `e.clientX - rect.left`, `e.clientY - http://rect.top`.
- Константы: `RADIUS = 165` px (радиус прожектора), `FEATHER = 45` px (мягкий край). Внутренний радиус полного просвета = `RADIUS - FEATHER` = 120px.
- Свойства `maskImage` / `WebkitMaskImage` рентгеновского слоя задаются встроенными стилями. При наведении:
```
radial-gradient(circle 165px at {x}px {y}px, #000 0, #000 120px, transparent 165px)
```
Когда курсор не наведен (свёрнуто до нулевого размера):
```
radial-gradient(circle 0px at 50% 50%, transparent 0, transparent 0)
```
- Переход маски длится `.12s linear`, поэтому проявление плавно следует за курсором. ПРИМЕЧАНИЕ: в CSS непрозрачные (`#000`) области СОХРАНЯЮТ слой — круг открывает рентгеновское изображение, а остальная часть слоя скрыта (под ней видно внешнее изображение).
### Подъём слов в заголовке (компонент `WordsPullUp`)
- Заголовок разделяется по пробелам; каждое слово — span с `inline-block` (`margin-right: 0.22em`, у последнего — 0). Каждое слово анимируется через `wpuUp` с `cubic-bezier(.16,1,.3,1) both`, стандартная `duration = 0.6s`, задержка между словами `delayStep = 0.08s` (`animationDelay: i * 0.08s`).
- Keyframes:
```
@keyframes wpuUp { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
```
- Необязательная надстрочная звёздочка (`.wpu-ast`, `font-size:0.31em; vertical-align:top; top:0.15em; left:-0.05em;`) — здесь не включена (`asterisk` по умолчанию имеет значение false).
- Учитывает `@media (prefers-reduced-motion: reduce)` → `.wpu-word { animation: none; }`.
### Появление правого блока снизу (`vtFadeUp`)
```
@keyframes vtFadeUp { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
```
Задержка абзаца `.5s`, задержка CTA `.7s`; для обоих используются `.8s cubic-bezier(.16,1,.3,1) both`.
### Пульсация (определена для точки подсказки)
```
@keyframes vtPulse { 0%,100%{transform:scale(1);opacity:.7} 50%{transform:scale(1.12);opacity:1} }
```
Применяется `vtPulse 1.8s ease-in-out infinite`.
## Адаптивность
- **≤1000px**: padding `24px 28px 32px`; навигация превращается в `1fr auto` (логотип + правая группа); центральное `.vt-menu` и `.vt-explore` скрыты; гамбургер отображается; `.vt-bottom` сворачивается в одну колонку (`gap:16px`); заголовок и правый блок занимают всю ширину; у `.vt-right` `transform:none; align-self:start; margin-top:4px; max-width:520px`.
- **≤600px**: padding `18px 20px 26px`; у логотипа `font-size:22px`; у заголовка `white-space:normal; font-size: clamp(40px, 13vw, 72px); line-height:0.92`; у абзаца `font-size:15px; margin-bottom:16px`; у CTA `font-size:14px; padding:5px 5px 5px 20px`; `.circ` размером 36×36px.
## Ключевые принципы дизайна
- Тёмная сцена (`#272727`) с единственным тёплым кремовым акцентом (`#E0E1CC`) и бирюзовым акцентом (`#2ed3b1`), зарезервированным для (необязательной) пульсирующей подсказки.
- Проявление продукта — главный визуальный элемент: курсор действует как рентгеновский фонарь над парой наложенных фотографий.
- Крупный редакционный заголовок (line-height 0.85, плотный трекинг `-0.07em`), закреплённый внизу слева; вспомогательный текст и CTA — внизу справа.
- Последовательное плавное появление (`cubic-bezier(.16,1,.3,1)`) для создания визуальной иерархии.
## Распространённые ошибки, которых следует избегать
- Не инвертируйте логику маски: непрозрачный `#000` в радиальном градиенте ОТКРЫВАЕТ рентгеновский слой; прозрачное кольцо скрывает его. При обратной логике внутренние компоненты будут видны повсюду, кроме области под курсором.
- Сохраняйте `RADIUS - FEATHER` (120px) как внутреннюю сплошную границу, а `RADIUS` (165px) — как прозрачную границу: эта полоса шириной 45px создаёт мягкий край.
- Координаты мыши должны вычисляться относительно прямоугольника секции (`getBoundingClientRect`), а не окна просмотра.
- Переход маски должен быть только `.12s linear` — более длительный переход или easing создаст ощущение запаздывания прожектора.
- `white-space: nowrap` у заголовка на десктопе используется намеренно; переключайте на `normal` только при ≤600px.
- Ограничьте все сбросы стилей и `@import` шрифта Almarai этим компонентом; не изменяйте глобальные стили `body`/`html`.
## Заголовок страницы
OBLT — Ready For The Ride
## Интеграция (безопасность сборки — не пропускать)
- Добавьте эту секцию как **новый** файл компонента с уникальным именем. Не редактируйте и не перезаписывайте существующие файлы, кроме добавления импорта и её рендеринга.
- Отрендерите её **после** всех существующих секций; оставьте каждую ранее созданную секцию без изменений — никогда не заменяйте и не удаляйте их.
- Если проекта нет, создайте минимальное приложение React + Tailwind; если проект уже существует, используйте его как есть — не создавайте его заново и не изменяйте конфигурацию или версию Tailwind/build.
- Сохраняйте компонент самодостаточным: ограничьте шрифт и любые сбросы стилей этой секцией; никогда не задавайте глобальные стили для `body`/`html`/`*` и глобальный шрифт.
- Устанавливайте только библиотеки, названные в этой секции.# OBLT E-bike Header
A full-viewport, dark, cinematic e-bike product header for the brand **OBLT**, built in React (client component) with pure CSS and an interactive cursor-following "x-ray" spotlight reveal — moving the mouse wipes away the bike's exterior photo to expose its internal carbon/gearbox structure underneath. Built with React only (no animation libraries).
## Tech stack (libraries actually imported)
- React only — `useRef`, `useState`, and the `MouseEvent` type. No framer-motion, no GSAP, no icon library. All animation is hand-written CSS keyframes + an inline CSS `mask-image`.
- SVG icon (the CTA arrow) is hand-inlined, not from a library.
## Fonts & global styles
- Single Google font, imported inside a `<style>` block:
```
@import url('https://fonts.googleapis.com/css2?family=Almarai:wght@300;400;700;800&display=swap');
```
- Font stack: `"Almarai","Helvetica Neue",Helvetica,Arial,sans-serif`.
- `-webkit-font-smoothing: antialiased`. `box-sizing: border-box` applied to the root and all descendants (scoped to `.vt-header`, never global).
## Section container
- Root `<header className="vt-header">` is the mouse-tracking element (handlers: `onMouseEnter`, `onMouseMove`, `onMouseLeave`).
- Styles: `position: relative; display: flex; flex-direction: column; min-height: 100vh; overflow: hidden; padding: 32px 56px 44px; background-color: #272727; color: #fff;`.
- Internal vertical flow: top nav, then a flex-grow spacer "stage", then bottom content pinned to the base.
## Structure, section by section
### 1. Reveal background (`.vt-bg`, absolute inset:0, z-index 0, pointer-events:none)
Three stacked layers:
- **Base exterior image** (`.vt-bg-img`): the full bike exterior photo, `object-fit: cover; object-position: center;`, fills the layer. `user-select:none`, `-webkit-user-drag:none`, `referrerPolicy="no-referrer"`.
- **X-ray layer** (`.vt-bg-xray`, z-index 1): contains the bike x-ray/internal image (same cover/center sizing). This layer is masked by a radial gradient driven by cursor position (see Animations). `will-change: -webkit-mask-image, mask-image;` and `transition: -webkit-mask-image .12s linear, mask-image .12s linear;`.
- **Veil overlay** (`.vt-bg-veil`, z-index 2): a vertical darkening gradient so text stays legible top & bottom:
```
linear-gradient(180deg, rgba(39,38,38,.62) 0%, rgba(39,38,38,.10) 26%, rgba(39,38,38,.10) 60%, rgba(39,38,38,.82) 100%)
```
### 2. Top nav (`.vt-nav`, z-index 30)
- `display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; gap: 24px;`.
- **Logo** (left, `.vt-logo`): text `OBLT` followed by a `.` span. `font-size: 28px; font-weight: 700; letter-spacing: 0.5px; color: #E0E1CC;` (dot is also `#E0E1CC`).
- **Center menu** (`.vt-menu`, gap 40px): three links — `E-bikes`, `Features`, `Connect`. Each: `font-size: 16px; font-weight: 400; letter-spacing: .3px; color: #E0E1CC; opacity: .85; transition: opacity .2s ease;` hover → opacity 1.
- **Right cluster** (`.vt-nav-right`, gap 18px): an uppercase explore link plus a hamburger button.
- `.vt-explore` link text: `Explore the bike` — `font-size: 14px; font-weight: 700; letter-spacing: 1.5px; text-transform: uppercase; color: #E0E1CC;` hover → opacity .65.
- **Hamburger** (`.vt-burger`, hidden on desktop): 34×34px, three `#E0E1CC` bars 22×2px, radius 2px, gap 5px. On `.open`: bar 1 `translateY(7px) rotate(45deg)`, bar 2 `opacity:0`, bar 3 `translateY(-7px) rotate(-45deg)`. Transition `transform .25s ease, opacity .2s ease`.
- **Mobile dropdown** (`.vt-mobile-menu`, rendered only when `menuOpen`): absolutely positioned below the nav (`top:100%; margin-top:16px; z-index:40`), `background: rgba(20,19,19,.97); backdrop-filter: blur(10px); border: 1px solid rgba(255,255,255,.1); border-radius: 16px; padding: 8px 18px;`. Links (`E-bikes`, `Features`, `Connect`, `Explore the bike`): `color:#E0E1CC; font-size:18px; padding:14px 4px; border-bottom:1px solid rgba(255,255,255,.08)`; last link `border-bottom:none; font-weight:700`. Each link closes the menu on click.
### 3. Stage spacer (`.vt-stage`, z-index 30, `flex: 1 1 0%`)
- `display: flex; align-items: flex-start; justify-content: flex-end; padding-top: 22px;`. In the current markup it is an empty `aria-hidden` spacer (the `.vt-hint` pulsing-dot styles exist in CSS but the hint element is not rendered).
- (Reference: `.vt-hint` styled as an uppercase 11px/600 label with a 36px circle dot, `border:1px solid rgba(46,211,176,.5); color:#2ed3b1;` running `vtPulse 1.8s ease-in-out infinite`.)
### 4. Bottom content (`.vt-bottom`, z-index 30)
12-column grid: `grid-template-columns: repeat(12, 1fr); align-items: end; gap: 18px 32px;`.
- **Headline** (`.vt-headline`, `grid-column: 1 / span 8`): `<h1>` containing the word-stagger component. h1 style: `color: #E0E1CC; font-weight: 500; font-size: clamp(36px, 7vw, 116px); line-height: 0.85; letter-spacing: -0.07em; white-space: nowrap; margin:0;`. Text: **Ready For The Ride**.
- **Right block** (`.vt-right`, `grid-column: 9 / span 4; align-self: end; transform: translateY(22px);`):
- Paragraph (verbatim): `An integrated gearbox, battery, and motor engineered in carbon and built to be seen. Every system, in the open.` Style: `font-size: 16px; line-height: 1.2; color: rgba(225,224,204,.7);` animates in via `vtFadeUp .8s cubic-bezier(.16,1,.3,1) both` with `animation-delay: .5s`.
- **CTA button** (`.vt-cta`): label **Reserve yours** plus a circular arrow. Pill: `color:#000; background:#E0E1CC; border:none; border-radius:9999px; padding:6px 6px 6px 22px; font-size: clamp(14px, 1vw, 16px); font-weight:500; display:inline-flex; align-items:center; gap:10px;`. Animates via `vtFadeUp .8s cubic-bezier(.16,1,.3,1) both`, `animation-delay: .7s`. Hover → `gap: 14px`. Inner circle `.circ`: 40×40px, `border-radius:50%; background:#000;` containing the SVG (stroke `#E0E1CC`); on button hover `.circ` scales to `1.1` (`transition: transform .25s ease`).
## Assets (every URL)
- Exterior photo (base layer): `https://cdn.jiro.build/ARS/OBLT%20E%20Bike/bike-exterior.png`
- X-ray / internals photo (revealed layer): `https://cdn.jiro.build/ARS/OBLT%20E%20Bike/bike-xray-original.png`
- CTA arrow icon: inline SVG, 16×16, `viewBox="0 0 24 24"`, `stroke="currentColor"`, `stroke-width="2.2"`, round caps/joins, path:
```
M5 12h14M13 6l6 6-6 6
```
## Animations
### Cursor "x-ray" spotlight (signature interaction)
- State: `hovering` (bool) and `pos` ({x,y} in px relative to the section's bounding rect). `handleMove` computes `e.clientX - rect.left`, `e.clientY - http://rect.top`.
- Constants: `RADIUS = 165` px (spotlight radius), `FEATHER = 45` px (soft edge). Inner fully-clear radius = `RADIUS - FEATHER` = 120px.
- The x-ray layer's `maskImage` / `WebkitMaskImage` is set inline. When hovering:
```
radial-gradient(circle 165px at {x}px {y}px, #000 0, #000 120px, transparent 165px)
```
When not hovering (collapsed to nothing):
```
radial-gradient(circle 0px at 50% 50%, transparent 0, transparent 0)
```
- Mask transitions at `.12s linear` so the reveal trails the cursor smoothly. NOTE: in CSS `mask`, opaque (`#000`) areas KEEP the layer — so the circle reveals the x-ray image while the rest of that layer is hidden (showing the exterior beneath).
### Headline word pull-up (`WordsPullUp` component)
- Splits the headline on spaces; each word is an `inline-block` span (`margin-right: 0.22em`, last word 0). Each word animates `wpuUp` with `cubic-bezier(.16,1,.3,1) both`, default `duration = 0.6s`, staggered by `delayStep = 0.08s` (`animationDelay: i * 0.08s`).
- Keyframes:
```
@keyframes wpuUp { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
```
- Optional superscript asterisk (`.wpu-ast`, `font-size:0.31em; vertical-align:top; top:0.15em; left:-0.05em;`) — not enabled here (`asterisk` defaults false).
- Respects `@media (prefers-reduced-motion: reduce)` → `.wpu-word { animation: none; }`.
### Fade-up for right block (`vtFadeUp`)
```
@keyframes vtFadeUp { from { transform: translateY(20px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
```
Paragraph delay `.5s`, CTA delay `.7s`; both `.8s cubic-bezier(.16,1,.3,1) both`.
### Pulse (defined for hint dot)
```
@keyframes vtPulse { 0%,100%{transform:scale(1);opacity:.7} 50%{transform:scale(1.12);opacity:1} }
```
Applied `vtPulse 1.8s ease-in-out infinite`.
## Responsive
- **≤1000px**: padding `24px 28px 32px`; nav becomes `1fr auto` (logo + right); center `.vt-menu` and `.vt-explore` hidden; hamburger shown; `.vt-bottom` collapses to single column (`gap:16px`); headline & right span full width; `.vt-right` `transform:none; align-self:start; margin-top:4px; max-width:520px`.
- **≤600px**: padding `18px 20px 26px`; logo `font-size:22px`; headline `white-space:normal; font-size: clamp(40px, 13vw, 72px); line-height:0.92`; paragraph `font-size:15px; margin-bottom:16px`; CTA `font-size:14px; padding:5px 5px 5px 20px`; `.circ` 36×36px.
## Key design principles
- Dark stage (`#272727`) with a single warm-cream accent (`#E0E1CC`) and a teal accent (`#2ed3b1`) reserved for the (optional) pulse hint.
- The product reveal IS the hero: cursor acts as an x-ray torch over a layered photo pair.
- Editorial oversized headline (line-height 0.85, tight `-0.07em` tracking) anchored bottom-left; supporting copy + CTA bottom-right.
- Staggered, eased (`cubic-bezier(.16,1,.3,1)`) entrance for hierarchy.
## Common mistakes to avoid
- Don't invert the mask logic: opaque `#000` in the radial gradient REVEALS the x-ray layer; the transparent ring hides it. Getting this backwards shows internals everywhere except under the cursor.
- Keep `RADIUS - FEATHER` (120px) as the inner solid stop and `RADIUS` (165px) as the transparent stop — that 45px band is the soft feather.
- Mouse coordinates must be relative to the section rect (`getBoundingClientRect`), not the viewport.
- Mask transition is `.12s linear` only — a longer/eased transition makes the spotlight feel laggy.
- `white-space: nowrap` on the headline is intentional on desktop; only switch to `normal` at ≤600px.
- Scope all resets and the Almarai `@import` to the component; do not touch global `body`/`html`.
## Page title
OBLT — Ready For The Ride
## Integration (build-safety — do not skip)
- Add this section as a **new** component file with a unique name. Don't edit or overwrite any existing file except to add its import and render it.
- Render it **after** all existing sections; keep every previously built section exactly as-is — never replace or remove them.
- If no project exists, create a minimal React + Tailwind app; if one exists, use it as-is — don't re-scaffold or change the Tailwind/build config or version.
- Keep it self-contained: scope its fonts and any resets to this section; never set global `body`/`html`/`*` styles or a global font.
- Install only the libraries this section names.
Права на промпт принадлежат автору @iamtanzil_. За коммерческое использование — продвижение нейросетей, агрегаторов, Telegram-ботов — отвечаете вы: mozgi.io ответственности не несёт. Подробнее →











