feat: improve page readability, add thumbnail switcher, CI/CD config
Some checks failed
ci/woodpecker/manual/woodpecker Pipeline failed

- Improve spacing and typography on product intro and scenarios pages
- Add thumbnail click switching for architecture hardware showcase
- Fix thumbnail click target and z-index overlap issues
- Add .woodpecker.yml, Dockerfile, and docker-compose.yml for CI/CD
- Set Vite base path to /lnbox/ for sub-path deployment
This commit is contained in:
kkfluous
2026-06-05 16:14:55 +08:00
parent 9f4de27243
commit fc47801968
6 changed files with 3179 additions and 268 deletions

63
.woodpecker.yml Normal file
View File

@@ -0,0 +1,63 @@
steps:
- name: pnpm-build
image: node:22-alpine
when:
event:
- push
- pull_request
- manual
branch:
- master
- develop
- main
commands: |
cd $CI_WORKSPACE
npm install -g pnpm
pnpm install
pnpm build
# 获取分支名
BRANCH_NAME=$(echo $CI_COMMIT_BRANCH | tr / -)
echo "Branch name: $BRANCH_NAME"
# 版本号: 分支名-package.json版本
PKG_VERSION=$(node -e "console.log(require('./package.json').version)")
PROJECT_VERSION="$BRANCH_NAME-$PKG_VERSION"
echo "Docker tag: $PROJECT_VERSION"
echo $PROJECT_VERSION > $CI_WORKSPACE/project_version.txt
- name: docker-build
image: docker:24.0.5-cli
when:
event:
- push
- pull_request
- manual
branch:
- master
- develop
- main
volumes:
- /var/run/docker.sock:/var/run/docker.sock
commands: |
PROJECT_VERSION=$(cat $CI_WORKSPACE/project_version.txt)
MODULE_NAME=lnbox
echo "Building Docker image: $MODULE_NAME:$PROJECT_VERSION"
cd $CI_WORKSPACE
docker build -t harbor.lnh2e.com/lingniu-v1/$MODULE_NAME:$PROJECT_VERSION .
mkdir -p /root/.docker
cat > /root/.docker/config.json <<EOF
{
"auths": {
"harbor.lnh2e.com": {
"auth": "$(echo Y2ljZDpMbkBjaWNkMDE=)"
}
}
}
EOF
docker push harbor.lnh2e.com/lingniu-v1/$MODULE_NAME:$PROJECT_VERSION

30
Dockerfile Normal file
View File

@@ -0,0 +1,30 @@
FROM node:22-alpine as builder
WORKDIR /usr/src/app
COPY . .
RUN npm install pnpm -g
RUN pnpm install
RUN pnpm build
FROM nginx:1.26
COPY --from=0 /usr/src/app/dist /usr/share/nginx/html/lnbox
RUN echo "server {\
listen 80;\
server_name localhost;\
location / {\
return 301 /lnbox/;\
}\
location /lnbox {\
alias /usr/share/nginx/html/lnbox;\
index index.html index.htm;\
try_files \$uri \$uri/ /lnbox/index.html;\
}\
}" > /etc/nginx/conf.d/default.conf
EXPOSE 80

16
docker-compose.yml Normal file
View File

@@ -0,0 +1,16 @@
version: '3.8'
services:
lnbox:
image: harbor.lnh2e.com/lingniu-v1/lnbox:main-0.0.0
ports:
- "8029:80"
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.role == manager]
labels:
- portainer.hide=false
- project=lingniu

