diff --git a/packages/web/app/_components/landing-page.tsx b/packages/web/app/_components/landing-page.tsx index 11b76f6a7..abf535337 100644 --- a/packages/web/app/_components/landing-page.tsx +++ b/packages/web/app/_components/landing-page.tsx @@ -1,44 +1,15 @@ import type { Metadata } from "next" -import type { JSX, SVGProps } from "react" -import { getTranslations } from "next-intl/server" -import { - Layers, - Star, - Check, - Zap, - Search, - Code2, - Brain, - Eye, - MessageSquare, - Shield, - Lightbulb, - Route, - HardDrive, - ArrowRight, - Target, - Users, - Network, - Terminal, - Wrench, - Sparkles, - Sword, -} from "lucide-react" -import { HeroStats } from "@/components/landing/hero-stats" -import { InstallCommand } from "@/components/landing/install-command" -import { TerminalTypewriter } from "@/components/landing/motion-wrappers" -import { Badge } from "@/components/ui/badge" -import { Button } from "@/components/ui/button" -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" -import { Link } from "@/i18n/routing" -import { formatStats, getStats } from "@/lib/stats" - -const FALLBACK_STATS = { - stars: "40k+", - totalDownloads: "1M+", - monthlyDownloads: "580k+", - weeklyDownloads: "90k+", -} +import type { JSX } from "react" +import { ArchitectureSection } from "@/components/landing/sections/architecture" +import { CtaSection } from "@/components/landing/sections/cta" +import { HephaestusSection } from "@/components/landing/sections/hephaestus" +import { HeroSection } from "@/components/landing/sections/hero" +import { PrometheusAtlasSection } from "@/components/landing/sections/prometheus-atlas" +import { ReviewsSection } from "@/components/landing/sections/reviews" +import { SisyphusSection } from "@/components/landing/sections/sisyphus" +import { SubAgentsSection } from "@/components/landing/sections/sub-agents" +import { TeamModeSection } from "@/components/landing/sections/team-mode" +import { UltraworkSection } from "@/components/landing/sections/ultrawork" export const landingMetadata: Metadata = { title: "Oh My OpenAgent — The Best Agent Harness", @@ -47,786 +18,19 @@ export const landingMetadata: Metadata = { } export async function LandingPage(): Promise { - const t = await getTranslations("landing") - - let formattedStats = FALLBACK_STATS - try { - const stats = await getStats() - formattedStats = formatStats(stats) - } catch { - formattedStats = FALLBACK_STATS - } - - const subAgentKeys = ["oracle", "librarian", "explore", "metis", "momus"] as const - type SubAgentKey = (typeof subAgentKeys)[number] - - const agentStyles: Record< - SubAgentKey, - { color: string; border: string; bg: string; icon: typeof Brain } - > = { - oracle: { - color: "text-purple-400", - border: "border-zinc-800", - bg: "bg-purple-400/5", - icon: Eye, - }, - librarian: { - color: "text-green-400", - border: "border-zinc-800", - bg: "bg-green-400/5", - icon: Search, - }, - explore: { - color: "text-blue-400", - border: "border-zinc-800", - bg: "bg-blue-400/5", - icon: Code2, - }, - metis: { - color: "text-pink-400", - border: "border-zinc-800", - bg: "bg-pink-400/5", - icon: MessageSquare, - }, - momus: { color: "text-red-400", border: "border-zinc-800", bg: "bg-red-400/5", icon: Check }, - } - - const reviewKeys = ["review1", "review2", "review3", "review4", "review5", "review6"] as const - - const principleKeys = [ - "specialization", - "trustVerify", - "wisdom", - "modelOptimization", - "categories", - "continuity", - ] as const - type PrincipleKey = (typeof principleKeys)[number] - - const principleIcons: Record = { - specialization: Target, - trustVerify: Shield, - wisdom: Lightbulb, - modelOptimization: Zap, - categories: Route, - continuity: HardDrive, - } - return (
-
-
- -
-
-
-
- - {t("ulw.badge")} - -

