diff --git a/.vscode/settings.json b/.vscode/settings.json
index f3006236..6a24f307 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,5 +1,3 @@
{
- "kiroAgent.configureMCP": "Disabled"
-
-
+ "kiroAgent.configureMCP": "Enabled"
}
diff --git a/TUICallKit-Vue3/App.vue b/TUICallKit-Vue3/App.vue
index b88a68b7..06e86640 100644
--- a/TUICallKit-Vue3/App.vue
+++ b/TUICallKit-Vue3/App.vue
@@ -31,8 +31,6 @@ onLaunch(() => {
uni.login({
provider: 'weixin',
success: function (loginRes) {
- console.log('xx');
- console.log(loginRes.code);
if( uni.getStorageSync('token')){
userinfo(loginRes.code);
}else{
diff --git a/TUICallKit-Vue3/main.js b/TUICallKit-Vue3/main.js
index ce23c462..e6a8b7f1 100644
--- a/TUICallKit-Vue3/main.js
+++ b/TUICallKit-Vue3/main.js
@@ -1,5 +1,5 @@
import App from './App'
-var baseUrl ='https://css.zhenyangtang.com.cn/';
+var baseUrl ='https://admin.zhenyangtang.com.cn/';
function joinApiUrl(base, path) {
const b = String(base || '').replace(/\/+$/, '')
diff --git a/TUICallKit-Vue3/pages.json b/TUICallKit-Vue3/pages.json
index fd67dba7..54474cf1 100644
--- a/TUICallKit-Vue3/pages.json
+++ b/TUICallKit-Vue3/pages.json
@@ -167,6 +167,23 @@
"backgroundColor": "#faf9f5",
"enablePullDownRefresh": true
}
+ },
+ {
+ "path": "pages/weekly",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "血糖管理",
+ "backgroundColor": "#f4fbf4",
+ "enablePullDownRefresh": true,
+ "mp-weixin": {
+ "usingPlugins": {
+ "WechatSI": {
+ "version": "0.3.5",
+ "provider": "wx069ba97219f66d99"
+ }
+ }
+ }
+ }
}
]
}
diff --git a/TUICallKit-Vue3/tongji/components/TongjiIcon.vue b/TUICallKit-Vue3/tongji/components/TongjiIcon.vue
index 32ecec3a..90f59470 100644
--- a/TUICallKit-Vue3/tongji/components/TongjiIcon.vue
+++ b/TUICallKit-Vue3/tongji/components/TongjiIcon.vue
@@ -40,6 +40,9 @@ const ICON_PATHS = {
heart: '',
activity: '',
users: '',
+ user: '',
+ person: '',
+ send: '',
'alert-triangle': '',
minus: '',
droplet: '',
@@ -54,7 +57,16 @@ const ICON_PATHS = {
info: '',
sun: '',
moon: '',
- sunset: ''
+ sunset: '',
+ mic: '',
+ camera: '',
+ bulb: '',
+ leaf: '',
+ utensils: '',
+ egg: '',
+ home: '',
+ 'plus-circle': '',
+ 'chevron-right': ''
}
/** 图片加载失败时的 emoji 回退 */
@@ -68,6 +80,9 @@ const ICON_FALLBACK = {
heart: '❤',
activity: '🏃',
users: '👥',
+ user: '👤',
+ person: '👤',
+ send: '➤',
'alert-triangle': '⚠',
minus: '—',
droplet: '💧',
@@ -82,7 +97,16 @@ const ICON_FALLBACK = {
info: '!',
sun: '☀',
moon: '🌙',
- sunset: '☀'
+ sunset: '☀',
+ mic: '🎤',
+ camera: '📷',
+ bulb: '💡',
+ leaf: '🥬',
+ utensils: '🍴',
+ egg: '🍳',
+ home: '🏠',
+ 'plus-circle': '⊕',
+ 'chevron-right': '›'
}
const strokeColor = computed(() => {
diff --git a/TUICallKit-Vue3/tongji/design-system/DESIGN.md b/TUICallKit-Vue3/tongji/design-system/DESIGN.md
new file mode 100644
index 00000000..10b0305b
--- /dev/null
+++ b/TUICallKit-Vue3/tongji/design-system/DESIGN.md
@@ -0,0 +1,28 @@
+# VitalMint Health (Stitch)
+
+Source: Google Stitch MCP · project `Modern WeChat UI Redesign`
+Screen HTML: `design-system/stitch-weekly.html`
+
+## Colors
+
+- background / surface: `#f4fbf4`
+- primary: `#006c49`
+- primary-container: `#10b981`
+- tertiary-container (餐后): `#fc7c78`
+- on-surface: `#161d19`
+- error (high glucose): `#ba1a1a`
+- warning: `#ea580c`
+
+## Layout (weekly.vue)
+
+1. TopAppBar — 头像 + 问候 + 朗读按钮
+2. 录入今日血糖 — 全宽圆角主按钮
+3. 今日血糖 — 双列卡片 + 查看更多
+4. 血糖趋势 — 单卡片内含统计、图表、7/30 切换
+5. AI 饮食 — 渐变边框白底卡片
+6. 能不能吃 — 独立卡片
+
+## Styles
+
+- `styles/stitch-vitalmint-theme.scss` — 设计 token
+- `styles/weekly-stitch.scss` — 页面组件样式 (vm-*)
\ No newline at end of file
diff --git a/TUICallKit-Vue3/tongji/design-system/code.html b/TUICallKit-Vue3/tongji/design-system/code.html
new file mode 100644
index 00000000..8d9191a0
--- /dev/null
+++ b/TUICallKit-Vue3/tongji/design-system/code.html
@@ -0,0 +1,398 @@
+
+
+
+血糖管理
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+person
+
+
+
下午好,用户16295733
+
今日血糖已记录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1
+天偏高
+
+
+1
+天正常
+
+
+2
+天有记录
+
+
+
+
+
+
+23.0
+18.0
+13.0
+8.0
+3.0
+
+
+
+
空腹阈 7
+
+
+
+
+05-23
+05-25
+05-27
+05-29
+
+
+
+
+
+
+
+
+
最新测量 · 餐后
+
+
+mmol/L
+
+
+warning
+偏高,请遵医嘱
+
+
+
+
+
+
+
+
+
+
+
+temp_preferences_custom
+
+
AI 饮食建议
+
+
+
+读您近 7 天 · 30 天血糖,定制今日三餐
+
+
+
+light_mode
+早餐
+
+
小米粥(少米多水)加煮鸡蛋一个
+
+
+
+eco
+午餐
+
+
清蒸鱼块、蒜蓉炒苋菜、二米饭(小米掺大米)
+
+
+
+
+
+
+
+ sparkles
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TUICallKit-Vue3/tongji/design-system/stitch-screen.json b/TUICallKit-Vue3/tongji/design-system/stitch-screen.json
new file mode 100644
index 00000000..221189b1
--- /dev/null
+++ b/TUICallKit-Vue3/tongji/design-system/stitch-screen.json
@@ -0,0 +1 @@
+{"name":"projects/15362588878567114380/screens/259c8c233434481881d0bacddb59fa7f","title":"血糖管理重构版","screenshot":{"name":"projects/15362588878567114380/files/c18dd3e3d7774a16897d78b40073b9f2","downloadUrl":"https://lh3.googleusercontent.com/aida/ADBb0ugpswBosy3eCG_j3kJlxCWpntXQGvRJvMuepINJTcB47Nf4ymWU81mrjex1ICPdAXn-p_JjyUokOtms4zIJpXL49692zt16mIJhEC16nfU9kH5hwAj1s7v3PlAZbUGWjYjPTdfVMaOCveS6Ohuh_IeyRTD6MmdsFZ2-H7Whg6zy4MiZeGLxRw0ckCOrNbTRObtuzk_dlUc49eDGeRagYtuL9xyS6pno5CiwBzSkGp872chdZVn9JOK-2n1P"},"htmlCode":{"name":"projects/15362588878567114380/files/ca56c13fc2d6481d9de60727f7b70f3f","downloadUrl":"https://contribution.usercontent.google.com/download?c=CgthaWRhX2NvZGVmeBJ8Eh1hcHBfY29tcGFuaW9uX2dlbmVyYXRlZF9maWxlcxpbCiVodG1sXzk5NTVmZjZjNTFkODQxMmY4MzIxNWNkYmIwNWI2MTMzEgsSBxCEnv3unRAYAZIBJAoKcHJvamVjdF9pZBIWQhQxNTM2MjU4ODg3ODU2NzExNDM4MA&filename=&opi=89354086","mimeType":"text/html"},"width":"780","height":"4122","deviceType":"MOBILE"}
diff --git a/TUICallKit-Vue3/tongji/design-system/stitch-weekly.html b/TUICallKit-Vue3/tongji/design-system/stitch-weekly.html
new file mode 100644
index 00000000..d5e28d3b
--- /dev/null
+++ b/TUICallKit-Vue3/tongji/design-system/stitch-weekly.html
@@ -0,0 +1,351 @@
+
+
+
+
+
+血糖管理
+
+
+
+
+
+
+
+
+
+
+
+
+
+person
+
+
+
下午好,用户16295733
+
今日血糖已记录
+
+
+
+
+
+
+
+
+
+今日血糖
+
+
+
+
空腹
+
+18.00
+mmol/L
+
+
+warning
+偏高,请遵医嘱
+
+
+
+
+
餐后
+
+20.00
+mmol/L
+
+
+warning
+偏高,请遵医嘱
+
+
+
+
+
+
+
+
+
+
+
+1
+天偏高
+
+
+1
+天正常
+
+
+2
+天有记录
+
+
+
+
+
+
+23.0
+18.0
+13.0
+8.0
+3.0
+
+
+
+05-23
+05-25
+05-27
+05-29
+
+
+
+空腹阈值 7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+auto_awesome
+
+
+
+
AI 饮食建议
+智能定制
+
+
读您近 7 天 · 30 天血糖,定制今日三餐
+
+
+
+
+
+
+
+
+
+
+wb_sunny
+早餐
+
+
小米粥(少米多水)加煮鸡蛋一个
+
+
+
+
+wb_twilight
+午餐
+
+
清蒸鱼块、蒜蓉炒苋菜、二米饭(小米掺大米)
+
+
+
+
+dark_mode
+晚餐
+
+
玉米糝粥(稀)配凉拌黄瓜
+
+
+
+
+
info
+
小贴士:先吃菜和肉再吃主食,每餐七分饱,血糖高就少喝粥汤。
+
+
+
+
+warning 今日尽量少碰
+
+
+白馒头
+油条
+粘豆包
+糯米饭
+西瓜
+含糖饮料
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/TUICallKit-Vue3/tongji/pages/index.vue b/TUICallKit-Vue3/tongji/pages/index.vue
index 457f4fcd..007a9b9b 100644
--- a/TUICallKit-Vue3/tongji/pages/index.vue
+++ b/TUICallKit-Vue3/tongji/pages/index.vue
@@ -373,24 +373,38 @@
-
-
-
-
-
- AI 饮食建议
- 读您近 7 天 · 30 天血糖,定制今日三餐
-
+
+
+
+
-
-
- {{ dietAiLoading ? '生成中' : '换一换' }}
+
+
+
+
+
+
+
+
+ AI 饮食建议
+
+
+ 智能定制
+
+
+ 读您近 7 天 · 30 天血糖,定制今日三餐
+
+
+
+
+ {{ dietAiLoading ? '生成中' : '换一换' }}
+
@@ -412,7 +426,7 @@
-
+
早餐
@@ -423,7 +437,7 @@
-
+
午餐
@@ -434,7 +448,7 @@
-
+
晚餐
@@ -6119,77 +6133,185 @@ async function onFamilyLike() {
@import '../styles/daily-theme.scss';
.ai-diet-card {
- margin: 24rpx 24rpx 0;
+ margin: 28rpx 24rpx 0;
padding: 0;
overflow: hidden;
- border-radius: 28rpx;
- border: 1rpx solid var(--border-soft);
- box-shadow: var(--shadow-premium);
+ border-radius: 34rpx;
+ border: none;
+ background: #ffffff;
+ box-shadow: 0 18rpx 48rpx rgba(14, 138, 138, 0.14), 0 6rpx 16rpx rgba(32, 78, 43, 0.06);
}
+
+/* ===== Hero:清新极光渐变 ===== */
.ai-diet-hero {
+ position: relative;
+ overflow: hidden;
+ padding: 32rpx 26rpx;
+ background: linear-gradient(135deg, #1f6f4a 0%, #0d8a82 58%, #14b8a6 100%);
+}
+.ai-diet-hero-aurora {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ pointer-events: none;
+}
+.ai-diet-blob {
+ position: absolute;
+ border-radius: 50%;
+ opacity: 0.6;
+}
+.ai-diet-blob-1 {
+ width: 280rpx;
+ height: 280rpx;
+ top: -120rpx;
+ right: -60rpx;
+ background: radial-gradient(circle, rgba(94, 234, 212, 0.9) 0%, rgba(94, 234, 212, 0) 70%);
+ animation: ai-diet-float 7s ease-in-out infinite;
+}
+.ai-diet-blob-2 {
+ width: 220rpx;
+ height: 220rpx;
+ bottom: -110rpx;
+ left: -50rpx;
+ background: radial-gradient(circle, rgba(165, 243, 252, 0.8) 0%, rgba(165, 243, 252, 0) 70%);
+ animation: ai-diet-float 9s ease-in-out infinite reverse;
+}
+.ai-diet-blob-3 {
+ width: 170rpx;
+ height: 170rpx;
+ top: 6rpx;
+ left: 42%;
+ background: radial-gradient(circle, rgba(255, 255, 255, 0.55) 0%, rgba(255, 255, 255, 0) 70%);
+ animation: ai-diet-float 11s ease-in-out infinite;
+}
+@keyframes ai-diet-float {
+ 0%, 100% { transform: translate(0, 0); }
+ 50% { transform: translate(-16rpx, 16rpx); }
+}
+.ai-diet-hero-content {
+ position: relative;
+ z-index: 1;
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16rpx;
- padding: 28rpx 24rpx 24rpx;
- background: linear-gradient(135deg, var(--primary-light) 0%, #f0faf4 55%, #ffffff 100%);
- border-bottom: 1rpx solid var(--border-soft);
}
.ai-diet-hero-main {
display: flex;
- align-items: flex-start;
- gap: 16rpx;
+ align-items: center;
+ gap: 18rpx;
flex: 1;
min-width: 0;
}
.ai-diet-hero-icon {
+ position: relative;
flex-shrink: 0;
- width: 72rpx;
- height: 72rpx;
+ width: 80rpx;
+ height: 80rpx;
display: flex;
align-items: center;
justify-content: center;
- border-radius: 20rpx;
- background: var(--primary-grad);
- box-shadow: var(--shadow-glow-primary);
+ border-radius: 24rpx;
+ background: rgba(255, 255, 255, 0.2);
+ border: 1rpx solid rgba(255, 255, 255, 0.4);
+ box-shadow: 0 8rpx 22rpx rgba(0, 0, 0, 0.14), inset 0 1rpx 0 rgba(255, 255, 255, 0.4);
+}
+.ai-diet-hero-icon-ring {
+ position: absolute;
+ top: -8rpx;
+ left: -8rpx;
+ right: -8rpx;
+ bottom: -8rpx;
+ border-radius: 30rpx;
+ border: 3rpx solid rgba(255, 255, 255, 0.5);
+ opacity: 0;
+}
+.ai-diet-hero-icon.thinking .ai-diet-hero-icon-ring {
+ animation: ai-diet-ring 1.6s ease-out infinite;
+}
+@keyframes ai-diet-ring {
+ 0% { opacity: 0.7; transform: scale(0.82); }
+ 100% { opacity: 0; transform: scale(1.28); }
}
.ai-diet-hero-copy {
flex: 1;
min-width: 0;
}
+.ai-diet-hero-titles {
+ display: flex;
+ align-items: center;
+ gap: 12rpx;
+ flex-wrap: wrap;
+}
.ai-diet-title {
- display: block;
- font-size: 34rpx;
+ font-size: 38rpx;
font-weight: 800;
- color: var(--text-primary);
+ color: #ffffff;
+ letter-spacing: 1rpx;
+ line-height: 1.25;
+ text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.12);
+}
+.ai-diet-badge {
+ display: flex;
+ align-items: center;
+ gap: 7rpx;
+ padding: 5rpx 16rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.22);
+ border: 1rpx solid rgba(255, 255, 255, 0.4);
+}
+.ai-diet-badge text {
+ font-size: 20rpx;
+ font-weight: 700;
+ color: #ffffff;
letter-spacing: 0.5rpx;
- line-height: 1.3;
+}
+.ai-diet-badge-dot {
+ width: 12rpx;
+ height: 12rpx;
+ border-radius: 50%;
+ background: #a7f3d0;
+ box-shadow: 0 0 10rpx #6ee7b7;
+ animation: ai-diet-pulse 1.4s ease-in-out infinite;
+}
+@keyframes ai-diet-pulse {
+ 0%, 100% { opacity: 1; transform: scale(1); }
+ 50% { opacity: 0.35; transform: scale(0.7); }
}
.ai-diet-sub {
display: block;
- margin-top: 8rpx;
+ margin-top: 12rpx;
font-size: 24rpx;
line-height: 1.5;
- color: var(--text-secondary);
+ color: rgba(255, 255, 255, 0.88);
}
.ai-diet-refresh {
flex-shrink: 0;
display: flex;
align-items: center;
gap: 8rpx;
- min-height: 64rpx;
- padding: 0 20rpx;
+ min-height: 60rpx;
+ padding: 0 22rpx;
border-radius: 999rpx;
- background: #ffffff;
- border: 2rpx solid var(--border-soft);
- color: var(--primary);
+ background: rgba(255, 255, 255, 0.22);
+ border: 1rpx solid rgba(255, 255, 255, 0.42);
+ color: #ffffff;
font-size: 24rpx;
font-weight: 700;
- box-shadow: 0 4rpx 12rpx rgba(32, 78, 43, 0.06);
+ box-shadow: 0 4rpx 14rpx rgba(0, 0, 0, 0.1);
transition: opacity 0.2s ease, background 0.2s ease;
}
.ai-diet-refresh.disabled {
- opacity: 0.55;
+ opacity: 0.6;
+}
+@media (prefers-reduced-motion: reduce) {
+ .ai-diet-blob,
+ .ai-diet-hero-icon.thinking .ai-diet-hero-icon-ring,
+ .ai-diet-badge-dot {
+ animation: none;
+ }
}
/* ===== 建议依据:近7天 / 近30天 血糖回顾 ===== */
@@ -6325,11 +6447,23 @@ async function onFamilyLike() {
margin-bottom: 14rpx;
}
.ai-diet-section-title {
+ position: relative;
+ padding-left: 20rpx;
font-size: 28rpx;
font-weight: 800;
color: var(--text-primary);
letter-spacing: 0.5rpx;
}
+.ai-diet-section-title::before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 4rpx;
+ bottom: 4rpx;
+ width: 8rpx;
+ border-radius: 8rpx;
+ background: linear-gradient(180deg, #10b981 0%, #14b8a6 100%);
+}
.ai-diet-section-tag {
font-size: 22rpx;
font-weight: 600;
@@ -6402,44 +6536,69 @@ async function onFamilyLike() {
gap: 12rpx;
}
.ai-diet-meal-card {
- padding: 20rpx;
- border-radius: 20rpx;
+ position: relative;
+ padding: 22rpx 22rpx 22rpx 26rpx;
+ border-radius: 22rpx;
background: var(--surface);
border: 1rpx solid var(--border-soft);
- border-left-width: 6rpx;
+ overflow: hidden;
+}
+.ai-diet-meal-card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ width: 8rpx;
+ border-radius: 8rpx;
}
.ai-diet-meal-card.meal-breakfast {
- border-left-color: #d97706;
- background: linear-gradient(90deg, rgba(217, 119, 6, 0.06) 0%, #ffffff 28%);
+ background: linear-gradient(120deg, rgba(251, 191, 36, 0.14) 0%, rgba(255, 255, 255, 0) 45%);
+}
+.ai-diet-meal-card.meal-breakfast::before {
+ background: linear-gradient(180deg, #fbbf24 0%, #f59e0b 100%);
}
.ai-diet-meal-card.meal-lunch {
- border-left-color: var(--primary);
- background: linear-gradient(90deg, var(--primary-glow) 0%, #ffffff 28%);
+ background: linear-gradient(120deg, rgba(16, 185, 129, 0.16) 0%, rgba(255, 255, 255, 0) 45%);
+}
+.ai-diet-meal-card.meal-lunch::before {
+ background: linear-gradient(180deg, #10b981 0%, #0d8a82 100%);
}
.ai-diet-meal-card.meal-dinner {
- border-left-color: #4f46e5;
- background: linear-gradient(90deg, rgba(79, 70, 229, 0.06) 0%, #ffffff 28%);
+ background: linear-gradient(120deg, rgba(99, 102, 241, 0.14) 0%, rgba(255, 255, 255, 0) 45%);
+}
+.ai-diet-meal-card.meal-dinner::before {
+ background: linear-gradient(180deg, #818cf8 0%, #6366f1 100%);
}
.ai-diet-meal-head {
display: flex;
align-items: center;
- gap: 10rpx;
- margin-bottom: 10rpx;
+ gap: 12rpx;
+ margin-bottom: 12rpx;
}
.ai-diet-meal-icon {
- width: 44rpx;
- height: 44rpx;
+ width: 48rpx;
+ height: 48rpx;
display: flex;
align-items: center;
justify-content: center;
- border-radius: 12rpx;
- background: var(--primary-light);
+ border-radius: 14rpx;
+ box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.08);
+}
+.meal-breakfast .ai-diet-meal-icon {
+ background: linear-gradient(150deg, #fde68a 0%, #fbbf24 100%);
+}
+.meal-lunch .ai-diet-meal-icon {
+ background: linear-gradient(150deg, #6ee7b7 0%, #10b981 100%);
+}
+.meal-dinner .ai-diet-meal-icon {
+ background: linear-gradient(150deg, #c7d2fe 0%, #818cf8 100%);
}
.ai-diet-meal-label {
font-size: 26rpx;
font-weight: 800;
- color: var(--primary);
- letter-spacing: 1rpx;
+ color: var(--text-primary);
+ letter-spacing: 2rpx;
}
.ai-diet-meal-text {
display: block;
@@ -6520,9 +6679,9 @@ async function onFamilyLike() {
transition: opacity 0.2s ease;
}
.ai-diet-btn.primary {
- background: var(--primary-grad);
+ background: linear-gradient(135deg, #1f6f4a 0%, #0d8a82 55%, #14b8a6 100%);
color: #ffffff;
- box-shadow: var(--shadow-glow-primary);
+ box-shadow: 0 10rpx 22rpx rgba(14, 138, 138, 0.28);
border: none;
}
.ai-diet-btn.ghost {
@@ -6717,11 +6876,11 @@ async function onFamilyLike() {
gap: 6rpx;
padding: 0 20rpx;
border-radius: 16rpx;
- background: var(--primary-grad);
+ background: linear-gradient(135deg, #1f6f4a 0%, #0d8a82 55%, #14b8a6 100%);
color: #ffffff;
font-size: 28rpx;
font-weight: 700;
- box-shadow: var(--shadow-glow-primary);
+ box-shadow: 0 8rpx 18rpx rgba(14, 138, 138, 0.26);
}
.ai-diet-ask-btn.disabled {
opacity: 0.55;
diff --git a/TUICallKit-Vue3/tongji/pages/weekly.vue b/TUICallKit-Vue3/tongji/pages/weekly.vue
new file mode 100644
index 00000000..11ff4203
--- /dev/null
+++ b/TUICallKit-Vue3/tongji/pages/weekly.vue
@@ -0,0 +1,2615 @@
+
+
+
+ 正在登录…
+
+
+
+
+
+
+
+
+
+ {{ card.patient_name || '就诊卡' }}
+
+
+
+
+
+
+
+
+ 录入今日血糖
+
+
+
+
+
+
+ 血糖趋势
+ {{ rangeText }} · mmol/L
+
+
+
+
+ 空腹
+
+
+
+ 餐后
+
+
+
+
+
+ {{ bloodHighDayCount }}
+ 天偏高
+
+
+ {{ bloodNormalDayCount }}
+ 天正常
+
+
+ {{ bloodRecordDayCount }}
+ 天有记录
+
+
+
+
+
+ 图表已暂停显示
+
+
+ 当前时间范围暂无血糖数据
+
+
+ {{ hoverInfo.date }}
+
+
+ 空腹 {{ hoverInfo.fasting }}
+
+
+
+ 餐后 {{ hoverInfo.postprandial }}
+
+
+
+
+
+
+
+
+
+ 最新测量 · {{ latestMeasurement.typeLabel }}
+
+ {{ latestMeasurement.value }}
+ mmol/L
+
+
+
+ 偏高,请遵医嘱
+
+
+
+
+ 空腹
+ {{ elderFasting.value }}
+ 偏高
+
+
+ 餐后
+ {{ elderPostprandial.value }}
+ 偏高
+
+
+
+
+
+
+
+
+
+
+
+
+ AI 饮食建议
+
+
+
+ {{ dietAiLoading ? '生成中' : '换一换' }}
+
+
+ 读您近 7 天 · 30 天血糖,定制今日三餐
+
+
+
+ 正在生成今日饮食建议…
+
+
+
+
+
+ 早餐
+
+
+ {{ dietAiRecommend.breakfast || (dietAiLoading ? '…' : '—') }}▍
+
+
+
+
+
+ 午餐
+
+
+ {{ dietAiRecommend.lunch || (dietAiLoading ? '…' : '—') }}▍
+
+
+
+
+
+ 晚餐
+
+
+ {{ dietAiRecommend.dinner || '…' }}▍
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dietAiAskResult.level_label }}
+
+
+ {{ dietAiAskResult.advice || (dietAiAsking ? '正在想…' : '') }}▍
+
+
+
+
+
+
+
+
+
+
+ 授权手机号
+ 绑定手机号后即可记录血糖,无需先填写就诊卡
+
+
+ ×
+
+
+
+ 微信仅提供手机号,请选择性别以便写入就诊档案。
+
+ 性别
+
+
+ 男
+
+
+ 女
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ inputForm.id ? '修改今日血糖' : '录入今日血糖' }}
+ {{ todayText }} · {{ patientName || '本人' }}
+
+
+ ×
+
+
+
+
+ 加载今日数据中…
+
+
+
+ 请如实填写,留空表示该项不上传。当天可多次修改。
+
+
+ 血糖(mmol/L)
+
+
+
+ 空腹血糖
+
+
+
+
+
+
+
+
+ 餐后血糖
+
+
+
+
+
+
+
+
+ 其他血糖
+
+
+
+
+
+
+ 备注
+
+
+
+
+
+
+
+ 删除
+
+
+ {{ inputForm.submitting ? '提交中…' : (inputForm.id ? '保存修改' : '提交录入') }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/TUICallKit-Vue3/tongji/styles/stitch-vitalmint-theme.scss b/TUICallKit-Vue3/tongji/styles/stitch-vitalmint-theme.scss
new file mode 100644
index 00000000..97fdd5df
--- /dev/null
+++ b/TUICallKit-Vue3/tongji/styles/stitch-vitalmint-theme.scss
@@ -0,0 +1,47 @@
+/**
+ * Google Stitch MCP · VitalMint Health
+ * 设计 token 与 stitch-weekly.html tailwind.config 一一对应
+ */
+
+.weekly-page {
+ --primary: #006c49;
+ --on-primary: #ffffff;
+ --on-primary-fixed-variant: #005236;
+ --primary-container: #10b981;
+ --on-primary-container: #00422b;
+ --inverse-primary: #4edea3;
+
+ --surface: #f4fbf4;
+ --on-surface: #161d19;
+ --on-surface-variant: #3c4a42;
+ --surface-container-lowest: #ffffff;
+ --surface-container-low: #eef6ee;
+ --surface-container: #e8f0e9;
+ --surface-container-high: #e3eae3;
+ --surface-container-highest: #dde4dd;
+ --surface-variant: #dde4dd;
+
+ --outline: #6c7a71;
+ --outline-variant: #bbcabf;
+
+ --error: #ba1a1a;
+ --on-error-container: #93000a;
+ --error-container: #ffdad6;
+ --tertiary: #a43a3a;
+ --tertiary-container: #fc7c78;
+
+ --st-container-margin: 40rpx;
+ --st-section-gap: 64rpx;
+ --st-card-padding: 40rpx;
+ --st-stack-gap: 32rpx;
+ --st-inline-gap: 24rpx;
+ --st-radius-2xl: 48rpx;
+ --st-radius-xl: 24rpx;
+ --st-radius-lg: 16rpx;
+ --st-shadow-ambient: 0 20rpx 60rpx -20rpx rgba(0, 108, 73, 0.08);
+
+ min-height: 100vh;
+ background: var(--surface);
+ color: var(--on-surface);
+ padding-bottom: calc(200rpx + env(safe-area-inset-bottom));
+}
diff --git a/TUICallKit-Vue3/tongji/styles/weekly-input-modal.scss b/TUICallKit-Vue3/tongji/styles/weekly-input-modal.scss
new file mode 100644
index 00000000..a4301b7f
--- /dev/null
+++ b/TUICallKit-Vue3/tongji/styles/weekly-input-modal.scss
@@ -0,0 +1,293 @@
+/* weekly.vue 录入弹窗 — 沿用 MCP 主色 */
+
+.weekly-page .input-modal-mask {
+ position: fixed;
+ inset: 0;
+ background: rgba(15, 23, 42, 0.45);
+ backdrop-filter: blur(12px);
+ z-index: 999;
+ display: flex;
+ align-items: flex-end;
+ justify-content: center;
+ animation: input-modal-mask-in 0.38s cubic-bezier(0.22, 1, 0.36, 1) both;
+}
+
+.weekly-page .input-modal {
+ width: 100%;
+ max-width: 750rpx;
+ background: var(--surface-container-lowest);
+ border-radius: 36rpx 36rpx 0 0;
+ padding: 16rpx 0 calc(20rpx + env(safe-area-inset-bottom));
+ box-shadow: 0 -12rpx 36rpx rgba(15, 23, 42, 0.12);
+ max-height: 88vh;
+ display: flex;
+ flex-direction: column;
+ animation: input-modal-rise 0.46s cubic-bezier(0.22, 1, 0.36, 1) both;
+}
+
+@keyframes input-modal-mask-in {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+
+@keyframes input-modal-rise {
+ from { transform: translate3d(0, 100%, 0); opacity: 0.96; }
+ to { transform: translate3d(0, 0, 0); opacity: 1; }
+}
+
+@keyframes input-modal-content-in {
+ from { opacity: 0; transform: translate3d(0, 24rpx, 0); }
+ to { opacity: 1; transform: translate3d(0, 0, 0); }
+}
+
+.weekly-page .input-modal-grip {
+ width: 80rpx;
+ height: 6rpx;
+ border-radius: 999rpx;
+ background: var(--surface-container-highest);
+ margin: 0 auto 8rpx;
+}
+
+.weekly-page .input-modal-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 12rpx 32rpx 16rpx;
+ border-bottom: 1rpx solid var(--surface-container-low);
+}
+
+.weekly-page .input-modal-title {
+ font-size: 40rpx;
+ font-weight: 800;
+ color: var(--on-surface);
+}
+
+.weekly-page .input-modal-sub {
+ font-size: 26rpx;
+ color: var(--on-surface-variant);
+ margin-top: 4rpx;
+}
+
+.weekly-page .input-modal-close {
+ width: 80rpx;
+ height: 80rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: 999rpx;
+ background: var(--surface-container-low);
+}
+
+.weekly-page .input-modal-close-icon {
+ font-size: 42rpx;
+ color: var(--outline);
+ line-height: 1;
+ font-weight: 700;
+}
+
+.weekly-page .phone-gate-body {
+ padding: 32rpx;
+}
+
+.weekly-page .phone-gate-tip {
+ display: block;
+ font-size: 28rpx;
+ color: var(--on-surface-variant);
+ line-height: 1.6;
+ margin-bottom: 24rpx;
+}
+
+.weekly-page .phone-gate-gender-label {
+ display: block;
+ font-size: 28rpx;
+ font-weight: 700;
+ color: var(--primary);
+ margin-bottom: 16rpx;
+}
+
+.weekly-page .phone-gate-gender-row {
+ display: flex;
+ gap: 20rpx;
+ margin-bottom: 32rpx;
+}
+
+.weekly-page .phone-gate-gender-opt {
+ flex: 1;
+ min-height: 88rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ border-radius: var(--st-radius-xl);
+ background: var(--surface-container-lowest);
+ border: 2rpx solid var(--outline-variant);
+ color: var(--on-surface-variant);
+ font-size: 32rpx;
+ font-weight: 600;
+}
+
+.weekly-page .phone-gate-gender-opt.active {
+ border-color: var(--primary);
+ color: var(--primary);
+}
+
+.weekly-page .phone-gate-btn {
+ width: 100%;
+ min-height: 96rpx;
+ line-height: 96rpx;
+ border-radius: var(--st-radius-xl);
+ background: var(--primary);
+ color: var(--on-primary);
+ font-size: 32rpx;
+ font-weight: 700;
+ border: none;
+}
+
+.weekly-page .phone-gate-btn::after {
+ border: none;
+}
+
+.weekly-page .input-modal-loading {
+ min-height: 520rpx;
+ padding: 120rpx 0;
+ text-align: center;
+ color: var(--outline);
+ font-size: 30rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.weekly-page .input-modal-body {
+ flex: 1;
+ min-height: 520rpx;
+ padding: 20rpx 32rpx 28rpx;
+ box-sizing: border-box;
+ width: 100%;
+}
+
+.weekly-page .input-modal-body-ready {
+ animation: input-modal-content-in 0.34s cubic-bezier(0.22, 1, 0.36, 1) both;
+}
+
+.weekly-page .input-modal-tip {
+ background: var(--surface-container-low);
+ border: 1rpx dashed var(--outline-variant);
+ border-radius: 14rpx;
+ padding: 18rpx 20rpx;
+ font-size: 26rpx;
+ color: var(--on-surface-variant);
+ line-height: 1.5;
+ margin-bottom: 22rpx;
+}
+
+.weekly-page .input-section-title {
+ font-size: 28rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+ margin: 18rpx 0 14rpx;
+}
+
+.weekly-page .input-field {
+ display: flex;
+ align-items: center;
+ gap: 18rpx;
+ padding: 14rpx 0;
+ border-bottom: 1rpx solid var(--surface-container-low);
+ min-height: 88rpx;
+}
+
+.weekly-page .input-field-label {
+ display: flex;
+ align-items: center;
+ gap: 10rpx;
+ width: 180rpx;
+ font-size: 30rpx;
+ color: var(--on-surface);
+ font-weight: 700;
+}
+
+.weekly-page .input-field-dot {
+ width: 14rpx;
+ height: 14rpx;
+ border-radius: 999rpx;
+}
+
+.weekly-page .input-field-dot-fasting {
+ background: var(--primary);
+}
+
+.weekly-page .input-field-dot-postprandial {
+ background: var(--tertiary-container);
+}
+
+.weekly-page .input-field-dot-other {
+ background: var(--outline);
+}
+
+.weekly-page .input-field-input {
+ flex: 1;
+ min-width: 0;
+ background: var(--surface);
+ border-radius: 16rpx;
+ padding: 18rpx 20rpx;
+ min-height: 76rpx;
+ border: 2rpx solid transparent;
+}
+
+.weekly-page .input-field-input input {
+ width: 100%;
+ font-size: 34rpx;
+ color: var(--on-surface);
+ text-align: right;
+ font-weight: 600;
+}
+
+.weekly-page .input-placeholder {
+ color: var(--outline);
+ font-size: 28rpx;
+}
+
+.weekly-page .input-field-textarea textarea {
+ width: 100%;
+ min-height: 140rpx;
+ background: var(--surface);
+ border-radius: 14rpx;
+ padding: 20rpx 22rpx;
+ font-size: 30rpx;
+ color: var(--on-surface);
+ border: 2rpx solid var(--outline-variant);
+}
+
+.weekly-page .input-modal-actions {
+ display: flex;
+ gap: 18rpx;
+ padding: 20rpx 32rpx 0;
+ border-top: 1rpx solid var(--surface-container-low);
+}
+
+.weekly-page .input-modal-btn {
+ flex: 1;
+ height: 100rpx;
+ border-radius: var(--st-radius-xl);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 32rpx;
+ font-weight: 700;
+}
+
+.weekly-page .input-modal-btn.primary {
+ background: var(--primary);
+ color: var(--on-primary);
+}
+
+.weekly-page .input-modal-btn.danger {
+ flex: 0 0 180rpx;
+ background: var(--error-container);
+ color: var(--error);
+}
+
+.weekly-page .input-modal-btn.disabled {
+ opacity: 0.5;
+ pointer-events: none;
+}
diff --git a/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss b/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss
new file mode 100644
index 00000000..3e682629
--- /dev/null
+++ b/TUICallKit-Vue3/tongji/styles/weekly-stitch.scss
@@ -0,0 +1,655 @@
+/**
+ * weekly.vue — 与 code.html (Stitch Modern WeChat UI) 1:1
+ */
+
+.weekly-page {
+ --st-shadow-ambient: 0 24rpx 60rpx -20rpx rgba(0, 108, 73, 0.08), 0 8rpx 20rpx -8rpx rgba(0, 0, 0, 0.03);
+ --st-shadow-cta: 0 16rpx 32rpx rgba(0, 108, 73, 0.2);
+ --st-shadow-float: 0 16rpx 64rpx rgba(0, 108, 73, 0.15);
+}
+
+/* ===== Header ===== */
+.weekly-page .st-header {
+ position: relative;
+ display: flex;
+ align-items: center;
+ padding-left: var(--st-container-margin);
+ padding-right: var(--st-container-margin);
+ padding-bottom: 32rpx;
+ /* padding-top / padding-right 由 initHeaderSafeArea 动态设置 */
+ background: var(--surface);
+}
+
+.weekly-page .st-header-text {
+ flex: 1;
+ min-width: 0;
+ overflow: hidden;
+}
+
+.weekly-page .st-header-left {
+ display: flex;
+ align-items: center;
+ gap: var(--st-inline-gap);
+ flex: 1;
+ min-width: 0;
+}
+
+.weekly-page .st-avatar {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ background: var(--primary-container);
+ border: 4rpx solid var(--surface-container-lowest);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-greet {
+ display: block;
+ font-size: 40rpx;
+ font-weight: 700;
+ line-height: 1.27;
+ color: var(--on-surface);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.weekly-page .st-status {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+ opacity: 0.8;
+}
+
+.weekly-page .st-voice-round {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-voice-round.disabled {
+ opacity: 0.45;
+}
+
+.weekly-page .st-card-scroll {
+ margin: 0 var(--st-container-margin) 8rpx;
+ white-space: nowrap;
+}
+
+.weekly-page .st-card-row {
+ display: inline-flex;
+ gap: 16rpx;
+}
+
+.weekly-page .st-card-chip {
+ padding: 12rpx 28rpx;
+ border-radius: 999rpx;
+ font-size: 26rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+ background: var(--surface-container-lowest);
+ border: 1rpx solid var(--outline-variant);
+}
+
+.weekly-page .st-card-chip.active {
+ background: var(--primary);
+ border-color: var(--primary);
+ color: var(--on-primary);
+}
+
+/* ===== Main ===== */
+.weekly-page .st-main {
+ padding: 0 var(--st-container-margin) 32rpx;
+ display: flex;
+ flex-direction: column;
+ gap: 48rpx;
+ margin-top: 16rpx;
+}
+
+.weekly-page .st-main-spacer {
+ height: 32rpx;
+}
+
+/* CTA — rounded-2xl h-14 */
+.weekly-page .st-cta {
+ width: 100%;
+ height: 112rpx;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 16rpx;
+ border-radius: var(--st-radius-2xl);
+ background: var(--primary);
+ color: var(--on-primary);
+ font-size: 32rpx;
+ font-weight: 700;
+ box-shadow: var(--st-shadow-cta);
+}
+
+.weekly-page .st-cta:active {
+ transform: scale(0.98);
+}
+
+/* ===== Chart card — rounded-3xl ===== */
+.weekly-page .st-chart-card {
+ padding: 40rpx;
+ border-radius: 48rpx;
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(221, 228, 221, 0.3);
+ box-shadow: var(--st-shadow-ambient);
+}
+
+.weekly-page .st-chart-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 48rpx;
+}
+
+.weekly-page .st-chart-title {
+ display: block;
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-chart-sub {
+ display: block;
+ margin-top: 4rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-chart-legend {
+ display: flex;
+ gap: var(--st-inline-gap);
+}
+
+.weekly-page .st-legend-item {
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-legend-item.inactive {
+ opacity: 0.4;
+}
+
+.weekly-page .st-dot {
+ width: 16rpx;
+ height: 16rpx;
+ border-radius: 50%;
+}
+
+.weekly-page .st-dot-fasting {
+ background: var(--primary);
+}
+
+.weekly-page .st-dot-post {
+ background: var(--tertiary);
+}
+
+.weekly-page .st-chart-summary {
+ display: flex;
+ padding: 32rpx;
+ margin-bottom: 48rpx;
+ border-radius: var(--st-radius-xl);
+ background: var(--surface-container-low);
+}
+
+.weekly-page .st-chart-summary-item {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ border-right: 1rpx solid var(--surface-container-highest);
+}
+
+.weekly-page .st-chart-summary-item:last-child {
+ border-right: none;
+}
+
+.weekly-page .st-chart-summary-num {
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-chart-summary-num.is-high {
+ color: var(--tertiary);
+}
+
+.weekly-page .st-chart-summary-num.is-good {
+ color: var(--primary);
+}
+
+.weekly-page .st-chart-summary-label {
+ margin-top: 8rpx;
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-chart-area {
+ position: relative;
+ height: 360rpx;
+ border-bottom: 1rpx dashed var(--surface-container-highest);
+}
+
+.weekly-page .st-chart-canvas {
+ width: 100%;
+ height: 360rpx;
+ display: block;
+}
+
+.weekly-page .st-chart-empty,
+.weekly-page .st-chart-placeholder {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 26rpx;
+ color: var(--outline);
+}
+
+/* ===== 最新测量 ===== */
+.weekly-page .st-latest-section {
+ display: flex;
+ flex-direction: column;
+ gap: 32rpx;
+}
+
+.weekly-page .st-latest-hero {
+ position: relative;
+ overflow: hidden;
+ min-height: 320rpx;
+ padding: 48rpx 40rpx;
+ border-radius: 48rpx;
+ background: var(--surface-container-lowest);
+ box-shadow: var(--st-shadow-ambient);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+}
+
+.weekly-page .st-latest-hero.is-high {
+ background: var(--error-container);
+ color: var(--on-error-container);
+}
+
+.weekly-page .st-latest-hero-pattern {
+ position: absolute;
+ inset: 0;
+ opacity: 0.1;
+ background-image: radial-gradient(circle at 4rpx 4rpx, currentColor 2rpx, transparent 0);
+ background-size: 32rpx 32rpx;
+ pointer-events: none;
+}
+
+.weekly-page .st-latest-label {
+ position: relative;
+ z-index: 1;
+ font-size: 24rpx;
+ font-weight: 600;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+ opacity: 0.9;
+ margin-bottom: 8rpx;
+}
+
+.weekly-page .st-latest-value-row {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ align-items: baseline;
+ gap: 8rpx;
+}
+
+.weekly-page .st-latest-value {
+ font-size: 112rpx;
+ font-weight: 800;
+ line-height: 1;
+ letter-spacing: -0.02em;
+}
+
+.weekly-page .st-latest-hero.is-high .st-latest-value,
+.weekly-page .st-latest-hero.is-high .st-latest-unit {
+ color: var(--on-error-container);
+}
+
+.weekly-page .st-latest-unit {
+ font-size: 32rpx;
+ font-weight: 500;
+ opacity: 0.8;
+}
+
+.weekly-page .st-latest-flag {
+ position: relative;
+ z-index: 1;
+ margin-top: 24rpx;
+ display: inline-flex;
+ align-items: center;
+ gap: 12rpx;
+ padding: 8rpx 24rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.3);
+ font-size: 24rpx;
+ font-weight: 700;
+}
+
+.weekly-page .st-summary-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 24rpx;
+}
+
+.weekly-page .st-summary-card {
+ padding: 32rpx;
+ border-radius: var(--st-radius-2xl);
+ background: var(--surface-container-lowest);
+ border: 1rpx solid rgba(221, 228, 221, 0.5);
+ box-shadow: var(--st-shadow-ambient);
+ display: flex;
+ flex-direction: column;
+ gap: 8rpx;
+}
+
+.weekly-page .st-summary-label {
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-summary-value {
+ font-size: 48rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-summary-value.is-high {
+ color: var(--tertiary);
+}
+
+.weekly-page .st-summary-tag {
+ align-self: flex-start;
+ padding: 4rpx 16rpx;
+ border-radius: 8rpx;
+ font-size: 20rpx;
+ font-weight: 600;
+ color: var(--tertiary);
+ background: rgba(255, 218, 214, 0.5);
+}
+
+/* ===== AI 饮食 ===== */
+.weekly-page .st-ai-section {
+ position: relative;
+ overflow: hidden;
+ padding: 40rpx;
+ border-radius: 48rpx;
+ background: linear-gradient(135deg, rgba(0, 108, 73, 0.1) 0%, rgba(0, 108, 73, 0.05) 100%);
+ border: 1rpx solid rgba(0, 108, 73, 0.1);
+}
+
+.weekly-page .st-ai-deco {
+ position: absolute;
+ width: 256rpx;
+ height: 256rpx;
+ top: -64rpx;
+ right: -64rpx;
+ border-radius: 50%;
+ background: rgba(78, 222, 163, 0.2);
+ filter: blur(40rpx);
+ pointer-events: none;
+}
+
+.weekly-page .st-ai-head {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 16rpx;
+}
+
+.weekly-page .st-ai-head-left {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+}
+
+.weekly-page .st-ai-icon {
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 50%;
+ background: var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.weekly-page .st-ai-icon.thinking {
+ animation: st-pulse 1.2s ease-in-out infinite;
+}
+
+@keyframes st-pulse {
+ 50% { opacity: 0.65; }
+}
+
+.weekly-page .st-ai-title {
+ font-size: 40rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-ai-refresh {
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ padding: 12rpx 24rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.5);
+ font-size: 24rpx;
+ font-weight: 600;
+ color: var(--primary);
+}
+
+.weekly-page .st-ai-refresh.disabled {
+ opacity: 0.5;
+}
+
+.weekly-page .st-ai-sub {
+ position: relative;
+ z-index: 1;
+ display: block;
+ margin-bottom: 32rpx;
+ font-size: 28rpx;
+ line-height: 1.43;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-meal-list {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 24rpx;
+}
+
+.weekly-page .st-meal-glass {
+ padding: 32rpx;
+ border-radius: var(--st-radius-2xl);
+ background: rgba(255, 255, 255, 0.8);
+ border: 1rpx solid #ffffff;
+ box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.04);
+}
+
+.weekly-page .st-meal-head {
+ display: flex;
+ align-items: center;
+ gap: 16rpx;
+ margin-bottom: 16rpx;
+}
+
+.weekly-page .st-meal-label {
+ font-size: 28rpx;
+ font-weight: 700;
+ color: var(--on-surface);
+}
+
+.weekly-page .st-meal-text {
+ font-size: 28rpx;
+ line-height: 1.43;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .st-skeleton-line {
+ height: 28rpx;
+ margin-bottom: 16rpx;
+ border-radius: 8rpx;
+ background: rgba(255, 255, 255, 0.5);
+}
+
+.weekly-page .st-skeleton-hint {
+ font-size: 26rpx;
+ color: var(--outline);
+ text-align: center;
+}
+
+/* ===== 底部浮动输入 ===== */
+.weekly-page .st-float-ask {
+ position: fixed;
+ left: var(--st-container-margin);
+ right: var(--st-container-margin);
+ bottom: calc(24rpx + env(safe-area-inset-bottom));
+ z-index: 90;
+}
+
+.weekly-page .st-float-inner {
+ display: flex;
+ align-items: center;
+ gap: 24rpx;
+ padding: 16rpx 16rpx 16rpx 40rpx;
+ border-radius: 999rpx;
+ background: rgba(255, 255, 255, 0.9);
+ backdrop-filter: blur(20rpx);
+ border: 1rpx solid rgba(0, 108, 73, 0.1);
+ box-shadow: var(--st-shadow-float);
+}
+
+.weekly-page .st-float-icon {
+ width: 64rpx;
+ height: 64rpx;
+ border-radius: 50%;
+ background: rgba(0, 108, 73, 0.1);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.weekly-page .st-float-input {
+ flex: 1;
+ min-width: 0;
+ height: 64rpx;
+ font-size: 28rpx;
+ color: var(--on-surface);
+ background: transparent;
+}
+
+.weekly-page .st-float-placeholder {
+ color: rgba(60, 74, 66, 0.6);
+ font-size: 28rpx;
+}
+
+.weekly-page .st-float-send {
+ width: 80rpx;
+ height: 80rpx;
+ border-radius: 50%;
+ background: var(--primary);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+ box-shadow: 0 4rpx 12rpx rgba(0, 108, 73, 0.2);
+}
+
+.weekly-page .st-float-send.disabled {
+ opacity: 0.55;
+}
+
+.weekly-page .st-float-send:active {
+ transform: scale(0.95);
+}
+
+.weekly-page .st-float-result {
+ margin-top: 16rpx;
+ padding: 24rpx 32rpx;
+ border-radius: var(--st-radius-xl);
+ background: rgba(255, 255, 255, 0.95);
+ border: 1rpx solid var(--outline-variant);
+ box-shadow: var(--st-shadow-ambient);
+}
+
+.weekly-page .st-float-badge {
+ display: inline-block;
+ margin-bottom: 8rpx;
+ padding: 4rpx 12rpx;
+ border-radius: 8rpx;
+ font-size: 22rpx;
+ font-weight: 700;
+ color: var(--primary);
+ background: rgba(0, 108, 73, 0.1);
+}
+
+.weekly-page .st-float-advice {
+ font-size: 28rpx;
+ line-height: 1.5;
+ color: var(--on-surface-variant);
+}
+
+.weekly-page .ai-stream-cursor {
+ animation: st-blink 0.8s step-end infinite;
+}
+
+@keyframes st-blink {
+ 50% { opacity: 0; }
+}
+
+.weekly-page .chart-tip {
+ position: absolute;
+ z-index: 10;
+ padding: 12rpx 16rpx;
+ border-radius: 12rpx;
+ background: rgba(22, 29, 25, 0.88);
+ color: #fff;
+ font-size: 22rpx;
+ pointer-events: none;
+}
+
+.weekly-page .chart-tip-date {
+ font-weight: 700;
+ margin-bottom: 8rpx;
+}
+
+.weekly-page .chart-tip-row {
+ display: flex;
+ align-items: center;
+ gap: 8rpx;
+ margin-top: 4rpx;
+}