2795
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -21,7 +21,6 @@ import scenarioDatacenterImage from './assets/images/scenario_datacenter_1779863
const CompactArchCard = ({ title, children, className = "", headerClass = "bg-[#121212]" }: { title?: React.ReactNode, children: React.ReactNode, className?: string, headerClass?: string }) => (
<div className={`bg-[#0D0D0D]/90 border border-neutral-800/80 rounded shadow-lg flex flex-col overflow-hidden relative transition-all duration-300 hover:border-[#00F2FF]/40 ${className}`}>
{/* Decorative micro LED accent on card edge */}
<div className="absolute top-0 left-0 right-0 h-[1px] bg-gradient-to-r from-transparent via-[#00F2FF]/20 to-transparent"></div>
{title && (
<div className={`${headerClass} px-3 py-1.5 border-b border-neutral-800/60 text-[10px] font-extrabold tracking-wider uppercase text-neutral-300 flex items-center justify-between`}>
@@ -79,6 +78,14 @@ export default function App() {
// Interactive Carbon Database Tab State
const [dbTab, setDbTab] = useState<'factors' | 'methodologies'>('factors');
// Architecture central hardware facet switcher
const [archFacet, setArchFacet] = useState<'top' | 'side' | 'iso'>('top');
const archFacetImages: Record<'top' | 'side' | 'iso', string> = {
top: oneossTopFacet,
side: oneossSideFacet,
iso: oneossBoxImage,
};
const themes = {
cyan: {
accent: '#00F2FF',
@@ -264,7 +271,7 @@ export default function App() {
className="grid grid-cols-1 xl:grid-cols-12 w-full max-w-[1920px] mx-auto min-h-full divide-y xl:divide-y-0 xl:divide-x divide-neutral-900 relative z-10"
>
{/* LEFT INTRODUCTORY PANEL (Bilingual, Rich Copy) */}
<div className="col-span-1 xl:col-span-6 flex flex-col justify-start gap-6 p-6 md:p-12 lg:p-16 bg-[#090909]/90 relative">
<div className="col-span-1 xl:col-span-6 flex flex-col justify-start gap-8 p-6 md:p-12 lg:p-16 bg-[#090909]/90 relative">
{/* Style Palette Mobile Hotbar */}
<div className="flex md:hidden items-center justify-between p-3 rounded bg-neutral-950/60 border border-neutral-900 mb-6">
@@ -285,7 +292,7 @@ export default function App() {
</div>
</div>
<div className="flex flex-col gap-6">
<div className="flex flex-col gap-8">
{/* Small tag */}
<div className="flex items-center gap-2">
<span className={`w-2 h-2 rounded-full ${activeTheme.bgAccent} shadow-[0_0_8px_${activeTheme.accent}] animate-pulse`} />
@@ -295,14 +302,14 @@ export default function App() {
</div>
{/* Title Matrix */}
<div className="space-y-2">
<h1 className="text-4xl md:text-5xl lg:text-6.5xl font-extrabold tracking-tight text-white leading-[1.1] font-sans">
<div className="space-y-3">
<h1 className="text-4xl md:text-5xl lg:text-6.5xl font-extrabold tracking-tight text-white leading-[1.15] font-sans">
AI Carbon Factor & <br />
<span className="font-light tracking-tight text-neutral-400">
Hydrogen Safety Box
</span>
</h1>
<div className="flex items-center gap-3 mt-1.5">
<div className="flex items-center gap-3">
<h2 className="text-xl md:text-3xl font-bold tracking-tight">
<span className={`font-semibold ${activeTheme.textAccent}`}>LNBox </span>
<span className="text-white font-medium">AI </span>
@@ -311,60 +318,60 @@ export default function App() {
</div>
{/* Copy Block in Chinese & English */}
<div className="space-y-4 max-w-xl text-neutral-400 text-sm leading-relaxed border-l-2 border-[#00F2FF]/40 pl-6 py-1">
<div className="space-y-4 max-w-xl text-neutral-400 text-sm leading-loose border-l-2 border-[#00F2FF]/40 pl-6 py-2">
<p className="font-sans font-light text-neutral-300">
LNBox OneOS AI 线 AI
</p>
</div>
{/* Feature Pillars Highlights (Bilingual) */}
<div className="grid grid-cols-1 md:grid-cols-2 gap-6 mt-6 border-t border-neutral-900 pt-8">
<div className="p-4 rounded bg-neutral-950/40 border border-neutral-900 relative overflow-hidden group hover:border-neutral-800 transition-all">
<div className="grid grid-cols-1 md:grid-cols-2 gap-5 border-t border-neutral-900 pt-8">
<div className="p-5 rounded bg-neutral-950/40 border border-neutral-900 relative overflow-hidden group hover:border-neutral-800 transition-all">
<div className="absolute top-0 left-0 w-1 h-full bg-cyan-500/20" />
<div className="flex items-center gap-3 mb-2">
<div className="p-1.5 rounded bg-cyan-950/30 text-cyan-400">
<div className="flex items-center gap-3 mb-3">
<div className="p-2 rounded bg-cyan-950/30 text-cyan-400">
<Cpu size={16} />
</div>
<span className="text-[12px] font-bold tracking-[0.1em] text-neutral-200">AI </span>
<span className="text-[13px] font-bold tracking-[0.08em] text-neutral-200">AI </span>
</div>
<p className="text-[11px] text-neutral-400 leading-normal mb-1">线</p>
<span className="text-[9px] font-mono text-neutral-500 block uppercase">AI CARBON FACTOR INFERENCE ENGINE</span>
<p className="text-[12px] text-neutral-400 leading-relaxed mb-2">线</p>
<span className="text-[9px] font-mono text-neutral-500 block uppercase tracking-wider">AI CARBON FACTOR INFERENCE ENGINE</span>
</div>
<div className="p-4 rounded bg-neutral-950/40 border border-neutral-900 relative overflow-hidden group hover:border-neutral-800 transition-all">
<div className="p-5 rounded bg-neutral-950/40 border border-neutral-900 relative overflow-hidden group hover:border-neutral-800 transition-all">
<div className="absolute top-0 left-0 w-1 h-full bg-emerald-500/20" />
<div className="flex items-center gap-3 mb-2">
<div className="p-1.5 rounded bg-emerald-950/30 text-emerald-400">
<div className="flex items-center gap-3 mb-3">
<div className="p-2 rounded bg-emerald-950/30 text-emerald-400">
<Leaf size={16} />
</div>
<span className="text-[12px] font-bold tracking-[0.1em] text-neutral-200"></span>
<span className="text-[13px] font-bold tracking-[0.08em] text-neutral-200"></span>
</div>
<p className="text-[11px] text-neutral-400 leading-normal mb-1">绿</p>
<span className="text-[9px] font-mono text-neutral-500 block uppercase">CARBON SINK ASSET RECOGNITION</span>
<p className="text-[12px] text-neutral-400 leading-relaxed mb-2">绿</p>
<span className="text-[9px] font-mono text-neutral-500 block uppercase tracking-wider">CARBON SINK ASSET RECOGNITION</span>
</div>
<div className="p-4 rounded bg-neutral-950/40 border border-neutral-900 relative overflow-hidden group hover:border-neutral-800 transition-all">
<div className="p-5 rounded bg-neutral-950/40 border border-neutral-900 relative overflow-hidden group hover:border-neutral-800 transition-all">
<div className="absolute top-0 left-0 w-1 h-full bg-amber-500/20" />
<div className="flex items-center gap-3 mb-2">
<div className="p-1.5 rounded bg-amber-950/30 text-amber-400">
<div className="flex items-center gap-3 mb-3">
<div className="p-2 rounded bg-amber-950/30 text-amber-400">
<Zap size={16} />
</div>
<span className="text-[12px] font-bold tracking-[0.1em] text-neutral-200"> AI </span>
<span className="text-[13px] font-bold tracking-[0.08em] text-neutral-200"> AI </span>
</div>
<p className="text-[11px] text-neutral-400 leading-normal mb-1">线 and </p>
<span className="text-[9px] font-mono text-neutral-500 block uppercase">AUTONOMOUS ENERGY AI DISPATCH</span>
<p className="text-[12px] text-neutral-400 leading-relaxed mb-2">线</p>
<span className="text-[9px] font-mono text-neutral-500 block uppercase tracking-wider">AUTONOMOUS ENERGY AI DISPATCH</span>
</div>
<div className="p-4 rounded bg-neutral-950/40 border border-neutral-900 relative overflow-hidden group hover:border-neutral-800 transition-all">
<div className="p-5 rounded bg-neutral-950/40 border border-neutral-900 relative overflow-hidden group hover:border-neutral-800 transition-all">
<div className="absolute top-0 left-0 w-1 h-full bg-[#00F2FF]/20" />
<div className="flex items-center gap-3 mb-2">
<div className="p-1.5 rounded bg-[#00F2FF]/10 text-[#00F2FF]">
<div className="flex items-center gap-3 mb-3">
<div className="p-2 rounded bg-[#00F2FF]/10 text-[#00F2FF]">
<ShieldCheck size={16} />
</div>
<span className="text-[12px] font-bold tracking-[0.1em] text-neutral-200"></span>
<span className="text-[13px] font-bold tracking-[0.08em] text-neutral-200"></span>
</div>
<p className="text-[11px] text-neutral-400 leading-normal mb-1"></p>
<span className="text-[9px] font-mono text-neutral-500 block uppercase">HYDROGEN SAFETY TELEMETRY NODE</span>
<p className="text-[12px] text-neutral-400 leading-relaxed mb-2"></p>
<span className="text-[9px] font-mono text-neutral-500 block uppercase tracking-wider">HYDROGEN SAFETY TELEMETRY NODE</span>
</div>
</div>
</div>
@@ -372,15 +379,15 @@ export default function App() {
{/* RIGHT DISPLAY PANEL (Pure Hardware Display with Holographic Scanning Top Plat Cover) */}
<div className="col-span-1 xl:col-span-6 flex flex-col justify-center items-center p-6 md:p-12 lg:p-16 bg-[#050505] relative overflow-hidden">
<div className="absolute top-6 right-6 flex items-center gap-2 px-3 py-1 bg-neutral-950 border border-neutral-900 rounded font-mono text-[9px] text-[#00F2FF]">
<div className="absolute top-6 right-6 flex items-center gap-2 px-3 py-1.5 bg-neutral-950 border border-neutral-900 rounded font-mono text-[9px] text-[#00F2FF]">
<span className="w-1.5 h-1.5 rounded-full bg-[#00F2FF] animate-ping" />
HEURISTIC ANALYTICS: ACTIVE SCANNING
</div>
<div className="w-full max-w-lg flex flex-col items-center">
<div className="text-center mb-6">
<span className="text-[9px] font-mono tracking-[0.3em] uppercase text-neutral-500">Holographic Deck Perspective</span>
<h3 className="text-xl font-bold tracking-widest text-[#FFF] uppercase mt-1">OneOS </h3>
<div className="text-center mb-8">
<span className="text-[10px] font-mono tracking-[0.3em] uppercase text-neutral-500">Holographic Deck Perspective</span>
<h3 className="text-xl font-bold tracking-widest text-[#FFF] uppercase mt-2">OneOS </h3>
</div>
<div className="relative w-full aspect-square max-h-[360px] md:max-h-[420px] group border border-neutral-800 bg-[#0E0E0E]/95 shadow-[0_0_50px_rgba(0,0,0,0.85)] rounded-2xl flex items-center justify-center overflow-hidden p-8">
@@ -440,17 +447,17 @@ export default function App() {
/>
{/* Status annotations overlaid inside card corner borders */}
<div className="absolute top-6 right-6 font-mono text-[7px] text-neutral-500 text-right z-10 flex flex-col gap-0.5 select-none">
<div className="absolute top-6 right-6 font-mono text-[8px] text-neutral-500 text-right z-10 flex flex-col gap-0.5 select-none">
<div className="text-[#00F2FF]">RADAR_SYS: LOCKED</div>
<div>FACET_REFR: 0X4FA3</div>
</div>
<div className="absolute bottom-6 left-6 font-mono text-[7px] text-neutral-500 z-10 select-none">
<div className="absolute bottom-6 left-6 font-mono text-[8px] text-neutral-500 z-10 select-none">
<div>SPECS: GLASS v5 PORT PANEL</div>
<div>SHIELDING: NANO-AEROGEL</div>
</div>
<div className="absolute bottom-6 right-6 font-mono text-[8px] text-neutral-500 text-right space-y-0.5 z-10">
<div className="absolute bottom-6 right-6 font-mono text-[9px] text-neutral-500 text-right space-y-0.5 z-10">
<div>MODEL_NO: LNBOX-TOP-V2</div>
<div className="text-emerald-400 font-bold">DECK_HOLOGRAPHIC: ACTIVE</div>
</div>
@@ -696,7 +703,7 @@ export default function App() {
<div className="grid grid-cols-1 lg:grid-cols-3 gap-2 items-stretch flex-1 z-10 min-h-0 min-w-0 py-1">
{/* Left Sub-column: Safety & Carbon */}
<div className="flex flex-col gap-2 h-full justify-between">
<div className="flex flex-col gap-2 h-full justify-between overflow-hidden">
<CompactArchCard title={<div className="flex items-center gap-1.5 text-red-400 font-extrabold"><ShieldAlert size={11} /><span></span></div>} className="flex-1">
<CompactArchList items={[
{ text: '泄漏监测', textEn: 'Liquid H2 gas leakage' },
@@ -718,15 +725,19 @@ export default function App() {
</div>
{/* Central Sub-column: Interactive Hardware Showcase */}
<div className="flex flex-col border border-neutral-800/80 rounded bg-[#070707] p-2 justify-between gap-2 overflow-hidden relative group">
<div className="flex flex-col border border-neutral-800/80 rounded bg-[#070707] p-2 justify-between gap-2 relative z-10 group">
{/* Interactive circuit-like subtle glow */}
<div className="absolute inset-x-0 top-0 h-[1px] bg-gradient-to-r from-transparent via-[#00F2FF]/40 to-transparent"></div>
<div className="relative w-full flex-1 border border-neutral-900 rounded bg-[#0A0A0A] p-2 flex flex-col items-center justify-center overflow-hidden min-h-[140px]">
<img
src={oneossTopFacet}
alt="OneOS AI Hardware cover plate"
className="w-full h-full max-h-[110px] object-contain opacity-95 brightness-[1.1] hover:scale-105 transition-all duration-300"
<motion.img
key={archFacet}
src={archFacetImages[archFacet]}
alt="OneOS AI Hardware"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
transition={{ duration: 0.25 }}
className="w-full h-full max-h-[110px] object-contain opacity-95 brightness-[1.1]"
referrerPolicy="no-referrer"
/>
@@ -740,21 +751,25 @@ export default function App() {
</div>
{/* Small operational thumbnails */}
<div className="grid grid-cols-3 gap-1 shrink-0">
<div className="border border-[#00F2FF]/40 rounded bg-[#101010] p-1 flex items-center justify-center h-[30px] overflow-hidden hover:border-[#00F2FF] transition-all cursor-pointer">
<img src={oneossTopFacet} alt="Top Facet" className="max-h-full max-w-full object-contain" referrerPolicy="no-referrer" />
</div>
<div className="border border-neutral-800 rounded bg-[#101010] p-1 flex items-center justify-center h-[30px] overflow-hidden hover:border-[#00F2FF]/50 transition-all cursor-pointer">
<img src={oneossSideFacet} alt="Side Facet" className="max-h-full max-w-full object-contain" referrerPolicy="no-referrer" />
</div>
<div className="border border-neutral-800 rounded bg-[#101010] p-1 flex items-center justify-center h-[30px] overflow-hidden hover:border-[#00F2FF]/50 transition-all cursor-pointer">
<img src={oneossBoxImage} alt="Full Box" className="max-h-full max-w-full object-contain" referrerPolicy="no-referrer" />
</div>
<div className="grid grid-cols-3 gap-1 shrink-0 relative z-20">
{([
{ id: 'top' as const, img: oneossTopFacet, label: 'Top' },
{ id: 'side' as const, img: oneossSideFacet, label: 'Side' },
{ id: 'iso' as const, img: oneossBoxImage, label: 'ISO' },
]).map((facet) => (
<button
key={facet.id}
onClick={() => setArchFacet(facet.id)}
className={`border rounded bg-[#101010] p-1 flex items-center justify-center h-[38px] transition-all cursor-pointer relative ${archFacet === facet.id ? 'border-[#00F2FF] ring-1 ring-[#00F2FF]/20' : 'border-neutral-800 hover:border-[#00F2FF]/50'}`}
>
<img src={facet.img} alt={facet.label} className="max-h-full max-w-full object-contain pointer-events-none" referrerPolicy="no-referrer" />
</button>
))}
</div>
</div>
{/* Right Sub-column: AI Analyzers & Device Management */}
<div className="flex flex-col gap-2 h-full justify-between">
<div className="flex flex-col gap-2 h-full justify-between overflow-hidden">
<CompactArchCard title={<div className="flex items-center gap-1.5 text-amber-400 font-extrabold"><Cpu size={11} /><span>AI分析决策模块</span></div>} className="flex-1">
<CompactArchList items={[
{ text: '数据分析', textEn: 'High freq operational analysis' },
@@ -777,8 +792,8 @@ export default function App() {
</div>
{/* Vertical flow connector pointing up from Data Security to Central Hardware (Modification 1) */}
<div className="flex lg:grid lg:grid-cols-3 shrink-0 h-4 lg:h-5 justify-center items-center relative select-none z-10 -my-1">
{/* Vertical flow connector pointing up from Data Security to Central Hardware */}
<div className="flex lg:grid lg:grid-cols-3 shrink-0 h-4 lg:h-5 justify-center items-center relative select-none z-10 -my-1 pointer-events-none">
<div className="hidden lg:block"></div> {/* Left empty */}
<div className="flex flex-col items-center justify-center text-[#00F2FF] animate-pulse">
{/* Arrowhead pointing UP */}
@@ -843,7 +858,7 @@ export default function App() {
</div>
<CompactArchCard title={<div className="flex items-center gap-1.5"><Cloud size={11} className="text-[#00F2FF]"/><span>OneOS AIoT </span></div>} className="flex-1">
{/* Futuristic Large Cloud core visualization panel (Modification 2) */}
{/* Futuristic Large Cloud core visualization panel */}
<div className="h-[120px] lg:h-[155px] w-full border border-cyan-500/20 bg-gradient-to-b from-[#080E16] to-[#040609] rounded-lg relative flex flex-col items-center justify-center mb-2.5 p-3 overflow-hidden group shadow-[inset_0_1px_12px_rgba(0,242,255,0.08)] shrink-0">
{/* Abstract grid matrix */}
<div className="absolute inset-0 opacity-[0.06] bg-[linear-gradient(to_right,#00F2FF_1px,transparent_1px),linear-gradient(to_bottom,#00F2FF_1px,transparent_1px)] bg-[size:10px_10px]" />
@@ -901,24 +916,21 @@ export default function App() {
<div className="text-[7.5px] font-mono text-neutral-500 uppercase">Operational Scenarios</div>
</div>
{/* Scenario 1: Fleet Operations (Modification 3) */}
{/* Scenario 1: Fleet Operations */}
<div className="bg-[#090909]/90 border border-neutral-800/80 rounded p-1.5 flex flex-col hover:border-[#00F2FF]/45 transition-all flex-1 justify-between min-h-0 overflow-hidden group">
<div className="flex items-center gap-1 pb-1 border-b border-neutral-900 shrink-0">
<div className="w-[15px] h-[15px] bg-cyan-950/45 border border-cyan-900/45 rounded flex items-center justify-center text-cyan-400">
<Truck size={9} />
</div>
<span className="text-[9px] font-extrabold text-neutral-200"></span>
<span className="text-[10px] font-extrabold text-neutral-200"></span>
<span className="text-[7px] font-mono text-neutral-500 ml-auto uppercase hidden lg:block">Fleet</span>
</div>
{/* Horizontal split body */}
<div className="flex flex-row items-center gap-1.5 flex-1 min-h-0 py-1">
{/* Left: Thumbnail */}
<div className="w-13 h-9 lg:w-[60px] lg:h-[42px] rounded border border-neutral-800 shrink-0 overflow-hidden relative shadow-md">
<img src={scenarioFleetImage} alt="Fleet" className="w-full h-full object-cover opacity-90 brightness-[1.05] group-hover:scale-105 transition-transform duration-300" referrerPolicy="no-referrer" />
<div className="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent pointer-events-none" />
</div>
{/* Right: Combined bullet checks */}
<div className="flex-1 flex flex-col justify-center gap-0.5 text-[8.5px] font-mono leading-tight pl-0.5 overflow-hidden">
<div className="flex-1 flex flex-col justify-center gap-0.5 text-[9px] leading-tight pl-0.5 overflow-hidden">
<div className="flex items-center gap-1 truncate">
<div className="w-[3px] h-[3px] rounded-full bg-[#00F2FF] shadow-[0_0_3px_#00F2FF] shrink-0" />
<span className="text-neutral-200 font-sans"> </span>
@@ -931,24 +943,21 @@ export default function App() {
</div>
</div>
{/* Scenario 2: Refueling Station Operations (Modification 3) */}
{/* Scenario 2: Refueling Station Operations */}
<div className="bg-[#090909]/90 border border-neutral-800/80 rounded p-1.5 flex flex-col hover:border-amber-400/45 transition-all flex-1 justify-between min-h-0 overflow-hidden group">
<div className="flex items-center gap-1 pb-1 border-b border-neutral-900 shrink-0">
<div className="w-[15px] h-[15px] bg-amber-950/45 border border-amber-900/45 rounded flex items-center justify-center text-amber-400">
<FactoryIcon size={9} />
</div>
<span className="text-[9px] font-extrabold text-neutral-200"></span>
<span className="text-[10px] font-extrabold text-neutral-200"></span>
<span className="text-[7px] font-mono text-neutral-500 ml-auto uppercase hidden lg:block">Station</span>
</div>
{/* Horizontal split body */}
<div className="flex flex-row items-center gap-1.5 flex-1 min-h-0 py-1">
{/* Left: Thumbnail */}
<div className="w-13 h-9 lg:w-[60px] lg:h-[42px] rounded border border-neutral-800 shrink-0 overflow-hidden relative shadow-md">
<img src={scenarioStationImage} alt="Station" className="w-full h-full object-cover opacity-90 brightness-[1.05] group-hover:scale-105 transition-transform duration-300" referrerPolicy="no-referrer" />
<div className="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent pointer-events-none" />
</div>
{/* Right: Combined bullet checks */}
<div className="flex-1 flex flex-col justify-center gap-0.5 text-[8.5px] font-mono leading-tight pl-0.5 overflow-hidden">
<div className="flex-1 flex flex-col justify-center gap-0.5 text-[9px] leading-tight pl-0.5 overflow-hidden">
<div className="flex items-center gap-1 truncate">
<div className="w-[3px] h-[3px] rounded-full bg-amber-400 shadow-[0_0_3px_#fbbf24] shrink-0" />
<span className="text-neutral-200 font-sans"> </span>
@@ -961,24 +970,21 @@ export default function App() {
</div>
</div>
{/* Scenario 3: Energy & Data Center Computes (Modification 3) */}
{/* Scenario 3: Energy & Data Center Computes */}
<div className="bg-[#090909]/90 border border-neutral-800/80 rounded p-1.5 flex flex-col hover:border-red-400/45 transition-all flex-1 justify-between min-h-0 overflow-hidden group">
<div className="flex items-center gap-1 pb-1 border-b border-neutral-900 shrink-0">
<div className="w-[15px] h-[15px] bg-red-950/45 border border-red-900/45 rounded flex items-center justify-center text-red-500">
<Server size={9} />
</div>
<span className="text-[9px] font-extrabold text-neutral-200">/</span>
<span className="text-[10px] font-extrabold text-neutral-200">/</span>
<span className="text-[7px] font-mono text-neutral-500 ml-auto uppercase hidden lg:block">Center</span>
</div>
{/* Horizontal split body */}
<div className="flex flex-row items-center gap-1.5 flex-1 min-h-0 py-1">
{/* Left: Thumbnail */}
<div className="w-13 h-9 lg:w-[60px] lg:h-[42px] rounded border border-neutral-800 shrink-0 overflow-hidden relative shadow-md">
<img src={scenarioDatacenterImage} alt="Data Center" className="w-full h-full object-cover opacity-90 brightness-[1.05] group-hover:scale-105 transition-transform duration-300" referrerPolicy="no-referrer" />
<div className="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent pointer-events-none" />
</div>
{/* Right: Combined bullet checks */}
<div className="flex-1 flex flex-col justify-center gap-0.5 text-[8.5px] font-mono leading-tight pl-0.5 overflow-hidden">
<div className="flex-1 flex flex-col justify-center gap-0.5 text-[9px] leading-tight pl-0.5 overflow-hidden">
<div className="flex items-center gap-1 truncate">
<div className="w-[3px] h-[3px] rounded-full bg-red-400 shadow-[0_0_3px_#f87171] shrink-0" />
<span className="text-neutral-200 font-sans"> </span>
@@ -994,7 +1000,7 @@ export default function App() {
</div>
{/* Bottom value matrix (价值输出层 中英双语 - Extremely Compact Layout for Full screen) */}
{/* Bottom value matrix (价值输出层 中英双语) */}
<div className="w-full bg-[#070707] border border-neutral-800/80 border-l-4 border-l-[#00F2FF] rounded shrink-0 relative overflow-hidden py-3 px-6 mt-4 flex items-center justify-between">
<div className="absolute inset-0 bg-gradient-to-r from-transparent via-[#00F2FF]/5 to-transparent pointer-events-none" />
@@ -1044,12 +1050,12 @@ export default function App() {
className="w-full h-full xl:max-h-[calc(100vh-140px)] flex flex-col items-center justify-start gap-4 p-3 md:p-5 lg:p-6 z-10 relative overflow-y-auto"
>
{/* Title Section */}
<div className="text-center mb-1 max-w-3xl px-4 flex-shrink-0">
<div className="inline-flex items-center gap-2 px-2.5 py-0.5 bg-[#121212]/80 border border-neutral-800 text-[9px] uppercase tracking-widest text-[#00F2FF] rounded font-mono mb-1.5">
<div className="text-center mb-3 max-w-3xl px-4 flex-shrink-0">
<div className="inline-flex items-center gap-2 px-3 py-1 bg-[#121212]/80 border border-neutral-800 text-[10px] uppercase tracking-widest text-[#00F2FF] rounded font-mono mb-2">
<span className="w-1.5 h-1.5 rounded-full bg-emerald-500 animate-ping mr-1"></span>
Real-time Industrial Telemetry & Carbon Sink Assurance Metrics
</div>
<h2 className="text-xl md:text-2xl font-light tracking-tight text-white mb-1">
<h2 className="text-xl md:text-2xl font-light tracking-tight text-white mb-1.5">
: <span className="font-extrabold text-[#00F2FF] tracking-wide"></span>
</h2>
<p className="text-[10px] font-mono text-neutral-500 uppercase tracking-widest">
@@ -1073,19 +1079,19 @@ export default function App() {
/>
<div className="absolute inset-0 bg-gradient-to-t from-black via-black/30 to-transparent pointer-events-none" />
<div className="absolute bottom-3 left-4 flex flex-col">
<span className="text-[9px] font-mono text-[#00F2FF] uppercase tracking-widest font-bold">SCENARIO 01 / COLD-CHAIN</span>
<span className="text-[10px] font-mono text-[#00F2FF] uppercase tracking-widest font-bold">SCENARIO 01 / COLD-CHAIN</span>
<span className="text-sm font-extrabold text-white mt-0.5"></span>
</div>
</div>
{/* Card Content */}
<div className="p-4 space-y-4">
<div className="space-y-1.5">
<div className="flex items-center gap-1.5 text-[11px] font-bold text-neutral-300">
<Cpu size={12} className="text-[#00F2FF]" />
<div className="p-5 space-y-4">
<div className="space-y-2">
<div className="flex items-center gap-2 text-[12px] font-bold text-neutral-300">
<Cpu size={13} className="text-[#00F2FF]" />
<span>LNBox </span>
</div>
<p className="text-xs text-neutral-400 bg-neutral-950 p-2.5 rounded border border-neutral-900 leading-relaxed">
<p className="text-xs text-neutral-400 bg-neutral-950 p-3 rounded border border-neutral-900 leading-relaxed">
<span className="text-white font-mono font-medium">85.3 km</span>
<span className="text-white font-mono font-medium">8.0 kg</span>
<span className="text-white font-mono font-medium">28.5 MPa</span>
@@ -1093,12 +1099,12 @@ export default function App() {
</p>
</div>
<div className="space-y-1.5">
<div className="flex items-center gap-1.5 text-[11px] font-bold text-[#00F2FF]">
<Workflow size={12} />
<div className="space-y-2">
<div className="flex items-center gap-2 text-[12px] font-bold text-[#00F2FF]">
<Workflow size={13} />
<span>OneOS </span>
</div>
<p className="text-xs text-neutral-400 bg-neutral-950 p-2.5 rounded border border-neutral-900 leading-relaxed">
<p className="text-xs text-neutral-400 bg-neutral-950 p-3 rounded border border-neutral-900 leading-relaxed">
<span className="text-emerald-400 font-mono font-bold">3.0927 kgCO2/kg </span>
<span className="text-emerald-400 font-mono font-bold">24.74 kgCO2e</span>
OneOS 绿
@@ -1108,7 +1114,7 @@ export default function App() {
</div>
{/* Indicators Table */}
<div className="p-4 bg-neutral-950/80 border-t border-neutral-900 grid grid-cols-2 gap-2 mt-2 shrink-0 rounded-b-xl">
<div className="p-4 bg-neutral-950/80 border-t border-neutral-900 grid grid-cols-2 gap-2.5 shrink-0 rounded-b-xl">
{[
{
labelCn: '氢消耗碳因子',
@@ -1139,27 +1145,27 @@ export default function App() {
tooltip: '当前已由OneOS平台引擎完成设备端高可信原始核算、哈希闭环与存证落底配有标准化区块链对外接口支持对公信减排平台的无缝扩展对接。'
},
].map((m, i) => (
<div key={i} className="relative group/indicator bg-neutral-900/60 p-2 rounded border border-neutral-900/40 flex flex-col justify-center text-left cursor-help hover:bg-neutral-900/90 hover:border-[#00F2FF]/40 transition-all duration-200">
<span className="text-[10px] font-bold text-neutral-300 tracking-wide flex items-center gap-1 select-none">
<div key={i} className="relative group/indicator bg-neutral-900/60 p-2.5 rounded border border-neutral-900/40 flex flex-col justify-center text-left cursor-help hover:bg-neutral-900/90 hover:border-[#00F2FF]/40 transition-all duration-200">
<span className="text-[11px] font-bold text-neutral-300 tracking-wide flex items-center gap-1 select-none">
{m.labelCn}
<span className="text-[8px] text-neutral-500 font-mono"></span>
</span>
<span className="text-[7px] font-mono text-neutral-500 uppercase tracking-wider">{m.labelEn}</span>
<span className="text-xs font-mono font-extrabold text-[#00F2FF] mt-0.5">{m.value}</span>
<span className="text-[8px] font-mono text-neutral-500 uppercase tracking-wider mt-0.5">{m.labelEn}</span>
<span className="text-xs font-mono font-extrabold text-[#00F2FF] mt-1">{m.value}</span>
{/* Interactive Tooltip Card */}
<div className="absolute bottom-[105%] left-1/2 -translate-x-1/2 w-64 p-3 bg-neutral-950 border border-neutral-800 rounded-lg shadow-2xl opacity-0 pointer-events-none group-hover/indicator:opacity-100 group-hover/indicator:pointer-events-auto transition-all duration-300 z-50 text-[10px] text-neutral-300 space-y-1.5 leading-normal">
<div className="flex items-center justify-between border-b border-neutral-800 pb-1 font-sans font-bold text-white text-[11px]">
<div className="absolute bottom-[105%] left-1/2 -translate-x-1/2 w-64 p-3 bg-neutral-950 border border-neutral-800 rounded-lg shadow-2xl opacity-0 pointer-events-none group-hover/indicator:opacity-100 group-hover/indicator:pointer-events-auto transition-all duration-300 z-50 text-[10px] text-neutral-300 space-y-2 leading-normal">
<div className="flex items-center justify-between border-b border-neutral-800 pb-1.5 font-sans font-bold text-white text-[11px]">
<span>{m.labelCn} · </span>
<span className="text-[7px] font-mono text-neutral-500">{m.labelEn}</span>
<span className="text-[8px] font-mono text-neutral-500">{m.labelEn}</span>
</div>
<div>
<span className="text-[9px] font-mono font-bold text-emerald-400 block pb-0.5">/</span>
<code className="block bg-neutral-950 p-1.5 rounded font-mono text-[8px] text-[#00F2FF] break-all border border-neutral-900">{m.formula}</code>
<code className="block bg-neutral-950 p-1.5 rounded font-mono text-[9px] text-[#00F2FF] break-all border border-neutral-900">{m.formula}</code>
</div>
<div>
<span className="text-[9px] font-sans font-bold text-neutral-400 block pb-0.5"></span>
<p className="text-neutral-400 text-[9.5px] leading-relaxed font-sans">{m.tooltip}</p>
<p className="text-neutral-400 text-[10px] leading-relaxed font-sans">{m.tooltip}</p>
</div>
{/* Triangle Arrow */}
<div className="absolute top-full left-1/2 -translate-x-1/2 -mt-[1px] w-0 h-0 border-x-4 border-x-transparent border-t-4 border-t-neutral-950" />
@@ -1183,19 +1189,19 @@ export default function App() {
/>
<div className="absolute inset-0 bg-gradient-to-t from-black via-black/30 to-transparent pointer-events-none" />
<div className="absolute bottom-3 left-4 flex flex-col">
<span className="text-[9px] font-mono text-amber-400 uppercase tracking-widest font-bold">SCENARIO 02 / HYDROGEN DISPATCH</span>
<span className="text-[10px] font-mono text-amber-400 uppercase tracking-widest font-bold">SCENARIO 02 / HYDROGEN DISPATCH</span>
<span className="text-sm font-extrabold text-white mt-0.5"></span>
</div>
</div>
{/* Card Content */}
<div className="p-4 space-y-4">
<div className="space-y-1.5">
<div className="flex items-center gap-1.5 text-[11px] font-bold text-neutral-300">
<Cpu size={12} className="text-[#00F2FF]" />
<div className="p-5 space-y-4">
<div className="space-y-2">
<div className="flex items-center gap-2 text-[12px] font-bold text-neutral-300">
<Cpu size={13} className="text-[#00F2FF]" />
<span>LNBox </span>
</div>
<p className="text-xs text-neutral-400 bg-neutral-950 p-2.5 rounded border border-neutral-900 leading-relaxed">
<p className="text-xs text-neutral-400 bg-neutral-950 p-3 rounded border border-neutral-900 leading-relaxed">
SOC量
<span className="text-white font-mono font-medium">2.4 MPa</span>
<span className="text-white font-mono font-medium">168 km</span>
@@ -1203,12 +1209,12 @@ export default function App() {
</p>
</div>
<div className="space-y-1.5">
<div className="flex items-center gap-1.5 text-[11px] font-bold text-amber-400">
<Workflow size={12} />
<div className="space-y-2">
<div className="flex items-center gap-2 text-[12px] font-bold text-amber-400">
<Workflow size={13} />
<span>OneOS AI </span>
</div>
<p className="text-xs text-neutral-400 bg-neutral-950 p-2.5 rounded border border-neutral-900 leading-relaxed text-left">
<p className="text-xs text-neutral-400 bg-neutral-950 p-3 rounded border border-neutral-900 leading-relaxed text-left">
<span className="text-amber-400 font-mono font-bold">S2 </span>
<span className="text-amber-400 font-mono font-bold">13km/20</span>
<span className="text-amber-400 font-mono font-bold">P2 ()</span>
@@ -1219,7 +1225,7 @@ export default function App() {
</div>
{/* Indicators Table */}
<div className="p-4 bg-neutral-950/80 border-t border-neutral-900 grid grid-cols-2 gap-2 mt-2 shrink-0 rounded-b-xl">
<div className="p-4 bg-neutral-950/80 border-t border-neutral-900 grid grid-cols-2 gap-2.5 shrink-0 rounded-b-xl">
{[
{
labelCn: '当前剩余续航',
@@ -1250,27 +1256,27 @@ export default function App() {
tooltip: '安全等级触发阀值器。由于氢气瓶残压极低、在保供城配干线段可能发生抛锚,云端算法自动将任务补能调优级提升至 P2 (高级),以自动调度资源保障车辆补能。'
},
].map((m, i) => (
<div key={i} className="relative group/indicator bg-neutral-900/60 p-2 rounded border border-neutral-900/40 flex flex-col justify-center text-left cursor-help hover:bg-neutral-900/90 hover:border-amber-400/40 transition-all duration-200">
<span className="text-[10px] font-bold text-neutral-300 tracking-wide flex items-center gap-1 select-none">
<div key={i} className="relative group/indicator bg-neutral-900/60 p-2.5 rounded border border-neutral-900/40 flex flex-col justify-center text-left cursor-help hover:bg-neutral-900/90 hover:border-amber-400/40 transition-all duration-200">
<span className="text-[11px] font-bold text-neutral-300 tracking-wide flex items-center gap-1 select-none">
{m.labelCn}
<span className="text-[8px] text-neutral-500 font-mono"></span>
</span>
<span className="text-[7px] font-mono text-neutral-500 uppercase tracking-wider">{m.labelEn}</span>
<span className="text-xs font-mono font-extrabold text-amber-400 mt-0.5">{m.value}</span>
<span className="text-[8px] font-mono text-neutral-500 uppercase tracking-wider mt-0.5">{m.labelEn}</span>
<span className="text-xs font-mono font-extrabold text-amber-400 mt-1">{m.value}</span>
{/* Interactive Tooltip Card */}
<div className="absolute bottom-[105%] left-1/2 -translate-x-1/2 w-64 p-3 bg-neutral-950 border border-neutral-800 rounded-lg shadow-2xl opacity-0 pointer-events-none group-hover/indicator:opacity-100 group-hover/indicator:pointer-events-auto transition-all duration-300 z-50 text-[10px] text-neutral-300 space-y-1.5 leading-normal">
<div className="flex items-center justify-between border-b border-neutral-800 pb-1 font-sans font-bold text-white text-[11px]">
<div className="absolute bottom-[105%] left-1/2 -translate-x-1/2 w-64 p-3 bg-neutral-950 border border-neutral-800 rounded-lg shadow-2xl opacity-0 pointer-events-none group-hover/indicator:opacity-100 group-hover/indicator:pointer-events-auto transition-all duration-300 z-50 text-[10px] text-neutral-300 space-y-2 leading-normal">
<div className="flex items-center justify-between border-b border-neutral-800 pb-1.5 font-sans font-bold text-white text-[11px]">
<span>{m.labelCn} · </span>
<span className="text-[7px] font-mono text-neutral-500">{m.labelEn}</span>
<span className="text-[8px] font-mono text-neutral-500">{m.labelEn}</span>
</div>
<div>
<span className="text-[9px] font-mono font-bold text-emerald-400 block pb-0.5">/</span>
<code className="block bg-neutral-950 p-1.5 rounded font-mono text-[8px] text-amber-400 break-all border border-neutral-900">{m.formula}</code>
<code className="block bg-neutral-950 p-1.5 rounded font-mono text-[9px] text-amber-400 break-all border border-neutral-900">{m.formula}</code>
</div>
<div>
<span className="text-[9px] font-sans font-bold text-neutral-400 block pb-0.5"></span>
<p className="text-neutral-400 text-[9.5px] leading-relaxed font-sans">{m.tooltip}</p>
<p className="text-neutral-400 text-[10px] leading-relaxed font-sans">{m.tooltip}</p>
</div>
{/* Triangle Arrow */}
<div className="absolute top-full left-1/2 -translate-x-1/2 -mt-[1px] w-0 h-0 border-x-4 border-x-transparent border-t-4 border-t-neutral-950" />
@@ -1294,31 +1300,31 @@ export default function App() {
/>
<div className="absolute inset-0 bg-gradient-to-t from-black via-black/30 to-transparent pointer-events-none" />
<div className="absolute bottom-3 left-4 flex flex-col">
<span className="text-[9px] font-mono text-red-400 tracking-widest font-bold">SCENARIO 03 / ESG TRUST</span>
<span className="text-[10px] font-mono text-red-400 tracking-widest font-bold">SCENARIO 03 / ESG TRUST</span>
<span className="text-sm font-extrabold text-white mt-0.5"></span>
</div>
</div>
{/* Card Content */}
<div className="p-4 space-y-4">
<div className="space-y-1.5">
<div className="flex items-center gap-1.5 text-[11px] font-bold text-neutral-300">
<Cpu size={12} className="text-[#00F2FF]" />
<div className="p-5 space-y-4">
<div className="space-y-2">
<div className="flex items-center gap-2 text-[12px] font-bold text-neutral-300">
<Cpu size={13} className="text-[#00F2FF]" />
<span>LNBox </span>
</div>
<p className="text-xs text-neutral-400 bg-neutral-950 p-2.5 rounded border border-neutral-900 leading-relaxed">
<p className="text-xs text-neutral-400 bg-neutral-950 p-3 rounded border border-neutral-900 leading-relaxed">
Box ID ID
</p>
</div>
<div className="space-y-1.5">
<div className="flex items-center gap-1.5 text-[11px] font-bold text-red-400">
<Workflow size={12} />
<div className="space-y-2">
<div className="flex items-center gap-2 text-[12px] font-bold text-red-400">
<Workflow size={13} />
<span>OneOS AI </span>
</div>
<p className="text-xs text-neutral-400 bg-neutral-950 p-2.5 rounded border border-neutral-900 leading-relaxed">
<p className="text-xs text-neutral-400 bg-neutral-950 p-3 rounded border border-neutral-900 leading-relaxed">
绿 <span className="text-red-400 font-mono font-bold">Ledger-0602-001</span>
ESG
</p>
@@ -1327,7 +1333,7 @@ export default function App() {
</div>
{/* Indicators Table */}
<div className="p-4 bg-neutral-950/80 border-t border-neutral-900 grid grid-cols-2 gap-2 mt-2 shrink-0 rounded-b-xl">
<div className="p-4 bg-neutral-950/80 border-t border-neutral-900 grid grid-cols-2 gap-2.5 shrink-0 rounded-b-xl">
{[
{
labelCn: 'ESG信披凭证',
@@ -1358,27 +1364,27 @@ export default function App() {
tooltip: 'OneOS 平台对车端里程、能耗数据完成了高可信原始核算与智能签名闭环符合国际ESG公信框架支持零改动弹性平移至多方碳普惠联盟。'
},
].map((m, i) => (
<div key={i} className="relative group/indicator bg-neutral-900/60 p-2 rounded border border-neutral-900/40 flex flex-col justify-center text-left cursor-help hover:bg-neutral-900/90 hover:border-red-400/40 transition-all duration-200">
<span className="text-[10px] font-bold text-neutral-300 tracking-wide flex items-center gap-1 select-none">
<div key={i} className="relative group/indicator bg-neutral-900/60 p-2.5 rounded border border-neutral-900/40 flex flex-col justify-center text-left cursor-help hover:bg-neutral-900/90 hover:border-red-400/40 transition-all duration-200">
<span className="text-[11px] font-bold text-neutral-300 tracking-wide flex items-center gap-1 select-none">
{m.labelCn}
<span className="text-[8px] text-neutral-500 font-mono"></span>
</span>
<span className="text-[7px] font-mono text-neutral-500 uppercase tracking-wider">{m.labelEn}</span>
<span className="text-xs font-mono font-extrabold text-red-400 mt-0.5">{m.value}</span>
<span className="text-[8px] font-mono text-neutral-500 uppercase tracking-wider mt-0.5">{m.labelEn}</span>
<span className="text-xs font-mono font-extrabold text-red-400 mt-1">{m.value}</span>
{/* Interactive Tooltip Card */}
<div className="absolute bottom-[105%] left-1/2 -translate-x-1/2 w-64 p-3 bg-neutral-950 border border-neutral-800 rounded-lg shadow-2xl opacity-0 pointer-events-none group-hover/indicator:opacity-100 group-hover/indicator:pointer-events-auto transition-all duration-300 z-50 text-[10px] text-neutral-300 space-y-1.5 leading-normal">
<div className="flex items-center justify-between border-b border-neutral-800 pb-1 font-sans font-bold text-white text-[11px]">
<div className="absolute bottom-[105%] left-1/2 -translate-x-1/2 w-64 p-3 bg-neutral-950 border border-neutral-800 rounded-lg shadow-2xl opacity-0 pointer-events-none group-hover/indicator:opacity-100 group-hover/indicator:pointer-events-auto transition-all duration-300 z-50 text-[10px] text-neutral-300 space-y-2 leading-normal">
<div className="flex items-center justify-between border-b border-neutral-800 pb-1.5 font-sans font-bold text-white text-[11px]">
<span>{m.labelCn} · </span>
<span className="text-[7px] font-mono text-neutral-500">{m.labelEn}</span>
<span className="text-[8px] font-mono text-neutral-500">{m.labelEn}</span>
</div>
<div>
<span className="text-[9px] font-mono font-bold text-emerald-400 block pb-0.5">/</span>
<code className="block bg-neutral-950 p-1.5 rounded font-mono text-[8px] text-red-400 break-all border border-neutral-900">{m.formula}</code>
<code className="block bg-neutral-950 p-1.5 rounded font-mono text-[9px] text-red-400 break-all border border-neutral-900">{m.formula}</code>
</div>
<div>
<span className="text-[9px] font-sans font-bold text-neutral-400 block pb-0.5"></span>
<p className="text-neutral-400 text-[9.5px] leading-relaxed font-sans">{m.tooltip}</p>
<p className="text-neutral-400 text-[10px] leading-relaxed font-sans">{m.tooltip}</p>
</div>
{/* Triangle Arrow */}
<div className="absolute top-full left-1/2 -translate-x-1/2 -mt-[1px] w-0 h-0 border-x-4 border-x-transparent border-t-4 border-t-neutral-950" />
@@ -1392,11 +1398,11 @@ export default function App() {
</div>
{/* Linear Flowchart Diagram */}
<div className="w-full max-w-[1780px] bg-[#070707] border border-neutral-800 rounded-xl relative overflow-hidden py-5 px-6 shrink-0 mt-5 shadow-inner">
<div className="w-full max-w-[1780px] bg-[#070707] border border-neutral-800 rounded-xl relative overflow-hidden py-6 px-6 shrink-0 mt-5 shadow-inner">
<div className="absolute top-0 left-0 w-full h-[1px] bg-gradient-to-r from-transparent via-[#00F2FF]/20 to-transparent" />
<div className="text-center md:text-left mb-5">
<span className="text-[8px] font-mono tracking-[0.2em] text-[#00F2FF] uppercase font-bold">End-to-End Pipeline</span>
<h3 className="text-sm font-bold text-white tracking-wider mt-0.5">绿</h3>
<div className="text-center md:text-left mb-6">
<span className="text-[9px] font-mono tracking-[0.2em] text-[#00F2FF] uppercase font-bold">End-to-End Pipeline</span>
<h3 className="text-sm font-bold text-white tracking-wider mt-1">绿</h3>
</div>
<div className="grid grid-cols-1 md:grid-cols-5 gap-4 items-stretch relative">
@@ -1407,14 +1413,14 @@ export default function App() {
{ step: '04', title: '碳资产认证与存证', desc: '核算双碳替代量并生成可信存证自动录入ESG系统。' },
{ step: '05', title: '数据智能闭环决策', desc: '输出车辆余氢续航预测、加氢站低成本补能路线推荐,完成闭环。' }
].map((step, idx) => (
<div key={idx} className="flex flex-col justify-between p-3 bg-neutral-950 rounded border border-neutral-900/60 relative group hover:border-[#00F2FF]/30 transition-all">
<div key={idx} className="flex flex-col justify-between p-3.5 bg-neutral-950 rounded border border-neutral-900/60 relative group hover:border-[#00F2FF]/30 transition-all">
<div>
<div className="flex items-center justify-between border-b border-neutral-900 pb-1.5">
<span className="text-[10px] font-mono text-[#00F2FF] font-bold">STEP {step.step}</span>
<span className="text-[7.5px] font-mono text-neutral-600 font-bold uppercase">SECURED</span>
<div className="flex items-center justify-between border-b border-neutral-900 pb-2">
<span className="text-[11px] font-mono text-[#00F2FF] font-bold">STEP {step.step}</span>
<span className="text-[8px] font-mono text-neutral-600 font-bold uppercase">SECURED</span>
</div>
<h4 className="text-[11px] font-bold text-neutral-200 mt-2">{step.title}</h4>
<p className="text-[10px] text-neutral-500 mt-1 leading-normal">{step.desc}</p>
<h4 className="text-[12px] font-bold text-neutral-200 mt-2.5">{step.title}</h4>
<p className="text-[11px] text-neutral-500 mt-1.5 leading-relaxed">{step.desc}</p>
</div>
{/* Connection Chevron for Desktop (don't show on last item) */}
@@ -1428,19 +1434,19 @@ export default function App() {
</div>
</div>
{/* Carbon Factors & Methodology Database (Injected for realistic data reference) */}
<div className="w-full max-w-[1780px] bg-[#070707] border border-neutral-800 rounded-xl relative overflow-hidden p-5 shrink-0 mt-5 shadow-2xl text-left">
{/* Carbon Factors & Methodology Database */}
<div className="w-full max-w-[1780px] bg-[#070707] border border-neutral-800 rounded-xl relative overflow-hidden p-6 shrink-0 mt-5 shadow-2xl text-left">
<div className="absolute top-0 left-0 w-full h-[1px] bg-gradient-to-r from-transparent via-[#00F2FF]/30 to-transparent" />
{/* Header of the console */}
<div className="flex flex-col lg:flex-row items-start lg:items-center justify-between gap-4 border-b border-neutral-900 pb-4 mb-4">
<div className="space-y-0.5">
<div className="flex flex-col lg:flex-row items-start lg:items-center justify-between gap-4 border-b border-neutral-900 pb-5 mb-5">
<div className="space-y-1">
<div className="flex items-center gap-2">
<span className="w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse" />
<span className="text-[10px] font-mono tracking-[0.2em] text-emerald-400 uppercase font-bold">LOCAL ACCOUNTING MATRIX</span>
</div>
<h3 className="text-sm font-extrabold text-white tracking-wider">OneOS </h3>
<p className="text-[10px] text-neutral-500 font-sans">
<p className="text-[11px] text-neutral-500 font-sans leading-relaxed">
</p>
</div>
@@ -1449,13 +1455,13 @@ export default function App() {
<div className="flex gap-2 bg-neutral-950 p-[3px] border border-neutral-900 rounded select-none">
<button
onClick={() => setDbTab('factors')}
className={`px-3 py-1.5 rounded text-[10px] font-bold tracking-wider transition-all duration-200 ${dbTab === 'factors' ? 'bg-[#111] text-[#00F2FF] border border-neutral-800/60 shadow' : 'text-neutral-500 hover:text-neutral-300'}`}
className={`px-3 py-1.5 rounded text-[11px] font-bold tracking-wider transition-all duration-200 ${dbTab === 'factors' ? 'bg-[#111] text-[#00F2FF] border border-neutral-800/60 shadow' : 'text-neutral-500 hover:text-neutral-300'}`}
>
</button>
<button
onClick={() => setDbTab('methodologies')}
className={`px-3 py-1.5 rounded text-[10px] font-bold tracking-wider transition-all duration-200 ${dbTab === 'methodologies' ? 'bg-[#111] text-[#00F2FF] border border-neutral-800/60 shadow' : 'text-neutral-500 hover:text-neutral-300'}`}
className={`px-3 py-1.5 rounded text-[11px] font-bold tracking-wider transition-all duration-200 ${dbTab === 'methodologies' ? 'bg-[#111] text-[#00F2FF] border border-neutral-800/60 shadow' : 'text-neutral-500 hover:text-neutral-300'}`}
>
</button>
@@ -1464,27 +1470,27 @@ export default function App() {
{dbTab === 'factors' ? (
<div className="space-y-4">
{/* Database Table Warning Banner */}
<div className="bg-[#0b0c0d] border border-neutral-800 rounded p-3 text-[10px] text-neutral-300 flex items-start gap-2 leading-relaxed font-sans">
{/* Database Table Info Banner */}
<div className="bg-[#0b0c0d] border border-neutral-800 rounded p-3.5 text-[11px] text-neutral-300 flex items-start gap-3 leading-relaxed font-sans">
<span className="text-[#00F2FF] text-xs mt-0.5"></span>
<div>
<strong className="text-neutral-200 font-bold block pb-0.5"></strong>
<strong className="text-neutral-200 font-bold block pb-1"></strong>
广
</div>
</div>
{/* Factor Table */}
<div className="overflow-x-auto border border-neutral-900 rounded-lg bg-neutral-950/40">
<table className="w-full text-left border-collapse text-[11px] font-sans">
<table className="w-full text-left border-collapse text-[12px] font-sans">
<thead>
<tr className="border-b border-neutral-900 bg-neutral-950/80 text-neutral-400 font-bold">
<th className="p-2.5">/</th>
<th className="p-2.5"></th>
<th className="p-2.5"></th>
<th className="p-2.5"></th>
<th className="p-2.5"></th>
<th className="p-2.5 text-right">/</th>
<th className="p-2.5 text-right"></th>
<th className="p-3">/</th>
<th className="p-3"></th>
<th className="p-3"></th>
<th className="p-3"></th>
<th className="p-3"></th>
<th className="p-3 text-right">/</th>
<th className="p-3 text-right"></th>
</tr>
</thead>
<tbody className="divide-y divide-neutral-900/60 font-mono text-neutral-300">
@@ -1499,16 +1505,16 @@ export default function App() {
{ city: '北京市', type: '氢能储配 (车端)', fuel: '氢气 (OneOS 场景)', model: '4.5吨轻型冷链车', formula: '消耗氢气量(kg) × 3.0927', em: '6.6610 kgCO2/100km', status: '本地已核证 (待上链)' },
].map((row, i) => (
<tr key={i} className="hover:bg-neutral-900/40 transition-colors">
<td className="p-2.5 font-sans font-medium text-neutral-300">{row.city}</td>
<td className="p-2.5 font-sans text-neutral-400">{row.type}</td>
<td className={`p-2.5 font-sans text-[11px] font-bold ${row.fuel.includes('氢气') ? 'text-emerald-400' : 'text-amber-500/80'}`}>{row.fuel}</td>
<td className="p-2.5 text-neutral-300 font-sans">{row.model}</td>
<td className="p-2.5 text-neutral-400 text-[10px] break-all max-w-[280px]">
<code className="bg-neutral-950/80 px-1.5 py-0.5 rounded text-neutral-200 border border-neutral-900/50">{row.formula}</code>
<td className="p-3 font-sans font-medium text-neutral-300">{row.city}</td>
<td className="p-3 font-sans text-neutral-400">{row.type}</td>
<td className={`p-3 font-sans text-[12px] font-bold ${row.fuel.includes('氢气') ? 'text-emerald-400' : 'text-amber-500/80'}`}>{row.fuel}</td>
<td className="p-3 text-neutral-300 font-sans">{row.model}</td>
<td className="p-3 text-neutral-400 text-[11px] break-all max-w-[280px]">
<code className="bg-neutral-950/80 px-1.5 py-1 rounded text-neutral-200 border border-neutral-900/50">{row.formula}</code>
</td>
<td className="p-2.5 text-right font-bold text-[#00F2FF]">{row.em}</td>
<td className="p-2.5 text-right font-sans">
<span className={`px-1.5 py-0.5 rounded text-[8.5px] font-bold ${row.status.includes('核证') ? 'bg-emerald-950/30 text-emerald-400 border border-emerald-900/30' : 'bg-neutral-900 text-neutral-500'}`}>
<td className="p-3 text-right font-bold text-[#00F2FF]">{row.em}</td>
<td className="p-3 text-right font-sans">
<span className={`px-2 py-1 rounded text-[9px] font-bold ${row.status.includes('核证') ? 'bg-emerald-950/30 text-emerald-400 border border-emerald-900/30' : 'bg-neutral-900 text-neutral-500'}`}>
{row.status}
</span>
</td>
@@ -1520,26 +1526,26 @@ export default function App() {
</div>
) : (
<div className="space-y-4">
{/* Database Table Warning Banner */}
<div className="bg-[#0b0c0d] border border-neutral-800 rounded p-3 text-[10px] text-neutral-400 flex items-start gap-2 leading-relaxed font-sans">
{/* Database Table Info Banner */}
<div className="bg-[#0b0c0d] border border-neutral-800 rounded p-3.5 text-[11px] text-neutral-400 flex items-start gap-3 leading-relaxed font-sans">
<span className="text-[#00F2FF] text-xs mt-0.5"></span>
<div>
<strong className="text-white font-bold block pb-0.5"></strong>
<strong className="text-white font-bold block pb-1"></strong>
OneOS
</div>
</div>
{/* Methodology Table */}
<div className="overflow-x-auto border border-neutral-900 rounded-lg bg-neutral-950/40 font-mono">
<table className="w-full text-left border-collapse text-[11px] font-sans">
<table className="w-full text-left border-collapse text-[12px] font-sans">
<thead>
<tr className="border-b border-neutral-900 bg-neutral-950/80 text-neutral-400 font-bold font-sans">
<th className="p-2.5"></th>
<th className="p-2.5">/</th>
<th className="p-2.5">/</th>
<th className="p-2.5"></th>
<th className="p-2.5">/</th>
<th className="p-2.5 text-right">OneOS </th>
<th className="p-3"></th>
<th className="p-3">/</th>
<th className="p-3">/</th>
<th className="p-3"></th>
<th className="p-3">/</th>
<th className="p-3 text-right">OneOS </th>
</tr>
</thead>
<tbody className="divide-y divide-neutral-900/60 font-mono text-neutral-300">
@@ -1549,12 +1555,12 @@ export default function App() {
{ region: '广东省广州市', name: '《广州市氢燃料电池汽车行驶碳普惠方法学(2024试行版)》', org: '广州市生态环境局', date: '2024-11-20', scope: '冷链城配载客载货车, 环卫作业车辆', calc: '广州绿色行驶替代系数核定' },
].map((row, i) => (
<tr key={i} className="hover:bg-neutral-900/40 transition-colors">
<td className="p-2.5 font-sans font-medium text-neutral-300">{row.region}</td>
<td className="p-2.5 font-sans text-neutral-200 font-bold leading-normal max-w-[280px] text-[10.5px]">{row.name}</td>
<td className="p-2.5 font-sans text-neutral-400">{row.org}</td>
<td className="p-2.5 text-neutral-400">{row.date}</td>
<td className="p-2.5 text-neutral-400 font-sans">{row.scope}</td>
<td className="p-2.5 text-right font-bold text-emerald-400 font-sans">{row.calc}</td>
<td className="p-3 font-sans font-medium text-neutral-300">{row.region}</td>
<td className="p-3 font-sans text-neutral-200 font-bold leading-normal max-w-[280px] text-[11px]">{row.name}</td>
<td className="p-3 font-sans text-neutral-400">{row.org}</td>
<td className="p-3 text-neutral-400">{row.date}</td>
<td className="p-3 text-neutral-400 font-sans">{row.scope}</td>
<td className="p-3 text-right font-bold text-emerald-400 font-sans">{row.calc}</td>
</tr>
))}
</tbody>

View File

@@ -5,6 +5,7 @@ import {defineConfig} from 'vite';
export default defineConfig(() => {
return {
base: '/lnbox/',
plugins: [react(), tailwindcss()],
resolve: {
alias: {