- {t("ulw.title")} -

-
-

{t("ulw.headline")}

-

{t("ulw.description")}

-
-
- - {t("ulw.autoPlanning")} - - - {t("ulw.deepResearch")} - - - {t("ulw.selfCorrection")} - - - {t("ulw.parallelAgents")} - -
-

{t("ulw.tagline")}

-
- -
-
-
-
-
-
-
- {t("ulw.terminalTitle")} -
-
-
-
- - ~ - -
-
-
{t("ulw.steps.scanning")}
-
{t("ulw.steps.context")}
-
{t("ulw.steps.planning")}
-
{t("ulw.steps.delegating")}
-
{t("ulw.steps.verifying")}
-
-
- - {t("ulw.steps.complete")} -
-
- - ~ - _ -
-
-
-
-
-
-
- -
-
-
-
-
- - {t("sisyphus.badge")} - - - {t("sisyphus.model")} - -
- -

- {t("sisyphus.title")} -

-

- {t("sisyphus.headline")} -

-

- {t("sisyphus.description")} -

- -
- {(["intent", "explore", "delegate", "verify"] as const).map((phase, i) => ( -
- - -
PHASE {i + 1}
- - {t(`sisyphus.phases.${phase}.title`)} - -
- -

- {t(`sisyphus.phases.${phase}.description`)} -

-
-
-
- ))} -
- -
-
-
-
- -
-
-

- {t("sisyphus.boulderTitle")} -

-

- {t("sisyphus.boulderDescription")} -

-
-
-
-
-
-
-
- -
-
-
- - {t("prometheusAtlas.badge")} - -

- {t("prometheusAtlas.title")} -

-

- {t("prometheusAtlas.headline")} -

-
- -
-
- - -
-
- -
- - {t("prometheusAtlas.prometheus.model")} - -
- - {t("prometheusAtlas.prometheus.name")} - - - {t("prometheusAtlas.prometheus.role")} - -
- -

- {t("prometheusAtlas.prometheus.description")} -

-
    - {([0, 1, 2, 3] as const).map((i) => ( -
  • - - {t(`prometheusAtlas.prometheus.features.${i}`)} -
  • - ))} -
-
-
-
- -
- - -
-
- -
- - {t("prometheusAtlas.atlas.model")} - -
- - {t("prometheusAtlas.atlas.name")} - - - {t("prometheusAtlas.atlas.role")} - -
- -

- {t("prometheusAtlas.atlas.description")} -

-
    - {([0, 1, 2, 3] as const).map((i) => ( -
  • - - {t(`prometheusAtlas.atlas.features.${i}`)} -
  • - ))} -
-
-
-
-
- -
-
-
- {([1, 2, 3, 4, 5] as const).map((step, i) => ( -
-
-
- {step} -
- - {t(`prometheusAtlas.workflow.step${step}`)} - -
- {i < 4 && ( - - )} -
- ))} -
-

- {t("prometheusAtlas.whyItWorks")} -

-
-
-
-
- -
-
-
-
-
- - {t("hephaestus.badge")} - - - {t("hephaestus.model")} - -
- -

- {t("hephaestus.title")} -

-

- {t("hephaestus.headline")} -

-

- {t("hephaestus.description")} -

- -
- {(["explore", "plan", "decide", "execute", "verify"] as const).map((step, i) => ( -
-
-
0{i + 1}
-

- {t(`hephaestus.loop.${step}`)} -

-
-
- ))} -
- -

{t("hephaestus.tagline")}

-
-
-
- -
-
-
-
-
- - {t("teamMode.badge")} - - - opt-in - -
- -

- - {t("teamMode.title")} - -

-

- {t("teamMode.headline")} -

-

- {t("teamMode.description")} -

