feat: implement ScanTerminalShellParts component for loading, topbar, and paywall UI
This commit is contained in:
@@ -3,13 +3,7 @@
|
|||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import type { Dispatch, SetStateAction } from "react";
|
import type { Dispatch, SetStateAction } from "react";
|
||||||
import {
|
import { LogIn, MessageCircle, Moon, Sun, UserRound } from "lucide-react";
|
||||||
LogIn,
|
|
||||||
MessageCircle,
|
|
||||||
Moon,
|
|
||||||
Sun,
|
|
||||||
UserRound,
|
|
||||||
} from "lucide-react";
|
|
||||||
import { ProFeaturePaywall } from "@/components/dashboard/ProFeaturePaywall";
|
import { ProFeaturePaywall } from "@/components/dashboard/ProFeaturePaywall";
|
||||||
import { LoadingSignal } from "@/components/dashboard/scan-terminal/LoadingSignal";
|
import { LoadingSignal } from "@/components/dashboard/scan-terminal/LoadingSignal";
|
||||||
import type { Locale } from "@/lib/i18n";
|
import type { Locale } from "@/lib/i18n";
|
||||||
@@ -50,7 +44,9 @@ export function ScanTerminalLoadingScreen({
|
|||||||
</div>
|
</div>
|
||||||
<div className="scan-loading-state">
|
<div className="scan-loading-state">
|
||||||
<LoadingSignal
|
<LoadingSignal
|
||||||
title={isEn ? "Preparing decision workspace" : "正在准备决策工作台"}
|
title={
|
||||||
|
isEn ? "Preparing decision workspace" : "正在准备决策工作台"
|
||||||
|
}
|
||||||
description={
|
description={
|
||||||
isEn
|
isEn
|
||||||
? "Checking access, city context and today's tradable weather windows."
|
? "Checking access, city context and today's tradable weather windows."
|
||||||
@@ -90,7 +86,9 @@ export function ScanTerminalTopBar({
|
|||||||
return (
|
return (
|
||||||
<div className="scan-topbar">
|
<div className="scan-topbar">
|
||||||
<div className="scan-topbar-title">
|
<div className="scan-topbar-title">
|
||||||
<strong>{isEn ? "AI Weather Decision Terminal" : "AI 天气交易决策台"}</strong>
|
<strong>
|
||||||
|
{isEn ? "AI Weather Decision Terminal" : "AI 天气交易决策台"}
|
||||||
|
</strong>
|
||||||
<span>
|
<span>
|
||||||
{isEn
|
{isEn
|
||||||
? "Start from the map, then open city cards to verify weather evidence"
|
? "Start from the map, then open city cards to verify weather evidence"
|
||||||
@@ -127,7 +125,9 @@ export function ScanTerminalTopBar({
|
|||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="scan-theme-button"
|
className="scan-theme-button"
|
||||||
aria-label={themeMode === "light" ? "切换到暗色模式" : "切换到明亮模式"}
|
aria-label={
|
||||||
|
themeMode === "light" ? "切换到暗色模式" : "切换到明亮模式"
|
||||||
|
}
|
||||||
title={themeMode === "light" ? "切换到暗色模式" : "切换到明亮模式"}
|
title={themeMode === "light" ? "切换到暗色模式" : "切换到明亮模式"}
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
setThemeMode((current) => (current === "light" ? "dark" : "light"))
|
setThemeMode((current) => (current === "light" ? "dark" : "light"))
|
||||||
@@ -145,16 +145,6 @@ export function ScanTerminalTopBar({
|
|||||||
<UserRound size={15} />
|
<UserRound size={15} />
|
||||||
</Link>
|
</Link>
|
||||||
) : null}
|
) : null}
|
||||||
<a
|
|
||||||
href="https://t.me/+nMG7SjziUKYyZmM1"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
className="scan-account-button"
|
|
||||||
aria-label={isEn ? "Feedback" : "反馈"}
|
|
||||||
title={isEn ? "Join Telegram for feedback" : "加入 Telegram 反馈"}
|
|
||||||
>
|
|
||||||
<MessageCircle size={15} />
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user