Frank 1 месяц назад
Родитель
Сommit
cda2af2589

+ 1 - 0
packages/console/app/src/i18n/ar.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/br.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/da.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/de.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/en.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/es.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/fr.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/it.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/ja.ts

@@ -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 プラン",

+ 1 - 0
packages/console/app/src/i18n/ko.ts

@@ -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 플랜",

+ 1 - 0
packages/console/app/src/i18n/no.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/pl.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/ru.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/th.ts

@@ -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",

+ 1 - 0
packages/console/app/src/i18n/tr.ts

@@ -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ı",

+ 1 - 0
packages/console/app/src/i18n/zh.ts

@@ -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 计划",

+ 1 - 0
packages/console/app/src/i18n/zht.ts

@@ -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 方案",

+ 13 - 0
packages/console/app/src/routes/black.css

@@ -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;

+ 0 - 0
packages/console/app/src/routes/black/subscribe/[plan].tsx → packages/console/app/src/routes/black/_subscribe/[plan].tsx


+ 64 - 58
packages/console/app/src/routes/black/index.tsx

@@ -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>
     </>
   )