- -
- {( - [ - { key: "lead", icon: Network }, - { key: "parallel", icon: Users }, - { key: "tmux", icon: Terminal }, - { key: "tools", icon: Wrench }, - ] as const - ).map(({ key, icon: Icon }) => ( -
- - -
- -
- - {t(`teamMode.features.${key}.title`)} - -
- -

- {t(`teamMode.features.${key}.description`)} -

-
-
-
- ))} -
- -
- - - {t("teamMode.poweredBy")} - -
-
- -
- {( - [ - { key: "hyperplan", icon: Sword, accent: "purple" as const }, - { key: "securityResearch", icon: Shield, accent: "rose" as const }, - ] as const - ).map(({ key, icon: Icon, accent }) => ( -
- - -
-
- -
- - {t(`teamMode.skills.${key}.name`)} - -
-
- -

- {t(`teamMode.skills.${key}.description`)} -

-
-
-
- ))} -
- -
- - {t("teamMode.optIn")} - -

{t("teamMode.tagline")}

-
-
-
-
- -
-
-
-

{t("agents.title")}

-

{t("agents.subtitle")}

-
- -
- {subAgentKeys.map((key) => { - const style = agentStyles[key] - const Icon = style.icon - return ( -
- - -
-
- -
- - {t(`agents.${key}.model`)} - -
- - {t(`agents.${key}.name`)} - - - {t(`agents.${key}.role`)} - -
- -

- {t(`agents.${key}.description`)} -

-
-
-
- ) - })} - -
- - -
- - {t("agents.dynamicSystem.role")} - -
- - {t("agents.dynamicSystem.name")} - - - {t("agents.dynamicSystem.description")} - -
- -
-
-

- Category Routing -

-
- {[ - { cat: "visual-engineering", model: "Gemini 3.1 Pro" }, - { cat: "ultrabrain", model: "GPT 5.5 xHigh" }, - { cat: "artistry", model: "Gemini 3.1 Pro" }, - { cat: "quick", model: "GPT 5.4 Mini" }, - { cat: "deep", model: "GPT 5.5 Medium" }, - { cat: "writing", model: "Kimi K2.5" }, - { cat: "git", model: "Claude Haiku 4.5" }, - ].map((item) => ( -
- {item.cat} - - {item.model} -
- ))} -
-
- -
-

- Skill Injection -

-
- {["playwright", "git-master", "frontend-ui-ux", "team-mode"].map( - (skill) => ( -
- - {skill} -
- ), - )} -
-
-

- "The right model + right expertise, every time." -

-
-
-
-
-
-
-
-
-
- -
-
-
-

- {t("architecture.title")} -

-

{t("architecture.subtitle")}

-
- -
- {principleKeys.map((key) => { - const Icon = principleIcons[key] - return ( -
- - -
- -
- - {t(`architecture.principles.${key}.title`)} - -
- -

- {t(`architecture.principles.${key}.description`)} -

-
-
-
- ) - })} -
-
-
- -
-
-
-

- {t("reviews.title")} -

-
-
- {reviewKeys.map((key) => ( -
- - -
- -
-

- “{t(`reviews.${key}.text`)}” -

-

- — {t(`reviews.${key}.author`)} -

-
-
-
- ))} -
-
-
- -
-
-
-
-
-
-

{t("cta.title")}

-

{t("cta.subtitle")}

