summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Hill <[email protected]>2025-10-30 00:22:49 +0000
committerDavid Hill <[email protected]>2025-10-30 00:22:49 +0000
commit5ae00ba567757579e0988162b3784ebaea0a04ad (patch)
tree2e147613008826e3bf22799fad66606a0ef3340b
parent950b608c4d41beaac8af24122f342c130c18fa58 (diff)
downloadopencode-5ae00ba567757579e0988162b3784ebaea0a04ad.tar.gz
opencode-5ae00ba567757579e0988162b3784ebaea0a04ad.zip
Brand page
-rw-r--r--packages/console/app/src/asset/lander/brand.pngbin0 -> 72109 bytes
-rw-r--r--packages/console/app/src/routes/brand/index.css443
-rw-r--r--packages/console/app/src/routes/brand/index.tsx100
3 files changed, 543 insertions, 0 deletions
diff --git a/packages/console/app/src/asset/lander/brand.png b/packages/console/app/src/asset/lander/brand.png
new file mode 100644
index 000000000..6172775e5
--- /dev/null
+++ b/packages/console/app/src/asset/lander/brand.png
Binary files differ
diff --git a/packages/console/app/src/routes/brand/index.css b/packages/console/app/src/routes/brand/index.css
new file mode 100644
index 000000000..8cb0cc032
--- /dev/null
+++ b/packages/console/app/src/routes/brand/index.css
@@ -0,0 +1,443 @@
+::selection {
+ background: var(--color-background-interactive);
+ color: var(--color-text-strong);
+
+ @media (prefers-color-scheme: dark) {
+ background: var(--color-background-interactive);
+ color: var(--color-text-inverted);
+ }
+}
+
+
+[data-page="enterprise"] {
+ --color-background: hsl(0, 20%, 99%);
+ --color-background-weak: hsl(0, 8%, 97%);
+ --color-background-weak-hover: hsl(0, 8%, 94%);
+ --color-background-strong: hsl(0, 5%, 12%);
+ --color-background-strong-hover: hsl(0, 5%, 18%);
+ --color-background-interactive: hsl(62, 84%, 88%);
+ --color-background-interactive-weaker: hsl(64, 74%, 95%);
+
+ --color-text: hsl(0, 1%, 39%);
+ --color-text-weak: hsl(0, 1%, 60%);
+ --color-text-weaker: hsl(30, 2%, 81%);
+ --color-text-strong: hsl(0, 5%, 12%);
+ --color-text-inverted: hsl(0, 20%, 99%);
+ --color-text-success: hsl(119, 100%, 35%);
+
+ --color-border: hsl(30, 2%, 81%);
+ --color-border-weak: hsl(0, 1%, 85%);
+
+ --color-icon: hsl(0, 1%, 55%);
+ --color-success: hsl(142, 76%, 36%);
+
+ background: var(--color-background);
+ font-family: var(--font-mono);
+ color: var(--color-text);
+ padding-bottom: 5rem;
+
+ @media (prefers-color-scheme: dark) {
+ --color-background: hsl(0, 9%, 7%);
+ --color-background-weak: hsl(0, 6%, 10%);
+ --color-background-weak-hover: hsl(0, 6%, 15%);
+ --color-background-strong: hsl(0, 15%, 94%);
+ --color-background-strong-hover: hsl(0, 15%, 97%);
+ --color-background-interactive: hsl(62, 100%, 90%);
+ --color-background-interactive-weaker: hsl(60, 20%, 8%);
+
+ --color-text: hsl(0, 4%, 71%);
+ --color-text-weak: hsl(0, 2%, 49%);
+ --color-text-weaker: hsl(0, 3%, 28%);
+ --color-text-strong: hsl(0, 15%, 94%);
+ --color-text-inverted: hsl(0, 9%, 7%);
+ --color-text-success: hsl(119, 60%, 72%);
+
+
+ --color-border: hsl(0, 3%, 28%);
+ --color-border-weak: hsl(0, 4%, 23%);
+
+ --color-icon: hsl(10, 3%, 43%);
+ --color-success: hsl(142, 76%, 46%);
+ }
+
+ /* Header and Footer styles - copied from index.css */
+ [data-component="top"] {
+ padding: 24px 5rem;
+ height: 80px;
+ position: sticky;
+ top: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ background: var(--color-background);
+ border-bottom: 1px solid var(--color-border-weak);
+ z-index: 10;
+
+ @media (max-width: 60rem) {
+ padding: 24px 1.5rem;
+ }
+
+ img {
+ height: 34px;
+ width: auto;
+ }
+
+ [data-component="nav-desktop"] {
+ ul {
+ display: flex;
+ justify-content: space-between;
+ gap: 48px;
+ li {
+ display: inline-block;
+ a {
+ text-decoration: none;
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+ a:hover {
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+ }
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+
+ [data-component="nav-mobile"] {
+ button > svg {
+ color: var(--color-icon);
+ }
+ }
+
+ [data-component="nav-mobile-toggle"] {
+ border: none;
+ background: none;
+ outline: none;
+ height: 40px;
+ width: 40px;
+ cursor: pointer;
+ margin-right: -8px;
+ }
+
+ [data-component="nav-mobile-toggle"]:hover {
+ background: var(--color-background-weak);
+ }
+
+ [data-component="nav-mobile"] {
+ display: none;
+
+ @media (max-width: 40rem) {
+ display: block;
+
+ [data-component="nav-mobile-icon"] {
+ cursor: pointer;
+ height: 40px;
+ width: 40px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ [data-component="nav-mobile-menu-list"] {
+ position: fixed;
+ background: var(--color-background);
+ top: 80px;
+ left: 0;
+ right: 0;
+ height: 100vh;
+
+ ul {
+ list-style: none;
+ padding: 20px 0;
+
+ li {
+ a {
+ text-decoration: none;
+ padding: 20px;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ [data-slot="logo dark"] {
+ display: none;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ [data-slot="logo light"] {
+ display: none;
+ }
+ [data-slot="logo dark"] {
+ display: block;
+ }
+ }
+ }
+
+ [data-component="footer"] {
+ border-top: 1px solid var(--color-border-weak);
+ display: flex;
+ flex-direction: row;
+
+ @media (max-width: 65rem) {
+ border-bottom: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"] {
+ flex: 1;
+ text-align: center;
+
+ a {
+ text-decoration: none;
+ padding: 2rem 0;
+ width: 100%;
+ display: block;
+
+ span {
+ color: var(--color-text-weak);
+
+ @media (max-width: 40rem) {
+ display: none;
+ }
+ }
+ }
+
+ a:hover {
+ background: var(--color-background-weak);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+ }
+ }
+
+ [data-slot="cell"] + [data-slot="cell"] {
+ border-left: 1px solid var(--color-border-weak);
+
+ @media (max-width: 40rem) {
+ border-left: none;
+ }
+ }
+
+ /* Mobile: third column on its own row */
+ @media (max-width: 25rem) {
+ flex-wrap: wrap;
+
+ [data-slot="cell"] {
+ flex: 1 0 100%;
+ border-left: none;
+ border-top: 1px solid var(--color-border-weak);
+ }
+
+ [data-slot="cell"]:nth-child(1) {
+ border-top: none;
+ }
+ }
+ }
+
+ [data-component="container"] {
+ max-width: 67.5rem;
+ margin: 0 auto;
+ border: 1px solid var(--color-border-weak);
+ border-top: none;
+
+ @media (max-width: 65rem) {
+ border: none;
+ }
+ }
+
+ [data-component="content"] {
+ }
+
+
+ [data-component="brand-content"] {
+ padding: 4rem 5rem;
+
+ h2 {
+ font-size: 1.5rem;
+ font-weight: 500;
+ color: var(--color-text-strong);
+ margin-bottom: 1rem;
+ }
+
+ h3 {
+ font-size: 1.25rem;
+ font-weight: 500;
+ color: var(--color-text-strong);
+ margin: 2rem 0 1rem 0;
+ }
+
+ p {
+ line-height: 1.6;
+ margin-bottom: 2.5rem;
+ color: var(--color-text);
+ }
+
+ [data-component="download-button"] {
+ padding: 8px 12px 8px 20px;
+ background: var(--color-background-strong);
+ color: var(--color-text-inverted);
+ border: none;
+ border-radius: 4px;
+ font-weight: 500;
+ cursor: pointer;
+ display: flex;
+ width: fit-content;
+ gap: 12px;
+ transition: background-color 0.2s ease;
+ text-decoration: none;
+
+
+ &:hover:not(:disabled) {
+ background: var(--color-background-strong-hover);
+ }
+
+ &:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ }
+ }
+
+ img {
+ width: 100%;
+ height: auto;
+ display: block;
+ margin-top: 4rem;
+ margin-bottom: 2rem;
+ }
+
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+ }
+
+
+
+
+ [data-component="faq"] {
+ border-top: 1px solid var(--color-border-weak);
+ padding: 4rem 5rem;
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+
+ [data-slot="section-title"] {
+ margin-bottom: 24px;
+
+ h3 {
+ font-size: 16px;
+ font-weight: 500;
+ color: var(--color-text-strong);
+ margin-bottom: 12px;
+ }
+
+ p {
+ margin-bottom: 12px;
+ color: var(--color-text);
+ }
+ }
+
+ ul {
+ padding: 0;
+
+ li {
+ list-style: none;
+ margin-bottom: 24px;
+ line-height: 200%;
+
+ @media (max-width: 60rem) {
+ line-height: 180%;
+ }
+ }
+ }
+
+ [data-slot="faq-question"] {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 8px;
+ color: var(--color-text-strong);
+ font-weight: 500;
+ cursor: pointer;
+ background: none;
+ border: none;
+ padding: 0;
+
+ [data-slot="faq-icon-plus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: block;
+ }
+ [data-expanded] & {
+ display: none;
+ }
+ }
+ [data-slot="faq-icon-minus"] {
+ flex-shrink: 0;
+ color: var(--color-text-weak);
+ margin-top: 2px;
+
+ [data-closed] & {
+ display: none;
+ }
+ [data-expanded] & {
+ display: block;
+ }
+ }
+ [data-slot="faq-question-text"] {
+ flex-grow: 1;
+ text-align: left;
+ }
+ }
+
+ [data-slot="faq-answer"] {
+ margin-left: 40px;
+ margin-bottom: 32px;
+ color: var(--color-text);
+ }
+ }
+
+ [data-component="legal"] {
+ color: var(--color-text-weak);
+ text-align: center;
+ padding: 2rem 5rem;
+
+ @media (max-width: 60rem) {
+ padding: 2rem 1.5rem;
+ }
+
+ a {
+ color: var(--color-text-weak);
+ text-decoration: none;
+ }
+ }
+
+ a {
+ color: var(--color-text-strong);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-thickness: 1px;
+
+ &:hover {
+ text-decoration-thickness: 2px;
+ }
+ }
+}
diff --git a/packages/console/app/src/routes/brand/index.tsx b/packages/console/app/src/routes/brand/index.tsx
new file mode 100644
index 000000000..53ce22bb9
--- /dev/null
+++ b/packages/console/app/src/routes/brand/index.tsx
@@ -0,0 +1,100 @@
+import "./index.css"
+import { Title, Meta } from "@solidjs/meta"
+import { Header } from "~/component/header"
+import { Footer } from "~/component/footer"
+import { Legal } from "~/component/legal"
+import { Faq } from "~/component/faq"
+import brand from "../../asset/lander/brand.png"
+
+
+export default function Brand() {
+
+ return (
+ <main data-page="enterprise">
+ <Title>OpenCode | Brand</Title>
+ <Meta name="description" content="OpenCode brand guidelines" />
+ <div data-component="container">
+ <Header />
+
+ <div data-component="content">
+ <section data-component="brand-content">
+ <h2>Brand guidelines</h2>
+ <p>
+ Resources and assets to help you work with the OpenCode brand.
+ </p>
+ <a data-component="download-button" href="#">Download brand assets<svg
+ width="24" height="24" viewBox="0 0 24 24" fill="none"
+ xmlns="http://www.w3.org/2000/svg">
+ <path d="M12 6.5L12 17M7.5 13L12 17.5L16.5 13" stroke="currentColor"
+ stroke-width="1.5" stroke-linecap="square"/>
+ </svg>
+ </a>
+ <img src={brand} alt=""/>
+
+ <p>If you need any help with anything brand related <a href="mailto:[email protected]">contact us</a>.</p>
+ </section>
+
+ <section data-component="faq">
+ <div data-slot="section-title">
+ <h3>FAQ</h3>
+ </div>
+ <ul>
+ <li>
+ <Faq question="Does Opencode store our code or context data?">
+ No. OpenCode never stores your code or context data. All
+ processing happens locally or directly with your AI provider.
+ </Faq>
+ </li>
+ <li>
+ <Faq question="Who owns the code generated with OpenCode?">
+ You do. All code produced is yours, with no licensing
+ restrictions or ownership claims.
+ </Faq>
+ </li>
+ <li>
+ <Faq
+ question="How can we trial OpenCode inside our organization?">
+ Simply install and run an internal trial with your team. Since
+ OpenCode doesn’t store any data, your developers can get
+ started right away.
+ </Faq>
+ </li>
+ <li>
+ <Faq
+ question="What happens if someone uses the `/share` feature?">
+ By default, sharing is disabled. If enabled, conversations are
+ sent to our share service and cached through our CDN. For
+ enterprise use, we recommend disabling or self-hosting this
+ feature.
+ </Faq>
+ </li>
+ <li>
+ <Faq question="Can OpenCode integrate with our company’s SSO?">
+ Yes. Enterprise deployments can include SSO integration so all
+ sessions and shared conversations are protected by your
+ authentication system.
+ </Faq>
+ </li>
+ <li>
+ <Faq question="Can OpenCode be self-hosted?">
+ Absolutely. You can fully self-host OpenCode, including the
+ share feature, ensuring that data and pages are accessible
+ only after authentication.
+ </Faq>
+ </li>
+ <li>
+ <Faq
+ question="How do we get started with enterprise deployment?">
+ Contact us to discuss pricing, implementation, and enterprise
+ options like SSO, private registries, and self-hosting.
+ </Faq>
+ </li>
+ </ul>
+ </section>
+ </div>
+ <Footer />
+ </div>
+ <Legal />
+ </main>
+ )
+}