# 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
...
``` CSS variables owned by scene root: ```scss .cyber-hero { --hero-pointer-x: 0; --hero-pointer-y: 0; --hero-scroll: 0; --hero-tilt-x: 0; --hero-tilt-y: 0; --hero-intensity: 1; } ``` Layer classes: ```text cyber-hero__background cyber-hero__wash cyber-hero__content cyber-hero__scene cyber-hero__connectors cyber-hero__video cyber-hero__robots cyber-hero__messages cyber-hero__feature-strip ``` Keep BEM-ish class names. Do not mix deep Vuetify selectors into cyber hero styling unless there is no alternative. ### `HeroSection.vue` Role: - Own top-level section, content, links, release note, and imports. - Delegate visual scene to `CyberHeroScene`. Responsibilities: - Fetch content with `useLandingContent`. - Resolve download/docs/github links. - Render: - headline - slogan strip - paragraph - CTA buttons - dev note - trust row or compact feature hints - `CyberHeroScene` Avoid: - Large robot data arrays. - Message animation state. - SVG path definitions. Target template shape: ```vue
``` Layout CSS: ```scss .cyber-hero__layout { display: grid; grid-template-columns: minmax(360px, 0.78fr) minmax(620px, 1.22fr); align-items: center; gap: clamp(32px, 5vw, 88px); } ``` Important: - Keep real text in HTML. - Use `clamp()` only within bounded ranges, not raw viewport scaling. - Make title width stable so animated scene does not push it. - Keep CTA row above robots in stacking order. - Put feature strip inside hero container but outside the main grid. ### `CyberHeroScene.vue` Role: - Own layered visual scene around the video. Layer order: ```text 0 background atmosphere 1 floor glow 2 connector SVG network 3 video frame 4 robot assets and role cards 5 message bubbles 6 foreground glows and scanlines ``` Props: ```ts type CyberHeroSceneProps = { videoLabel: string; reducedMotion?: boolean; }; ``` State: - Pointer parallax CSS variables. - Active message cycle. - Active packet route index. Target DOM structure: ```vue