-
-
- $ - {t("cta.installCommand")} -
-
-
- - - - - - -
-
-
-
-
-
+ + + + + + + + + +
) } - -function GithubIcon(props: SVGProps) { - return ( - - GitHub - - - - ) -} diff --git a/packages/web/components/icons/github-icon.tsx b/packages/web/components/icons/github-icon.tsx new file mode 100644 index 000000000..985886aeb --- /dev/null +++ b/packages/web/components/icons/github-icon.tsx @@ -0,0 +1,24 @@ +import type { SVGProps, JSX } from "react" + +export function GithubIcon(props: SVGProps): JSX.Element { + return ( + + GitHub + + + + ) +} diff --git a/packages/web/components/landing/constants.ts b/packages/web/components/landing/constants.ts new file mode 100644 index 000000000..56451c751 --- /dev/null +++ b/packages/web/components/landing/constants.ts @@ -0,0 +1,95 @@ +import type { Brain } from "lucide-react" +import { + Check, + Eye, + Search, + Code2, + MessageSquare, + Target, + Shield, + Lightbulb, + Zap, + Route, + HardDrive, +} from "lucide-react" + +export const SUB_AGENT_KEYS = ["oracle", "librarian", "explore", "metis", "momus"] as const +export type SubAgentKey = (typeof SUB_AGENT_KEYS)[number] + +type AgentStyle = { + readonly color: string + readonly border: string + readonly bg: string + readonly icon: typeof Brain +} + +// Consolidated: single secondary accent (violet) for all sub-agents. +// The visual differentiation comes from the icon, not a rainbow of colors. +export const AGENT_STYLES: Readonly> = { + oracle: { color: "text-violet-300", border: "border-zinc-800", bg: "bg-violet-400/5", icon: Eye }, + librarian: { + color: "text-violet-300", + border: "border-zinc-800", + bg: "bg-violet-400/5", + icon: Search, + }, + explore: { + color: "text-violet-300", + border: "border-zinc-800", + bg: "bg-violet-400/5", + icon: Code2, + }, + metis: { + color: "text-violet-300", + border: "border-zinc-800", + bg: "bg-violet-400/5", + icon: MessageSquare, + }, + momus: { + color: "text-violet-300", + border: "border-zinc-800", + bg: "bg-violet-400/5", + icon: Check, + }, +} + +export const PRINCIPLE_KEYS = [ + "specialization", + "trustVerify", + "wisdom", + "modelOptimization", + "categories", + "continuity", +] as const +export type PrincipleKey = (typeof PRINCIPLE_KEYS)[number] + +export const PRINCIPLE_ICONS: Readonly> = { + specialization: Target, + trustVerify: Shield, + wisdom: Lightbulb, + modelOptimization: Zap, + categories: Route, + continuity: HardDrive, +} + +export const REVIEW_KEYS = [ + "review1", + "review2", + "review3", + "review4", + "review5", + "review6", +] as const +export type ReviewKey = (typeof REVIEW_KEYS)[number] + +export const CATEGORY_ROUTING = [ + { cat: "visual-engineering", model: "Gemini 3.1 Pro" }, + { cat: "ultrabrain", model: "GPT 5.5 xHigh" }, + { cat: "artistry", model: "Gemini 3.1 Pro" }, + { cat: "quick", model: "GPT 5.4 Mini" }, + { cat: "deep", model: "GPT 5.5 Medium" }, + { cat: "writing", model: "Kimi K2.5" }, + { cat: "git", model: "Claude Haiku 4.5" }, +] as const + +export const SKILL_INJECTIONS = ["playwright", "git-master", "frontend-ui-ux", "team-mode"] as const diff --git a/packages/web/components/landing/sections/architecture.tsx b/packages/web/components/landing/sections/architecture.tsx new file mode 100644 index 000000000..29ec0ff38 --- /dev/null +++ b/packages/web/components/landing/sections/architecture.tsx @@ -0,0 +1,46 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { PRINCIPLE_KEYS, PRINCIPLE_ICONS } from "@/components/landing/constants" + +export async function ArchitectureSection(): Promise { + const t = await getTranslations("landing") + + return ( +
+
+
+

+ {t("architecture.title")} +

+

{t("architecture.subtitle")}

