This commit is contained in:
ljy
2026-08-11 01:34:54 +08:00
parent 738f00d442
commit eba21aedf9
133 changed files with 15595 additions and 21 deletions
+468
View File
@@ -0,0 +1,468 @@
import { Link, Outlet, useLocation } from 'react-router-dom'
import {
brand,
contact,
haoke,
hero,
images,
partner,
poetry,
qingxiang,
subsidy,
system,
tech,
techDetail,
} from '../content/site'
import './MobileViews.css'
export function MobileViews() {
const location = useLocation()
const path = location.pathname
switch (path) {
case '/':
return <MobileHomeView />
case '/brand':
return <MobileBrandView />
case '/poetry':
return <MobilePoetryView />
case '/qingxiang':
return <MobileQingxiangView />
case '/haoke':
return <MobileHaokeView />
case '/system':
return <MobileSystemView />
case '/tech':
return <MobileTechView />
case '/subsidy':
return <MobileSubsidyView />
case '/partner':
return <MobilePartnerView />
case '/tech-detail':
return <MobileTechDetailView />
case '/contact':
return <MobileContactView />
default:
return <Outlet />
}
}
/* 1. Mobile Home View */
function MobileHomeView() {
return (
<div className="m-view-container">
<div className="m-hero">
<div className="m-hero-sub">{hero.subBrand} · </div>
<h1 className="m-hero-title">{hero.brand}</h1>
<p style={{ fontSize: '1.05rem', color: 'var(--gold)', fontFamily: 'Noto Serif SC', margin: 0 }}>
{hero.title}
</p>
<img src={images.t30} alt="酒祖杜康 T30" className="m-hero-img" />
<p className="m-lead" style={{ textAlign: 'center' }}>
{hero.subtitle}
</p>
<div style={{ display: 'flex', gap: '0.75rem', justifyContent: 'center' }}>
<Link to="/brand" className="m-btn m-btn-primary">
{hero.primaryCta.label}
</Link>
<Link to="/partner" className="m-btn m-btn-outline">
{hero.secondaryCta.label}
</Link>
</div>
</div>
</div>
)
}
/* 2. Mobile Brand View */
function MobileBrandView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{brand.eyebrow}</div>
<h2 className="m-page-title">{brand.title}</h2>
<p className="m-lead">{brand.lead}</p>
</div>
<div style={{ display: 'grid', gap: '0.85rem' }}>
{brand.cards.map((card, idx) => (
<div key={card.title} className="m-card">
<div style={{ fontSize: '0.8rem', color: 'var(--gold)', fontWeight: 600 }}>0{idx + 1}</div>
<h3>{card.title}</h3>
<p>{card.text}</p>
</div>
))}
</div>
<div className="m-card">
<h3></h3>
<img
src={images.brand.manor}
alt="杜康庄园"
style={{ width: '100%', borderRadius: '0.3rem', marginTop: '0.3rem' }}
/>
<div style={{ display: 'grid', gap: '0.4rem', marginTop: '0.5rem' }}>
{brand.timeline.map((item) => (
<div
key={item}
style={{
fontSize: '0.88rem',
color: 'var(--ink-soft)',
display: 'flex',
alignItems: 'center',
gap: '0.5rem',
}}
>
<span
style={{
width: '6px',
height: '6px',
borderRadius: '50%',
background: 'var(--brand)',
flexShrink: 0,
}}
/>
<span>{item}</span>
</div>
))}
</div>
</div>
<div className="m-closing">{brand.closing}</div>
<div className="m-deep-links">
<div style={{ fontSize: '0.9rem', color: 'var(--brand)', fontWeight: 600 }}></div>
{brand.deepReads.map((dp) => (
<Link key={dp.path} to={dp.path} className="m-deep-card">
<strong>{dp.label} </strong>
<span>{dp.blurb}</span>
</Link>
))}
</div>
</div>
)
}
/* 3. Mobile Poetry View */
function MobilePoetryView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{poetry.eyebrow}</div>
<h2 className="m-page-title">{poetry.title}</h2>
<p className="m-lead">{poetry.lead}</p>
</div>
<div className="m-poem-box">
<p className="m-poem-quote">{poetry.mainPoem.quote}</p>
<div className="m-poem-source"> {poetry.mainPoem.source}</div>
</div>
<div style={{ display: 'grid', gap: '0.85rem' }}>
{poetry.poems.map((p) => (
<div key={p.source} className="m-card">
<p style={{ fontFamily: 'Noto Serif SC', fontSize: '1rem', color: 'var(--ink)' }}>{p.quote}</p>
<div style={{ fontSize: '0.82rem', color: 'var(--gold)', textAlign: 'right' }}> {p.source}</div>
</div>
))}
</div>
<div className="m-closing">{poetry.closing}</div>
<div className="m-deep-links">
<div style={{ fontSize: '0.9rem', color: 'var(--brand)', fontWeight: 600 }}></div>
{poetry.deepReads.map((dp) => (
<Link key={dp.path} to={dp.path} className="m-deep-card">
<strong>{dp.label} </strong>
<span>{dp.blurb}</span>
</Link>
))}
</div>
</div>
)
}
/* 4. Mobile Qingxiang View */
function MobileQingxiangView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{qingxiang.eyebrow}</div>
<h2 className="m-page-title">{qingxiang.title}</h2>
<p className="m-lead">{qingxiang.lead}</p>
</div>
<div style={{ textAlign: 'center' }}>
<img src={images.t30} alt="酒祖杜康清香 T30" style={{ width: '9rem', margin: '0 auto' }} />
<div className="m-rings-row">
{qingxiang.styleWords.map((word) => (
<div key={word} className="m-ring-item">
{word}
</div>
))}
</div>
</div>
<div style={{ display: 'grid', gap: '0.85rem' }}>
{qingxiang.positions.map((pos) => (
<div key={pos.title} className="m-card">
<h3>{pos.title}</h3>
<p>{pos.text}</p>
</div>
))}
</div>
<div className="m-card">
<h3> · </h3>
<div style={{ display: 'grid', gap: '0.5rem', marginTop: '0.3rem' }}>
{qingxiang.tasting.map((t) => (
<div key={t.title} style={{ fontSize: '0.88rem' }}>
<strong style={{ color: 'var(--brand)' }}>{t.title}</strong>
<span style={{ color: 'var(--ink-soft)' }}>{t.text}</span>
</div>
))}
</div>
</div>
<div className="m-closing">{qingxiang.mission}</div>
<div className="m-deep-links">
<div style={{ fontSize: '0.9rem', color: 'var(--brand)', fontWeight: 600 }}></div>
{qingxiang.deepReads.map((dp) => (
<Link key={dp.path} to={dp.path} className="m-deep-card">
<strong>{dp.label} </strong>
<span>{dp.blurb}</span>
</Link>
))}
</div>
</div>
)
}
/* 5. Mobile Haoke View */
function MobileHaokeView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{haoke.eyebrow}</div>
<h2 className="m-page-title">{haoke.title}</h2>
<p className="m-lead">{haoke.lead}</p>
</div>
<div className="m-card" style={{ background: 'rgba(166, 28, 32, 0.08)', borderColor: 'var(--brand)' }}>
<h3 style={{ fontSize: '1.15rem' }}></h3>
<p style={{ fontWeight: 600, color: 'var(--brand)', fontSize: '1.02rem', lineHeight: 1.5 }}>
{haoke.oneLiner}
</p>
</div>
<div style={{ display: 'grid', gap: '0.85rem' }}>
{haoke.points.map((pt) => (
<div key={pt.title} className="m-card">
<h3>{pt.title}</h3>
<p>{pt.text}</p>
</div>
))}
</div>
<div className="m-closing">{haoke.closing}</div>
</div>
)
}
/* 6. Mobile System View */
function MobileSystemView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{system.eyebrow}</div>
<h2 className="m-page-title">{system.title}</h2>
<p className="m-lead">{system.lead}</p>
</div>
<div style={{ display: 'grid', gap: '0.85rem' }}>
{system.ends.map((end) => (
<div key={end.title} className="m-card">
<h3>{end.title}</h3>
<p style={{ fontWeight: 500, color: 'var(--ink)' }}>{end.role}</p>
<div
style={{
fontSize: '0.82rem',
color: 'var(--gold)',
paddingTop: '0.4rem',
borderTop: '1px dashed rgba(196, 163, 90, 0.3)',
}}
>
{end.caps}
</div>
</div>
))}
</div>
<div className="m-card" style={{ textAlign: 'center', background: 'rgba(166, 28, 32, 0.05)' }}>
<div style={{ fontSize: '0.82rem', color: 'var(--brand)', fontWeight: 600 }}></div>
<p style={{ fontWeight: 500, color: 'var(--brand)' }}>{system.loop}</p>
</div>
<div className="m-closing">{system.closing}</div>
</div>
)
}
/* 7. Mobile Tech View */
function MobileTechView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{tech.eyebrow}</div>
<h2 className="m-page-title">{tech.title}</h2>
<p className="m-lead">{tech.lead}</p>
</div>
<div style={{ display: 'grid', gap: '0.85rem' }}>
{tech.points.map((pt) => (
<div key={pt.title} className="m-card">
<h3>{pt.title}</h3>
<p>{pt.text}</p>
</div>
))}
</div>
<div className="m-closing">{tech.claim}</div>
<div style={{ textAlign: 'center', marginTop: '0.5rem' }}>
<Link to={tech.cta.to} className="m-btn m-btn-primary">
{tech.cta.label}
</Link>
</div>
</div>
)
}
/* 8. Mobile Subsidy View */
function MobileSubsidyView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{subsidy.eyebrow}</div>
<h2 className="m-page-title">{subsidy.title}</h2>
<div style={{ fontSize: '0.92rem', color: 'var(--gold)', fontWeight: 600, marginBottom: '0.5rem' }}>
{subsidy.subtitle}
</div>
<p className="m-lead">{subsidy.lead}</p>
</div>
<div className="m-card" style={{ textAlign: 'center', padding: '1.5rem 1rem' }}>
<div style={{ fontSize: '0.88rem', color: 'var(--gold)', fontWeight: 600 }}></div>
<div className="m-big-num">{subsidy.number}</div>
<p style={{ fontSize: '0.85rem' }}>{subsidy.numberNote}</p>
</div>
<div style={{ display: 'grid', gap: '0.85rem' }}>
{subsidy.points.map((pt) => (
<div key={pt.title} className="m-card">
<h3>{pt.title}</h3>
<p>{pt.text}</p>
</div>
))}
</div>
<div className="m-closing">{subsidy.closing}</div>
</div>
)
}
/* 9. Mobile Partner View */
function MobilePartnerView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{partner.eyebrow}</div>
<h2 className="m-page-title">{partner.title}</h2>
<p className="m-lead">{partner.lead}</p>
</div>
<div style={{ display: 'grid', gap: '0.85rem' }}>
{partner.points.map((pt) => (
<div key={pt.title} className="m-card">
<h3>{pt.title}</h3>
<p>{pt.text}</p>
</div>
))}
</div>
<div style={{ display: 'flex', gap: '0.75rem', justifyContent: 'center', marginTop: '1rem' }}>
<Link to={partner.primaryCta.to} className="m-btn m-btn-primary">
{partner.primaryCta.label}
</Link>
<Link to={partner.secondaryCta.to} className="m-btn m-btn-outline">
{partner.secondaryCta.label}
</Link>
</div>
</div>
)
}
/* 10. Mobile Tech Detail View */
function MobileTechDetailView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{techDetail.eyebrow}</div>
<h2 className="m-page-title">{techDetail.title}</h2>
<p className="m-lead">{techDetail.lead}</p>
</div>
<div style={{ display: 'grid', gap: '0.85rem' }}>
{techDetail.ports.map((port) => (
<div key={port.title} className="m-card">
<h3>{port.title}</h3>
<p>{port.text}</p>
</div>
))}
</div>
<div className="m-closing">{techDetail.closing}</div>
</div>
)
}
/* 11. Mobile Contact View */
function MobileContactView() {
return (
<div className="m-view-container">
<div>
<div className="m-eyebrow">{contact.eyebrow}</div>
<h2 className="m-page-title">{contact.title}</h2>
<p className="m-lead">{contact.lead}</p>
</div>
<div className="m-card m-qr-card">
<div className="m-qr-img">
<img src={images.qr} alt="微信二维码" />
</div>
<div>
<h3 style={{ fontSize: '1.25rem' }}>{contact.name}</h3>
<div style={{ fontSize: '0.88rem', color: 'var(--gold)', margin: '0.2rem 0 0.5rem' }}>
{contact.role}
</div>
<a
href={`tel:${contact.phone}`}
style={{
display: 'inline-block',
fontSize: '1.3rem',
fontWeight: 700,
color: 'var(--brand)',
textDecoration: 'none',
}}
>
📞 {contact.phone}
</a>
<p style={{ fontSize: '0.8rem', color: 'var(--ink-soft)', marginTop: '0.4rem' }}>
{contact.wechatHint}
</p>
</div>
</div>
</div>
)
}