feat(public-frontend): 公开前端 UI 视觉升级
引入统一品牌主题(色阶/字体/阴影/动效),重做首页 hero、卡片、导航与页脚,统一各页面的卡片/输入框/按钮样式。 - tailwind: 新增 brand 色阶、Inter 字体、card/glow 阴影与 fade-up 动效 - index.html: 引入 Inter 字体与 theme-color/description meta - index.css: 双径向渐变背景 + @layer 组件类(.card/.input/.btn-primary 等) - App/Home/ProductView/Contribute/ApiDocs/Account: 套用新设计系统 Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
@@ -28,11 +28,11 @@ export default function ProductView({ id, onBack }: { id: string; onBack: () =>
|
||||
<button onClick={onBack} className="text-sm text-gray-500 flex items-center gap-1 mb-4">
|
||||
<ArrowLeft className="w-4 h-4" /> 返回
|
||||
</button>
|
||||
<div className="bg-red-50 text-red-700 text-sm rounded-md px-4 py-3">{error}</div>
|
||||
<div className="rounded-xl bg-red-50 px-4 py-3 text-sm text-red-700">{error}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
if (!p) return <div className="text-gray-400">加载中…</div>;
|
||||
if (!p) return <div className="text-gray-400 animate-pulse">加载中…</div>;
|
||||
|
||||
const basisLabel: Record<string, string> = {
|
||||
per_100g: "每 100g",
|
||||
@@ -45,14 +45,14 @@ export default function ProductView({ id, onBack }: { id: string; onBack: () =>
|
||||
|
||||
return (
|
||||
<div>
|
||||
<button onClick={onBack} className="text-sm text-gray-500 flex items-center gap-1 mb-4">
|
||||
<button onClick={onBack} className="mb-4 inline-flex items-center gap-1 text-sm text-gray-500 hover:text-gray-700">
|
||||
<ArrowLeft className="w-4 h-4" /> 返回检索
|
||||
</button>
|
||||
|
||||
<div className="bg-white border rounded-lg p-5">
|
||||
<div className="card p-6 animate-fade-up">
|
||||
<div className="flex items-start justify-between gap-4">
|
||||
<h1 className="text-xl font-semibold text-gray-800">{p.name}</h1>
|
||||
<span className="shrink-0 text-xs bg-emerald-50 text-emerald-700 rounded px-2 py-1">
|
||||
<h1 className="text-2xl font-semibold tracking-tight text-gray-900">{p.name}</h1>
|
||||
<span className="shrink-0 rounded-full border border-brand-100 bg-brand-50 px-2.5 py-1 text-xs font-medium text-brand-700">
|
||||
质量分 {Math.round(p.quality_score * 100)}
|
||||
</span>
|
||||
</div>
|
||||
@@ -107,7 +107,7 @@ export default function ProductView({ id, onBack }: { id: string; onBack: () =>
|
||||
</div>
|
||||
|
||||
{p.specs && p.specs.length > 0 && (
|
||||
<div className="bg-white border rounded-lg p-5 mt-4">
|
||||
<div className="card p-6 mt-4">
|
||||
<h2 className="font-medium text-gray-700 mb-2">规格参数</h2>
|
||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm">
|
||||
{p.specs.map((s) => (
|
||||
@@ -124,7 +124,7 @@ export default function ProductView({ id, onBack }: { id: string; onBack: () =>
|
||||
)}
|
||||
|
||||
{nutriEntries.length > 0 && (
|
||||
<div className="bg-white border rounded-lg p-5 mt-4">
|
||||
<div className="card p-6 mt-4">
|
||||
<h2 className="font-medium text-gray-700 mb-2">
|
||||
营养成分
|
||||
{p.nutrition_basis ? `(${basisLabel[p.nutrition_basis] || p.nutrition_basis})` : ""}
|
||||
|
||||
Reference in New Issue
Block a user