+
+ +
+ {PRINCIPLE_KEYS.map((key) => { + const Icon = PRINCIPLE_ICONS[key] + return ( +
+ + +
+ +
+ + {t(`architecture.principles.${key}.title`)} + +
+ +

+ {t(`architecture.principles.${key}.description`)} +

+
+
+
+ ) + })} +
+
+
+ ) +} diff --git a/packages/web/components/landing/sections/cta.tsx b/packages/web/components/landing/sections/cta.tsx new file mode 100644 index 000000000..a03f36d83 --- /dev/null +++ b/packages/web/components/landing/sections/cta.tsx @@ -0,0 +1,53 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { Button } from "@/components/ui/button" +import { Link } from "@/i18n/routing" + +export async function CtaSection(): Promise { + const t = await getTranslations("landing") + + return ( +
+
+
+
+
+
+

{t("cta.title")}

+

{t("cta.subtitle")}

+
+
+ $ + {t("cta.installCommand")} +
+
+
+ + + + + + +
+
+
+
+
+
+ ) +} diff --git a/packages/web/components/landing/sections/hephaestus.tsx b/packages/web/components/landing/sections/hephaestus.tsx new file mode 100644 index 000000000..a903d8de7 --- /dev/null +++ b/packages/web/components/landing/sections/hephaestus.tsx @@ -0,0 +1,50 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { Badge } from "@/components/ui/badge" + +export async function HephaestusSection(): Promise { + const t = await getTranslations("landing") + + return ( +
+
+
+
+
+ + {t("hephaestus.badge")} + + + {t("hephaestus.model")} + +
+ +

+ {t("hephaestus.title")} +

+

+ {t("hephaestus.headline")} +

+

+ {t("hephaestus.description")} +

+ +
+ {(["explore", "plan", "decide", "execute", "verify"] as const).map((step, i) => ( +
+
+
0{i + 1}
+

+ {t(`hephaestus.loop.${step}`)} +

+
+
+ ))} +
+ +

{t("hephaestus.tagline")}

+
+
+
+ ) +} diff --git a/packages/web/components/landing/sections/hero.tsx b/packages/web/components/landing/sections/hero.tsx new file mode 100644 index 000000000..d2ad5e25f --- /dev/null +++ b/packages/web/components/landing/sections/hero.tsx @@ -0,0 +1,101 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { getStats, formatStats } from "@/lib/stats" +import { HeroStats } from "@/components/landing/hero-stats" +import { InstallCommand } from "@/components/landing/install-command" +import { Button } from "@/components/ui/button" +import { Link } from "@/i18n/routing" +import { GithubIcon } from "@/components/icons/github-icon" + +const FALLBACK_STATS = { + stars: "40k+", + totalDownloads: "1M+", + monthlyDownloads: "580k+", + weeklyDownloads: "90k+", +} + +export async function HeroSection(): Promise { + const t = await getTranslations("landing") + + let formattedStats = FALLBACK_STATS + try { + const stats = await getStats() + formattedStats = formatStats(stats) + } catch { + formattedStats = FALLBACK_STATS + } + + return ( +
+
+ ) +} diff --git a/packages/web/components/landing/sections/prometheus-atlas.tsx b/packages/web/components/landing/sections/prometheus-atlas.tsx new file mode 100644 index 000000000..ca613b815 --- /dev/null +++ b/packages/web/components/landing/sections/prometheus-atlas.tsx @@ -0,0 +1,120 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { Brain, Layers, ArrowRight } from "lucide-react" +import { Badge } from "@/components/ui/badge" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" + +export async function PrometheusAtlasSection(): Promise { + const t = await getTranslations("landing") + + return ( +
+
+
+ + {t("prometheusAtlas.badge")} + +

+ {t("prometheusAtlas.title")} +

+

{t("prometheusAtlas.headline")}

+
+ +
+
+ + +
+
+ +
+ + {t("prometheusAtlas.prometheus.model")} + +
+ + {t("prometheusAtlas.prometheus.name")} + + + {t("prometheusAtlas.prometheus.role")} + +
+ +

+ {t("prometheusAtlas.prometheus.description")} +

+
    + {([0, 1, 2, 3] as const).map((i) => ( +
  • + + {t(`prometheusAtlas.prometheus.features.${i}`)} +
  • + ))} +
+
+
+
+ +
+ + +
+
+ +
+ + {t("prometheusAtlas.atlas.model")} + +
+ + {t("prometheusAtlas.atlas.name")} + + + {t("prometheusAtlas.atlas.role")} + +
+ +

