wip: zen lite

This commit is contained in:
Frank
2026-02-23 23:01:23 -05:00
parent eda71373b0
commit cda2af2589
20 changed files with 94 additions and 58 deletions

View File

@@ -243,6 +243,7 @@ export const dict = {
"black.hero.title": "الوصول إلى أفضل نماذج البرمجة في العالم",
"black.hero.subtitle": "بما في ذلك Claude، GPT، Gemini والمزيد",
"black.title": "OpenCode Black | الأسعار",
"black.paused": "التسجيل في خطة Black متوقف مؤقتًا.",
"black.plan.icon20": "خطة Black 20",
"black.plan.icon100": "خطة Black 100",
"black.plan.icon200": "خطة Black 200",

View File

@@ -247,6 +247,7 @@ export const dict = {
"black.hero.title": "Acesse os melhores modelos de codificação do mundo",
"black.hero.subtitle": "Incluindo Claude, GPT, Gemini e mais",
"black.title": "OpenCode Black | Preços",
"black.paused": "A inscrição no plano Black está temporariamente pausada.",
"black.plan.icon20": "Plano Black 20",
"black.plan.icon100": "Plano Black 100",
"black.plan.icon200": "Plano Black 200",

View File

@@ -245,6 +245,7 @@ export const dict = {
"black.hero.title": "Få adgang til verdens bedste kodningsmodeller",
"black.hero.subtitle": "Inklusive Claude, GPT, Gemini og mere",
"black.title": "OpenCode Black | Priser",
"black.paused": "Black-plantilmelding er midlertidigt sat på pause.",
"black.plan.icon20": "Black 20-plan",
"black.plan.icon100": "Black 100-plan",
"black.plan.icon200": "Black 200-plan",

View File

@@ -247,6 +247,7 @@ export const dict = {
"black.hero.title": "Zugriff auf die weltweit besten Coding-Modelle",
"black.hero.subtitle": "Einschließlich Claude, GPT, Gemini und mehr",
"black.title": "OpenCode Black | Preise",
"black.paused": "Die Anmeldung zum Black-Plan ist vorübergehend pausiert.",
"black.plan.icon20": "Black 20 Plan",
"black.plan.icon100": "Black 100 Plan",
"black.plan.icon200": "Black 200 Plan",

View File

@@ -239,6 +239,7 @@ export const dict = {
"black.hero.title": "Access all the world's best coding models",
"black.hero.subtitle": "Including Claude, GPT, Gemini and more",
"black.title": "OpenCode Black | Pricing",
"black.paused": "Black plan enrollment is temporarily paused.",
"black.plan.icon20": "Black 20 plan",
"black.plan.icon100": "Black 100 plan",
"black.plan.icon200": "Black 200 plan",

View File

@@ -248,6 +248,7 @@ export const dict = {
"black.hero.title": "Accede a los mejores modelos de codificación del mundo",
"black.hero.subtitle": "Incluyendo Claude, GPT, Gemini y más",
"black.title": "OpenCode Black | Precios",
"black.paused": "La inscripción al plan Black está temporalmente pausada.",
"black.plan.icon20": "Plan Black 20",
"black.plan.icon100": "Plan Black 100",
"black.plan.icon200": "Plan Black 200",

View File

@@ -251,6 +251,7 @@ export const dict = {
"black.hero.title": "Accédez aux meilleurs modèles de code au monde",
"black.hero.subtitle": "Y compris Claude, GPT, Gemini et plus",
"black.title": "OpenCode Black | Tarification",
"black.paused": "L'inscription au plan Black est temporairement suspendue.",
"black.plan.icon20": "Forfait Black 20",
"black.plan.icon100": "Forfait Black 100",
"black.plan.icon200": "Forfait Black 200",

View File

@@ -246,6 +246,7 @@ export const dict = {
"black.hero.title": "Accedi ai migliori modelli di coding al mondo",
"black.hero.subtitle": "Inclusi Claude, GPT, Gemini e altri",
"black.title": "OpenCode Black | Prezzi",
"black.paused": "L'iscrizione al piano Black è temporaneamente sospesa.",
"black.plan.icon20": "Piano Black 20",
"black.plan.icon100": "Piano Black 100",
"black.plan.icon200": "Piano Black 200",

View File

@@ -244,6 +244,7 @@ export const dict = {
"black.hero.title": "世界最高峰のコーディングモデルすべてにアクセス",
"black.hero.subtitle": "Claude、GPT、Gemini などを含む",
"black.title": "OpenCode Black | 料金",
"black.paused": "Blackプランの登録は一時的に停止しています。",
"black.plan.icon20": "Black 20 プラン",
"black.plan.icon100": "Black 100 プラン",
"black.plan.icon200": "Black 200 プラン",

View File

@@ -241,6 +241,7 @@ export const dict = {
"black.hero.title": "세계 최고의 코딩 모델에 액세스하세요",
"black.hero.subtitle": "Claude, GPT, Gemini 등 포함",
"black.title": "OpenCode Black | 가격",
"black.paused": "Black 플랜 등록이 일시적으로 중단되었습니다.",
"black.plan.icon20": "Black 20 플랜",
"black.plan.icon100": "Black 100 플랜",
"black.plan.icon200": "Black 200 플랜",

View File

@@ -245,6 +245,7 @@ export const dict = {
"black.hero.title": "Få tilgang til verdens beste kodemodeller",
"black.hero.subtitle": "Inkludert Claude, GPT, Gemini og mer",
"black.title": "OpenCode Black | Priser",
"black.paused": "Black-planregistrering er midlertidig satt på pause.",
"black.plan.icon20": "Black 20-plan",
"black.plan.icon100": "Black 100-plan",
"black.plan.icon200": "Black 200-plan",

View File

@@ -246,6 +246,7 @@ export const dict = {
"black.hero.title": "Dostęp do najlepszych na świecie modeli kodujących",
"black.hero.subtitle": "W tym Claude, GPT, Gemini i inne",
"black.title": "OpenCode Black | Cennik",
"black.paused": "Rejestracja planu Black jest tymczasowo wstrzymana.",
"black.plan.icon20": "Plan Black 20",
"black.plan.icon100": "Plan Black 100",
"black.plan.icon200": "Plan Black 200",

View File

@@ -249,6 +249,7 @@ export const dict = {
"black.hero.title": "Доступ к лучшим моделям для кодинга в мире",
"black.hero.subtitle": "Включая Claude, GPT, Gemini и другие",
"black.title": "OpenCode Black | Цены",
"black.paused": "Регистрация на план Black временно приостановлена.",
"black.plan.icon20": "План Black 20",
"black.plan.icon100": "План Black 100",
"black.plan.icon200": "План Black 200",

View File

@@ -244,6 +244,7 @@ export const dict = {
"black.hero.title": "เข้าถึงโมเดลเขียนโค้ดที่ดีที่สุดในโลก",
"black.hero.subtitle": "รวมถึง Claude, GPT, Gemini และอื่นๆ อีกมากมาย",
"black.title": "OpenCode Black | ราคา",
"black.paused": "การสมัครแผน Black หยุดชั่วคราว",
"black.plan.icon20": "แผน Black 20",
"black.plan.icon100": "แผน Black 100",
"black.plan.icon200": "แผน Black 200",

View File

@@ -247,6 +247,7 @@ export const dict = {
"black.hero.title": "Dünyanın en iyi kodlama modellerine erişin",
"black.hero.subtitle": "Claude, GPT, Gemini ve daha fazlası dahil",
"black.title": "OpenCode Black | Fiyatlandırma",
"black.paused": "Black plan kaydı geçici olarak duraklatıldı.",
"black.plan.icon20": "Black 20 planı",
"black.plan.icon100": "Black 100 planı",
"black.plan.icon200": "Black 200 planı",

View File

@@ -234,6 +234,7 @@ export const dict = {
"black.hero.title": "访问全球顶尖编程模型",
"black.hero.subtitle": "包括 Claude, GPT, Gemini 等",
"black.title": "OpenCode Black | 定价",
"black.paused": "Black 订阅已暂时暂停注册。",
"black.plan.icon20": "Black 20 计划",
"black.plan.icon100": "Black 100 计划",
"black.plan.icon200": "Black 200 计划",

View File

@@ -234,6 +234,7 @@ export const dict = {
"black.hero.title": "存取全球最佳編碼模型",
"black.hero.subtitle": "包括 Claude、GPT、Gemini 等",
"black.title": "OpenCode Black | 定價",
"black.paused": "Black 訂閱暫時暫停註冊。",
"black.plan.icon20": "Black 20 方案",
"black.plan.icon100": "Black 100 方案",
"black.plan.icon200": "Black 200 方案",

View File

@@ -335,6 +335,19 @@
}
}
[data-slot="paused"] {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
color: rgba(255, 255, 255, 0.59);
font-size: 18px;
font-style: normal;
font-weight: 400;
line-height: 160%;
padding: 120px 20px;
}
[data-slot="pricing-card"] {
display: flex;
flex-direction: column;

View File

@@ -5,6 +5,8 @@ import { PlanIcon, plans } from "./common"
import { useI18n } from "~/context/i18n"
import { useLanguage } from "~/context/language"
const paused = true
export default function Black() {
const [params] = useSearchParams()
const i18n = useI18n()
@@ -42,72 +44,76 @@ export default function Black() {
<>
<Title>{i18n.t("black.title")}</Title>
<section data-slot="cta">
<Switch>
<Match when={!selected()}>
<div data-slot="pricing">
<For each={plans}>
{(plan) => (
<button
type="button"
onClick={() => select(plan.id)}
data-slot="pricing-card"
style={{ "view-transition-name": `card-${plan.id}` }}
>
<Show when={!paused} fallback={<p data-slot="paused">{i18n.t("black.paused")}</p>}>
<Switch>
<Match when={!selected()}>
<div data-slot="pricing">
<For each={plans}>
{(plan) => (
<button
type="button"
onClick={() => select(plan.id)}
data-slot="pricing-card"
style={{ "view-transition-name": `card-${plan.id}` }}
>
<div data-slot="icon">
<PlanIcon plan={plan.id} />
</div>
<p data-slot="price">
<span data-slot="amount">${plan.id}</span>{" "}
<span data-slot="period">{i18n.t("black.price.perMonth")}</span>
<Show when={plan.multiplier}>
{(multiplier) => <span data-slot="multiplier">{i18n.t(multiplier())}</span>}
</Show>
</p>
</button>
)}
</For>
</div>
</Match>
<Match when={selectedPlan()}>
{(plan) => (
<div data-slot="selected-plan">
<div data-slot="selected-card" style={{ "view-transition-name": `card-${plan().id}` }}>
<div data-slot="icon">
<PlanIcon plan={plan.id} />
<PlanIcon plan={plan().id} />
</div>
<p data-slot="price">
<span data-slot="amount">${plan.id}</span>{" "}
<span data-slot="period">{i18n.t("black.price.perMonth")}</span>
<Show when={plan.multiplier}>
<span data-slot="amount">${plan().id}</span>{" "}
<span data-slot="period">{i18n.t("black.price.perPersonBilledMonthly")}</span>
<Show when={plan().multiplier}>
{(multiplier) => <span data-slot="multiplier">{i18n.t(multiplier())}</span>}
</Show>
</p>
</button>
)}
</For>
</div>
</Match>
<Match when={selectedPlan()}>
{(plan) => (
<div data-slot="selected-plan">
<div data-slot="selected-card" style={{ "view-transition-name": `card-${plan().id}` }}>
<div data-slot="icon">
<PlanIcon plan={plan().id} />
</div>
<p data-slot="price">
<span data-slot="amount">${plan().id}</span>{" "}
<span data-slot="period">{i18n.t("black.price.perPersonBilledMonthly")}</span>
<Show when={plan().multiplier}>
{(multiplier) => <span data-slot="multiplier">{i18n.t(multiplier())}</span>}
</Show>
</p>
<ul data-slot="terms" style={{ "view-transition-name": `terms-${plan().id}` }}>
<li>{i18n.t("black.terms.1")}</li>
<li>{i18n.t("black.terms.2")}</li>
<li>{i18n.t("black.terms.3")}</li>
<li>{i18n.t("black.terms.4")}</li>
<li>{i18n.t("black.terms.5")}</li>
<li>{i18n.t("black.terms.6")}</li>
<li>{i18n.t("black.terms.7")}</li>
</ul>
<div data-slot="actions" style={{ "view-transition-name": `actions-${plan().id}` }}>
<button type="button" onClick={() => cancel()} data-slot="cancel">
{i18n.t("common.cancel")}
</button>
<a href={`/black/subscribe/${plan().id}`} data-slot="continue">
{i18n.t("black.action.continue")}
</a>
<ul data-slot="terms" style={{ "view-transition-name": `terms-${plan().id}` }}>
<li>{i18n.t("black.terms.1")}</li>
<li>{i18n.t("black.terms.2")}</li>
<li>{i18n.t("black.terms.3")}</li>
<li>{i18n.t("black.terms.4")}</li>
<li>{i18n.t("black.terms.5")}</li>
<li>{i18n.t("black.terms.6")}</li>
<li>{i18n.t("black.terms.7")}</li>
</ul>
<div data-slot="actions" style={{ "view-transition-name": `actions-${plan().id}` }}>
<button type="button" onClick={() => cancel()} data-slot="cancel">
{i18n.t("common.cancel")}
</button>
<a href={`/black/subscribe/${plan().id}`} data-slot="continue">
{i18n.t("black.action.continue")}
</a>
</div>
</div>
</div>
</div>
)}
</Match>
</Switch>
<p data-slot="fine-print" style={{ "view-transition-name": "fine-print" }}>
{i18n.t("black.finePrint.beforeTerms")} ·{" "}
<A href={language.route("/legal/terms-of-service")}>{i18n.t("black.finePrint.terms")}</A>
</p>
)}
</Match>
</Switch>
</Show>
<Show when={!paused}>
<p data-slot="fine-print" style={{ "view-transition-name": "fine-print" }}>
{i18n.t("black.finePrint.beforeTerms")} ·{" "}
<A href={language.route("/legal/terms-of-service")}>{i18n.t("black.finePrint.terms")}</A>
</p>
</Show>
</section>
</>
)