summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorDavid Hill <[email protected]>2025-12-11 10:36:31 +0000
committerDavid Hill <[email protected]>2025-12-11 10:36:31 +0000
commit380d2c466ecc18c888f06df4ba8d26aece5f6818 (patch)
tree1f090d0d47ae1d35dbc4a46c565f3c2ce31d80d5 /packages
parent02705e460f85f8ae5a4f66e23094854b9a030b79 (diff)
downloadopencode-380d2c466ecc18c888f06df4ba8d26aece5f6818.tar.gz
opencode-380d2c466ecc18c888f06df4ba8d26aece5f6818.zip
wip: lander hero updates
Diffstat (limited to 'packages')
-rw-r--r--packages/console/app/src/routes/index.css121
-rw-r--r--packages/console/app/src/routes/index.tsx195
2 files changed, 108 insertions, 208 deletions
diff --git a/packages/console/app/src/routes/index.css b/packages/console/app/src/routes/index.css
index f04297104..6f658771f 100644
--- a/packages/console/app/src/routes/index.css
+++ b/packages/console/app/src/routes/index.css
@@ -475,66 +475,40 @@ body {
}
}
- [data-component="desktop-app-available"] {
- background: var(--color-surface-raised-base);
- border: 1px solid var(--color-border-weak);
+ [data-component="desktop-app-banner"] {
display: flex;
- margin-bottom: 48px;
-
- [data-slot="desktop-icon"] {
- border-right: 1px solid var(--color-border-weak);
- width: 56px;
- height: 72px;
- background: var(--color-surface-raised-base-active);
- display: flex;
- align-items: center;
- justify-content: center;
- position: relative;
-
- img {
- width: 40px;
- height: 40px;
- opacity: 100%;
- }
+ align-items: center;
+ gap: 12px;
+ margin-bottom: 32px;
- [data-slot="dot"] {
- border-radius: 100px;
- width: 6px;
- height: 6px;
- background: var(--color-background-strong);
- position: absolute;
- bottom: 5px;
- left: 24px;
- opacity: 0;
- }
+ [data-slot="badge"] {
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ font-weight: 500;
+ padding: 4px 8px;
+ line-height: 1;
}
- &[data-animating] [data-slot="desktop-icon"] img {
- animation: iconBounce 1s ease-in-out forwards;
+ [data-slot="text"] {
+ color: var(--color-text-strong);
+ line-height: 1.4;
}
- &[data-animating] [data-slot="desktop-icon"] [data-slot="dot"] {
- animation: dotFadeInOut 6s ease-out forwards;
+ a {
+ color: var(--color-text-weak);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ margin-left: 4px;
+ white-space: nowrap;
}
+ a:hover {
+ color: var(--color-text);
+ }
-
- [data-slot="desktop-copy"] {
- display: flex;
- align-items: center;
- padding: 20px;
- gap: 16px;
- flex: 1;
- cursor: default;
-
- span {
- color: var(--color-text-strong);
- line-height: 1;
- }
-
- a {
- color: var(--color-text-weak);
- }
+ @media (max-width: 40rem) {
+ flex-wrap: wrap;
}
}
@@ -1212,48 +1186,3 @@ body {
}
}
}
-
-@keyframes iconBounce {
- 0%, 100% {
- transform: translateY(0);
- }
- 50% {
- transform: translateY(-10px);
- }
-}
- 25% {
- transform: translateY(-10px);
- }
- 50% {
- transform: translateY(0);
- }
- 75% {
- transform: translateY(-10px);
- }
-}
-
-@keyframes dotAppear {
- 0% {
- opacity: 0;
- transform: scale(0);
- }
- 100% {
- opacity: 0.5;
- transform: scale(1);
- }
-}
-
-@keyframes dotFadeInOut {
- 0%, 16% {
- opacity: 0;
- }
- 20% {
- opacity: 0.4;
- }
- 90% {
- opacity: 0.4;
- }
- 100% {
- opacity: 0;
- }
-}
diff --git a/packages/console/app/src/routes/index.tsx b/packages/console/app/src/routes/index.tsx
index edccb3577..86a03f01b 100644
--- a/packages/console/app/src/routes/index.tsx
+++ b/packages/console/app/src/routes/index.tsx
@@ -3,7 +3,6 @@ import { Title, Meta, Link } from "@solidjs/meta"
// import { HttpHeader } from "@solidjs/start"
import video from "../asset/lander/opencode-min.mp4"
import videoPoster from "../asset/lander/opencode-poster.png"
-import desktopAppIcon from "../asset/lander/desktop-app-icon.png"
import { IconCopy, IconCheck } from "../component/icon"
import { A, createAsync } from "@solidjs/router"
import { EmailSignup } from "~/component/email-signup"
@@ -13,9 +12,8 @@ import { Header } from "~/component/header"
import { Footer } from "~/component/footer"
import { Legal } from "~/component/legal"
import { github } from "~/lib/github"
-import { createMemo, createSignal } from "solid-js"
+import { createMemo } from "solid-js"
import { config } from "~/config"
-import avatarDavid from "~/asset/lander/avatar-david.png"
function CopyStatus() {
return (
@@ -30,18 +28,6 @@ export default function Home() {
const githubData = createAsync(() => github())
const release = createMemo(() => githubData()?.release)
- const [isAnimating, setIsAnimating] = createSignal(false)
-
- const handleDesktopCopyHover = () => {
- if (!isAnimating()) {
- setIsAnimating(true)
- // Animation duration is 6s for dot fade in/out
- setTimeout(() => {
- setIsAnimating(false)
- }, 6000)
- }
- }
-
const handleCopyClick = (event: Event) => {
const button = event.currentTarget as HTMLButtonElement
const text = button.textContent
@@ -66,14 +52,10 @@ export default function Home() {
<div data-component="content">
<section data-component="hero">
- <div data-component="desktop-app-available" data-animating={isAnimating() ? "" : undefined}>
- <div data-slot="desktop-icon">
- <img src={desktopAppIcon} alt="" />
- <div data-slot="dot"></div>
- </div>
- <div data-slot="desktop-copy" onMouseEnter={handleDesktopCopyHover}>
- <span>Now available on desktop for macOS, Windows, and Linux.</span> <a href="/download">Learn more</a>
- </div>
+ <div data-component="desktop-app-banner">
+ <span data-slot="badge">New</span>
+ <span data-slot="text">Desktop app available in beta on macOS, Windows, and Linux.</span>
+ <a href="/download">Download now</a>
</div>
<div data-slot="hero-copy">
@@ -87,96 +69,85 @@ export default function Home() {
Free models included or connect any model from any provider, <span data-slot="br"></span>including
Claude, GPT, Gemini and more.
</p>
- <a href="/download">
- <span>Get started for free</span>
- <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
- <path
- d="M6.5 12L17 12M13 16.5L17.5 12L13 7.5"
- stroke="currentColor"
- stroke-width="1.5"
- stroke-linecap="square"
- />
- </svg>
- </a>
</div>
- {/*<div data-slot="installation">*/}
- {/* <Tabs*/}
- {/* as="section"*/}
- {/* aria-label="Install options"*/}
- {/* class="tabs"*/}
- {/* data-component="tabs"*/}
- {/* data-active="curl"*/}
- {/* defaultValue="curl"*/}
- {/* >*/}
- {/* <Tabs.List data-slot="tablist">*/}
- {/* <Tabs.Trigger value="curl" data-slot="tab">*/}
- {/* curl*/}
- {/* </Tabs.Trigger>*/}
- {/* <Tabs.Trigger value="npm" data-slot="tab">*/}
- {/* npm*/}
- {/* </Tabs.Trigger>*/}
- {/* <Tabs.Trigger value="bun" data-slot="tab">*/}
- {/* bun*/}
- {/* </Tabs.Trigger>*/}
- {/* <Tabs.Trigger value="brew" data-slot="tab">*/}
- {/* brew*/}
- {/* </Tabs.Trigger>*/}
- {/* <Tabs.Trigger value="paru" data-slot="tab">*/}
- {/* paru*/}
- {/* </Tabs.Trigger>*/}
- {/* <Tabs.Indicator />*/}
- {/* </Tabs.List>*/}
- {/* <div data-slot="panels">*/}
- {/* <Tabs.Content as="pre" data-slot="panel" value="curl">*/}
- {/* <button data-copy data-slot="command" onClick={handleCopyClick}>*/}
- {/* <span data-slot="command-script">*/}
- {/* <span>curl -fsSL </span>*/}
- {/* <span data-slot="protocol">https://</span>*/}
- {/* <span data-slot="highlight">opencode.ai/install</span>*/}
- {/* <span> | bash</span>*/}
- {/* </span>*/}
- {/* <CopyStatus />*/}
- {/* </button>*/}
- {/* </Tabs.Content>*/}
- {/* <Tabs.Content as="pre" data-slot="panel" value="npm">*/}
- {/* <button data-copy data-slot="command" onClick={handleCopyClick}>*/}
- {/* <span>*/}
- {/* <span data-slot="protocol">npm i -g </span>*/}
- {/* <span data-slot="highlight">opencode-ai</span>*/}
- {/* </span>*/}
- {/* <CopyStatus />*/}
- {/* </button>*/}
- {/* </Tabs.Content>*/}
- {/* <Tabs.Content as="pre" data-slot="panel" value="bun">*/}
- {/* <button data-copy data-slot="command" onClick={handleCopyClick}>*/}
- {/* <span>*/}
- {/* <span data-slot="protocol">bun add -g </span>*/}
- {/* <span data-slot="highlight">opencode-ai</span>*/}
- {/* </span>*/}
- {/* <CopyStatus />*/}
- {/* </button>*/}
- {/* </Tabs.Content>*/}
- {/* <Tabs.Content as="pre" data-slot="panel" value="brew">*/}
- {/* <button data-copy data-slot="command" onClick={handleCopyClick}>*/}
- {/* <span>*/}
- {/* <span data-slot="protocol">brew install </span>*/}
- {/* <span data-slot="highlight">opencode</span>*/}
- {/* </span>*/}
- {/* <CopyStatus />*/}
- {/* </button>*/}
- {/* </Tabs.Content>*/}
- {/* <Tabs.Content as="pre" data-slot="panel" value="paru">*/}
- {/* <button data-copy data-slot="command" onClick={handleCopyClick}>*/}
- {/* <span>*/}
- {/* <span data-slot="protocol">paru -S </span>*/}
- {/* <span data-slot="highlight">opencode</span>*/}
- {/* </span>*/}
- {/* <CopyStatus />*/}
- {/* </button>*/}
- {/* </Tabs.Content>*/}
- {/* </div>*/}
- {/* </Tabs>*/}
- {/*</div>*/}
+ <div data-slot="installation">
+ <Tabs
+ as="section"
+ aria-label="Install options"
+ class="tabs"
+ data-component="tabs"
+ data-active="curl"
+ defaultValue="curl"
+ >
+ <Tabs.List data-slot="tablist">
+ <Tabs.Trigger value="curl" data-slot="tab">
+ curl
+ </Tabs.Trigger>
+ <Tabs.Trigger value="npm" data-slot="tab">
+ npm
+ </Tabs.Trigger>
+ <Tabs.Trigger value="bun" data-slot="tab">
+ bun
+ </Tabs.Trigger>
+ <Tabs.Trigger value="brew" data-slot="tab">
+ brew
+ </Tabs.Trigger>
+ <Tabs.Trigger value="paru" data-slot="tab">
+ paru
+ </Tabs.Trigger>
+ <Tabs.Indicator />
+ </Tabs.List>
+ <div data-slot="panels">
+ <Tabs.Content as="pre" data-slot="panel" value="curl">
+ <button data-copy data-slot="command" onClick={handleCopyClick}>
+ <span data-slot="command-script">
+ <span>curl -fsSL </span>
+ <span data-slot="protocol">https://</span>
+ <span data-slot="highlight">opencode.ai/install</span>
+ <span> | bash</span>
+ </span>
+ <CopyStatus />
+ </button>
+ </Tabs.Content>
+ <Tabs.Content as="pre" data-slot="panel" value="npm">
+ <button data-copy data-slot="command" onClick={handleCopyClick}>
+ <span>
+ <span data-slot="protocol">npm i -g </span>
+ <span data-slot="highlight">opencode-ai</span>
+ </span>
+ <CopyStatus />
+ </button>
+ </Tabs.Content>
+ <Tabs.Content as="pre" data-slot="panel" value="bun">
+ <button data-copy data-slot="command" onClick={handleCopyClick}>
+ <span>
+ <span data-slot="protocol">bun add -g </span>
+ <span data-slot="highlight">opencode-ai</span>
+ </span>
+ <CopyStatus />
+ </button>
+ </Tabs.Content>
+ <Tabs.Content as="pre" data-slot="panel" value="brew">
+ <button data-copy data-slot="command" onClick={handleCopyClick}>
+ <span>
+ <span data-slot="protocol">brew install </span>
+ <span data-slot="highlight">opencode</span>
+ </span>
+ <CopyStatus />
+ </button>
+ </Tabs.Content>
+ <Tabs.Content as="pre" data-slot="panel" value="paru">
+ <button data-copy data-slot="command" onClick={handleCopyClick}>
+ <span>
+ <span data-slot="protocol">paru -S </span>
+ <span data-slot="highlight">opencode</span>
+ </span>
+ <CopyStatus />
+ </button>
+ </Tabs.Content>
+ </div>
+ </Tabs>
+ </div>
</section>
<section data-component="video">