+ {t("prometheusAtlas.atlas.description")} +

+
    + {([0, 1, 2, 3] as const).map((i) => ( +
  • + + {t(`prometheusAtlas.atlas.features.${i}`)} +
  • + ))} +
+
+
+
+
+ +
+
+
+ {([1, 2, 3, 4, 5] as const).map((step, i) => ( +
+
+
+ {step} +
+ + {t(`prometheusAtlas.workflow.step${step}`)} + +
+ {i < 4 && ( + + )} +
+ ))} +
+

+ {t("prometheusAtlas.whyItWorks")} +

+
+
+
+
+ ) +} diff --git a/packages/web/components/landing/sections/reviews.tsx b/packages/web/components/landing/sections/reviews.tsx new file mode 100644 index 000000000..d24730492 --- /dev/null +++ b/packages/web/components/landing/sections/reviews.tsx @@ -0,0 +1,40 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { Card, CardContent } from "@/components/ui/card" +import { Star } from "lucide-react" +import { REVIEW_KEYS } from "@/components/landing/constants" + +export async function ReviewsSection(): Promise { + const t = await getTranslations("landing") + + return ( +
+
+
+

+ {t("reviews.title")} +

+
+
+ {REVIEW_KEYS.map((key) => ( +
+ + +
+ +
+

+ “{t(`reviews.${key}.text`)}” +

+

+ — {t(`reviews.${key}.author`)} +

+
+
+
+ ))} +
+
+
+ ) +} diff --git a/packages/web/components/landing/sections/sisyphus.tsx b/packages/web/components/landing/sections/sisyphus.tsx new file mode 100644 index 000000000..d070c7ea5 --- /dev/null +++ b/packages/web/components/landing/sections/sisyphus.tsx @@ -0,0 +1,79 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { HardDrive } from "lucide-react" +import { Badge } from "@/components/ui/badge" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" + +export async function SisyphusSection(): Promise { + const t = await getTranslations("landing") + + return ( +
+
+
+
+
+ + {t("sisyphus.badge")} + + + {t("sisyphus.model")} + +
+ +

+ {t("sisyphus.title")} +

+

+ {t("sisyphus.headline")} +

+

+ {t("sisyphus.description")} +

+ +
+ {(["intent", "explore", "delegate", "verify"] as const).map((phase, i) => ( +
+ + +
PHASE {i + 1}
+ + {t(`sisyphus.phases.${phase}.title`)} + +
+ +

+ {t(`sisyphus.phases.${phase}.description`)} +

+
+
+
+ ))} +
+ +
+
+
+
+ +
+
+

+ {t("sisyphus.boulderTitle")} +

+

+ {t("sisyphus.boulderDescription")} +

