-
-
@@ -1,4 +1,6 @@
-
-
1
-
+
+
+
+ @@ -1,4 +1,6 @@
+
+
import {"{"} db {"}"} from "../db"
-
-
-
- +
-
+
+
import {"{"} CloudWorkspace {"}"} from "./types"
-
-
-
- +
-
+
+
import {"{"} createSSHConnection {"}"} from "./ssh"
-
-
-
- 2
-
-
-
- -
-
- export const getWorkspaces = () ={">"} {"{"}
-
-
-
- +
-
- export const getWorkspaces = async () ={">"} {"{"}
-
-
-
- 4
-
- {" "}return db.query.workspaces
-
+
+
+
+ export const getWorkspaces = () => {"{"}
+
+
+ export const getWorkspaces = async () => {"{"}
+
+ {" "}return db.query.workspaces
-
-
-
-
-
-
+
+
+
+
+
+
);
}
+
+function DiffLine({
+ n,
+ added,
+ removed,
+ children,
+}: {
+ n?: number;
+ added?: boolean;
+ removed?: boolean;
+ children?: React.ReactNode;
+}) {
+ let bg = "";
+ let bar = "border-transparent";
+ let prefix = "";
+ let textColor = "text-muted-foreground/75";
+
+ if (added) {
+ bg = "bg-emerald-500/[0.08]";
+ bar = "border-emerald-500/85";
+ prefix = "+";
+ textColor = "text-emerald-300/95";
+ } else if (removed) {
+ bg = "bg-rose-500/[0.08]";
+ bar = "border-rose-500/85";
+ prefix = "−";
+ textColor = "text-rose-300/95";
+ }
+
+ return (
+
+
+ {prefix || n}
+
+ {children}
+
+ );
+}
diff --git a/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/StatusIndicator/StatusIndicator.tsx b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/StatusIndicator/StatusIndicator.tsx
index cff5bd29562..6bafcc98adb 100644
--- a/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/StatusIndicator/StatusIndicator.tsx
+++ b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/StatusIndicator/StatusIndicator.tsx
@@ -10,13 +10,13 @@ const STATUS_STYLES: Record<
WorkspaceStatus,
{ dot: string; ping: string; pulse: boolean }
> = {
- permission: { ping: "bg-red-400/45", dot: "bg-red-400/80", pulse: true },
+ permission: { ping: "bg-amber-300/40", dot: "bg-amber-300/90", pulse: true },
working: {
- ping: "bg-orange-500/35",
- dot: "bg-orange-500/80",
+ ping: "bg-brand/40",
+ dot: "bg-brand",
pulse: true,
},
- review: { ping: "", dot: "bg-emerald-400/75", pulse: false },
+ review: { ping: "", dot: "bg-emerald-400/85", pulse: false },
};
export function StatusIndicator({ status }: StatusIndicatorProps) {
diff --git a/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/TabBar/TabBar.tsx b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/TabBar/TabBar.tsx
new file mode 100644
index 00000000000..75d0a0e824d
--- /dev/null
+++ b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/TabBar/TabBar.tsx
@@ -0,0 +1,97 @@
+"use client";
+
+import { motion } from "framer-motion";
+import Image from "next/image";
+import {
+ LuChevronDown,
+ LuExternalLink,
+ LuPlay,
+ LuPlus,
+ LuTerminal,
+ LuX,
+} from "react-icons/lu";
+import { AGENT_TABS } from "../../constants";
+import type { ActiveDemo } from "../../types";
+
+interface TabBarProps {
+ activeDemo: ActiveDemo;
+}
+
+export function TabBar({ activeDemo }: TabBarProps) {
+ const isSetup = activeDemo === "Create Parallel Branches";
+
+ return (
+
+
+ {isSetup ? (
+
+ ) : (
+
+ )}
+ {isSetup ? "setup" : "claude"}
+
+
+
+
+ {AGENT_TABS.map((tab) => (
+
+
+ {tab.label}
+
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/TabBar/index.ts b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/TabBar/index.ts
new file mode 100644
index 00000000000..a4038ca4508
--- /dev/null
+++ b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/TabBar/index.ts
@@ -0,0 +1 @@
+export { TabBar } from "./TabBar";
diff --git a/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/WindowChrome/WindowChrome.tsx b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/WindowChrome/WindowChrome.tsx
index b951abd743d..7cbb2f7a025 100644
--- a/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/WindowChrome/WindowChrome.tsx
+++ b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/WindowChrome/WindowChrome.tsx
@@ -1,17 +1,58 @@
"use client";
-export function WindowChrome() {
+import { LuChevronDown, LuExternalLink, LuX } from "react-icons/lu";
+import type { ActiveDemo } from "../../types";
+
+interface WindowChromeProps {
+ activeDemo?: ActiveDemo;
+}
+
+const TITLE_BY_DEMO: Record
= {
+ "Use Any Agents": {
+ title: "use any agents in parallel",
+ branch: "use-any-agents",
+ },
+ "Create Parallel Branches": {
+ title: "set up parallel branches",
+ branch: "create-parallel-branches",
+ },
+ "See Changes": {
+ title: "review cloud-workspace diff",
+ branch: "see-changes",
+ },
+ "Open in Any IDE": {
+ title: "edit in any IDE",
+ branch: "open-in-any-ide",
+ },
+};
+
+export function WindowChrome({
+ activeDemo = "Use Any Agents",
+}: WindowChromeProps) {
+ const { title, branch } = TITLE_BY_DEMO[activeDemo];
return (
-
-
-
-
-
+
+
+
+ {title}
+
+
+
+ {branch}
+
+
+
+
+
+
-
- superset
-
-
);
}
diff --git a/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/WorkspaceItem/WorkspaceItem.tsx b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/WorkspaceItem/WorkspaceItem.tsx
index 996bead5024..37a0b0490b9 100644
--- a/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/WorkspaceItem/WorkspaceItem.tsx
+++ b/apps/marketing/src/app/components/HeroSection/components/AppMockup/components/WorkspaceItem/WorkspaceItem.tsx
@@ -1,6 +1,7 @@
"use client";
-import { LuFolderGit2, LuGitPullRequest } from "react-icons/lu";
+import { LuGitBranch } from "react-icons/lu";
+import { TbCloud } from "react-icons/tb";
import type { WorkspaceStatus } from "../../types";
import { AsciiSpinner } from "../AsciiSpinner";
import { StatusIndicator } from "../StatusIndicator";
@@ -17,64 +18,56 @@ interface WorkspaceItemProps {
export function WorkspaceItem({
name,
- branch,
add,
del,
- pr,
isActive,
status,
}: WorkspaceItemProps) {
+ const isCloud = name === "see changes";
+ const isBranch = name === "forward ports";
return (
{isActive && (
-
+
)}
-
+
+
{status === "working" ? (
-
+
+ ) : status ? (
+
+ ) : isCloud ? (
+
+ ) : isBranch ? (
+
) : (
-
- )}
- {status && status !== "working" && (
-
-
-
+
)}
-
-
-
- {name}
-
- {(add !== undefined || pr) && (
-
- {add !== undefined && (
-
- +{add}
- {del !== undefined && del > 0 && (
- -{del}
- )}
-
- )}
-
- )}
-
-
-
- {branch}
-
- {pr && (
-
-
- {pr}
-
+
+
+ {name}
+
+
+ {add !== undefined && (
+
+ +{add}
+ {del !== undefined && del > 0 && (
+ −{del}
)}
-
-
+
+ )}
);
}
diff --git a/apps/marketing/src/app/components/HeroSection/components/AppMockup/constants.ts b/apps/marketing/src/app/components/HeroSection/components/AppMockup/constants.ts
index 3ff23f79585..e73278cf9ee 100644
--- a/apps/marketing/src/app/components/HeroSection/components/AppMockup/constants.ts
+++ b/apps/marketing/src/app/components/HeroSection/components/AppMockup/constants.ts
@@ -43,7 +43,6 @@ export const WORKSPACES: WorkspaceData[] = [
];
export const FILE_CHANGES: FileChange[] = [
- { path: "bun.lock", add: 38, del: 25, type: "edit" },
{ path: "packages/db/src/schema", type: "folder" },
{ path: "cloud-workspace.ts", add: 119, del: 0, type: "add", indent: 1 },
{ path: "enums.ts", add: 21, del: 0, type: "edit", indent: 1 },
@@ -73,13 +72,26 @@ export const PORTS: PortGroup[] = [
export const AGENT_TABS: AgentTab[] = [
{ src: "/app-icons/codex.svg", alt: "Codex", label: "codex", delay: 0.1 },
- { src: "/app-icons/gemini.svg", alt: "Gemini", label: "gemini", delay: 0.25 },
{
src: "/app-icons/cursor-agent.svg",
alt: "Cursor",
label: "cursor",
+ delay: 0.2,
+ },
+ {
+ src: "/app-icons/opencode.svg",
+ alt: "OpenCode",
+ label: "opencode",
+ delay: 0.3,
+ },
+ {
+ src: "/app-icons/copilot-white.svg",
+ alt: "Copilot",
+ label: "copilot",
delay: 0.4,
},
+ { src: "/app-icons/amp.svg", alt: "Amp", label: "amp", delay: 0.5 },
+ { src: "/app-icons/gemini.svg", alt: "Gemini", label: "gemini", delay: 0.6 },
];
export const SETUP_STEPS = [