fix: anchor empty listing pages and footer

This commit is contained in:
Codex User
2026-09-09 11:44:25 +08:00
parent d72a83ade1
commit 2ed5d1d301
6 changed files with 39 additions and 16 deletions
+3 -3
View File
@@ -5,13 +5,13 @@ import MobileStickyCTA from './MobileStickyCTA'
export default function Layout() {
return (
<>
<div className="app-shell">
<Navbar />
<main style={{ minHeight: '60vh' }}>
<main className="site-main">
<Outlet />
</main>
<Footer />
<MobileStickyCTA />
</>
</div>
)
}
+3 -4
View File
@@ -1,10 +1,9 @@
import { Link } from 'react-router-dom'
import { CASES as FALLBACK_CASES } from '@/data/mock'
import { useCMS, useCMSTexts, getCMSCases } from '@/services/cms'
import GlobalCTA from '@/components/Layout/GlobalCTA'
export default function Cases() {
const { data: CASES } = useCMS(getCMSCases, FALLBACK_CASES)
const { data: CASES } = useCMS(getCMSCases, [])
const { data: texts } = useCMSTexts()
return (
<div>
@@ -22,7 +21,7 @@ export default function Cases() {
</div>
<section className="section">
<div className="container">
<div className="grid-2">
{CASES.length ? <div className="grid-2">
{CASES.map(c => (
<Link key={c.id} to={`/cases/${c.slug}`} className="card" style={{ display: 'block' }}>
<div style={{ fontSize: 11, color: '#0f6b5b', fontWeight: 800, letterSpacing: '0.08em' }}>CASE · {c.status.toUpperCase()}</div>
@@ -31,7 +30,7 @@ export default function Cases() {
<span style={{ fontSize: 12, color: '#163E70', fontWeight: 700, marginTop: 10, display: 'inline-block' }}>{texts['cases.detail_link'] || '查看完整叙事'} →</span>
</Link>
))}
</div>
</div> : <div className="empty-state"><div><h2>{texts['cases.empty_title'] || '案例内容正在整理中'}</h2><p>{texts['cases.empty_description'] || '如需了解与企业当前阶段匹配的实践路径,欢迎直接咨询顾问。'}</p></div></div>}
</div>
</section>
<GlobalCTA />
+3 -4
View File
@@ -1,10 +1,9 @@
import { Link } from 'react-router-dom'
import { INSIGHTS as FALLBACK_INSIGHTS } from '@/data/mock'
import { useCMS, useCMSTexts, getCMSInsights } from '@/services/cms'
import GlobalCTA from '@/components/Layout/GlobalCTA'
export default function Insights() {
const { data: INSIGHTS } = useCMS(getCMSInsights, FALLBACK_INSIGHTS)
const { data: INSIGHTS } = useCMS(getCMSInsights, [])
const { data: texts } = useCMSTexts()
return (
<div>
@@ -22,7 +21,7 @@ export default function Insights() {
</div>
<section className="section">
<div className="container">
<div className="grid-2">
{INSIGHTS.length ? <div className="grid-2">
{INSIGHTS.map(i => (
<Link key={i.id} to={`/insights/${i.slug}`} className="card" style={{ display: 'block' }}>
<div style={{ fontSize: 11, color: '#0f6b5b', fontWeight: 800, letterSpacing: '0.08em' }}>{i.category.toUpperCase()}</div>
@@ -33,7 +32,7 @@ export default function Insights() {
</div>
</Link>
))}
</div>
</div> : <div className="empty-state"><div><h2>{texts['insights.empty_title'] || '内容正在持续沉淀'}</h2><p>{texts['insights.empty_description'] || '欢迎关注企业进化、价值坐标与经营现场的后续观察。'}</p></div></div>}
</div>
</section>
<GlobalCTA />
+3 -4
View File
@@ -1,10 +1,9 @@
import { Link } from 'react-router-dom'
import { SERVICES as FALLBACK_SERVICES } from '@/data/mock'
import { useCMS, useCMSTexts, getCMSServices } from '@/services/cms'
import GlobalCTA from '@/components/Layout/GlobalCTA'
export default function Services() {
const { data: SERVICES } = useCMS(getCMSServices, FALLBACK_SERVICES)
const { data: SERVICES } = useCMS(getCMSServices, [])
const { data: texts } = useCMSTexts()
return (
<div>
@@ -22,7 +21,7 @@ export default function Services() {
</div>
<section className="section">
<div className="container">
<div className="grid-3">
{SERVICES.length ? <div className="grid-3">
{SERVICES.map(s => (
<div key={s.id} className="card" style={{ display: 'flex', flexDirection: 'column' }}>
<div style={{ fontSize: 11, letterSpacing: '0.08em', color: s.serviceType === 'standard' ? '#163E70' : '#0f6b5b', fontWeight: 800 }}>
@@ -52,7 +51,7 @@ export default function Services() {
</div>
</div>
))}
</div>
</div> : <div className="empty-state"><div><h2>{texts['services.empty_title'] || '服务内容正在更新中'}</h2><p>{texts['services.empty_description'] || '欢迎联系我们,获取适合企业当前阶段的沟通与服务建议。'}</p></div></div>}
</div>
</section>
<GlobalCTA />
+21 -1
View File
@@ -14,14 +14,22 @@
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
html { scroll-behavior: smooth; min-height: 100%; }
body {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
color: var(--text);
background: var(--bg);
line-height: 1.7;
-webkit-font-smoothing: antialiased;
min-height: 100vh;
}
#root { min-height: 100vh; }
.app-shell { min-height: 100vh; display: flex; flex-direction: column; }
.site-main { flex: 1; display: flex; flex-direction: column; }
/* Each route is a page-level wrapper. Let a short page fill the available space,
then anchor its final CTA immediately above the footer. */
.site-main > * { flex: 1; display: flex; flex-direction: column; }
.site-main > * > .cta-band:last-child { margin-top: auto; }
a { color: var(--primary); text-decoration: none; }
a:hover { color: var(--primary-light); }
img { max-width: 100%; display: block; }
@@ -66,6 +74,18 @@ img { max-width: 100%; display: block; }
line-height: 1.6;
}
.placeholder strong { color: #b45309; }
.empty-state {
min-height: 180px;
display: grid;
place-items: center;
text-align: center;
background: var(--bg-white);
border: 1px dashed var(--border);
border-radius: 12px;
padding: 32px 24px;
}
.empty-state h2 { color: var(--primary); font-size: 18px; margin-bottom: 8px; }
.empty-state p { color: var(--text-secondary); font-size: 14px; max-width: 480px; }
/* Cards */
.card {