+
+
+
+
+
+
+
+ ) +} diff --git a/packages/web/components/landing/sections/sub-agents.tsx b/packages/web/components/landing/sections/sub-agents.tsx new file mode 100644 index 000000000..bdeb1b5fe --- /dev/null +++ b/packages/web/components/landing/sections/sub-agents.tsx @@ -0,0 +1,123 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { Badge } from "@/components/ui/badge" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { ArrowRight, Zap } from "lucide-react" +import { + SUB_AGENT_KEYS, + AGENT_STYLES, + CATEGORY_ROUTING, + SKILL_INJECTIONS, +} from "@/components/landing/constants" + +export async function SubAgentsSection(): Promise { + const t = await getTranslations("landing") + + return ( +
+
+
+

{t("agents.title")}

+

{t("agents.subtitle")}

+
+ +
+ {SUB_AGENT_KEYS.map((key) => { + const style = AGENT_STYLES[key] + const Icon = style.icon + return ( +
+ + +
+
+ +
+ + {t(`agents.${key}.model`)} + +
+ + {t(`agents.${key}.name`)} + + + {t(`agents.${key}.role`)} + +
+ +

+ {t(`agents.${key}.description`)} +

+
+
+
+ ) + })} + +
+ + +
+ + {t("agents.dynamicSystem.role")} + +
+ + {t("agents.dynamicSystem.name")} + + + {t("agents.dynamicSystem.description")} + +
+ +
+
+

+ Category Routing +

+
+ {CATEGORY_ROUTING.map((item) => ( +
+ {item.cat} + + {item.model} +
+ ))} +
+
+ +
+

+ Skill Injection +

+
+ {SKILL_INJECTIONS.map((skill) => ( +
+ + {skill} +
+ ))} +
+
+

+ "The right model + right expertise, every time." +

+
+
+
+
+
+
+
+
+
+ ) +} diff --git a/packages/web/components/landing/sections/team-mode.tsx b/packages/web/components/landing/sections/team-mode.tsx new file mode 100644 index 000000000..d605ba64e --- /dev/null +++ b/packages/web/components/landing/sections/team-mode.tsx @@ -0,0 +1,112 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { Network, Users, Terminal, Wrench, Sparkles, Sword, Shield } from "lucide-react" +import { Badge } from "@/components/ui/badge" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" + +export async function TeamModeSection(): Promise { + const t = await getTranslations("landing") + + return ( +
+
+
+
+
+ + {t("teamMode.badge")} + + + opt-in + +
+ +

+ {t("teamMode.title")} +

+

+ {t("teamMode.headline")} +

+

+ {t("teamMode.description")} +

+ +
+ {( + [ + { key: "lead", icon: Network }, + { key: "parallel", icon: Users }, + { key: "tmux", icon: Terminal }, + { key: "tools", icon: Wrench }, + ] as const + ).map(({ key, icon: Icon }) => ( +
+ + +
+ +
+ + {t(`teamMode.features.${key}.title`)} + +
+ +

+ {t(`teamMode.features.${key}.description`)} +

+
+
+
+ ))} +
+ +
+ + + {t("teamMode.poweredBy")} + +
+
+ +
+ {( + [ + { key: "hyperplan", icon: Sword }, + { key: "securityResearch", icon: Shield }, + ] as const + ).map(({ key, icon: Icon }) => ( +
+ + +
+
+ +
+ + {t(`teamMode.skills.${key}.name`)} + +
+
+ +

+ {t(`teamMode.skills.${key}.description`)} +

+
+
+
+ ))} +
+ +
+ {t("teamMode.optIn")} +

{t("teamMode.tagline")}

+
+
+
+
+ ) +} diff --git a/packages/web/components/landing/sections/ultrawork.tsx b/packages/web/components/landing/sections/ultrawork.tsx new file mode 100644 index 000000000..396d57673 --- /dev/null +++ b/packages/web/components/landing/sections/ultrawork.tsx @@ -0,0 +1,82 @@ +import type { JSX } from "react" +import { getTranslations } from "next-intl/server" +import { Badge } from "@/components/ui/badge" +import { TerminalTypewriter } from "@/components/landing/motion-wrappers" + +export async function UltraworkSection(): Promise { + const t = await getTranslations("landing") + + return ( +
+
+
+
+ + {t("ulw.badge")} + +

+ {t("ulw.title")} +

+
+

{t("ulw.headline")}

+

{t("ulw.description")}

+
+
+ + {t("ulw.autoPlanning")} + + + {t("ulw.deepResearch")} + + + {t("ulw.selfCorrection")} + + + {t("ulw.parallelAgents")} + +
+

{t("ulw.tagline")}

+
+ +
+
+
+
+
+
+
{t("ulw.terminalTitle")}
+
+
+
+ $ + ~ + +
+
+
{t("ulw.steps.scanning")}
+
{t("ulw.steps.context")}
+
{t("ulw.steps.planning")}
+
{t("ulw.steps.delegating")}
+
{t("ulw.steps.verifying")}
+
+
+ ok + {t("ulw.steps.complete")} +
+
+ $ + ~ + _ +
+
+
+
+
+
+
+ ) +}