# Cyberpunk Robots Landing Plan
Date: 2026-05-15
Main reference:
- Design note: `landing/docs/design/cyberpunk-robots-hero-reference.md`
- WebP reference: `landing/assets/images/references/cyberpunk-robots-hero-reference-2026-05-15.webp`
- PNG reference: `landing/assets/images/references/cyberpunk-robots-hero-reference-2026-05-15.png`
## Goal
Turn the current Agent Teams landing hero into a cyberpunk command scene where the core product idea is obvious in the first viewport:
- You are the CTO.
- Many AI agents coordinate as a team.
- The center-right hero frame is the demo video.
- Robots around the video pass messages, review, build, test, and deploy.
- The page feels premium and alive, not like a static poster.
## Locked Decisions
- Use the slogan exactly: `YOU'RE THE CTO, AGENTS ARE YOUR TEAM.`
- Remove the top-left status metrics block from the generated reference.
- Keep the central block as a real video frame.
- Use **message passing option 1 + 2**:
- SVG neon packets moving along connector lines.
- Occasional readable message bubbles like `Code ready`, `Review requested`, `Tests passed`.
- Use WebP for production visual assets.
- Do not add animation libraries in the first implementation. Use Vue, CSS transforms, SVG, and existing project tooling.
- Keep SSG compatibility. No runtime-only backend assumptions.
## Quality Bar
This is the practical target. If a change does not support these points, it is probably visual noise.
- First viewport must explain the product before the user scrolls: AI agents coordinate around a real demo.
- The design should feel like a premium developer tool, not a game poster.
- The hero must be usable as a website: readable text, clickable CTAs, playable video, accessible controls.
- The cyberpunk style must come from layout, light, depth, contrast, and motion. Do not rely on random neon decoration.
- Robots must be meaningful: each robot has a role, status, task card, and relation to the central video frame.
- Motion must be subtle and layered. It should communicate activity, not distract from CTA and video.
- Mobile must be intentionally redesigned, not just scaled down.
- Implementation should stay maintainable: data-driven roles, small components, CSS tokens, no giant one-off template.
Quality score target:
- Visual impact: 🎯 9/10
- Reliability across breakpoints: 🛡️ 8/10
- Implementation complexity: 🧠 8/10
- Performance risk after optimization: 🛡️ 8/10
## Recommended Build Strategy
**Hybrid asset + code scene** - 🎯 9 🛡️ 8 🧠 8 - roughly **1200-1900 lines** total.
Why this is the right approach:
- Background and robots need visual richness, so they should be assets.
- HUD, text, video, buttons, connectors, hover states, and responsive layout should be code.
- Animations need separate layers so the scene feels alive and remains maintainable.
- A single full-page image would look good once, but it would be fragile, bad for SEO, hard to localize, and impossible to make interactive.
### Top 3 Build Variants
1. **Balanced production hero** - 🎯 9 🛡️ 8 🧠 8 - **1200-1900 lines**.
Use WebP background, separate robot assets, code-rendered HUD, real video, SVG packets, message bubbles, and custom parallax. Best balance of visual quality and maintainability.
2. **Fast coded approximation** - 🎯 7 🛡️ 8 🧠 5 - **650-1000 lines**.
Use one background reference image, fewer robots, simple CSS cards, simple connectors. Good for quick direction validation, but weaker visual depth and less premium.
3. **Maximum cinematic scene** - 🎯 9 🛡️ 6 🧠 10 - **1900-2800 lines**.
More layered assets, advanced robot cuts, per-robot arm/screen layers, richer parallax and timed sequences. Highest wow effect, but more fragile and slower to tune.
Recommended: option 1. It gives enough wow while keeping the landing page real, responsive, and debuggable.
## Current Landing Context
Current project shape:
- Nuxt 3 + Vue 3 + TypeScript.
- Vuetify is already configured.
- Existing hero lives in `landing/components/sections/HeroSection.vue`.
- Existing demo video component lives in `landing/components/ui/HeroDemoVideo.vue`.
- Existing background/video styling lives inside `HeroSection.vue`.
- Existing parallax helper exists at `landing/composables/useParallaxSections.ts`, but it is section-level and too generic for this hero.
Important guardrails:
- Landing must remain static-generated.
- Content and i18n stay separate:
- microcopy in `landing/locales/*`
- section content in `landing/content/*`
- Avoid broad stores. This hero does not need Pinia.
- Do not run broad auto-format commands unless intentionally doing a formatting pass.
## Content, SEO, and i18n Rules
Content score: 🎯 8 🛡️ 9 🧠 5.
The hero can look cinematic, but the content model must stay boring and reliable.
- The `h1` remains real text and must include `Agent Teams`.
- The slogan is locked in English for this design pass: `YOU'RE THE CTO, AGENTS ARE YOUR TEAM.`
- Paragraph copy should still come from the existing content/i18n layer unless the product copy is intentionally changed.
- CTA labels should continue using locale messages.
- Robot role labels can start in `landing/data/heroAgents.ts`, but final user-visible strings should move to locale files if they become part of the stable landing content.
- Do not put SEO-critical claims inside images, SVG-only text, or video.
- Keep `alt=""` for decorative robot images. If a robot becomes meaningful content, expose the meaning in nearby HTML, not in a long image alt.
- The central video frame should have an accessible label like `Watch Agent Teams demo`.
- If the visible hero copy changes, update page meta/OG copy in the existing SEO path.
Copy rules:
- One idea per line/block.
- Avoid generic AI slogans.
- Prefer product-specific language:
- `Agents coordinate tasks, messages, reviews, and releases.`
- `You set the goal. They handle the work.`
- Avoid overexplaining the animation in visible text. The animation should demonstrate coordination by itself.
Localization risk:
1. **Keep slogan English-only for style** - 🎯 8 🛡️ 8 🧠 3 - **0-20 lines**.
Best for this cyberpunk visual because the generated reference and mono strip depend on a short English command phrase.
2. **Translate slogan per locale** - 🎯 7 🛡️ 7 🧠 5 - **30-80 lines**.
Better localization, but must test text length in every language.
3. **Use a shorter locale-specific eyebrow plus English slogan** - 🎯 8 🛡️ 8 🧠 6 - **50-110 lines**.
Good compromise if non-English pages feel awkward later.
Recommended now: option 1. Revisit after the hero layout is stable.
## Design System Direction
### Visual Principles
- **Command center, not decoration**: every bright element should imply state, action, routing, focus, or hierarchy.
- **One clear hero action cluster**: the user should see headline, slogan, paragraph, and CTAs before noticing secondary details.
- **Depth through layers**: background city, atmospheric wash, connector network, video frame, robots, message bubbles, foreground scanlines.
- **Readable over flashy**: the headline and CTAs win over robots and neon.
- **Robots explain the product**: robots should frame the video and task flow, not just decorate corners.
- **Cyberpunk restraint**: cyan is the system color, magenta is activity/accent, amber/red are rare warning states.
### Composition Rules
Desktop composition:
- Left 38-42%: brand message and CTAs.
- Center/right 58-62%: video command frame and robot network.
- The video frame should be the largest object after the headline.
- Robots should orbit the video, not compete with the headline.
- Bottom feature strip should peek into the first viewport, about 92-140px visible.
- Keep the upper-left area clean after removing the status block. Use only subtle skyline/HUD detail there.
Hero hierarchy:
1. `Agent Teams` headline.
2. `YOU'RE THE CTO, AGENTS ARE YOUR TEAM.` slogan strip.
3. One short paragraph.
4. CTA row.
5. Demo video frame.
6. Robots and message network.
7. Feature strip.
Spacing:
- Desktop safe content max width: `min(1640px, calc(100vw - 64px))`.
- Hero min height: `min(980px, 100svh)` for large screens, `auto` on mobile.
- Left content max width: `620px`.
- CTA row gap: `12-16px`.
- Minimum gap from headline to video frame: `32px`.
- Minimum gap from robot/card to video controls: `24px`.
### Typography
Use the existing Inter + JetBrains Mono direction, but with stricter roles:
- Headline: Inter, 72-96px desktop, 54-64px laptop, 40-48px tablet, 36-42px mobile.
- Slogan strip: JetBrains Mono, uppercase, 14-17px desktop, 12-14px mobile.
- Paragraph: Inter, 18-21px desktop, 16px mobile, line-height `1.65`.
- Robot role labels: JetBrains Mono, 11-13px, uppercase.
- Task card text: JetBrains Mono or Inter depending readability, 10-12px.
- Buttons: Inter or JetBrains Mono, 14-15px, uppercase only if it matches current nav style.
Rules:
- Do not use viewport-width font scaling.
- No negative letter spacing for compact UI text.
- Avoid text shadows on small text unless they improve contrast.
- Generated image text is not a source of truth. Real product text must be HTML.
### Color and Light
Primary palette:
```text
Background: #02050d, #050814, #09101f
Panel: rgba(3, 10, 22, 0.72)
Panel strong: rgba(5, 14, 31, 0.88)
Cyan: #00eaff
Blue: #2f7dff
Magenta: #ff2bff
Violet: #8b5cff
Amber: #ffb238
Red: #ff4c6a
Text: #f4f7ff
Muted: #9ba8c7
```
Light rules:
- Cyan is structure: borders, primary routes, focus, system state.
- Magenta is activity: packets, live events, active robot accents.
- Amber is caution: ops/build/waiting.
- Red is rare: security or critical state only.
- Do not let the page become purple-only.
- Use dark gradient washes behind text instead of cranking text shadow.
### Design Token Contract
Token contract score: 🎯 9 🛡️ 9 🧠 5.
Create a small cyber hero token layer in `landing/assets/styles/cyberpunk-hero.scss`. Do not scatter raw hex values across components.
Token groups:
```scss
:root {
--cyber-bg-0: #02050d;
--cyber-bg-1: #050814;
--cyber-panel-weak: rgba(3, 10, 22, 0.58);
--cyber-panel: rgba(3, 10, 22, 0.72);
--cyber-panel-strong: rgba(5, 14, 31, 0.88);
--cyber-cyan: #00eaff;
--cyber-blue: #2f7dff;
--cyber-magenta: #ff2bff;
--cyber-violet: #8b5cff;
--cyber-amber: #ffb238;
--cyber-red: #ff4c6a;
--cyber-text: #f4f7ff;
--cyber-muted: #9ba8c7;
--cyber-border-cyan: rgba(0, 234, 255, 0.42);
--cyber-border-magenta: rgba(255, 43, 255, 0.42);
--cyber-radius-xs: 4px;
--cyber-radius-sm: 6px;
--cyber-radius-md: 8px;
--cyber-frame-cut: 18px;
}
```
Rules:
- Raw hex values are allowed in token definitions and nowhere else unless there is a clear reason.
- Use semantic variables for accent states: `--agent-accent`, `--agent-accent-soft`, `--message-accent`.
- Keep opacity in token names when it is stable. Use local opacity only for one-off fine tuning.
- If a color appears 3+ times, it becomes a token.
- Do not import a new design system or utility library for this hero.
Review gate:
- Run `rg "#[0-9a-fA-F]{3,8}" landing/components/hero landing/assets/styles/cyberpunk-hero.scss` and verify raw colors are intentional.
### HUD Geometry
Use one angular language everywhere:
- Frame corners clipped with `clip-path`.
- Decorative corner strokes are pseudo-elements.
- Borders are 1px base, 2px only on active/focused elements.
- Radius should be small: `4px`, `6px`, max `8px`.
- Avoid pill-heavy UI except small badges.
- Prefer corners and edge accents over heavy full-box glow.
Frame pattern:
```scss
.cyber-frame {
position: relative;
border: 1px solid rgba(0, 234, 255, 0.42);
background: linear-gradient(135deg, rgba(3, 10, 22, 0.88), rgba(7, 12, 28, 0.66));
clip-path: polygon(18px 0, 100% 0, 100% calc(100% - 18px), calc(100% - 18px) 100%, 0 100%, 0 18px);
}
```
Best practice:
- Use `clip-path` on wrapper.
- Use a child element for content padding.
- Do not clip focus rings on interactive children. Add focus rings on inner buttons, not the clipped parent.
## Target File Structure
Recommended new or changed files:
```text
landing/components/sections/HeroSection.vue
landing/components/hero/CyberHeroScene.vue
landing/components/hero/CyberHeroVideoFrame.vue
landing/components/hero/CyberHeroRobot.vue
landing/components/hero/CyberHeroConnectors.vue
landing/components/hero/CyberHeroMessageBubbles.vue
landing/components/hero/CyberHeroFeatureStrip.vue
landing/data/heroAgents.ts
landing/composables/useCyberHeroParallax.ts
landing/assets/styles/cyberpunk-hero.scss
landing/assets/images/hero/cyberpunk-city-bg.webp
landing/assets/images/hero/cyberpunk-floor-glow.webp
landing/assets/images/hero/robots/*.webp
```
Alternative if scope needs to be smaller:
- Keep everything in `HeroSection.vue` first - 🎯 7 🛡️ 6 🧠 5 - **700-1100 lines**.
- Faster, but the file will become too large and harder to tune.
- I do not recommend this unless speed matters more than maintainability.
## Asset Plan
Asset strategy score: 🎯 9 🛡️ 8 🧠 7.
Main rule: assets provide richness, code provides layout and meaning.
- Background can be art-directed and baked.
- Robot bodies can be bitmap assets.
- Text, CTAs, video, role cards, connectors, packets, focus states, and responsive behavior must be HTML/CSS/SVG.
### 1. Background
Create:
```text
landing/assets/images/hero/cyberpunk-city-bg.webp
landing/assets/images/hero/cyberpunk-floor-glow.webp
landing/assets/images/hero/cyberpunk-city-bg-mobile.webp
```
Specs:
- `cyberpunk-city-bg.webp`
- 2560x1440 or 2880x1620 source.
- Export target around 350-650KB.
- Dark city, neon signage, rainy depth, no readable random brand text.
- Left side must stay clean enough for headline readability.
- Right/center can be richer behind the video frame.
- `cyberpunk-floor-glow.webp`
- Transparent WebP if possible.
- Export target around 120-260KB.
- Wet reflection, magenta/cyan platform glow under the video frame.
- Can be hidden on mobile.
- `cyberpunk-city-bg-mobile.webp`
- 1080x1600 or 1290x1800.
- Re-cropped for mobile, not automatically squeezed from desktop.
- Keep top/left text area dark and quiet.
Implementation:
- Use `image-set()` or normal `background-image`.
- Put a dark gradient wash over the background.
- Add scanline/noise via CSS pseudo-elements, not baked into every asset.
- Use `background-position` by breakpoint:
- desktop: `center top`
- laptop: `58% top`
- mobile: `center top`
- Add `content-visibility` only below the hero, not on the hero itself.
### 2. Robot Assets
Create 8-10 separate robot assets:
```text
planner.webp
lead.webp
reviewer.webp
developer.webp
tester.webp
researcher.webp
docs.webp
ops.webp
security.webp
fixer.webp
```
Specs:
- Transparent background.
- WebP with alpha for final use.
- Keep original PNG sources if generation/post-processing needs them.
- Keep a neutral light direction: top/front cyan, side magenta accents.
- Robots should have tablets or small panels when possible.
- Keep silhouettes varied, but keep the same visual family.
- Rough display size:
- desktop large robots: 150-240px tall.
- desktop small robots: 90-150px tall.
- mobile: hide most robots, keep 2-3 symbolic avatars/cards.
Generation workflow:
1. Generate robots on flat chroma-key background.
2. Remove background locally.
3. Convert alpha PNG to WebP.
4. Validate edges against dark and cyan/magenta backgrounds.
5. Create a tiny contact glow in CSS, not in the asset, so it can adapt to layout.
6. Save source prompt and generation notes near assets if final assets are generated.
Do not make the robots look like soldiers. They should feel like compact software-agent assistants.
Robot asset acceptance:
- Edges are clean on `#02050d`.
- No baked text inside the robot asset.
- No weapons or battle armor.
- Face/screen area is clear enough for blink/pulse overlays.
- Each robot can be mirrored only if labels and screen details do not become visibly wrong.
### 2.1 Robot Layering Options
1. **Single image per robot + CSS overlays** - 🎯 8 🛡️ 9 🧠 5 - **80-160 lines**.
Best first version. Add eye glow, card glow, and hover lift in CSS.
2. **Two-layer robot: body + face/screen layer** - 🎯 9 🛡️ 8 🧠 7 - **160-280 lines**.
Use for the 2-3 biggest robots. Allows real blinking and screen pulse.
3. **Three-layer robot: body + face + arm/tablet** - 🎯 9 🛡️ 6 🧠 9 - **260-450 lines**.
Highest animation quality, but only worth it if the hero is already stable.
Recommended: start with option 1 for all robots, then upgrade the Lead, Developer, and Reviewer robots to option 2.
### 3. Video Frame
Reuse the current demo video source from `HeroDemoVideo.vue` unless product wants a new recording.
Frame requirements:
- Angular cyan HUD border.
- Magenta/cyan outer glow.
- Slight perspective transform on desktop.
- Play overlay stays readable.
- Controls still work.
- Fullscreen still works.
- Central frame remains recognizable as video, not fake dashboard art.
Video poster:
- Use a real frame from the demo video or a screenshot from the app.
- Do not use generated UI text as the video poster if the demo video has a better first frame.
- Poster should be dark and readable with the play overlay.
- If the video loads from GitHub user attachments, keep error fallback polished.
### 4. Asset Directory Rules
Recommended directories:
```text
landing/assets/images/hero/backgrounds/
landing/assets/images/hero/robots/
landing/assets/images/hero/overlays/
landing/assets/images/references/
```
Naming:
```text
cyber-city-desktop-v1.webp
cyber-city-mobile-v1.webp
robot-planner-v1.webp
robot-lead-v1.webp
robot-reviewer-v1.webp
```
Do not overwrite generated references. Add `v2`, `v3`, or date suffixes when iterating.
### 5. Compression Targets
Use these as practical budgets:
```text
desktop background: 350-650KB
mobile background: 220-420KB
floor glow overlay: 120-260KB
large robot: 50-110KB
small robot: 25-70KB
full first-viewport image budget: ideally <= 1.4MB
```
If the first version exceeds budget, reduce:
1. background detail
2. robot count on initial load
3. oversized transparent padding around robot assets
4. unnecessary alpha overlays
Use `cwebp -q 82-90` for hero assets and compare visually. Do not blindly set quality to 100.
### 6. Asset QA Checklist
Before an asset is used in the hero:
- [ ] filename follows naming rules
- [ ] dimensions are known
- [ ] visual subject has enough transparent padding but not excessive empty canvas
- [ ] WebP export size is within target or explicitly accepted
- [ ] robot edges look clean on dark background
- [ ] no baked text that should be localized
- [ ] no visible watermark or generation artifacts
- [ ] no accidental weapons/combat styling
- [ ] asset still reads at final rendered size
- [ ] mobile crop is reviewed separately
Asset inspection commands:
```bash
file landing/assets/images/hero/backgrounds/cyber-city-desktop-v1.webp
ls -lh landing/assets/images/hero/backgrounds landing/assets/images/hero/robots
```
If ImageMagick is available:
```bash
magick identify landing/assets/images/hero/robots/robot-lead-v1.webp
```
Do not ship generated assets straight from the generator folder. Copy final selected assets into the landing asset directory and keep references stable.
## Component Design
Component architecture score: 🎯 9 🛡️ 9 🧠 7.
Design rule: the hero is a scene, but it should be built like a product UI. Data and coordinates live in data files, visual primitives live in components, animation timing lives in a small composable, and `HeroSection.vue` stays readable.
### Component Boundaries
- `HeroSection.vue` owns content and links.
- `CyberHeroScene.vue` owns scene composition.
- `CyberHeroVideoFrame.vue` owns video chrome only.
- `CyberHeroRobot.vue` owns one agent visual.
- `CyberHeroConnectors.vue` owns SVG paths and packet animation.
- `CyberHeroMessageBubbles.vue` owns readable message handoff sequence.
- `CyberHeroFeatureStrip.vue` owns the bottom first-viewport feature band.
Avoid:
- importing robot assets directly in many components
- calculating path geometry inside templates
- storing animation state in Pinia
- hardcoding 10 separate robot markup blocks
- making decorative layers intercept pointer events
### CSS Contract
Top-level scene root should expose stable attributes/classes:
```vue
YOU'RE THE CTO, AGENTS ARE YOUR TEAM.
``` Rules: - Use real text. - Use mono font. - Keep one line on desktop. - Allow wrap on mobile if needed. - Add angular frame corners with pseudo-elements. ### Terminal Note The dev branch note can become a cyber terminal strip. Rules: - Keep it clickable if it links to dev branch. - Use `>` prompt style. - Keep release version as small right-aligned text on desktop. - On mobile, stack release version under the terminal line. ### Feature Strip Rules: - Feature strip should not look like five separate floating cards. - Use one full-width angular rail with internal separators. - Icons can glow, but text should stay calm. - On mobile, show 2-3 compact chips or move full strip below hero. ## CSS Implementation Recipes These are the preferred low-level patterns. Use them before inventing one-off effects. ### Angular Panel Use one reusable primitive for HUD panels: ```scss .cyber-panel { position: relative; background: linear-gradient(135deg, rgba(5, 14, 31, 0.92), rgba(3, 10, 22, 0.68)); border: 1px solid rgba(0, 234, 255, 0.42); clip-path: polygon(18px 0, 100% 0, 100% calc(100% - 18px), calc(100% - 18px) 100%, 0 100%, 0 18px); box-shadow: 0 0 0 1px rgba(47, 125, 255, 0.12) inset, 0 0 24px rgba(0, 234, 255, 0.12); } .cyber-panel::before, .cyber-panel::after { content: ""; position: absolute; pointer-events: none; border-color: rgba(0, 234, 255, 0.78); } ``` Rules: - Use `cyber-panel` for slogan, terminal note, robot role cards, and feature rail variants. - Do not duplicate a new panel style for every component. - Use accent classes for color changes: `.cyber-panel--magenta`, `.cyber-panel--amber`. ### Neon Border Without Heavy Blur Good: ```scss .cyber-frame { border: 1px solid rgba(0, 234, 255, 0.58); box-shadow: 0 0 0 1px rgba(0, 234, 255, 0.16) inset, 0 0 20px rgba(0, 234, 255, 0.16), 0 0 48px rgba(255, 43, 255, 0.08); } ``` Avoid: ```scss /* Too expensive and visually mushy */ box-shadow: 0 0 80px #00eaff, 0 0 160px #ff2bff; filter: drop-shadow(0 0 60px #00eaff); ``` ### Scanline Layer Use a very subtle overlay: ```scss .cyber-hero__scanlines { position: absolute; inset: 0; pointer-events: none; opacity: 0.12; background-image: repeating-linear-gradient( to bottom, rgba(255, 255, 255, 0.08) 0, rgba(255, 255, 255, 0.08) 1px, transparent 1px, transparent 4px ); mix-blend-mode: overlay; } ``` Rules: - Keep opacity low. - Do not animate scanlines unless a tiny movement actually improves the scene. - Disable or reduce on mobile if text looks noisy. ### SVG Connector Style ```scss .cyber-connectors__path { fill: none; stroke: rgba(0, 234, 255, 0.36); stroke-width: 1.2; vector-effect: non-scaling-stroke; } .cyber-connectors__path-glow { fill: none; stroke: rgba(0, 234, 255, 0.18); stroke-width: 5; vector-effect: non-scaling-stroke; } .cyber-connectors__path--active { stroke: rgba(255, 43, 255, 0.86); } ``` Rules: - Render glow as separate wider low-opacity path. - Keep the base line crisp. - Use active class only for current message route. ### Responsive Typography Tokens Use bounded `clamp()`: ```scss .cyber-hero__title { font-size: clamp(2.35rem, 5.2vw, 5.8rem); line-height: 0.96; } .cyber-hero__description { font-size: clamp(1rem, 1.15vw, 1.22rem); line-height: 1.65; } ``` Rules: - Never use unbounded `vw` font sizes. - Check longest translated string before locking button widths. - Keep line length around 48-68 characters for paragraph copy. ### Stable Button Layout ```scss .cyber-hero__actions { display: flex; flex-wrap: wrap; gap: 12px; } .cyber-hero__action { min-height: 52px; min-width: 172px; padding: 0 22px; } @media (max-width: 480px) { .cyber-hero__action { flex: 1 1 100%; min-width: 0; } } ``` Rules: - Use fixed min heights. - Do not make button width depend on hover state. - Ensure icon and text stay aligned when labels localize. ## Component Definition of Done ### `HeroSection.vue` Done when: - hero copy is semantic HTML - CTA links work - release/dev note behavior still works - no scene-specific animation state exists here - layout works with JS disabled except advanced animation ### `CyberHeroScene.vue` Done when: - all layers follow z-index contract - decorative layers do not intercept pointer events - scene has stable aspect ratio - mobile does not render a broken desktop composition - reduced motion class/prop is respected ### `CyberHeroVideoFrame.vue` Done when: - video plays, pauses, seeks, mutes, and fullscreen works - frame chrome does not clip controls - loading and error states are styled - mobile removes perspective transforms if they blur the video ### `CyberHeroRobot.vue` Done when: - robot is positioned via data-driven CSS variables - active sender/receiver states work - role card is readable - idle animation does not override parallax transform - image has width/height or reserved layout space ### `CyberHeroConnectors.vue` Done when: - paths use a shared viewbox - paths do not cross copy/CTA safe zones - active route is visually obvious - packets can be disabled without losing all meaning - SVG is `aria-hidden` ### `CyberHeroMessageBubbles.vue` Done when: - one message sequence is active at a time - timers clear on unmount - hidden tab pauses sequence - reduced motion shows static copy - bubbles never cover CTA or video controls ### `useCyberHeroParallax.ts` Done when: - listeners attach only on client - listeners are cleaned up - pointer values are clamped - RAF is used - touch/mobile and reduced motion disable it - no Vue reactive state updates every frame ## Nuxt and Vue Best Practices - Use `ClientOnly` only where browser APIs or video behavior require it. - Keep SSG-safe content rendered on server where possible. - Do not gate the whole hero behind `ClientOnly`. - Use `onMounted` only for pointer/parallax/IntersectionObserver logic. - Clear timers and observers on unmount. - Do not put random `Math.random()` values in SSR-rendered markup. Use deterministic delays from data. - Prefer typed `as const` data arrays for roles, connections, and messages. - Keep imports path-stable and avoid magic relative paths when aliases are available. - Keep local visual components under `landing/components/hero/` because this is a landing-only visual system. Hydration safety: - Initial rendered message state should be deterministic. - Do not render different robot counts on server and client based on `window.innerWidth`. - Use CSS media queries to hide/show by breakpoint, or compute client-only variants after mount with stable fallback. ## PR Slicing Strategy PR slicing score: 🎯 9 🛡️ 9 🧠 5. Do not ship the full cinematic hero as one giant unreviewable diff. ### PR 1 - Static Shell and Video Frame Scope: - new cyber hero layout - background layer - copy/CTA layout - video frame wrapper - no final robots - no parallax Expected size: **450-750 lines**. Acceptance: - page builds - hero is readable - video works - no status metrics block - screenshot review passes static composition ### PR 2 - Robot Data and Static Robots Scope: - `heroAgents.ts` - `CyberHeroRobot` - 4-6 robot assets or placeholders - role cards - basic idle CSS Expected size: **350-650 lines**. Acceptance: - robots communicate product meaning - no overlap with CTA/video - mobile hides/simplifies robots correctly ### PR 3 - Connectors and Message Bubbles Scope: - `heroConnections` - `CyberHeroConnectors` - `CyberHeroMessageBubbles` - one deterministic message cycle - reduced motion fallback Expected size: **350-650 lines**. Acceptance: - one readable handoff sequence - packets route around safe zones - timers clean up - no animation chaos ### PR 4 - Parallax and Polish Scope: - `useCyberHeroParallax` - depth variables - final responsive tuning - final asset compression - screenshot and performance pass Expected size: **250-500 lines**. Acceptance: - parallax enhances but does not carry layout - reduced motion is polished - screenshot set passes - `pnpm --dir landing generate` passes Recommended path: PR 1 -> PR 2 -> PR 3 -> PR 4. This keeps review quality high and avoids hiding layout bugs under animation. ## Visual QA Workflow Use screenshot-based review, because this hero is visual and small CSS changes can break composition. Minimum screenshot set: ```text 1440x900 desktop 1920x1080 wide desktop 1280x800 laptop 1024x768 tablet landscape 768x1024 tablet portrait 430x932 mobile 390x844 mobile 360x800 narrow mobile ``` For every screenshot, check: - headline readable - slogan readable - CTA visible without scrolling on common desktop heights - video frame visible and not covered - robots do not cover important UI - connectors do not cross CTA/headline - feature strip either peeks cleanly or moves below content - no horizontal scroll - no text clipped inside buttons Motion QA: - 30 seconds idle with no obvious jank. - Move pointer slowly across desktop hero. - Scroll hero partially out of view and back. - Switch tab away and back. - Toggle reduced motion. - Try video play/pause while animations run. Performance QA: - Check image transfer size. - Check LCP element. - Check if any animated layer repaints the whole viewport. - Check CPU usage during idle. - Check mobile scroll smoothness. ## Review Gates These gates decide whether the implementation is ready to continue. ### Gate 1 - Static Design Gate Pass when: - headline, slogan, paragraph, CTAs, video frame, and feature strip are readable at `1440x900` - mobile layout works at `390x844` - no status metrics block exists - screenshot looks like the selected reference in composition and mood Fail when: - video looks secondary - CTA is buried - background makes text hard to read - layout only works at one viewport size ### Gate 2 - Interaction Gate Pass when: - video controls work - CTA links work - keyboard focus is visible - reduced motion keeps a polished static scene - animations pause offscreen or hidden tab Fail when: - frame overlays block video controls - focus ring is clipped - animation keeps running aggressively offscreen - reduced motion leaves broken empty elements ### Gate 3 - Visual Density Gate Pass when: - active elements are visually prioritized - inactive robots/cards are quieter - packet lines are visible but not dominant - only one readable bubble sequence is active Fail when: - everything glows equally - robots compete with headline - connector lines cover CTAs - message bubbles feel like spam ### Gate 4 - Performance Gate Pass when: - first viewport image budget is near target - no obvious CLS - no obvious scroll jank - animation CPU cost is acceptable - mobile remains usable Fail when: - background or robots cause visible late layout shifts - idle animation repaints huge layers - mobile scroll feels heavy - video interaction lags ## Manual Test Script Use this exact human smoke test before calling the hero ready: 1. Open landing page fresh with cache disabled. 2. Wait 2 seconds. 3. Confirm first impression: headline, slogan, CTA, video, robots. 4. Move mouse slowly left to right. 5. Confirm parallax is subtle. 6. Click `Watch Demo` or video play. 7. Seek video. 8. Try fullscreen and exit fullscreen. 9. Scroll down until hero is half hidden. 10. Confirm animation calms down or stops. 11. Resize to `390x844`. 12. Confirm no horizontal scroll. 13. Enable reduced motion. 14. Reload and confirm static scene still looks designed. If any step fails, fix before tuning small visuals. ## Implementation Phases ### Phase 0 - Asset and layout proof Score: 🎯 9 🛡️ 9 🧠 4 - **80-160 lines** Tasks: - Confirm final desktop background crop. - Confirm mobile background crop. - Prepare 2-3 temporary robot assets or placeholders. - Create a rough CSS grid in a throwaway branch or component state. - Verify that headline, CTA, video, and 3 robots fit at 1440x900 and 390x844. Acceptance: - No full implementation starts before the composition works. - The left copy area remains readable over the background. - The video frame area has enough space for controls. - Robot placement does not depend on lucky viewport dimensions. ### Phase 1 - Static cyberpunk hero shell Score: 🎯 9 🛡️ 9 🧠 5 - **250-400 lines** Tasks: - Replace current background video hero with WebP city background layer. - Add dark gradient wash and scanline layer. - Build headline layout matching reference. - Add exact slogan strip. - Remove any status metrics block. - Keep existing CTA links and release note behavior. Acceptance: - Desktop first viewport resembles the reference composition. - Text is readable. - No animation yet. - Top-left status metrics block is absent. - The slogan is exact. - No horizontal scroll at desktop/tablet/mobile test widths. ### Phase 2 - Video frame Score: 🎯 9 🛡️ 8 🧠 6 - **180-300 lines** Tasks: - Wrap existing `HeroDemoVideo` in cyberpunk video frame. - Add angular border, glow, corner accents, and platform reflection. - Ensure video controls still work. - Verify fullscreen still works. Acceptance: - Central/right block is clearly a video. - Decorative layers do not block clicks. - Video play/pause works. - Fullscreen works. - Error fallback looks intentional. ### Phase 3 - Robot layer Score: 🎯 8 🛡️ 8 🧠 7 - **280-500 lines** Tasks: - Add `heroAgents.ts`. - Add robot assets. - Render robots through `CyberHeroRobot`. - Add role cards and short task lists. - Add idle bob, eye blink, screen pulse. Acceptance: - 8-10 robots visible on desktop. - Product meaning is obvious without reading paragraph. - No robots overlap headline, CTA, or video controls. - At least 4 roles are visually distinct. - At least 2 primary robots have active glow/eye/screen states. ### Phase 4 - Message passing 1 + 2 Score: 🎯 9 🛡️ 9 🧠 7 - **220-380 lines** Tasks: - Add SVG connector network. - Animate packet dots along paths. - Add timed message bubbles. - Tie bubble events to sender/receiver pulse classes. - Reduce message density on smaller screens. Acceptance: - It is clear that robots pass work between each other. - Animation feels alive, not chaotic. - Messages stay readable and short. - Only one readable message sequence is active at a time. - Packets do not visually cross the headline or CTA area. ### Phase 5 - Parallax Score: 🎯 8 🛡️ 8 🧠 7 - **150-260 lines** Tasks: - Add `useCyberHeroParallax`. - Track pointer and scroll with `requestAnimationFrame`. - Set CSS variables on hero root. - Apply depth-based movement to background, video, robots, connectors. - Disable on mobile and reduced motion. Acceptance: - Scene reacts subtly to pointer. - Scroll creates layer separation. - No jank on desktop. - Parallax is disabled on touch/mobile. - Reduced motion mode is static and still polished. ### Phase 6 - Responsive polish Score: 🎯 8 🛡️ 9 🧠 8 - **220-420 lines** Tasks: - Desktop, tablet, mobile layouts. - Hide or simplify robots by breakpoint. - Reduce connector complexity on mobile. - Ensure CTA and video are still first-class. - Tune feature strip. Acceptance: - No horizontal scroll. - No text overlap. - Buttons fit. - Video is usable on mobile. - Tablet does not look like a broken desktop crop. - Mobile still communicates robots/agent coordination. ### Phase 7 - Quality pass Score: 🎯 9 🛡️ 9 🧠 5 - **80-160 lines** Tasks: - Run `pnpm --dir landing lint`. - Run `pnpm --dir landing generate`. - Browser smoke in desktop and mobile widths. - Screenshot compare against reference. - Check reduced motion mode. - Check video controls. Acceptance: - Static generation succeeds. - No major visual regressions. - Hero is close to reference and still usable. - Screenshot review passes at the target viewport sizes. - Performance is acceptable with animations running. ## Verification Checklist Visual review process: 1. Start the landing dev server with `pnpm --dir landing dev`. 2. Capture desktop, tablet, and mobile screenshots. 3. Compare against the reference for composition, not pixel perfection. 4. Check hero with motion enabled. 5. Check hero with reduced motion. 6. Check video interaction. 7. Check with slow network or cached disabled once. Design acceptance rubric: - First impression - 🎯 target 9/10: product feels premium and distinctive. - Clarity - 🎯 target 9/10: user understands multi-agent coordination. - Readability - 🛡️ target 9/10: text and CTAs stay clear over background. - Responsiveness - 🛡️ target 8/10: tablet/mobile are intentionally composed. - Motion taste - 🎯 target 8/10: animated but not chaotic. - Performance - 🛡️ target 8/10: no obvious jank. - Maintainability - 🛡️ target 8/10: components/data are not tangled. - [ ] `pnpm --dir landing lint` - [ ] `pnpm --dir landing generate` - [ ] Desktop screenshot: 1440x900 - [ ] Wide desktop screenshot: 1920x1080 - [ ] Tablet screenshot: 1024x768 - [ ] Mobile screenshot: 390x844 - [ ] Video play/pause works - [ ] Video fullscreen works - [ ] CTA links work - [ ] Docs link respects locale - [ ] Reduced motion disables parallax and packet movement - [ ] No status metrics block in hero - [ ] Slogan text is exact - [ ] Robots do not cover important UI - [ ] Message bubbles do not overlap CTA/video controls ## Design and Layout Do/Don't Do: - Use real HTML for headline, CTA, nav, and slogan. - Treat video as the hero product surface. - Let robots support the video instead of fighting it. - Use strong dark washes behind readable text. - Use fewer, better neon accents. - Keep all animations transform/opacity-based. - Make mobile a different composition. - Test with screenshots before polishing tiny details. Don't: - Put the whole hero into one image. - Add random neon panels with no information purpose. - Put text inside generated assets. - Use giant glowing blur on every panel. - Animate every robot and every connector equally. - Let packets cross the CTA cluster. - Use purple/magenta everywhere. - Hide video controls under chrome overlays. - Depend on desktop absolute positions for mobile. ## Common Failure Cases ### Failure 1 - Looks like a poster, not a product page Symptoms: - video frame feels decorative - CTAs are visually weak - text is hard to read - robots dominate the page Fix: - darken copy area with a local wash - reduce robot opacity/scale near headline - make video frame larger and cleaner - simplify background behind text - keep only one active message bubble ### Failure 2 - Cyberpunk style becomes noisy Symptoms: - too many glows - every border is bright - packets everywhere - role cards fight with the video Fix: - reduce base connector opacity - keep magenta only for activity - keep cyan for structure - remove secondary HUD panels that do not explain the product - make inactive role cards quieter ### Failure 3 - Mobile is just a broken desktop crop Symptoms: - horizontal scroll - video too small - buttons wrap badly - robots cover text - connectors become random lines Fix: - switch to vertical composition - hide most robots - replace full connector network with compact agent relay row - use mobile background crop - move feature strip below hero content ### Failure 4 - Animations feel cheap Symptoms: - all robots move in sync - parallax is too strong - packets move too fast - message bubbles spam the scene Fix: - stagger durations and delays - cut parallax values by 30-50% - use one readable bubble sequence - slow packets to `2800-4600ms` - keep idle motion under 6px for most robots ### Failure 5 - Performance drops Symptoms: - scroll jank - CPU stays high while idle - mobile browser gets hot - frames drop during parallax Fix: - reduce animated shadows - remove animated filters - reduce visible packet count - disable complex animation on mobile - stop message cycle when offscreen - check if a large layer repaints every frame ## Risks ### Risk 1 - Generated assets do not match the reference Score: 🎯 7 🛡️ 6 🧠 6 Mitigation: - Generate background and robot assets separately. - Keep the current full mockup as visual reference only. - Iterate assets before deep CSS tuning. ### Risk 2 - Scene becomes too cluttered Score: 🎯 8 🛡️ 7 🧠 5 Mitigation: - Limit active message bubbles to one sequence. - Limit visible packet count. - Hide lower-priority robots on tablet/mobile. - Keep left hero area visually clean. ### Risk 3 - Animation hurts performance Score: 🎯 8 🛡️ 8 🧠 6 Mitigation: - Transform/opacity only. - No animated blur filters on large layers. - Disable heavy motion on mobile. - Respect reduced motion. ### Risk 4 - Video controls get blocked Score: 🎯 9 🛡️ 8 🧠 4 Mitigation: - All decorative frame overlays use `pointer-events: none`. - Only video controls receive pointer events inside the frame. ## Suggested First PR Scope Best first implementation slice: 1. Phase 0 layout proof with final-ish background crop and 2-3 robot placeholders. 2. Static cyberpunk hero shell. 3. Video frame with existing demo. 4. 4 placeholder robot layers with CSS animation. 5. Connector SVG with simple packets. 6. One readable message bubble sequence. 7. Keep final 8-10 robot asset pass for the next slice. Score: 🎯 9 🛡️ 8 🧠 6 - **850-1200 lines**. Reason: - Gets the visual direction into code quickly. - Keeps risk manageable. - Lets us verify layout and parallax before spending too much time on final robot assets. ## Final Target The final hero should feel like this: - The city is alive in the background. - The demo video is the central command console. - Robots are active teammates around the console. - Neon packets show work moving through the team. - Message bubbles explain the coordination in human-readable moments. - The user immediately understands: this product is an AI engineering team dashboard. ## Summary 📌 Build the hero as a layered scene: WebP background, real video frame, separate robot assets, SVG connector packets, readable message bubbles, and CSS/Vue parallax. The chosen implementation is visually strong, maintainable, SSG-safe, and realistic for the existing Nuxt landing app.