Просмотр исходного кода

merge(frontend): 合并 U1 小程序 UI 令牌收敛(font-scale 补漏 / 品牌色变量化 / AI 味文案清理 / uni.scss 新增 spacing 令牌)

Agnes Agent 2 недель назад
Родитель
Сommit
ea43a6c793
100 измененных файлов с 570 добавлено и 570 удалено
  1. 2 2
      cfc-frontend/components/BadgeGrid.vue
  2. 3 3
      cfc-frontend/components/BaseBadge.vue
  3. 1 1
      cfc-frontend/components/BaseLoading.vue
  4. 2 2
      cfc-frontend/components/ConfigurableGuide.vue
  5. 1 1
      cfc-frontend/components/ContentSharePoster.vue
  6. 7 7
      cfc-frontend/components/DimensionActivities.vue
  7. 2 2
      cfc-frontend/components/DimensionArticles.vue
  8. 1 1
      cfc-frontend/components/DimensionIntroCard.vue
  9. 3 3
      cfc-frontend/components/DimensionProducts.vue
  10. 1 1
      cfc-frontend/components/DimensionTasks.vue
  11. 3 3
      cfc-frontend/components/DimensionVisitorCard.vue
  12. 3 3
      cfc-frontend/components/FamilyChallengeCard.vue
  13. 1 1
      cfc-frontend/components/FamilyEmptyState/FamilyEmptyState.vue
  14. 4 4
      cfc-frontend/components/FamilyEnergyBar.vue
  15. 5 5
      cfc-frontend/components/FamilyFeed.vue
  16. 4 4
      cfc-frontend/components/FamilyMemberCard.vue
  17. 1 1
      cfc-frontend/components/GenerationPicker.vue
  18. 5 5
      cfc-frontend/components/HealthBadge.vue
  19. 2 2
      cfc-frontend/components/LoginGuideCard.vue
  20. 11 11
      cfc-frontend/components/MemberSelector.vue
  21. 2 2
      cfc-frontend/components/OnboardingGuide.vue
  22. 1 1
      cfc-frontend/components/OnboardingProgressBar.vue
  23. 1 1
      cfc-frontend/components/PageBanner.vue
  24. 4 4
      cfc-frontend/components/PlayfulButton.vue
  25. 2 2
      cfc-frontend/components/ProfileBadges.vue
  26. 1 1
      cfc-frontend/components/RadarChart.vue
  27. 5 5
      cfc-frontend/components/RecommendedFeed.vue
  28. 4 4
      cfc-frontend/components/RelatedContent.vue
  29. 2 2
      cfc-frontend/components/TagChip.vue
  30. 1 1
      cfc-frontend/components/TrendChart.vue
  31. 5 5
      cfc-frontend/components/address-picker.vue
  32. 2 2
      cfc-frontend/components/gate-lock.vue
  33. 2 2
      cfc-frontend/components/hand-signature/hand-signature.vue
  34. 6 6
      cfc-frontend/components/login-sheet.vue
  35. 3 3
      cfc-frontend/components/report-upload-card.vue
  36. 2 2
      cfc-frontend/components/tab-transition.vue
  37. 10 10
      cfc-frontend/components/wuxing-sandbox.vue
  38. 1 1
      cfc-frontend/custom-tab-bar/index.vue
  39. 5 5
      cfc-frontend/pages/achievement/index.vue
  40. 9 9
      cfc-frontend/pages/action-detail/components/AbilityDiagram.vue
  41. 8 8
      cfc-frontend/pages/action-detail/components/OctopusDiagram.vue
  42. 8 8
      cfc-frontend/pages/action-detail/components/PearlDiagram.vue
  43. 5 5
      cfc-frontend/pages/action-detail/contact-detail.vue
  44. 8 8
      cfc-frontend/pages/action-detail/index.vue
  45. 5 5
      cfc-frontend/pages/action-detail/interaction-log.vue
  46. 2 2
      cfc-frontend/pages/action-detail/member-action-detail.vue
  47. 5 5
      cfc-frontend/pages/action-detail/octopus-add-effect.vue
  48. 5 5
      cfc-frontend/pages/action-detail/octopus-add-key-person.vue
  49. 4 4
      cfc-frontend/pages/action-detail/octopus-effects-list.vue
  50. 1 1
      cfc-frontend/pages/action-detail/pearl-add-resource.vue
  51. 4 4
      cfc-frontend/pages/action-detail/relationship-questionnaire.vue
  52. 47 47
      cfc-frontend/pages/activity/activity-detail/activity-detail.vue
  53. 9 9
      cfc-frontend/pages/activity/components/ActivityPoster.vue
  54. 5 5
      cfc-frontend/pages/activity/create.vue
  55. 21 21
      cfc-frontend/pages/activity/index.vue
  56. 4 4
      cfc-frontend/pages/activity/order-pay/order-pay.vue
  57. 10 10
      cfc-frontend/pages/ai/chat.vue
  58. 1 1
      cfc-frontend/pages/ai/components/AITaskCard.vue
  59. 2 2
      cfc-frontend/pages/ai/components/UpgradeGuideModal.vue
  60. 26 26
      cfc-frontend/pages/article-center/article-detail.vue
  61. 6 6
      cfc-frontend/pages/article-center/article-edit.vue
  62. 15 15
      cfc-frontend/pages/article-center/index.vue
  63. 3 3
      cfc-frontend/pages/article-center/my-posts.vue
  64. 2 2
      cfc-frontend/pages/assessment-plan/detail.vue
  65. 3 3
      cfc-frontend/pages/assessment-plan/list.vue
  66. 7 7
      cfc-frontend/pages/assessment/apply.vue
  67. 1 1
      cfc-frontend/pages/assessment/execution.vue
  68. 9 9
      cfc-frontend/pages/assessment/purchase.vue
  69. 4 4
      cfc-frontend/pages/assessment/quota.vue
  70. 1 1
      cfc-frontend/pages/assessment/rating.vue
  71. 5 5
      cfc-frontend/pages/assessment/results.vue
  72. 2 2
      cfc-frontend/pages/assessment/upload-report.vue
  73. 5 5
      cfc-frontend/pages/body-detail/checkin.vue
  74. 3 3
      cfc-frontend/pages/body-detail/dimension-detail.vue
  75. 4 4
      cfc-frontend/pages/body-detail/dimension-questionnaire.vue
  76. 8 8
      cfc-frontend/pages/body-detail/health-dimensions.vue
  77. 9 9
      cfc-frontend/pages/body-detail/health-report.vue
  78. 8 8
      cfc-frontend/pages/body-detail/index.vue
  79. 1 1
      cfc-frontend/pages/body-detail/member-body-detail.vue
  80. 3 3
      cfc-frontend/pages/butler/apply.vue
  81. 3 3
      cfc-frontend/pages/butler/select.vue
  82. 2 2
      cfc-frontend/pages/child/rewards.vue
  83. 7 7
      cfc-frontend/pages/child/tasks.vue
  84. 4 4
      cfc-frontend/pages/cognitive-hall.vue
  85. 5 5
      cfc-frontend/pages/cognitive-test/language-test.vue
  86. 2 2
      cfc-frontend/pages/cognitive-test/logic-test.vue
  87. 5 5
      cfc-frontend/pages/cognitive-test/memory-test.vue
  88. 5 5
      cfc-frontend/pages/cognitive-test/perception-test.vue
  89. 3 3
      cfc-frontend/pages/cognitive-test/spatial-test.vue
  90. 4 4
      cfc-frontend/pages/cognitive-test/speed-test.vue
  91. 1 1
      cfc-frontend/pages/dan-assessment/comparison.vue
  92. 6 6
      cfc-frontend/pages/dan-assessment/report-result.vue
  93. 7 7
      cfc-frontend/pages/diet/food-query.vue
  94. 13 13
      cfc-frontend/pages/diet/index.vue
  95. 5 5
      cfc-frontend/pages/diet/meal-config.vue
  96. 4 4
      cfc-frontend/pages/diet/preferences.vue
  97. 10 10
      cfc-frontend/pages/diet/recommendation.vue
  98. 8 8
      cfc-frontend/pages/diet/record-detail.vue
  99. 30 30
      cfc-frontend/pages/diet/records.vue
  100. 37 37
      cfc-frontend/pages/discover-detail/product-detail/product-detail.vue

+ 2 - 2
cfc-frontend/components/BadgeGrid.vue

@@ -51,6 +51,6 @@ export default {
   margin-bottom: 8rpx;
 }
 .badge-icon-wrap--locked { background: $uni-border-color-light; }
-.badge-icon { font-size: 36rpx; }
-.badge-name { font-size: 22rpx; color: $facade-text-strong; text-align: center; }
+.badge-icon { font-size: calc(36rpx * var(--font-scale, 1)); }
+.badge-name { font-size: calc(22rpx * var(--font-scale, 1)); color: $facade-text-strong; text-align: center; }
 </style>

+ 3 - 3
cfc-frontend/components/BaseBadge.vue

@@ -29,9 +29,9 @@ export default {
 }
 
 /* Sizes */
-.base-badge--xs { font-size: 20rpx; padding: 4rpx 14rpx; line-height: 1.4; }
-.base-badge--sm { font-size: 22rpx; padding: 6rpx 18rpx; line-height: 1.4; }
-.base-badge--md { font-size: 24rpx; padding: 8rpx 24rpx; line-height: 1.5; }
+.base-badge--xs { font-size: calc(20rpx * var(--font-scale, 1)); padding: 4rpx 14rpx; line-height: 1.4; }
+.base-badge--sm { font-size: calc(22rpx * var(--font-scale, 1)); padding: 6rpx 18rpx; line-height: 1.4; }
+.base-badge--md { font-size: calc(24rpx * var(--font-scale, 1)); padding: 8rpx 24rpx; line-height: 1.5; }
 
 /* Variants */
 .base-badge--primary {

+ 1 - 1
cfc-frontend/components/BaseLoading.vue

@@ -57,7 +57,7 @@ export default {
 .base-loading__dot:nth-child(3) { animation-delay: 0.4s; }
 
 .base-loading__text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: var(--muted, $app-text-subtle);
 }
 </style>

+ 2 - 2
cfc-frontend/components/ConfigurableGuide.vue

@@ -135,7 +135,7 @@ export default {
   justify-content: center;
   padding: 72rpx 56rpx 40rpx;
 }
-.cg-icon { font-size: 80rpx; margin-bottom: 32rpx; display: block; }
+.cg-icon { font-size: calc(80rpx * var(--font-scale, 1)); margin-bottom: 32rpx; display: block; }
 .cg-img { width: 160rpx; height: 160rpx; margin-bottom: 32rpx; }
 .cg-title {
   font-size: calc(36rpx * var(--font-scale, 1));
@@ -164,7 +164,7 @@ export default {
   height: 88rpx;
   border-radius: 999rpx;
   color: $app-surface;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: 700;
   display: flex;
   align-items: center;

+ 1 - 1
cfc-frontend/components/ContentSharePoster.vue

@@ -799,7 +799,7 @@ export default {
 .poster-btn {
   height: 80rpx;
   line-height: 80rpx;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   border-radius: 40rpx;
   text-align: center;
   border: none;

+ 7 - 7
cfc-frontend/components/DimensionActivities.vue

@@ -249,7 +249,7 @@ export default {
   margin-right: 12rpx;
 }
 .section-icon {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
 }
 .section-title {
   font-size: calc(32rpx * var(--font-scale, 1));
@@ -271,7 +271,7 @@ export default {
   margin-right: 4rpx;
 }
 .section-more-arrow {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $app-text-subtle;
 }
 
@@ -283,7 +283,7 @@ export default {
   padding: 30rpx 0;
 }
 .empty-icon {
-  font-size: 64rpx;
+  font-size: calc(64rpx * var(--font-scale, 1));
   margin-bottom: 16rpx;
 }
 .empty-tip {
@@ -394,7 +394,7 @@ export default {
 }
 
 .meta-icon {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   margin-right: 6rpx;
 }
 
@@ -422,7 +422,7 @@ export default {
 }
 
 .badge-icon {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   line-height: 1;
 }
 
@@ -452,7 +452,7 @@ export default {
 }
 
 .card-price {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $brand-primary;
 }
@@ -463,7 +463,7 @@ export default {
 }
 
 .card-price-free {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $status-success-2;
 }

+ 2 - 2
cfc-frontend/components/DimensionArticles.vue

@@ -199,7 +199,7 @@ export default {
   margin-bottom: 10rpx;
 }
 .weight-badge {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   padding: 2rpx 10rpx;
   border-radius: 8rpx;
   font-weight: 500;
@@ -223,7 +223,7 @@ export default {
   margin-right: 24rpx;
 }
 .meta-icon {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   margin-right: 6rpx;
 }
 .meta-text {

+ 1 - 1
cfc-frontend/components/DimensionIntroCard.vue

@@ -80,7 +80,7 @@ export default {
   margin-bottom: 20rpx;
 }
 .dim-intro-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   margin-right: 16rpx;
 }
 .dim-intro-text {

+ 3 - 3
cfc-frontend/components/DimensionProducts.vue

@@ -200,7 +200,7 @@ export default {
   align-items: baseline;
 }
 .product-price {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: bold;
 }
@@ -230,7 +230,7 @@ export default {
   white-space: normal;
 }
 .product-price-mall {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
 }
 .empty-state {
   display: flex;
@@ -254,7 +254,7 @@ export default {
   width: 100%;
 }
 .loading-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .no-more {

+ 1 - 1
cfc-frontend/components/DimensionTasks.vue

@@ -112,7 +112,7 @@ export default {
   border-color: $status-success-2;
 }
 .task-check-icon {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $app-surface;
   font-weight: bold;
 }

+ 3 - 3
cfc-frontend/components/DimensionVisitorCard.vue

@@ -160,7 +160,7 @@ export default {
   line-height: 88rpx;
   border-radius: 44rpx;
   color: $app-surface;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 600;
   border: none;
   padding: 0;
@@ -172,7 +172,7 @@ export default {
   line-height: 88rpx;
   border-radius: 44rpx;
   background: $app-surface;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 500;
   border: 2rpx solid;
   padding: 0;
@@ -190,7 +190,7 @@ export default {
   align-items: center;
 }
 .dvc-preview-icon {
-  font-size: 44rpx;
+  font-size: calc(44rpx * var(--font-scale, 1));
   margin-bottom: 14rpx;
 }
 .dvc-preview-text {

+ 3 - 3
cfc-frontend/components/FamilyChallengeCard.vue

@@ -238,7 +238,7 @@ export default {
   margin-bottom: 6rpx;
 }
 .member-status-tag {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   padding: 2rpx 10rpx;
   border-radius: 999rpx;
 }
@@ -355,13 +355,13 @@ export default {
   border-radius: 999rpx;
   background: $status-success;
   color: $app-surface;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   font-weight: 600;
 }
 .respond-btn {
   padding: 10rpx 24rpx;
   border-radius: 999rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   font-weight: 600;
   margin-left: 12rpx;
 }

+ 1 - 1
cfc-frontend/components/FamilyEmptyState/FamilyEmptyState.vue

@@ -32,7 +32,7 @@ export default {
 .family-empty-card { padding: 24rpx 16rpx; }
 .family-empty-block { padding: 60rpx 24rpx; }
 .family-empty-list { padding: 40rpx 16rpx; }
-.empty-icon { font-size: 48rpx; margin-bottom: 12rpx; }
+.empty-icon { font-size: calc(48rpx * var(--font-scale, 1)); margin-bottom: 12rpx; }
 .empty-title { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-strong; margin-bottom: 8rpx; }
 .empty-desc { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-muted; margin-bottom: 16rpx; }
 </style>

+ 4 - 4
cfc-frontend/components/FamilyEnergyBar.vue

@@ -180,11 +180,11 @@ export default {
   align-items: center;
   margin-bottom: 20rpx;
 }
-.bar-icon { font-size: 32rpx; margin-right: 8rpx; }
+.bar-icon { font-size: calc(32rpx * var(--font-scale, 1)); margin-right: 8rpx; }
 .bar-title { font-size: calc(28rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; flex: 1; }
 .bar-total-score { font-size: calc(40rpx * var(--font-scale, 1)); font-weight: bold; color: $brand-primary; margin-right: 12rpx; }
 .bar-expand-icon {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $facade-text-ghost-light;
   transition: transform 0.3s ease;
 }
@@ -225,7 +225,7 @@ export default {
   flex-shrink: 0;
 }
 .bar-arrow {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-ghost;
   margin-left: 8rpx;
 }
@@ -265,7 +265,7 @@ export default {
   margin-right: 6rpx;
 }
 .legend-label {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 </style>

+ 5 - 5
cfc-frontend/components/FamilyFeed.vue

@@ -255,7 +255,7 @@ export default {
 }
 
 .feed-title { font-size: calc(24rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; }
-.feed-icon  { font-size: 20rpx; }
+.feed-icon  { font-size: calc(20rpx * var(--font-scale, 1)); }
 
 @keyframes spin {
   0%, 100% { transform: rotate(0deg); }
@@ -325,7 +325,7 @@ export default {
 
 .feed-count {
   flex-shrink: 0; margin-left: 12rpx;
-  font-size: 20rpx; color: $brand-primary;
+  font-size: calc(20rpx * var(--font-scale, 1)); color: $brand-primary;
   background: rgba(249,115,22,0.1);
   border-radius: 999rpx; padding: 2rpx 12rpx; line-height: 1.4;
 }
@@ -363,12 +363,12 @@ export default {
   display: flex; align-items: center; justify-content: center;
   margin-right: 16rpx; flex-shrink: 0;
 }
-.feed-detail-icon { font-size: 34rpx; }
+.feed-detail-icon { font-size: calc(34rpx * var(--font-scale, 1)); }
 
 .feed-detail-head-texts { flex: 1; min-width: 0; display: flex; flex-direction: column; }
 .feed-detail-type { font-size: calc(26rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; }
 .feed-detail-time { font-size: calc(20rpx * var(--font-scale, 1)); color: $facade-text-muted; margin-top: 4rpx; }
-.feed-detail-close { font-size: 40rpx; color: $facade-text-ghost-light; line-height: 1; padding: 0 8rpx; flex-shrink: 0; }
+.feed-detail-close { font-size: calc(40rpx * var(--font-scale, 1)); color: $facade-text-ghost-light; line-height: 1; padding: 0 8rpx; flex-shrink: 0; }
 
 .feed-detail-title {
   display: block; font-size: calc(30rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong;
@@ -388,5 +388,5 @@ export default {
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   display: flex; align-items: center; justify-content: center;
 }
-.feed-detail-btn-text { font-size: 28rpx; color: $app-surface; font-weight: bold; }
+.feed-detail-btn-text { font-size: calc(28rpx * var(--font-scale, 1)); color: $app-surface; font-weight: bold; }
 </style>

+ 4 - 4
cfc-frontend/components/FamilyMemberCard.vue

@@ -162,7 +162,7 @@ export default {
   justify-content: center;
 }
 .spouse-icon {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
 }
 /* 待办角标 */
 .card-pending-badge {
@@ -174,7 +174,7 @@ export default {
   padding: 0 8rpx;
   background: #FF6B6B;
   color: #fff;
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   border-radius: 16rpx;
   text-align: center;
   line-height: 32rpx;
@@ -222,7 +222,7 @@ export default {
   margin-top: 2rpx;
 }
 .contact-icon {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
 }
 .contact-phone {
   font-size: calc(16rpx * var(--font-scale, 1));
@@ -258,7 +258,7 @@ export default {
   justify-content: center;
 }
 .mark-icon {
-  font-size: 16rpx;
+  font-size: calc(16rpx * var(--font-scale, 1));
   color: $app-surface;
   font-weight: bold;
 }

+ 1 - 1
cfc-frontend/components/GenerationPicker.vue

@@ -116,7 +116,7 @@ export default {
 }
 .form-item .label {
   display: block;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-strong;
   margin-bottom: 10rpx;
   font-weight: bold;

+ 5 - 5
cfc-frontend/components/HealthBadge.vue

@@ -58,10 +58,10 @@ export default {
 .badge-lv-3 { background: $status-warning-soft; }
 .badge-lv-4 { background: $brand-primary-light-2; }
 .badge-lv-5 { background: #FECDD3; }
-.badge-icon { font-size: 40rpx; }
+.badge-icon { font-size: calc(40rpx * var(--font-scale, 1)); }
 .badge-info { flex: 1; min-width: 0; }
 .badge-title {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 700;
   color: $status-success-strong;
 }
@@ -72,12 +72,12 @@ export default {
   margin-top: 4rpx;
 }
 .badge-level {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $status-success-deep-2;
   font-weight: 600;
 }
 .badge-score {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-slate;
 }
 .badge-progress-bar {
@@ -94,7 +94,7 @@ export default {
   transition: width 0.5s ease;
 }
 .badge-next {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $facade-text-slate;
   margin-top: 4rpx;
   display: block;

+ 2 - 2
cfc-frontend/components/LoginGuideCard.vue

@@ -42,7 +42,7 @@ export default {
   padding: 40rpx 32rpx;
   text-align: center;
 }
-.guide-icon { font-size: 48rpx; }
+.guide-icon { font-size: calc(48rpx * var(--font-scale, 1)); }
 .guide-title {
   font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
@@ -65,7 +65,7 @@ export default {
 .guide-btn {
   padding: 16rpx 48rpx;
   border-radius: 40rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 500;
 }
 .guide-btn.primary {

+ 11 - 11
cfc-frontend/components/MemberSelector.vue

@@ -135,7 +135,7 @@
         <view class="empty-content">
           <text class="empty-icon">🏠</text>
           <text class="empty-title">还未创建家庭</text>
-          <text class="empty-desc">创建家庭,开启全家幸福之旅</text>
+          <text class="empty-desc">创建家庭,全家幸福从今天开始</text>
           <view class="empty-btn" @click="onCreateFamily">+ 创建家庭</view>
         </view>
       </view>
@@ -644,7 +644,7 @@ export default {
   background: $facade-fill-gray-100;
 }
 .action-item-icon {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   margin-right: 16rpx;
 }
 .action-item-text {
@@ -681,7 +681,7 @@ export default {
   flex-direction: column;
   align-items: center;
 }
-.empty-icon { font-size: 56rpx; }
+.empty-icon { font-size: calc(56rpx * var(--font-scale, 1)); }
 .empty-title { font-size: calc(30rpx * var(--font-scale, 1)); font-weight: 600; color: $facade-text-gray-800; margin-top: 12rpx; }
 .empty-desc { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-gray-400; margin-top: 8rpx; }
 .empty-btn {
@@ -689,7 +689,7 @@ export default {
   padding: 16rpx 48rpx;
   background: $brand-primary;
   color: $app-surface;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   border-radius: 40rpx;
 }
 /* Action Sheet 头部 */
@@ -817,7 +817,7 @@ $tab-dims: (
   border-radius: 18rpx;
   background: $brand-primary;
   color: $app-surface;
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   font-weight: 600;
   display: flex;
   align-items: center;
@@ -830,7 +830,7 @@ $tab-dims: (
   max-width: 200rpx;
 }
 .tab-name {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $app-text;
   line-height: 1.3;
@@ -846,18 +846,18 @@ $tab-dims: (
   gap: 10rpx;
 }
 .tab-relation {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $app-text-muted;
   line-height: 1.2;
 }
 .tab-score {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   font-weight: 700;
   color: $app-text-secondary;
   line-height: 1.2;
 }
 .tab-score-unit {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   font-weight: 400;
   margin-left: 1rpx;
 }
@@ -878,7 +878,7 @@ $tab-dims: (
   }
 }
 .tab-manage-icon {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $app-text-secondary;
   font-weight: 500;
 }
@@ -903,7 +903,7 @@ $tab-dims: (
   border-radius: 40rpx;
   background: $brand-primary;
   color: $app-surface;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   font-weight: 500;
 
   &:active {

+ 2 - 2
cfc-frontend/components/OnboardingGuide.vue

@@ -195,7 +195,7 @@ export default {
 }
 
 .onboarding-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 32rpx;
   display: block;
 }
@@ -274,7 +274,7 @@ export default {
   border-radius: 999rpx;
   background: var(--color-primary, $brand-primary);
   color: $app-surface;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: 700;
   display: flex;
   align-items: center;

+ 1 - 1
cfc-frontend/components/OnboardingProgressBar.vue

@@ -91,7 +91,7 @@ export default {
   color: $mat-orange-deep;
 }
 .opb-count {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary-deep;
 }
 .opb-bar {

+ 1 - 1
cfc-frontend/components/PageBanner.vue

@@ -124,7 +124,7 @@ export default {
 }
 
 .banner-tagline {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   opacity: 0.85;
   line-height: 1.4;
   margin-top: 2rpx;

+ 4 - 4
cfc-frontend/components/PlayfulButton.vue

@@ -102,10 +102,10 @@ export default {
 }
 
 /* ---- Sizes ---- */
-.playful-btn--xs { font-size: 22rpx; padding: 8rpx 20rpx; }
-.playful-btn--sm { font-size: 24rpx; padding: 12rpx 28rpx; }
-.playful-btn--md { font-size: 28rpx; padding: 16rpx 36rpx; }
-.playful-btn--lg { font-size: 32rpx; padding: 20rpx 48rpx; min-height: 88rpx; }
+.playful-btn--xs { font-size: calc(22rpx * var(--font-scale, 1)); padding: 8rpx 20rpx; }
+.playful-btn--sm { font-size: calc(24rpx * var(--font-scale, 1)); padding: 12rpx 28rpx; }
+.playful-btn--md { font-size: calc(28rpx * var(--font-scale, 1)); padding: 16rpx 36rpx; }
+.playful-btn--lg { font-size: calc(32rpx * var(--font-scale, 1)); padding: 20rpx 48rpx; min-height: 88rpx; }
 
 /* ---- States ---- */
 .playful-btn:active:not(:disabled) {

+ 2 - 2
cfc-frontend/components/ProfileBadges.vue

@@ -155,7 +155,7 @@ export default {
   align-items: center;
   justify-content: center;
   margin-bottom: 8rpx;
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
 }
 .badge-icon-wrap.unlocked {
   background: linear-gradient(135deg, #fdfbfb, #ebedee);
@@ -166,7 +166,7 @@ export default {
   opacity: 0.5;
 }
 .badge-name {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   text-align: center;
 }

+ 1 - 1
cfc-frontend/components/RadarChart.vue

@@ -914,7 +914,7 @@ export default {
 }
 
 .legend-text {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $uni-text-color-secondary;
   font-weight: 500;
 }

+ 5 - 5
cfc-frontend/components/RecommendedFeed.vue

@@ -206,7 +206,7 @@ export default {
   margin-bottom: 6rpx;
 }
 .feed-type-badge {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   padding: 2rpx 8rpx;
   border-radius: 6rpx;
   font-weight: 500;
@@ -220,7 +220,7 @@ export default {
   color: $brand-primary-dark;
 }
 .feed-status-badge {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   padding: 2rpx 8rpx;
   border-radius: 6rpx;
 }
@@ -237,14 +237,14 @@ export default {
   line-height: 1.4;
 }
 .feed-title-placeholder {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-ghost;
   display: block;
   margin-bottom: 6rpx;
   min-height: 36rpx;
 }
 .feed-price {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: 600;
 }
@@ -262,7 +262,7 @@ export default {
   color: $facade-text-ghost-light;
 }
 .feed-sub-placeholder {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-ghost;
 }
 .line-clamp-2 {

+ 4 - 4
cfc-frontend/components/RelatedContent.vue

@@ -315,7 +315,7 @@ export default {
   justify-content: center;
 }
 .related-loading-text {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-gray-400;
 }
 .related-section {
@@ -411,17 +411,17 @@ export default {
   color: $facade-text-muted;
 }
 .ra-price {
-  font-size: 23rpx;
+  font-size: calc(23rpx * var(--font-scale, 1));
   color: $status-danger;
   font-weight: 600;
 }
 .ra-price-free {
-  font-size: 23rpx;
+  font-size: calc(23rpx * var(--font-scale, 1));
   color: $facade-text-gray-400;
 }
 .related-loading-hint {
   text-align: center;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-gray-400;
   padding: 16rpx 0 8rpx;
 }

+ 2 - 2
cfc-frontend/components/TagChip.vue

@@ -50,7 +50,7 @@ export default {
 }
 
 .tag-chip__label {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 
@@ -75,7 +75,7 @@ export default {
 }
 
 .tag-chip--body .tag-chip__label {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
 }
 
 .tag-chip--body.is-active {

+ 1 - 1
cfc-frontend/components/TrendChart.vue

@@ -297,7 +297,7 @@ export default {
   margin-right: 8rpx;
 }
 .legend-text {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-slate-deep;
 }
 </style>

+ 5 - 5
cfc-frontend/components/address-picker.vue

@@ -389,7 +389,7 @@ export default {
 }
 
 .address-arrow {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-left: 10rpx;
 }
@@ -426,7 +426,7 @@ export default {
 }
 
 .picker-btn {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-body;
   padding: 10rpx 20rpx;
 }
@@ -437,7 +437,7 @@ export default {
 }
 
 .picker-title {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $facade-text-strong;
 }
@@ -466,7 +466,7 @@ export default {
 }
 
 .crumb-arrow {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin: 0 8rpx;
 }
@@ -507,6 +507,6 @@ export default {
   padding: 40rpx;
   text-align: center;
   color: $facade-text-muted;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
 }
 </style>

+ 2 - 2
cfc-frontend/components/gate-lock.vue

@@ -99,7 +99,7 @@ export default {
   text-align: center;
 }
 .lock-icon {
-  font-size: 64rpx;
+  font-size: calc(64rpx * var(--font-scale, 1));
   margin-bottom: 16rpx;
   opacity: 0.8;
 }
@@ -142,7 +142,7 @@ export default {
   width: 70%;
   height: 80rpx;
   line-height: 80rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $app-surface;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-dark);
   border: none;

+ 2 - 2
cfc-frontend/components/hand-signature/hand-signature.vue

@@ -327,7 +327,7 @@ export default {
   height: 72rpx;
   line-height: 72rpx;
   margin-right: 20rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-body;
   background: $facade-fill-2;
   border: none;
@@ -340,7 +340,7 @@ export default {
   flex: 0 0 200rpx;
   height: 72rpx;
   line-height: 72rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $app-surface;
   background: linear-gradient(135deg, $accent-indigo 0%, $accent-indigo-deep 100%);
   border: none;

+ 6 - 6
cfc-frontend/components/login-sheet.vue

@@ -33,7 +33,7 @@
           <!-- 五维标签 -->
           <view class="dims-row">
             <view class="dim-tag dim-tag-body"><text>🌏</text><text>身·健康</text></view>
-            <view class="dim-tag dim-tag-wisdom"><text>⚡</text><text>智·赋能</text></view>
+            <view class="dim-tag dim-tag-wisdom"><text>⚡</text><text>智·认知</text></view>
             <view class="dim-tag dim-tag-wealth"><text>💧</text><text>富·创富</text></view>
             <view class="dim-tag dim-tag-action"><text>🌿</text><text>行·和谐</text></view>
             <view class="dim-tag dim-tag-mind"><text>🔥</text><text>心·大爱</text></view>
@@ -272,7 +272,7 @@ export default {
   justify-content: center;
 }
 .login-sheet-title {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $facade-text-strong;
 }
@@ -364,7 +364,7 @@ export default {
   white-space: nowrap;  /* 禁止四字步骤文本换行 */
 }
 .loop-arrow {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-ghost-light;
   padding: 0 2rpx;
   flex-shrink: 0;  /* 箭头不被压缩 */
@@ -387,7 +387,7 @@ export default {
   align-items: center;
   border-radius: 999rpx;
   padding: 8rpx 14rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $app-surface;
   margin: 0 8rpx;  /* 使用 margin 替代 gap,微信小程序不支持 gap */
   white-space: nowrap;
@@ -408,7 +408,7 @@ export default {
   border-radius: 48rpx;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   color: $app-surface;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: 600;
   display: flex;
   flex-direction: row;
@@ -434,7 +434,7 @@ export default {
   margin-top: 24rpx;
 }
 .skip-btn {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   text-decoration: underline;
 }

+ 3 - 3
cfc-frontend/components/report-upload-card.vue

@@ -53,7 +53,7 @@ export default {
   flex-shrink: 0;
 }
 .report-upload-icon {
-  font-size: 52rpx;
+  font-size: calc(52rpx * var(--font-scale, 1));
 }
 .report-upload-right {
   flex: 1;
@@ -79,14 +79,14 @@ export default {
   gap: 10rpx;
 }
 .report-upload-tags .tag {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: #33691E;
   background: rgba(255,255,255,0.6);
   padding: 4rpx 14rpx;
   border-radius: 20rpx;
 }
 .report-upload-arrow {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   color: $mat-green-soft;
   margin-left: 12rpx;
 }

+ 2 - 2
cfc-frontend/components/tab-transition.vue

@@ -20,7 +20,7 @@ import { BrandColors } from '../utils/brand-colors.js'
 var DIM_MAP = {
   action:  { char: '行', icon: '🌿', color: BrandColors.success, label: '人际和谐' },
   body:    { char: '身', icon: '🌏', color: BrandColors.brownWarm, label: '根基永因' },
-  wisdom:  { char: '智', icon: '⚡', color: BrandColors.wisdom, label: '赋能未来' },
+  wisdom:  { char: '智', icon: '⚡', color: BrandColors.wisdom, label: '面向未来' },
   mind:    { char: '心', icon: '🔥', color: BrandColors.mind, label: '大爱传承' },
   wealth:  { char: '富', icon: '💧', color: BrandColors.wealth, label: '利他创富' }
 }
@@ -129,7 +129,7 @@ export default {
 }
 
 .dim-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   line-height: 1;
   margin-bottom: 16rpx;
 }

+ 10 - 10
cfc-frontend/components/wuxing-sandbox.vue

@@ -698,7 +698,7 @@ export default {
 .sandbox-title { font-size: calc(26rpx * var(--font-scale, 1)); font-weight: bold; color: #8FC5E8; margin-left: 8rpx; }
 .sandbox-logo { width: 32rpx; height: 32rpx; flex-shrink: 0; }
 .sandbox-badge {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: rgba(143,197,232,0.7);
   background: rgba(143,197,232,0.1);
   padding: 4rpx 14rpx;
@@ -709,7 +709,7 @@ export default {
   display: flex;
   align-items: center;
   gap: 6rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $app-surface;
   background: linear-gradient(135deg, $accent-indigo, $accent-indigo-deep);
   padding: 10rpx 20rpx;
@@ -723,9 +723,9 @@ export default {
   opacity: 0.85;
   box-shadow: none;
 }
-.sandbox-switch-icon { font-size: 24rpx; line-height: 1; }
-.sandbox-switch-label { font-size: 22rpx; font-weight: 700; max-width: 140rpx; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
-.sandbox-switch-arrow { font-size: 20rpx; opacity: 0.8; }
+.sandbox-switch-icon { font-size: calc(24rpx * var(--font-scale, 1)); line-height: 1; }
+.sandbox-switch-label { font-size: calc(22rpx * var(--font-scale, 1)); font-weight: 700; max-width: 140rpx; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
+.sandbox-switch-arrow { font-size: calc(20rpx * var(--font-scale, 1)); opacity: 0.8; }
 
 /* ---- 成员选择面板 ---- */
 .member-picker-mask {
@@ -751,7 +751,7 @@ export default {
 }
 .member-picker-title {
   padding-bottom: 16rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   font-weight: 700;
   color: #333333;
   text-align: center;
@@ -770,7 +770,7 @@ export default {
   background: rgba(102, 126, 234, 0.12);
 }
 .member-picker-label {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: #333333;
 }
 .member-picker-item--active .member-picker-label {
@@ -778,7 +778,7 @@ export default {
   font-weight: 700;
 }
 .member-picker-check {
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   font-weight: 700;
   color: #667eea;
 }
@@ -840,7 +840,7 @@ export default {
 .point-dot--metal { background: linear-gradient(135deg, $accent-gold, #FF8F00); }
 .point-dot--wood { background: linear-gradient(135deg, $mat-green, $mat-green-strong); }
 
-.point-icon { font-size: 26rpx; line-height: 1; }
+.point-icon { font-size: calc(26rpx * var(--font-scale, 1)); line-height: 1; }
 
 .point-label {
   font-size: calc(22rpx * var(--font-scale, 1)); font-weight: bold; color: rgba(255,255,255,0.9);
@@ -923,7 +923,7 @@ export default {
   border-color: $brand-primary;
 }
 .toggle-icon {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   margin-right: 8rpx;
 }
 .toggle-text {

+ 1 - 1
cfc-frontend/custom-tab-bar/index.vue

@@ -87,7 +87,7 @@ export default {
         { code: 'action', name: '行', desc: '知行合一', icon: '🌿', color: BrandColors.success, bgColor: 'rgba(16,185,129,0.15)' },
         { code: 'mind', name: '心', desc: '大爱传承', icon: '🔥', color: BrandColors.mind, bgColor: 'rgba(255,107,157,0.15)' },
         { code: 'body', name: '身', desc: '主动健康', icon: '🌏', color: BrandColors.body, bgColor: 'rgba(255,140,66,0.15)' },
-        { code: 'wisdom', name: '智', desc: '赋能未来', icon: '⚡', color: BrandColors.wisdom, bgColor: 'rgba(99,102,241,0.15)' }
+        { code: 'wisdom', name: '智', desc: '面向未来', icon: '⚡', color: BrandColors.wisdom, bgColor: 'rgba(99,102,241,0.15)' }
       ]
     }
   },

+ 5 - 5
cfc-frontend/pages/achievement/index.vue

@@ -128,7 +128,7 @@ export default {
 }
 .stat-num {
   display: block;
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   font-weight: 700;
   color: $brand-primary;
 }
@@ -175,17 +175,17 @@ export default {
   background: $facade-fill-4;
 }
 .badge-icon {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
 }
 .badge-name {
   display: block;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-strong;
   margin-bottom: 4rpx;
 }
 .badge-desc {
   display: block;
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .empty-state {
@@ -193,7 +193,7 @@ export default {
   padding: 60rpx 0;
 }
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   display: block;
   margin-bottom: 20rpx;
 }

+ 9 - 9
cfc-frontend/pages/action-detail/components/AbilityDiagram.vue

@@ -606,12 +606,12 @@ export default {
   flex-direction: column;
 }
 .popup-name {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $uni-text-color;
 }
 .popup-relation {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $uni-text-color-secondary;
   margin-top: 2rpx;
 }
@@ -622,7 +622,7 @@ export default {
   margin-bottom: 12rpx;
 }
 .popup-skills-title {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   font-weight: 700;
   color: $status-warning-2;
   display: block;
@@ -634,14 +634,14 @@ export default {
   gap: 8rpx;
 }
 .popup-skill-item {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-slate-deep;
   background: $status-warning-soft;
   border-radius: 8rpx;
   padding: 4rpx 10rpx;
 }
 .popup-skill-more {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $app-text-subtle;
   padding: 4rpx 6rpx;
 }
@@ -651,11 +651,11 @@ export default {
   margin-top: 4rpx;
 }
 .popup-time-label {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $app-text-subtle;
 }
 .popup-time-value {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-slate-deep;
 }
 .popup-arrow {
@@ -683,7 +683,7 @@ export default {
   margin: 10rpx 0;
 }
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 16rpx;
 }
 .empty-text {
@@ -698,7 +698,7 @@ export default {
   margin-bottom: 24rpx;
 }
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $uni-text-color-secondary;
 }
 </style>

+ 8 - 8
cfc-frontend/pages/action-detail/components/OctopusDiagram.vue

@@ -569,7 +569,7 @@ export default {
   margin: 10rpx 0;
 }
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 16rpx;
 }
 .empty-text {
@@ -584,14 +584,14 @@ export default {
   margin-bottom: 24rpx;
 }
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $uni-text-color-secondary;
 }
 .action-btn {
   display: inline-block;
   padding: 12rpx 32rpx;
   border-radius: 20rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   font-weight: 600;
 }
 .action-btn-primary {
@@ -606,7 +606,7 @@ export default {
   background: rgba(255,255,255,0.9);
   border-radius: 20rpx;
   padding: 8rpx 16rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $uni-text-color-secondary;
 }
 /* 成效弹窗 */
@@ -632,7 +632,7 @@ export default {
   margin-bottom: 12rpx;
 }
 .popup-name {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $uni-text-color;
 }
@@ -642,7 +642,7 @@ export default {
   margin-top: 4rpx;
 }
 .popup-tag {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   padding: 2rpx 10rpx;
   border-radius: 6rpx;
   margin-right: 8rpx;
@@ -656,7 +656,7 @@ export default {
   margin-top: 8rpx;
 }
 .popup-title {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $app-text-subtle;
   display: block;
   margin-bottom: 6rpx;
@@ -673,7 +673,7 @@ export default {
   gap: 8rpx;
 }
 .kp-sys-badge {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   color: $status-success;
   background: $status-success-tint;
   padding: 2rpx 10rpx;

+ 8 - 8
cfc-frontend/pages/action-detail/components/PearlDiagram.vue

@@ -909,7 +909,7 @@ export default {
   flex-direction: column;
 }
 .popup-name {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $uni-text-color;
 }
@@ -919,7 +919,7 @@ export default {
   margin-top: 6rpx;
 }
 .popup-tag {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   padding: 2rpx 10rpx;
   border-radius: 6rpx;
   margin-right: 8rpx;
@@ -933,7 +933,7 @@ export default {
   border-top: 1rpx solid $facade-fill-slate;
 }
 .popup-skill-count {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $status-warning-2;
   display: block;
@@ -944,7 +944,7 @@ export default {
   flex-wrap: wrap;
 }
 .popup-skill-item {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $uni-text-color-secondary;
   margin-right: 8rpx;
   margin-bottom: 4rpx;
@@ -954,7 +954,7 @@ export default {
   border-top: 1rpx solid $facade-fill-slate;
 }
 .popup-desc-text {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-slate-deep;
   display: block;
 }
@@ -967,7 +967,7 @@ export default {
   display: inline-block;
   padding: 10rpx 24rpx;
   border-radius: 20rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
 }
 .action-btn-primary {
   background: $brand-primary;
@@ -1017,7 +1017,7 @@ export default {
   margin: 10rpx 0;
 }
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 16rpx;
 }
 .empty-text {
@@ -1032,7 +1032,7 @@ export default {
   margin-bottom: 24rpx;
 }
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $uni-text-color-secondary;
 }
 </style>

+ 5 - 5
cfc-frontend/pages/action-detail/contact-detail.vue

@@ -276,7 +276,7 @@ export default {
   margin-bottom: 30rpx;
 }
 .back-btn, .edit-btn {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   padding: 10rpx 20rpx;
 }
 .page-title { font-size: calc(32rpx * var(--font-scale, 1)); font-weight: bold; }
@@ -317,7 +317,7 @@ export default {
   align-items: flex-start;
   margin-bottom: 16rpx;
 }
-.info-icon { font-size: 28rpx; margin-right: 12rpx; width: 40rpx; }
+.info-icon { font-size: calc(28rpx * var(--font-scale, 1)); margin-right: 12rpx; width: 40rpx; }
 .info-value { font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-deep; flex: 1; }
 .countdown { color: $accent-pink; }
 
@@ -362,7 +362,7 @@ export default {
   padding: 24rpx;
   border-radius: 12rpx;
   background: linear-gradient(135deg, $mind-accent, $brand-primary);
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   color: $app-surface;
   text-align: center;
   border: none;
@@ -383,7 +383,7 @@ export default {
   padding: 24rpx;
   border-radius: 12rpx;
   background: linear-gradient(135deg, $accent-indigo, $accent-indigo-deep);
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   color: $app-surface;
   text-align: center;
   border: none;
@@ -396,7 +396,7 @@ export default {
   border-radius: 12rpx;
   background: $app-surface;
   border: 1rpx solid $status-danger-2;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $status-danger-2;
   text-align: center;
 }

+ 8 - 8
cfc-frontend/pages/action-detail/index.vue

@@ -944,7 +944,7 @@ $c-tint-mint: $c-tint-mint-wash;
   align-items: center;
   gap: 12rpx;
 }
-.guidance-icon { font-size: 36rpx; }
+.guidance-icon { font-size: calc(36rpx * var(--font-scale, 1)); }
 .guidance-text {
   font-size: calc(26rpx * var(--font-scale, 1));
   color: $status-success-strong;
@@ -989,7 +989,7 @@ $c-tint-mint: $c-tint-mint-wash;
   border-radius: 50%;
   border: 2rpx solid $app-border-strong;
   color: $app-text-muted;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   display: flex;
   align-items: center;
   justify-content: center;
@@ -1100,7 +1100,7 @@ $c-tint-mint: $c-tint-mint-wash;
 .explain-icon-warn { background: linear-gradient(135deg, $dim-wealth, $status-warning); box-shadow: 0 4rpx 12rpx rgba(245,158,11,0.3); }
 .explain-icon-bad { background: linear-gradient(135deg, $status-danger, $c-danger-light); box-shadow: 0 4rpx 12rpx rgba(239,68,68,0.3); }
 .explain-icon {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $app-surface;
   font-weight: 700;
 }
@@ -1167,13 +1167,13 @@ $c-tint-mint: $c-tint-mint-wash;
   background: linear-gradient(135deg, $dim-action-tint, $app-surface);
 }
 .help-dialog-title {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: 700;
   color: $app-text;
 }
 .help-dialog-close {
   position: relative;
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   color: $app-text-subtle;
   cursor: pointer;
   width: 48rpx;
@@ -1198,7 +1198,7 @@ $c-tint-mint: $c-tint-mint-wash;
 }
 .help-dialog-content {
   padding: 28rpx 32rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $c-text-soft;
   line-height: 1.8;
 }
@@ -1241,7 +1241,7 @@ $c-tint-mint: $c-tint-mint-wash;
   box-shadow: 0 2rpx 8rpx rgba(16, 185, 129, 0.2);
 }
 .func-icon {
-  font-size: 44rpx;
+  font-size: calc(44rpx * var(--font-scale, 1));
 }
 .func-label {
   font-size: calc(24rpx * var(--font-scale, 1));
@@ -1296,7 +1296,7 @@ $c-tint-mint: $c-tint-mint-wash;
   align-items: center;
   justify-content: center;
   margin-right: 10rpx;
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   background: linear-gradient(135deg, $status-success-soft, $c-success-light);
 }
 .portrait-dim-name {

+ 5 - 5
cfc-frontend/pages/action-detail/interaction-log.vue

@@ -489,7 +489,7 @@ export default {
   background: $facade-fill-ghost;
 }
 .type-icon {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   display: block;
   margin-bottom: 8rpx;
 }
@@ -568,7 +568,7 @@ export default {
   height: 40rpx;
   background: rgba(0, 0, 0, 0.6);
   color: $app-surface;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   display: flex;
   align-items: center;
   justify-content: center;
@@ -592,7 +592,7 @@ export default {
 }
 .video-icon,
 .audio-icon {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
 }
 .video-name,
 .audio-name {
@@ -616,7 +616,7 @@ export default {
   justify-content: center;
 }
 .media-add-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .media-add-text {
@@ -636,7 +636,7 @@ export default {
   border: none;
   border-radius: 12rpx;
   padding: 24rpx 0;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
 }
 .btn-submit[disabled] {
   background: $facade-text-ghost;

+ 2 - 2
cfc-frontend/pages/action-detail/member-action-detail.vue

@@ -233,7 +233,7 @@ export default {
   padding-bottom: 40rpx;
 }
 .nav-back-icon {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   color: $facade-text-strong;
 }
 .member-card {
@@ -325,7 +325,7 @@ export default {
   align-items: center;
   gap: 12rpx;
 }
-.guidance-icon { font-size: 32rpx; }
+.guidance-icon { font-size: calc(32rpx * var(--font-scale, 1)); }
 .guidance-text {
   font-size: calc(26rpx * var(--font-scale, 1));
   color: $status-success-strong;

+ 5 - 5
cfc-frontend/pages/action-detail/octopus-add-effect.vue

@@ -304,7 +304,7 @@ export default {
   color: $facade-text-muted;
 }
 .kp-match-btn {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $uni-info;
   padding: 4rpx 12rpx;
   border: 1rpx solid $uni-info;
@@ -313,7 +313,7 @@ export default {
   flex-shrink: 0;
 }
 .kp-sys-badge {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $status-success;
   background: $status-success-tint;
   padding: 2rpx 12rpx;
@@ -326,7 +326,7 @@ export default {
   gap: 12rpx;
 }
 .role-tag {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   padding: 6rpx 20rpx;
   border-radius: 8rpx;
   border: 2rpx solid $facade-hairline;
@@ -351,7 +351,7 @@ export default {
   border: none;
   border-radius: 12rpx;
   padding: 24rpx 0;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
 }
 .btn-submit[disabled] {
   background: $facade-text-ghost;
@@ -399,7 +399,7 @@ export default {
   background: $uni-info;
   color: $app-surface;
   border-radius: 12rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   flex-shrink: 0;
 }
 .phone-match-result {

+ 5 - 5
cfc-frontend/pages/action-detail/octopus-add-key-person.vue

@@ -239,11 +239,11 @@ export default {
   color: $brand-primary;
 }
 .referrer-placeholder {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-ghost;
 }
 .picker-arrow {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .empty-referrer {
@@ -281,12 +281,12 @@ export default {
   background: $app-surface;
 }
 .referrer-modal-title {
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $facade-text-strong;
 }
 .referrer-modal-close {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .referrer-option {
@@ -315,7 +315,7 @@ export default {
   border: none;
   border-radius: 12rpx;
   padding: 24rpx 0;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
 }
 .btn-submit[disabled] {
   background: $facade-text-ghost;

+ 4 - 4
cfc-frontend/pages/action-detail/octopus-effects-list.vue

@@ -154,7 +154,7 @@ export default {
   gap: 8rpx;
 }
 .tag {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   padding: 4rpx 12rpx;
   background: $uni-primary-pale;
   color: $brand-primary;
@@ -176,7 +176,7 @@ export default {
   right: 24rpx;
 }
 .action-btn-del {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $app-border;
   padding: 4rpx 12rpx;
   border-radius: 8rpx;
@@ -192,7 +192,7 @@ export default {
   padding: 80rpx 20rpx;
 }
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 16rpx;
 }
 .empty-text {
@@ -219,7 +219,7 @@ export default {
   justify-content: center;
 }
 .fab-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   color: $app-surface;
   font-weight: 300;
 }

+ 1 - 1
cfc-frontend/pages/action-detail/pearl-add-resource.vue

@@ -266,7 +266,7 @@ export default {
   border: none;
   border-radius: 12rpx;
   padding: 24rpx 0;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
 }
 .btn-submit[disabled] {
   background: $facade-text-ghost;

+ 4 - 4
cfc-frontend/pages/action-detail/relationship-questionnaire.vue

@@ -208,7 +208,7 @@ export default {
   padding: 100rpx 0;
 }
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .empty-text {
@@ -223,7 +223,7 @@ export default {
   border: none;
   border-radius: 12rpx;
   padding: 24rpx 60rpx;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
 }
 .questionnaire-form {
   display: flex;
@@ -239,7 +239,7 @@ export default {
   margin-bottom: 20rpx;
 }
 .dimension-tag {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   padding: 4rpx 12rpx;
   border-radius: 6rpx;
   margin-right: 12rpx;
@@ -369,6 +369,6 @@ export default {
   border: none;
   border-radius: 12rpx;
   padding: 20rpx 0;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
 }
 </style>

+ 47 - 47
cfc-frontend/pages/activity/activity-detail/activity-detail.vue

@@ -1058,12 +1058,12 @@ export default {
 .loading-text,
 .error-text,
 .empty-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-bottom: 20rpx;
 }
 .error-icon {
-  font-size: 60rpx;
+  font-size: calc(60rpx * var(--font-scale, 1));
   margin-bottom: 16rpx;
 }
 .retry-btn {
@@ -1072,7 +1072,7 @@ export default {
   border: none;
   border-radius: 40rpx;
   padding: 12rpx 40rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   line-height: 1.5;
 }
 
@@ -1100,7 +1100,7 @@ export default {
   margin-top: 16rpx;
 }
 .tag-chip {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $brand-primary;
   background: $uni-primary-pale;
   padding: 3rpx 14rpx;
@@ -1119,7 +1119,7 @@ export default {
 }
 .status-tag {
   display: inline-block;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   padding: 4rpx 16rpx;
   border-radius: 8rpx;
 }
@@ -1145,7 +1145,7 @@ export default {
   margin-bottom: 0;
 }
 .meta-icon {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   margin-right: 12rpx;
   width: 32rpx;
   text-align: center;
@@ -1185,7 +1185,7 @@ export default {
   margin-right: 48rpx;
 }
 .roster-num {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   font-weight: 700;
   color: $brand-primary;
   line-height: 1.2;
@@ -1197,7 +1197,7 @@ export default {
   color: $facade-text-gray-600;
 }
 .roster-label {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-top: 4rpx;
 }
@@ -1221,7 +1221,7 @@ export default {
   transition: width 0.3s ease;
 }
 .roster-progress-text {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-left: 16rpx;
   width: 64rpx;
@@ -1245,7 +1245,7 @@ export default {
   border-radius: 24rpx;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   color: #ffffff;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   font-weight: 600;
   display: flex;
   align-items: center;
@@ -1253,18 +1253,18 @@ export default {
   margin-right: 8rpx;
 }
 .roster-name {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-gray-800;
 }
 .roster-time {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-left: 8rpx;
 }
 .roster-empty {
   display: block;
   margin-top: 16rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 
@@ -1303,7 +1303,7 @@ export default {
   align-items: center;
 }
 .refund-notice-icon {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   margin-right: 10rpx;
   flex-shrink: 0;
 }
@@ -1333,11 +1333,11 @@ export default {
   flex-direction: column;
 }
 .bottom-type {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .bottom-vendor {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-top: 4rpx;
 }
@@ -1352,7 +1352,7 @@ export default {
   border: none;
   border-radius: 40rpx;
   padding: 16rpx 48rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 600;
   line-height: 1.5;
   min-width: 160rpx;
@@ -1375,7 +1375,7 @@ export default {
   border: none;
   border-radius: 40rpx;
   padding: 16rpx 32rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   font-weight: 600;
   line-height: 1.5;
   min-width: 140rpx;
@@ -1389,7 +1389,7 @@ export default {
   border: none;
   border-radius: 40rpx;
   padding: 16rpx 32rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   line-height: 1.5;
   min-width: 140rpx;
   text-align: center;
@@ -1400,7 +1400,7 @@ export default {
   border: 2rpx solid $facade-border-soft;
   border-radius: 40rpx;
   padding: 14rpx 28rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   line-height: 1.5;
   min-width: 120rpx;
   text-align: center;
@@ -1428,14 +1428,14 @@ export default {
   text-align: center;
 }
 .penalty-title {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $status-danger;
   display: block;
   margin-bottom: 20rpx;
 }
 .penalty-desc {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-body;
   display: block;
   margin-bottom: 40rpx;
@@ -1447,7 +1447,7 @@ export default {
   border: none;
   border-radius: 40rpx;
   padding: 16rpx 60rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
 }
 
 /* 活动评价 */
@@ -1461,16 +1461,16 @@ export default {
 .feedback-title { font-size: calc(32rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; }
 .feedback-btn {
   background: $brand-primary; color: $app-surface; border: none;
-  border-radius: 40rpx; padding: 20rpx 40rpx; font-size: 28rpx;
+  border-radius: 40rpx; padding: 20rpx 40rpx; font-size: calc(28rpx * var(--font-scale, 1));
   text-align: center;
 }
 .feedback-submitted { padding: 10rpx 0; }
 .feedback-ratings-display { margin-bottom: 16rpx; }
 .fr-row { display: flex; justify-content: space-between; padding: 8rpx 0; }
-.fr-label { font-size: 28rpx; color: $facade-text-strong; }
-.fr-stars { font-size: 28rpx; color: $brand-primary; }
+.fr-label { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-strong; }
+.fr-stars { font-size: calc(28rpx * var(--font-scale, 1)); color: $brand-primary; }
 .feedback-comment-text { font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-body; margin: 10rpx 0; line-height: 1.5; }
-.feedback-thanks { font-size: 24rpx; color: $facade-text-muted; text-align: center; margin-top: 16rpx; }
+.feedback-thanks { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-muted; text-align: center; margin-top: 16rpx; }
 .feedback-modal-overlay {
   position: fixed;
   top: 0;
@@ -1488,39 +1488,39 @@ export default {
   width: 80%; max-width: 600rpx;
 }
 .feedback-modal-title {
-  font-size: 34rpx; font-weight: bold; color: $facade-text-strong;
+  font-size: calc(34rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong;
   text-align: center; margin-bottom: 30rpx;
 }
 .rating-row {
   display: flex; justify-content: space-between; align-items: center;
   padding: 16rpx 0;
 }
-.rating-label { font-size: 28rpx; color: $facade-text-strong; min-width: 120rpx; }
+.rating-label { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-strong; min-width: 120rpx; }
 .stars { display: flex; }
-.star-icon { font-size: 40rpx; color: $facade-border-soft; padding: 0 6rpx; }
+.star-icon { font-size: calc(40rpx * var(--font-scale, 1)); color: $facade-border-soft; padding: 0 6rpx; }
 .star-active { color: $brand-primary; }
 .feedback-textarea {
   width: 100%; height: 160rpx; margin-top: 20rpx;
   border: 1rpx solid $facade-hairline-2; border-radius: 12rpx;
-  padding: 16rpx; font-size: 26rpx; box-sizing: border-box;
+  padding: 16rpx; font-size: calc(26rpx * var(--font-scale, 1)); box-sizing: border-box;
 }
 .feedback-modal-actions {
   display: flex; justify-content: space-between; margin-top: 30rpx;
 }
 .feedback-cancel-btn {
   flex: 1; background: $facade-fill-2; color: $facade-text-body; border: none;
-  border-radius: 40rpx; padding: 20rpx; font-size: 28rpx;
+  border-radius: 40rpx; padding: 20rpx; font-size: calc(28rpx * var(--font-scale, 1));
   text-align: center; margin-right: 20rpx;
 }
 .feedback-submit-btn {
   flex: 1; background: $brand-primary; color: $app-surface; border: none;
-  border-radius: 40rpx; padding: 20rpx; font-size: 28rpx;
+  border-radius: 40rpx; padding: 20rpx; font-size: calc(28rpx * var(--font-scale, 1));
   text-align: center;
 }
-.share-btn { height: 64rpx; line-height: 64rpx; background: $app-surface; border: 2rpx solid $brand-primary; color: $brand-primary; font-size: 24rpx; border-radius: 32rpx; padding: 0 24rpx; display: flex; align-items: center; flex-shrink: 0; }
+.share-btn { height: 64rpx; line-height: 64rpx; background: $app-surface; border: 2rpx solid $brand-primary; color: $brand-primary; font-size: calc(24rpx * var(--font-scale, 1)); border-radius: 32rpx; padding: 0 24rpx; display: flex; align-items: center; flex-shrink: 0; }
 .share-btn::after { border: none; }
-.share-btn-icon { font-size: 28rpx; margin-right: 6rpx; }
-.share-btn-text { font-size: 24rpx; font-weight: 600; }
+.share-btn-icon { font-size: calc(28rpx * var(--font-scale, 1)); margin-right: 6rpx; }
+.share-btn-text { font-size: calc(24rpx * var(--font-scale, 1)); font-weight: 600; }
 
 /* 报名表单弹窗 */
 .reg-modal-overlay {
@@ -1544,7 +1544,7 @@ export default {
   overflow-y: auto;
 }
 .reg-modal-title {
-  font-size: 34rpx;
+  font-size: calc(34rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $facade-text-strong;
   text-align: center;
@@ -1552,7 +1552,7 @@ export default {
   margin-bottom: 30rpx;
 }
 .reg-section-label {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $facade-text-deep;
   display: block;
@@ -1585,12 +1585,12 @@ export default {
   align-items: center;
 }
 .reg-family-name {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-strong;
   margin-right: 12rpx;
 }
 .reg-family-relation {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   background: $facade-hairline-2;
   padding: 2rpx 12rpx;
@@ -1598,7 +1598,7 @@ export default {
 }
 .reg-checkmark {
   color: $brand-primary;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
 }
 .reg-list {
@@ -1617,7 +1617,7 @@ export default {
   border: none;
   border-radius: 12rpx;
   padding: 16rpx 20rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-strong;
 }
 .reg-input-name {
@@ -1628,7 +1628,7 @@ export default {
 }
 .reg-remove {
   color: $status-danger;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   padding: 10rpx;
   flex-shrink: 0;
 }
@@ -1637,7 +1637,7 @@ export default {
   border: 2rpx dashed $facade-border-soft;
   border-radius: 12rpx;
   padding: 16rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $brand-primary;
   text-align: center;
   width: 100%;
@@ -1645,7 +1645,7 @@ export default {
 }
 .reg-total {
   text-align: center;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $brand-primary;
   margin-bottom: 24rpx;
@@ -1666,7 +1666,7 @@ export default {
   border: none;
   border-radius: 40rpx;
   padding: 20rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   text-align: center;
 }
 .reg-submit {
@@ -1676,7 +1676,7 @@ export default {
   border: none;
   border-radius: 40rpx;
   padding: 20rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 600;
   text-align: center;
 }

+ 9 - 9
cfc-frontend/pages/activity/components/ActivityPoster.vue

@@ -775,7 +775,7 @@ export default {
 }
 </script>
 
-<style scoped>
+<style scoped lang="scss">
 .poster-overlay {
   position: fixed;
   top: 0;
@@ -809,7 +809,7 @@ export default {
   display: flex;
   align-items: center;
   margin: 12rpx 0 4rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: #666;
 }
 .tpl-label {
@@ -832,8 +832,8 @@ export default {
   background: #F8FAFC;
 }
 .tpl-option.tpl-active {
-  border-color: #F97316;
-  background: #FFF7ED;
+  border-color: $uni-primary;
+  background: $uni-primary-pale;
 }
 .tpl-dot {
   width: 24rpx;
@@ -844,12 +844,12 @@ export default {
   box-sizing: border-box;
 }
 .tpl-text {
-  font-size: 14rpx;
+  font-size: calc(14rpx * var(--font-scale, 1));
   color: #666;
   white-space: nowrap;
 }
 .tpl-active .tpl-text {
-  color: #F97316;
+  color: $uni-primary;
   font-weight: 500;
 }
 .bg-options {
@@ -864,7 +864,7 @@ export default {
   border: 2rpx solid transparent;
 }
 .bg-option.bg-active {
-  border-color: #F97316;
+  border-color: $uni-primary;
   box-shadow: 0 0 0 2rpx rgba(249, 115, 22, 0.3);
 }
 .poster-actions {
@@ -876,10 +876,10 @@ export default {
   width: 70%;
   height: 88rpx;
   line-height: 88rpx;
-  background: linear-gradient(135deg, #F97316, #EA580C);
+  background: linear-gradient(135deg, $uni-primary, $uni-primary-dark);
   color: #fff;
   border-radius: 44rpx;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   font-weight: 600;
   border: none;
 }

+ 5 - 5
cfc-frontend/pages/activity/create.vue

@@ -670,7 +670,7 @@ export default {
 }
 
 .picker-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $uni-text-color;
 }
 
@@ -678,7 +678,7 @@ export default {
 .picker-hint {
   display: block;
   margin-top: 4rpx;
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $uni-text-color-secondary;
 }
 
@@ -716,7 +716,7 @@ export default {
 }
 
 .upload-icon {
-  font-size: 64rpx;
+  font-size: calc(64rpx * var(--font-scale, 1));
   color: $app-text-subtle;
 }
 
@@ -807,7 +807,7 @@ export default {
   border-radius: 32rpx;
   background: $brand-primary;
   color: $app-surface;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
 }
 
 .form-actions {
@@ -825,7 +825,7 @@ export default {
   display: flex;
   align-items: center;
   justify-content: center;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   font-weight: 600;
 }
 

+ 21 - 21
cfc-frontend/pages/activity/index.vue

@@ -983,7 +983,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .tab-label {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 
@@ -1022,7 +1022,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .filter-label {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 
@@ -1067,7 +1067,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
   margin-top: 10rpx;
 }
 .tag-chip {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $brand-primary;
   background: $uni-primary-pale;
   padding: 2rpx 12rpx;
@@ -1086,7 +1086,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .card-meta {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-top: 8rpx;
 }
@@ -1101,7 +1101,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .card-status {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   padding: 4rpx 12rpx;
   border-radius: 6rpx;
 }
@@ -1152,7 +1152,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .card-price {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: 600;
 }
@@ -1170,7 +1170,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 
 .btn-cancel {
   padding: 8rpx 20rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   background: $app-surface;
   border: 1rpx solid $facade-border-soft;
@@ -1180,7 +1180,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 
 .btn-checkin {
   padding: 8rpx 20rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $app-surface;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   border: none;
@@ -1197,26 +1197,26 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 20rpx;
 }
 
 .empty-title {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $facade-text-strong;
   margin-bottom: 12rpx;
 }
 
 .empty-desc {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-bottom: 40rpx;
 }
 
 .empty-btn {
   padding: 16rpx 48rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $app-surface;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   border: none;
@@ -1246,7 +1246,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .loading-text {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 
@@ -1256,7 +1256,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .load-more-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 
@@ -1277,7 +1277,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 
 .nav-add-icon {
   color: $app-surface;
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   font-weight: 300;
   line-height: 1;
 }
@@ -1303,7 +1303,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .manage-stat-num {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   font-weight: 700;
   color: $facade-text-strong;
   line-height: 1.2;
@@ -1322,7 +1322,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .manage-stat-label {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-top: 8rpx;
 }
@@ -1346,13 +1346,13 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 
 .manage-action-icon {
   color: $app-surface;
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   font-weight: 300;
 }
 
 .manage-action-text {
   color: $app-surface;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 600;
 }
 
@@ -1362,7 +1362,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .manage-section-title text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $facade-text-strong;
 }
@@ -1376,7 +1376,7 @@ uni.showToast({ title: '请先选择家庭成员身份', icon: 'none' })
 }
 
 .manage-action-small {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   padding: 4rpx 16rpx;
   border-radius: 20rpx;
   background: $brand-primary;

+ 4 - 4
cfc-frontend/pages/activity/order-pay/order-pay.vue

@@ -186,7 +186,7 @@ export default {
 }
 
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $app-text-subtle;
 }
 
@@ -211,7 +211,7 @@ export default {
 
 .header-countdown {
   margin-top: 12rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-brand-tint-2;
 }
 
@@ -278,7 +278,7 @@ export default {
 }
 
 .payment-icon {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   margin-right: 12rpx;
 }
 
@@ -305,7 +305,7 @@ export default {
   border-radius: 44rpx;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   color: $app-surface;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   font-weight: 600;
   display: flex;
   align-items: center;

+ 10 - 10
cfc-frontend/pages/ai/chat.vue

@@ -540,7 +540,7 @@ export default {
   border-bottom-color: $dim-wealth;
 }
 .chat-nav.mascot-fubao .nav-back-icon {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   color: var(--text, $uni-text-color);
   font-weight: 600;
 }
@@ -554,7 +554,7 @@ export default {
 }
 
 .nav-action {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   color: var(--text-secondary, $uni-text-color-secondary);
 }
 
@@ -653,7 +653,7 @@ export default {
 }
 
 .welcome-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 20rpx;
   transition: transform 0.3s;
 }
@@ -702,7 +702,7 @@ export default {
 }
 
 .suggestion-icon {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   margin-right: 12rpx;
 }
 
@@ -805,7 +805,7 @@ export default {
 }
 
 .voice-icon {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
 }
 
 .chat-input {
@@ -830,7 +830,7 @@ export default {
 }
 
 .send-icon {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $app-surface;
 }
 
@@ -921,7 +921,7 @@ export default {
 
 .rec-type-tag {
   display: inline-block;
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   color: var(--color-primary, $brand-primary);
   background: rgba(249,115,22,0.1);
   padding: 2rpx 12rpx;
@@ -947,7 +947,7 @@ export default {
 }
 
 .rec-price {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: 600;
 }
@@ -960,10 +960,10 @@ export default {
   padding: 6rpx 16rpx;
   background: $dim-wisdom-tint-2;
   border-radius: 20rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
 }
 .mascot-badge-icon {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
 }
 .mascot-badge-name {
   color: $dim-wisdom;

+ 1 - 1
cfc-frontend/pages/ai/components/AITaskCard.vue

@@ -213,7 +213,7 @@ export default {
   border: none;
   border-radius: 12rpx;
   padding: 20rpx 40rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 500;
   line-height: 1.2;
 }

+ 2 - 2
cfc-frontend/pages/ai/components/UpgradeGuideModal.vue

@@ -91,7 +91,7 @@ export default {
   text-align: center;
 }
 .upgrade-guide-icon {
-  font-size: 72rpx;
+  font-size: calc(72rpx * var(--font-scale, 1));
   margin-bottom: 24rpx;
 }
 .upgrade-guide-title {
@@ -115,7 +115,7 @@ export default {
   height: 80rpx;
   line-height: 80rpx;
   border-radius: 40rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
 }
 .btn-know {
   background: $facade-fill-2;

+ 26 - 26
cfc-frontend/pages/article-center/article-detail.vue

@@ -448,29 +448,29 @@ export default {
 .loading-wrap { display: flex; flex-direction: column; align-items: center; padding-top: 300rpx; }
 .loading-spinner { width: 60rpx; height: 60rpx; border: 4rpx solid $facade-hairline; border-top-color: $uni-info; border-radius: 50%; animation: spin 0.8s linear infinite; margin-bottom: 20rpx; }
 @keyframes spin { 0% { transform: rotate(0deg); } 360% { transform: rotate(360deg); } }
-.loading-text { font-size: 26rpx; color: $facade-text-muted; }
+.loading-text { font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-muted; }
 .error-wrap { display: flex; flex-direction: column; align-items: center; padding-top: 300rpx; }
-.error-icon { font-size: 100rpx; margin-bottom: 24rpx; }
-.error-text { font-size: 28rpx; color: $facade-text-muted; margin-bottom: 30rpx; }
-.retry-btn { width: 240rpx; height: 72rpx; line-height: 72rpx; background: $brand-primary; color: $app-surface; font-size: 28rpx; border-radius: 36rpx; text-align: center; border: none; }
+.error-icon { font-size: calc(100rpx * var(--font-scale, 1)); margin-bottom: 24rpx; }
+.error-text { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-muted; margin-bottom: 30rpx; }
+.retry-btn { width: 240rpx; height: 72rpx; line-height: 72rpx; background: $brand-primary; color: $app-surface; font-size: calc(28rpx * var(--font-scale, 1)); border-radius: 36rpx; text-align: center; border: none; }
 .content-scroll { height: calc(100vh - 120rpx); }
 .detail-cover { width: 100%; display: block; }
 .detail-title { display: block; font-size: calc(36rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; line-height: 1.4; padding: 30rpx 30rpx 0; }
-.detail-meta { display: flex; align-items: center; padding: 16rpx 30rpx 0; font-size: 22rpx; color: $facade-text-muted; flex-wrap: wrap; }
+.detail-meta { display: flex; align-items: center; padding: 16rpx 30rpx 0; font-size: calc(22rpx * var(--font-scale, 1)); color: $facade-text-muted; flex-wrap: wrap; }
 .meta-author { color: $uni-info; }
 .meta-sep { margin: 0 12rpx; color: $facade-border-soft; }
-.reading-time-badge { margin-left: auto; font-size: 20rpx; color: $uni-info; background: rgba(14, 165, 233, 0.08); padding: 4rpx 12rpx; border-radius: 20rpx; white-space: nowrap; }
+.reading-time-badge { margin-left: auto; font-size: calc(20rpx * var(--font-scale, 1)); color: $uni-info; background: rgba(14, 165, 233, 0.08); padding: 4rpx 12rpx; border-radius: 20rpx; white-space: nowrap; }
 .reading-time-badge.completed { color: $status-success; background: rgba(16,185,129,0.1); }
 .meta-readcount {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $facade-text-ghost-light;
 }
 .detail-category-row { padding: 16rpx 30rpx 0; }
-.detail-category { display: inline-block; font-size: 20rpx; color: $uni-info; background: rgba(14, 165, 233, 0.1); padding: 4rpx 16rpx; border-radius: 8rpx; }
+.detail-category { display: inline-block; font-size: calc(20rpx * var(--font-scale, 1)); color: $uni-info; background: rgba(14, 165, 233, 0.1); padding: 4rpx 16rpx; border-radius: 8rpx; }
 .detail-dimensions { padding: 16rpx 30rpx 0; display: flex; gap: 12rpx; }
 .dim-bar-item { flex: 1; }
 .dim-bar { height: 8rpx; border-radius: 4rpx; }
-.dim-label { font-size: 18rpx; color: $facade-text-muted; text-align: center; display: block; margin-top: 4rpx; }
+.dim-label { font-size: calc(18rpx * var(--font-scale, 1)); color: $facade-text-muted; text-align: center; display: block; margin-top: 4rpx; }
 .detail-summary { padding: 20rpx 30rpx; }
 .detail-summary-text { font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-faint; line-height: 1.7; display: block; border-left: 4rpx solid $brand-primary; padding-left: 20rpx; }
 .divider { height: 1rpx; background: $facade-hairline-2; margin: 24rpx 30rpx; }
@@ -479,44 +479,44 @@ export default {
 .detail-footer { position: fixed; bottom: 0; left: 0; right: 0; background: $app-surface; padding: 20rpx 30rpx; display: flex; align-items: center; gap: 16rpx; box-shadow: 0 -2rpx 10rpx rgba(0,0,0,0.06); z-index: 10; }
 .share-btn { height: 72rpx; padding: 0 30rpx; background: linear-gradient(135deg, $brand-primary, $brand-primary-light); border-radius: 36rpx; display: flex; align-items: center; justify-content: center; border: none; }
 .share-btn::after { border: none; }
-.share-btn-icon { font-size: 30rpx; margin-right: 8rpx; }
-.share-btn-text { font-size: 26rpx; color: $app-surface; font-weight: 600; }
+.share-btn-icon { font-size: calc(30rpx * var(--font-scale, 1)); margin-right: 8rpx; }
+.share-btn-text { font-size: calc(26rpx * var(--font-scale, 1)); color: $app-surface; font-weight: 600; }
 
 .listen-btn { height: 72rpx; padding: 0 30rpx; background: rgba(14, 165, 233, 0.1); border: 2rpx solid $uni-info; border-radius: 36rpx; display: flex; align-items: center; justify-content: center; }
 .listen-btn.playing { background: rgba(14, 165, 233, 0.2); }
-.listen-btn-icon { font-size: 30rpx; margin-right: 8rpx; }
-.listen-btn-text { font-size: 26rpx; color: $uni-info; font-weight: 600; }
+.listen-btn-icon { font-size: calc(30rpx * var(--font-scale, 1)); margin-right: 8rpx; }
+.listen-btn-text { font-size: calc(26rpx * var(--font-scale, 1)); color: $uni-info; font-weight: 600; }
 
 /* 答题弹窗 */
 .quiz-mask, .result-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 999; display: flex; align-items: center; justify-content: center; }
 .quiz-dialog, .result-dialog { background: $app-surface; border-radius: 24rpx; width: 650rpx; padding: 32rpx; }
 .quiz-mascot { display: flex; align-items: center; justify-content: center; gap: 12rpx; margin-bottom: 16rpx; }
-.mascot-icon { font-size: 60rpx; }
-.mascot-name { font-size: 32rpx; font-weight: 700; color: $brand-primary; }
+.mascot-icon { font-size: calc(60rpx * var(--font-scale, 1)); }
+.mascot-name { font-size: calc(32rpx * var(--font-scale, 1)); font-weight: 700; color: $brand-primary; }
 .quiz-step-bar { display: flex; align-items: center; justify-content: center; margin-bottom: 24rpx; }
-.quiz-step-text { font-size: 24rpx; color: $facade-text-muted; margin-right: 12rpx; }
+.quiz-step-text { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-muted; margin-right: 12rpx; }
 .quiz-dots { display: flex; align-items: center; gap: 8rpx; }
 .quiz-dot { width: 12rpx; height: 12rpx; border-radius: 50%; background: $facade-gray-200; }
 .quiz-dot.active { background: $brand-primary; }
 .quiz-dot.done { background: $mat-orange-300; }
-.q-title { font-size: 30rpx; font-weight: 600; color: $facade-text-strong; line-height: 1.5; margin-bottom: 20rpx; }
+.q-title { font-size: calc(30rpx * var(--font-scale, 1)); font-weight: 600; color: $facade-text-strong; line-height: 1.5; margin-bottom: 20rpx; }
 .q-options { display: flex; flex-direction: column; gap: 12rpx; }
 .q-option-row { display: flex; align-items: center; padding: 16rpx 20rpx; border: 2rpx solid $facade-gray-200; border-radius: 12rpx; }
 .q-option-row.selected { border-color: $brand-primary; background: $uni-primary-pale; }
-.q-option-letter { width: 44rpx; font-size: 26rpx; font-weight: 600; color: $facade-text-body; flex-shrink: 0; }
+.q-option-letter { width: 44rpx; font-size: calc(26rpx * var(--font-scale, 1)); font-weight: 600; color: $facade-text-body; flex-shrink: 0; }
 .q-option-row.selected .q-option-letter { color: $brand-primary; }
-.q-option-text { flex: 1; min-width: 0; font-size: 26rpx; color: $facade-text-strong; }
+.q-option-text { flex: 1; min-width: 0; font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-strong; }
 .q-option-row.selected .q-option-text { color: $status-warning-strong; }
-.q-option-check { width: 32rpx; height: 32rpx; border-radius: 50%; border: 3rpx solid $app-border-strong; color: transparent; font-size: 20rpx; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
+.q-option-check { width: 32rpx; height: 32rpx; border-radius: 50%; border: 3rpx solid $app-border-strong; color: transparent; font-size: calc(20rpx * var(--font-scale, 1)); display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
 .q-option-row.selected .q-option-check { border-color: $brand-primary; background: $brand-primary; color: $app-surface; }
 .quiz-nav { display: flex; gap: 16rpx; margin-top: 28rpx; }
-.quiz-prev { flex: 1; padding: 20rpx; background: $app-surface; color: $brand-primary; border: 2rpx solid $brand-primary; font-size: 28rpx; border-radius: 12rpx; }
+.quiz-prev { flex: 1; padding: 20rpx; background: $app-surface; color: $brand-primary; border: 2rpx solid $brand-primary; font-size: calc(28rpx * var(--font-scale, 1)); border-radius: 12rpx; }
 .quiz-prev::after { border: none; }
-.quiz-submit { flex: 1; padding: 20rpx; background: linear-gradient(135deg, $brand-primary, $brand-primary-light); color: $app-surface; font-size: 28rpx; border-radius: 12rpx; border: none; }
+.quiz-submit { flex: 1; padding: 20rpx; background: linear-gradient(135deg, $brand-primary, $brand-primary-light); color: $app-surface; font-size: calc(28rpx * var(--font-scale, 1)); border-radius: 12rpx; border: none; }
 .quiz-submit::after { border: none; }
-.result-btn { width: 100%; padding: 20rpx; background: linear-gradient(135deg, $brand-primary, $brand-primary-light); color: $app-surface; font-size: 28rpx; border-radius: 12rpx; border: none; margin-top: 20rpx; }
+.result-btn { width: 100%; padding: 20rpx; background: linear-gradient(135deg, $brand-primary, $brand-primary-light); color: $app-surface; font-size: calc(28rpx * var(--font-scale, 1)); border-radius: 12rpx; border: none; margin-top: 20rpx; }
 .result-dialog { text-align: center; }
-.result-icon { font-size: 80rpx; }
-.result-text { font-size: 32rpx; font-weight: 700; color: $facade-text-strong; margin: 16rpx 0; }
-.result-energy { font-size: 28rpx; color: $brand-primary; }
+.result-icon { font-size: calc(80rpx * var(--font-scale, 1)); }
+.result-text { font-size: calc(32rpx * var(--font-scale, 1)); font-weight: 700; color: $facade-text-strong; margin: 16rpx 0; }
+.result-energy { font-size: calc(28rpx * var(--font-scale, 1)); color: $brand-primary; }
 </style>

+ 6 - 6
cfc-frontend/pages/article-center/article-edit.vue

@@ -258,7 +258,7 @@ export default {
   z-index: 10;
 }
 .header-left { display: flex; align-items: center; }
-.back-icon { font-size: 36rpx; margin-right: 8rpx; }
+.back-icon { font-size: calc(36rpx * var(--font-scale, 1)); margin-right: 8rpx; }
 
 .header-title { font-size: calc(32rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; }
 .header-right { }
@@ -282,7 +282,7 @@ export default {
   justify-content: center;
   height: 100%;
 }
-.cover-icon { font-size: 60rpx; margin-bottom: 10rpx; }
+.cover-icon { font-size: calc(60rpx * var(--font-scale, 1)); margin-bottom: 10rpx; }
 .cover-hint { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-muted; }
 .cover-change {
   position: absolute;
@@ -309,14 +309,14 @@ export default {
   outline: none;
 }
 .title-input { font-weight: bold; }
-.char-count { display: block; text-align: right; font-size: 20rpx; color: $facade-text-ghost-light; margin-top: 8rpx; }
+.char-count { display: block; text-align: right; font-size: calc(20rpx * var(--font-scale, 1)); color: $facade-text-ghost-light; margin-top: 8rpx; }
 .form-label { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-body; display: block; margin-bottom: 16rpx; }
 /* 维度 */
 .dimension-chips { display: flex; flex-wrap: wrap; gap: 16rpx; }
 .dim-chip {
   padding: 10rpx 28rpx;
   border-radius: 30rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   border: 2rpx solid $facade-border-soft;
   color: $facade-text-body;
 }
@@ -342,7 +342,7 @@ export default {
   text-align: center;
 }
 .vis-option.active { border-color: $brand-primary; background: $uni-primary-pale; }
-.vis-icon { font-size: 40rpx; display: block; margin-bottom: 8rpx; }
+.vis-icon { font-size: calc(40rpx * var(--font-scale, 1)); display: block; margin-bottom: 8rpx; }
 .vis-text { font-size: calc(26rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; display: block; }
 .vis-desc { font-size: calc(20rpx * var(--font-scale, 1)); color: $facade-text-muted; display: block; margin-top: 4rpx; }
 /* 发布按钮 */
@@ -352,7 +352,7 @@ export default {
   line-height: 88rpx;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-dark);
   color: $app-surface;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   border-radius: 44rpx;
   text-align: center;

+ 15 - 15
cfc-frontend/pages/article-center/index.vue

@@ -363,12 +363,12 @@ onLoad(options) {
   flex-shrink: 0;
 }
 .ac-nav-back {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   color: $facade-text-strong;
   font-weight: bold;
 }
 .ac-nav-title {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $text-charcoal;
   flex: 1;
@@ -381,11 +381,11 @@ onLoad(options) {
   flex-shrink: 0;
 }
 .ac-nav-search-icon {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 .ac-nav-add {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: 300;
   line-height: 1;
@@ -405,11 +405,11 @@ onLoad(options) {
   background: $facade-fill-2;
   border-radius: 30rpx;
   padding: 0 28rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-strong;
 }
 .ac-search-cancel {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-left: 16rpx;
   flex-shrink: 0;
@@ -434,7 +434,7 @@ onLoad(options) {
   height: 52rpx;
   padding: 0 28rpx;
   margin-right: 16rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-body;
   background: $facade-fill;
   border-radius: 26rpx;
@@ -497,7 +497,7 @@ onLoad(options) {
   margin-bottom: 28rpx;
 }
 .ac-empty-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-ghost-light;
 }
 
@@ -539,7 +539,7 @@ onLoad(options) {
 .ac-card-dim-tag {
   padding: 2rpx 14rpx;
   border-radius: 12rpx;
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $app-surface;
   font-weight: 500;
   line-height: 1.4;
@@ -554,7 +554,7 @@ onLoad(options) {
   margin-bottom: 12rpx;
 }
 .ac-card-category {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $brand-primary;
   background: rgba(249,115,22,0.08);
   padding: 2rpx 14rpx;
@@ -562,7 +562,7 @@ onLoad(options) {
   margin-right: 16rpx;
 }
 .ac-card-readtime {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $text-ghost-soft;
 }
 .ac-card-title {
@@ -593,7 +593,7 @@ onLoad(options) {
 .ac-card-footer {
   display: flex;
   align-items: center;
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $facade-text-ghost-light;
 }
 .ac-card-author {
@@ -620,11 +620,11 @@ onLoad(options) {
   padding: 30rpx;
 }
 .ac-loading-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-ghost-light;
 }
 .ac-no-more-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-border-soft;
 }
 .ac-bottom-gap {
@@ -652,7 +652,7 @@ onLoad(options) {
   opacity: 0.85;
 }
 .ac-fab-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   font-weight: 300;
   line-height: 1;
 }

+ 3 - 3
cfc-frontend/pages/article-center/my-posts.vue

@@ -136,10 +136,10 @@ export default {
 .posts-container { min-height: 100vh; background: $app-bg; }
 .posts-list { height: 100vh; }
 .loading-wrap, .empty-wrap { display: flex; flex-direction: column; align-items: center; padding-top: 200rpx; }
-.loading-text { font-size: 26rpx; color: $facade-text-muted; }
-.empty-icon { font-size: 100rpx; margin-bottom: 24rpx; }
+.loading-text { font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-muted; }
+.empty-icon { font-size: calc(100rpx * var(--font-scale, 1)); margin-bottom: 24rpx; }
 .empty-text { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-muted; margin-bottom: 30rpx; }
-.write-btn { width: 240rpx; height: 72rpx; line-height: 72rpx; background: $brand-primary; color: $app-surface; font-size: 28rpx; border-radius: 36rpx; border: none; }
+.write-btn { width: 240rpx; height: 72rpx; line-height: 72rpx; background: $brand-primary; color: $app-surface; font-size: calc(28rpx * var(--font-scale, 1)); border-radius: 36rpx; border: none; }
 .write-btn::after { border: none; }
 .post-list { padding: 20rpx 24rpx; }
 .post-card {

+ 2 - 2
cfc-frontend/pages/assessment-plan/detail.vue

@@ -156,7 +156,7 @@ export default {
   padding: 80rpx 0;
 }
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 
@@ -255,7 +255,7 @@ export default {
   padding: 120rpx 60rpx;
 }
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 24rpx;
 }
 .empty-title {

+ 3 - 3
cfc-frontend/pages/assessment-plan/list.vue

@@ -123,7 +123,7 @@ export default {
   padding: 80rpx 0;
 }
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 
@@ -209,7 +209,7 @@ export default {
   right: 24rpx;
   top: 50%;
   transform: translateY(-50%);
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   color: $facade-text-ghost;
 }
 
@@ -221,7 +221,7 @@ export default {
   padding: 120rpx 60rpx;
 }
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 24rpx;
 }
 .empty-title {

+ 7 - 7
cfc-frontend/pages/assessment/apply.vue

@@ -440,7 +440,7 @@ export default {
 }
 
 .guide-price {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: bold;
 }
@@ -467,7 +467,7 @@ export default {
 }
 
 .type-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   display: block;
   margin-bottom: 10rpx;
 }
@@ -512,12 +512,12 @@ export default {
   background: $facade-fill-page;
   border-radius: 10rpx;
   padding: 0 20rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-strong;
 }
 
 .picker-arrow {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 
@@ -539,12 +539,12 @@ export default {
 }
 
 .price-label {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 
 .price-value {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $facade-text-strong;
 }
@@ -559,7 +559,7 @@ export default {
   background: linear-gradient(135deg, $accent-indigo 0%, $accent-indigo-deep 100%);
   color: $app-surface;
   border-radius: 45rpx;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   margin-top: 40rpx;
 }

+ 1 - 1
cfc-frontend/pages/assessment/execution.vue

@@ -573,7 +573,7 @@ export default {
 
 .btn-primary, .btn-secondary, .btn-outline {
   border-radius: 20rpx;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   padding: 30rpx;
   text-align: center;
 }

+ 9 - 9
cfc-frontend/pages/assessment/purchase.vue

@@ -437,7 +437,7 @@ export default {
 }
 
 .guide-price {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: bold;
 }
@@ -485,14 +485,14 @@ export default {
 }
 
 .price {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $brand-primary;
   display: block;
 }
 
 .original-price {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   text-decoration: line-through;
   margin-left: 10rpx;
@@ -520,7 +520,7 @@ export default {
 
 .feature-icon {
   color: $mat-green;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   margin-right: 8rpx;
 }
 
@@ -562,12 +562,12 @@ export default {
 }
 
 .price-label {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 
 .price-value {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $facade-text-strong;
 }
@@ -577,13 +577,13 @@ export default {
 }
 
 .price-row.total .price-label {
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $facade-text-strong;
 }
 
 .price-row.total .price-value {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   color: $brand-primary;
 }
 
@@ -593,7 +593,7 @@ export default {
   background: linear-gradient(135deg, $accent-indigo 0%, $accent-indigo-deep 100%);
   color: $app-surface;
   border-radius: 45rpx;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   margin-top: 40rpx;
 }

+ 4 - 4
cfc-frontend/pages/assessment/quota.vue

@@ -143,7 +143,7 @@ export default {
   color: $facade-text-strong;
 }
 .status-tag {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   padding: 4rpx 16rpx;
   border-radius: 20rpx;
 }
@@ -213,7 +213,7 @@ export default {
   background: linear-gradient(135deg, $accent-indigo, $accent-indigo-deep);
   color: $app-surface;
   border-radius: 38rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   text-align: center;
 }
 .empty {
@@ -223,7 +223,7 @@ export default {
   padding-top: 120rpx;
 }
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   margin-bottom: 20rpx;
 }
 .empty-text {
@@ -238,7 +238,7 @@ export default {
   background: linear-gradient(135deg, $accent-indigo, $accent-indigo-deep);
   color: $app-surface;
   border-radius: 40rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   text-align: center;
 }
 </style>

+ 1 - 1
cfc-frontend/pages/assessment/rating.vue

@@ -349,7 +349,7 @@ export default {
 
 .btn-primary, .btn-outline {
   border-radius: 20rpx;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   padding: 30rpx;
   text-align: center;
 }

+ 5 - 5
cfc-frontend/pages/assessment/results.vue

@@ -269,7 +269,7 @@ export default {
   text-align: center;
   padding: 20rpx;
   border-radius: 10rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 
@@ -364,7 +364,7 @@ export default {
 }
 
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   display: block;
   margin-bottom: 20rpx;
 }
@@ -411,13 +411,13 @@ export default {
 }
 
 .modal-title {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $facade-text-strong;
 }
 
 .modal-close {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   padding: 10rpx;
 }
@@ -477,7 +477,7 @@ export default {
   background: $facade-fill;
   color: $facade-text-strong;
   border-radius: 40rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: bold;
 }
 </style>

+ 2 - 2
cfc-frontend/pages/assessment/upload-report.vue

@@ -191,7 +191,7 @@ export default {
   border-radius: 12rpx;
 }
 .upload-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
 }
 .upload-text {
   font-size: calc(28rpx * var(--font-scale, 1));
@@ -213,7 +213,7 @@ export default {
   background: linear-gradient(135deg, $accent-indigo, $accent-indigo-deep);
   color: $app-surface;
   border-radius: 44rpx;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   margin-top: 30rpx;
 }
 .btn-submit[disabled] {

+ 5 - 5
cfc-frontend/pages/body-detail/checkin.vue

@@ -304,7 +304,7 @@ $c-tint-amber-edge: #FFECB3;  // 能量提示渐变终点(amber-100;与全
   align-items: center;
 }
 .tip-icon {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   margin-right: 12rpx;
 }
 .tip-text {
@@ -349,7 +349,7 @@ $c-tint-amber-edge: #FFECB3;  // 能量提示渐变终点(amber-100;与全
   color: $facade-text-strong;
 }
 .date-arrow {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   color: $facade-text-ghost;
 }
 
@@ -362,7 +362,7 @@ $c-tint-amber-edge: #FFECB3;  // 能量提示渐变终点(amber-100;与全
 .behavior-chip {
   background: $facade-fill;
   color: $facade-text-body;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   padding: 12rpx 20rpx;
   border-radius: 24rpx;
   margin-right: 16rpx;
@@ -414,7 +414,7 @@ $c-tint-amber-edge: #FFECB3;  // 能量提示渐变终点(amber-100;与全
 .submit-btn {
   background: linear-gradient(135deg, $mat-green, $mat-green-light-2);
   color: $app-surface;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   text-align: center;
   padding: 24rpx;
@@ -468,7 +468,7 @@ $c-tint-amber-edge: #FFECB3;  // 能量提示渐变终点(amber-100;与全
 .bh-tag {
   background: $mat-blue-tint;
   color: $mat-blue-strong;
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   padding: 4rpx 12rpx;
   border-radius: 12rpx;
   margin-right: 8rpx;

+ 3 - 3
cfc-frontend/pages/body-detail/dimension-detail.vue

@@ -355,7 +355,7 @@ export default {
   height: 60vh;
 }
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .dd-header {
@@ -503,7 +503,7 @@ export default {
   font-weight: 500;
 }
 .dd-prod-price {
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   color: $mind-accent;
   font-weight: 600;
   margin-top: 8rpx;
@@ -519,7 +519,7 @@ export default {
   line-height: 88rpx;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   color: $app-surface;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   border-radius: 44rpx;
   text-align: center;
 }

+ 4 - 4
cfc-frontend/pages/body-detail/dimension-questionnaire.vue

@@ -455,7 +455,7 @@ export default {
   height: 60vh;
 }
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .qd-step {
@@ -502,7 +502,7 @@ export default {
   background: $brand-primary-soft;
 }
 .qd-dim-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   margin-bottom: 10rpx;
 }
 .qd-dim-label {
@@ -597,7 +597,7 @@ export default {
   line-height: 88rpx;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   color: $app-surface;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   border-radius: 44rpx;
   border: none;
   text-align: center;
@@ -620,7 +620,7 @@ export default {
   padding: 60rpx 0;
 }
 .qd-result-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
 }
 .qd-result-title {
   font-size: calc(40rpx * var(--font-scale, 1));

+ 8 - 8
cfc-frontend/pages/body-detail/health-dimensions.vue

@@ -471,7 +471,7 @@ export default {
   align-items: center;
 }
 .dim-level-tag {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   padding: 4rpx 16rpx;
   border-radius: 20rpx;
   background: $facade-fill;
@@ -505,7 +505,7 @@ export default {
   text-align: center;
 }
 .loading-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .fab-upload {
@@ -522,7 +522,7 @@ export default {
   box-shadow: 0 8rpx 24rpx rgba(255, 140, 66, 0.4);
 }
 .fab-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   color: $app-surface;
   font-weight: bold;
   line-height: 1;
@@ -553,12 +553,12 @@ export default {
   border-bottom: 1px solid $facade-fill;
 }
 .modal-title {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $facade-text-strong;
 }
 .modal-close {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   line-height: 1;
 }
@@ -580,7 +580,7 @@ export default {
   border: 1px solid $facade-hairline;
   border-radius: 12rpx;
   padding: 0 20rpx;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-strong;
 }
 .form-input {
@@ -602,7 +602,7 @@ export default {
   text-align: center;
   background: $facade-fill;
   border-radius: 44rpx;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 .btn-confirm {
@@ -612,7 +612,7 @@ export default {
   text-align: center;
   background: linear-gradient(135deg, $dim-body, $mind-accent);
   border-radius: 44rpx;
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   color: $app-surface;
 }
 </style>

+ 9 - 9
cfc-frontend/pages/body-detail/health-report.vue

@@ -544,7 +544,7 @@ export default {
   display: inline-block;
   background: $mat-blue-strong;
   color: $app-surface;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   padding: 6rpx 20rpx;
   border-radius: 20rpx;
   margin-bottom: 20rpx;
@@ -575,7 +575,7 @@ export default {
   background: $mat-green-tint;
 }
 .score-num {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $mat-blue-strong;
 }
@@ -601,7 +601,7 @@ export default {
 .info-chip {
   background: $app-surface;
   color: $facade-text-strong;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   padding: 8rpx 20rpx;
   border-radius: 20rpx;
   margin-right: 16rpx;
@@ -646,7 +646,7 @@ export default {
   color: $facade-text-strong;
 }
 .category-count {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .indicator-card {
@@ -697,7 +697,7 @@ export default {
   align-items: baseline;
 }
 .ind-value {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $mat-blue-strong;
 }
@@ -740,12 +740,12 @@ export default {
 }
 
 .fab-icon {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   margin-right: 12rpx;
 }
 
 .fab-text {
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   font-weight: 600;
 }
 
@@ -800,7 +800,7 @@ export default {
   margin-bottom: 8rpx;
 }
 .flora-score-num {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $app-surface;
 }
@@ -833,7 +833,7 @@ export default {
   color: $facade-text-strong;
 }
 .deficiency-type-tag {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   padding: 4rpx 16rpx;
   border-radius: 16rpx;
   background: $fortune-1-tint;

+ 8 - 8
cfc-frontend/pages/body-detail/index.vue

@@ -797,7 +797,7 @@ $c-tint-warm: #FFF5EE;
 }
 
 .overview-icon {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
 }
 
 .overview-details {
@@ -830,7 +830,7 @@ $c-tint-warm: #FFF5EE;
 }
 
 .trend-icon {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   flex-shrink: 0;
 }
 
@@ -876,7 +876,7 @@ $c-tint-warm: #FFF5EE;
 
 .overview-nav-btn-text {
   color: $app-surface;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   font-weight: 600;
 }
 
@@ -903,7 +903,7 @@ $c-tint-warm: #FFF5EE;
 
 .overview-nav-btn-secondary-text {
   color: $dim-body;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   font-weight: 600;
 }
 
@@ -953,7 +953,7 @@ $c-tint-warm: #FFF5EE;
 
 .avg-badge {
   display: block;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $app-text-muted;
   padding: 0 24rpx 16rpx;
 }
@@ -1009,7 +1009,7 @@ $c-tint-warm: #FFF5EE;
 }
 
 .indicator-delta {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   font-weight: 500;
   flex-shrink: 0;
   margin-left: 8rpx;
@@ -1219,7 +1219,7 @@ $c-tint-warm: #FFF5EE;
   align-items: center;
   justify-content: center;
   margin-right: 12rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
 }
 .portrait-dim-name {
   font-size: calc(26rpx * var(--font-scale, 1));
@@ -1271,7 +1271,7 @@ $c-tint-warm: #FFF5EE;
 }
 
 .guidance-icon {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   margin-right: 12rpx;
 }
 

+ 1 - 1
cfc-frontend/pages/body-detail/member-body-detail.vue

@@ -193,7 +193,7 @@ export default {
   padding-bottom: 40rpx;
 }
 .nav-back-icon {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   color: $facade-text-strong;
 }
 .member-card {

+ 3 - 3
cfc-frontend/pages/butler/apply.vue

@@ -170,7 +170,7 @@ export default {
   color: $facade-text-muted;
 }
 .arrow {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .textarea {
@@ -183,7 +183,7 @@ export default {
   box-sizing: border-box;
 }
 .counter {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   text-align: right;
   display: block;
@@ -195,7 +195,7 @@ export default {
   background: linear-gradient(135deg, $accent-indigo 0%, $accent-indigo-deep 100%);
   color: $app-surface;
   border-radius: 45rpx;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   margin-top: 40rpx;
 }

+ 3 - 3
cfc-frontend/pages/butler/select.vue

@@ -151,10 +151,10 @@ export default {
 .current-name { font-size: calc(34rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; }
 .current-date { font-size: calc(22rpx * var(--font-scale, 1)); color: $facade-text-muted; margin-top: 6rpx; }
 .current-desc { font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-body; margin-top: 20rpx; line-height: 1.6; }
-.btn-change { margin-top: 24rpx; background: $brand-primary; color: $app-surface; font-size: 28rpx; border-radius: 40rpx; }
+.btn-change { margin-top: 24rpx; background: $brand-primary; color: $app-surface; font-size: calc(28rpx * var(--font-scale, 1)); border-radius: 40rpx; }
 .upgrade-banner { display: flex; justify-content: space-between; align-items: center; background: $uni-primary-pale; border: 1rpx solid #ffb56b; border-radius: 16rpx; padding: 24rpx; margin-bottom: 24rpx; }
 .upgrade-text { font-size: calc(26rpx * var(--font-scale, 1)); color: #d4770a; flex: 1; }
-.upgrade-arrow { font-size: 36rpx; color: #d4770a; margin-left: 12rpx; }
+.upgrade-arrow { font-size: calc(36rpx * var(--font-scale, 1)); color: #d4770a; margin-left: 12rpx; }
 .section-title { font-size: calc(30rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; margin: 8rpx 0 20rpx; }
 .butler-card { display: flex; align-items: center; background: $app-surface; border-radius: 20rpx; padding: 28rpx; margin-bottom: 20rpx; }
 .butler-card.active { border: 2rpx solid $brand-primary; }
@@ -164,7 +164,7 @@ export default {
 .card-name { font-size: calc(30rpx * var(--font-scale, 1)); font-weight: bold; color: $facade-text-strong; }
 .card-slots { font-size: calc(22rpx * var(--font-scale, 1)); color: $status-success; }
 .card-desc { display: block; font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-faint; margin-top: 8rpx; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
-.btn-select { width: 120rpx; height: 60rpx; line-height: 60rpx; padding: 0; font-size: 26rpx; background: $brand-primary; color: $app-surface; border-radius: 30rpx; flex-shrink: 0; margin-left: 16rpx; }
+.btn-select { width: 120rpx; height: 60rpx; line-height: 60rpx; padding: 0; font-size: calc(26rpx * var(--font-scale, 1)); background: $brand-primary; color: $app-surface; border-radius: 30rpx; flex-shrink: 0; margin-left: 16rpx; }
 .btn-select[disabled] { background: $facade-text-ghost; color: $app-surface; }
 .empty-tip { text-align: center; color: $facade-text-muted; font-size: calc(26rpx * var(--font-scale, 1)); padding: 60rpx 0; }
 </style>

+ 2 - 2
cfc-frontend/pages/child/rewards.vue

@@ -142,7 +142,7 @@ export default {
 
 <style scoped lang="scss">
 .container { padding: 30rpx; padding-bottom: 120rpx; }
-.exit-switch { background: $facade-fill-2; padding: 20rpx; border-radius: 10rpx; margin-bottom: 20rpx; text-align: center; color: $facade-text-body; font-size: 28rpx; }
+.exit-switch { background: $facade-fill-2; padding: 20rpx; border-radius: 10rpx; margin-bottom: 20rpx; text-align: center; color: $facade-text-body; font-size: calc(28rpx * var(--font-scale, 1)); }
 .reward-item { background: $app-surface; border-radius: 16rpx; padding: 30rpx; margin-bottom: 20rpx; }
 .reward-title { font-size: calc(30rpx * var(--font-scale, 1)); color: $facade-text-strong; margin-bottom: 15rpx; }
 .reward-progress { width: 100%; }
@@ -151,7 +151,7 @@ export default {
 .empty { text-align: center; color: $facade-text-muted; padding: 100rpx; }
 .modal-mask { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; }
 .modal { background: $app-surface; border-radius: 20rpx; padding: 40rpx; width: 80%; }
-.modal-title { font-size: 32rpx; font-weight: bold; margin-bottom: 30rpx; text-align: center; }
+.modal-title { font-size: calc(32rpx * var(--font-scale, 1)); font-weight: bold; margin-bottom: 30rpx; text-align: center; }
 .form-item { margin-bottom: 20rpx; }
 .form-label { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-strong; margin-bottom: 10rpx; }
 .required { color: $brand-primary; }

+ 7 - 7
cfc-frontend/pages/child/tasks.vue

@@ -477,11 +477,11 @@ export default {
 }
 
 .exit-switch__icon {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
 }
 
 .exit-switch__text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: var(--text-secondary, $uni-text-color-secondary);
   font-weight: var(--font-weight-medium, 500);
 }
@@ -523,7 +523,7 @@ export default {
 }
 
 .tab-item__label {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   font-weight: var(--font-weight-medium, 500);
   color: var(--text-secondary, $uni-text-color-secondary);
   transition: color var(--transition-fast, 0.15s ease);
@@ -544,7 +544,7 @@ export default {
   border-radius: 999rpx;
   background: rgba(249,115,22,0.12);
   color: var(--color-primary, $brand-primary);
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   font-weight: var(--font-weight-bold, 600);
   line-height: 1;
 }
@@ -611,7 +611,7 @@ export default {
 }
 
 .task-card__celebrate-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   animation: celebrateBounce 0.6s ease both;
 }
 
@@ -649,7 +649,7 @@ export default {
 }
 
 .task-icon__emoji {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   line-height: 1;
 }
 
@@ -734,7 +734,7 @@ export default {
 }
 
 .status-badge__text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   line-height: 1;
 }
 

+ 4 - 4
cfc-frontend/pages/cognitive-hall.vue

@@ -243,7 +243,7 @@ $c-ink-night:    $app-ink-night;   // 深夜蓝黑(本页深色文字)
 }
 
 .game-icon {
-  font-size: 44rpx;
+  font-size: calc(44rpx * var(--font-scale, 1));
 }
 
 .game-info {
@@ -280,7 +280,7 @@ $c-ink-night:    $app-ink-night;   // 深夜蓝黑(本页深色文字)
 }
 
 .game-arrow {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   color: $facade-text-ghost;
   margin-left: 16rpx;
 }
@@ -289,11 +289,11 @@ $c-ink-night:    $app-ink-night;   // 深夜蓝黑(本页深色文字)
   text-align: center;
   padding: 80rpx 40rpx;
   color: $facade-text-muted;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
 }
 
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   display: block;
   margin-bottom: 20rpx;
 }

+ 5 - 5
cfc-frontend/pages/cognitive-test/language-test.vue

@@ -260,7 +260,7 @@ export default {
 
 /* ===== 说明页 ===== */
 .title-icon {
-  font-size: 88rpx;
+  font-size: calc(88rpx * var(--font-scale, 1));
   margin-bottom: 24rpx;
 }
 
@@ -289,7 +289,7 @@ export default {
 .btn-primary {
   background: linear-gradient(135deg, $dim-wealth, $status-warning);
   color: $app-ink-night;
-  font-size: 34rpx;
+  font-size: calc(34rpx * var(--font-scale, 1));
   font-weight: bold;
   width: 480rpx;
   height: 92rpx;
@@ -307,7 +307,7 @@ export default {
 .btn-secondary {
   background: rgba(255,255,255,0.1);
   color: rgba(255,255,255,0.85);
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   width: 480rpx;
   height: 92rpx;
   line-height: 92rpx;
@@ -428,7 +428,7 @@ export default {
 }
 
 .score-num {
-  font-size: 88rpx;
+  font-size: calc(88rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $dim-wealth;
 }
@@ -446,7 +446,7 @@ export default {
 }
 
 .dimension-tag {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $dim-wealth;
   border: 2rpx solid $dim-wealth;
   border-radius: 24rpx;

+ 2 - 2
cfc-frontend/pages/cognitive-test/logic-test.vue

@@ -296,7 +296,7 @@ export default {
   margin-bottom: 40rpx;
 }
 .intro-icon-text {
-  font-size: 72rpx;
+  font-size: calc(72rpx * var(--font-scale, 1));
 }
 .intro-title {
   font-size: calc(44rpx * var(--font-scale, 1));
@@ -477,7 +477,7 @@ export default {
   background: rgba(255, 215, 0, 0.12);
 }
 .dim-tag-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $accent-gold;
   font-weight: bold;
 }

+ 5 - 5
cfc-frontend/pages/cognitive-test/memory-test.vue

@@ -324,7 +324,7 @@ export default {
   border-radius: 48rpx;
   background: linear-gradient(135deg, $dim-wisdom 0%, $dim-wisdom-light 100%);
   color: $app-surface;
-  font-size: 34rpx;
+  font-size: calc(34rpx * var(--font-scale, 1));
   font-weight: 600;
   border: none;
   box-shadow: 0 8rpx 24rpx rgba(99, 102, 241, 0.35);
@@ -346,7 +346,7 @@ export default {
   border-radius: 48rpx;
   background: transparent;
   color: $indigo-light;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   border: 2rpx solid rgba(99, 102, 241, 0.5);
 }
 .ghost-btn::after {
@@ -372,7 +372,7 @@ export default {
   margin-bottom: 40rpx;
 }
 .intro-icon-text {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
 }
 .intro-title {
   font-size: calc(48rpx * var(--font-scale, 1));
@@ -623,7 +623,7 @@ export default {
   box-shadow: 0 12rpx 40rpx rgba(99, 102, 241, 0.45);
 }
 .score-num {
-  font-size: 96rpx;
+  font-size: calc(96rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $app-surface;
   line-height: 1;
@@ -651,7 +651,7 @@ export default {
 }
 .dimension-tag {
   margin-top: 24rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $indigo-light;
   background: rgba(99, 102, 241, 0.15);
   border: 2rpx solid rgba(99, 102, 241, 0.4);

+ 5 - 5
cfc-frontend/pages/cognitive-test/perception-test.vue

@@ -258,7 +258,7 @@ export default {
 
 /* ===== 说明页 ===== */
 .title-icon {
-  font-size: 88rpx;
+  font-size: calc(88rpx * var(--font-scale, 1));
   margin-bottom: 24rpx;
 }
 
@@ -287,7 +287,7 @@ export default {
 .btn-primary {
   background: linear-gradient(135deg, $flat-teal, #45B7AA);
   color: $app-surface;
-  font-size: 34rpx;
+  font-size: calc(34rpx * var(--font-scale, 1));
   font-weight: bold;
   width: 480rpx;
   height: 92rpx;
@@ -305,7 +305,7 @@ export default {
 .btn-secondary {
   background: rgba(255,255,255,0.1);
   color: rgba(255,255,255,0.85);
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   width: 480rpx;
   height: 92rpx;
   line-height: 92rpx;
@@ -423,7 +423,7 @@ export default {
 }
 
 .score-num {
-  font-size: 88rpx;
+  font-size: calc(88rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $flat-teal;
 }
@@ -441,7 +441,7 @@ export default {
 }
 
 .dimension-tag {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $flat-teal;
   border: 2rpx solid $flat-teal;
   border-radius: 24rpx;

+ 3 - 3
cfc-frontend/pages/cognitive-test/spatial-test.vue

@@ -393,7 +393,7 @@ export default {
   margin-bottom: 20rpx;
 }
 .direction-arrow {
-  font-size: 100rpx;
+  font-size: calc(100rpx * var(--font-scale, 1));
   color: $app-surface;
   line-height: 1.2;
   margin-bottom: 20rpx;
@@ -425,7 +425,7 @@ export default {
   background: rgba(59, 130, 246, 0.2);
 }
 .option-arrow {
-  font-size: 72rpx;
+  font-size: calc(72rpx * var(--font-scale, 1));
   color: $app-surface;
 }
 .feedback-row {
@@ -463,7 +463,7 @@ export default {
   margin: 40rpx 0;
 }
 .score-number {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $app-surface;
   line-height: 1.1;

+ 4 - 4
cfc-frontend/pages/cognitive-test/speed-test.vue

@@ -375,7 +375,7 @@ export default {
   width: 70%;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   color: $app-surface;
-  font-size: 34rpx;
+  font-size: calc(34rpx * var(--font-scale, 1));
   border-radius: 50rpx;
   border: none;
   margin-top: 20rpx;
@@ -393,7 +393,7 @@ export default {
   width: 70%;
   background: transparent;
   color: $brand-primary;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   border-radius: 50rpx;
   border: 2rpx solid $brand-primary;
   margin-top: 30rpx;
@@ -526,7 +526,7 @@ export default {
 }
 
 .score-num {
-  font-size: 88rpx;
+  font-size: calc(88rpx * var(--font-scale, 1));
   font-weight: bold;
   color: $app-surface;
   line-height: 1;
@@ -564,7 +564,7 @@ export default {
 }
 
 .dimension-tag {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $brand-primary;
   background: rgba(249, 115, 22, 0.12);
   border: 2rpx solid rgba(249, 115, 22, 0.4);

+ 1 - 1
cfc-frontend/pages/dan-assessment/comparison.vue

@@ -189,7 +189,7 @@ export default {
 .value { font-size: calc(24rpx * var(--font-scale, 1)); color: $uni-text-color; }
 .deltas-list { margin-top: 24rpx; }
 .delta-item { padding: 12rpx 0; border-bottom: 1rpx solid $uni-border-color-light; display: flex; align-items: center; }
-.delta-code { flex: 1; font-size: 24rpx; color: $uni-text-color-secondary; }
+.delta-code { flex: 1; font-size: calc(24rpx * var(--font-scale, 1)); color: $uni-text-color-secondary; }
 .delta-added { color: #32CD32; }
 .delta-removed { color: $accent-coral; }
 .delta-modified { color: $accent-gold-deep; }

+ 6 - 6
cfc-frontend/pages/dan-assessment/report-result.vue

@@ -675,13 +675,13 @@ $c-rpt-mask-ink:     #000;    // 遮罩渐变异色(mask-image)
 .hero-name { font-size: calc(44rpx * var(--font-scale, 1)); font-weight: 700; color: $app-surface; display: block; }
 .hero-dim-row { display: flex; align-items: center; margin-top: 14rpx; flex-wrap: wrap; }
 .hero-dim-badge {
-  font-size: 22rpx; color: $app-surface;
+  font-size: calc(22rpx * var(--font-scale, 1)); color: $app-surface;
   background: rgba(255,255,255,0.22);
   border-radius: 24rpx; padding: 6rpx 18rpx;
   margin-right: 14rpx;
 }
 .hero-level-badge {
-  font-size: 22rpx; color: $c-rpt-brown; font-weight: 600;
+  font-size: calc(22rpx * var(--font-scale, 1)); color: $c-rpt-brown; font-weight: 600;
   background: linear-gradient(135deg, $status-warning-light, $status-warning);
   border-radius: 24rpx; padding: 6rpx 18rpx;
   margin-right: 14rpx;
@@ -695,8 +695,8 @@ $c-rpt-mask-ink:     #000;    // 遮罩渐变异色(mask-image)
 }
 .hero-score-col { flex: 1; display: flex; flex-direction: column; align-items: center; }
 .hero-score-divider { width: 1rpx; height: 72rpx; background: rgba(255,255,255,0.25); }
-.hero-score-num { font-size: 88rpx; font-weight: 700; color: $app-surface; line-height: 1; }
-.hero-score-num-pct { font-size: 72rpx; }
+.hero-score-num { font-size: calc(88rpx * var(--font-scale, 1)); font-weight: 700; color: $app-surface; line-height: 1; }
+.hero-score-num-pct { font-size: calc(72rpx * var(--font-scale, 1)); }
 .hero-score-pct-unit { font-size: calc(32rpx * var(--font-scale, 1)); font-weight: 400; margin-left: 2rpx; }
 .hero-score-label { font-size: calc(24rpx * var(--font-scale, 1)); color: rgba(255,255,255,0.75); margin-top: 12rpx; }
 
@@ -745,7 +745,7 @@ $c-rpt-mask-ink:     #000;    // 遮罩渐变异色(mask-image)
 .metric-value-warn { color: $brand-primary-dark; }
 .metric-unit { font-size: calc(20rpx * var(--font-scale, 1)); font-weight: 400; }
 .metric-warn-badge {
-  font-size: 20rpx; color: $brand-primary-dark;
+  font-size: calc(20rpx * var(--font-scale, 1)); color: $brand-primary-dark;
   background: $uni-primary-pale; border: 1rpx solid $c-rpt-orange;
   border-radius: 16rpx; padding: 2rpx 12rpx; margin-right: 10rpx;
 }
@@ -853,7 +853,7 @@ $c-rpt-mask-ink:     #000;    // 遮罩渐变异色(mask-image)
 
 /* ==================== 其他 ==================== */
 .loading-wrap { display: flex; justify-content: center; padding: 140rpx 0; }
-.loading-text { font-size: 28rpx; color: $facade-text-muted; }
+.loading-text { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-muted; }
 .empty-wrap { display: flex; justify-content: center; padding: 140rpx 0; }
 .empty-text { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-muted; }
 .bottom-spacer { height: 60rpx; }

+ 7 - 7
cfc-frontend/pages/diet/food-query.vue

@@ -469,7 +469,7 @@ export default {
   border-radius: 20rpx;
   background: $facade-fill-2;
   color: $facade-text-body;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
 }
 .mode-btn.active {
   background: linear-gradient(135deg, $status-success, $status-success-light-3);
@@ -496,7 +496,7 @@ export default {
   background-color: $dim-body;
   color: $app-surface;
   border-radius: 30rpx;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
 }
 
 .content {
@@ -518,7 +518,7 @@ export default {
   padding: 12rpx 24rpx;
   border: 1rpx solid $facade-border-soft;
   border-radius: 30rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-body;
   background-color: $app-surface;
 }
@@ -646,7 +646,7 @@ export default {
   background: linear-gradient(135deg, $status-danger, $status-danger-deep);
 }
 .ingredient-badge-text {
-  font-size: 18rpx;
+  font-size: calc(18rpx * var(--font-scale, 1));
   color: $app-surface;
   font-weight: 600;
 }
@@ -697,7 +697,7 @@ export default {
 .status-badge {
   padding: 6rpx 16rpx;
   border-radius: 20rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   font-weight: 500;
 }
 .badge-suitable {
@@ -715,7 +715,7 @@ export default {
   padding: 100rpx 40rpx;
 }
 .empty-icon {
-  font-size: 80rpx;
+  font-size: calc(80rpx * var(--font-scale, 1));
   display: block;
   margin-bottom: 20rpx;
 }
@@ -731,7 +731,7 @@ export default {
   padding: 80rpx 0;
 }
 .loading-text {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .bottom-spacer { height: 40rpx; }

+ 13 - 13
cfc-frontend/pages/diet/index.vue

@@ -426,7 +426,7 @@ export default {
   display: flex; align-items: center; justify-content: center;
   margin-right: 20rpx; flex-shrink: 0;
 }
-.hero-icon { font-size: 44rpx; }
+.hero-icon { font-size: calc(44rpx * var(--font-scale, 1)); }
 .hero-title { font-size: calc(38rpx * var(--font-scale, 1)); font-weight: 700; color: $app-surface; display: block; }
 .hero-subtitle { font-size: calc(24rpx * var(--font-scale, 1)); color: rgba(255,255,255,0.85); margin-top: 6rpx; display: block; }
 .hero-meals { display: flex; }
@@ -440,11 +440,11 @@ export default {
 .hero-meal:last-child { margin-right: 0; }
 .hero-meal-emoji { font-size: calc(40rpx * var(--font-scale, 1)); margin-bottom: 8rpx; }
 .hero-meal-label { font-size: calc(24rpx * var(--font-scale, 1)); color: $app-surface; }
-.hero-meal-count { font-size: 22rpx; color: rgba(255,255,255,0.9); margin-top: 6rpx; font-weight: 600; }
+.hero-meal-count { font-size: calc(22rpx * var(--font-scale, 1)); color: rgba(255,255,255,0.9); margin-top: 6rpx; font-weight: 600; }
 .hero-empty { display: flex; flex-direction: column; align-items: center; padding: 12rpx 0; }
 .hero-empty-text { font-size: calc(26rpx * var(--font-scale, 1)); color: $app-surface; margin-bottom: 20rpx; }
 .hero-empty-btn {
-  background: $app-surface; color: $brand-primary-deep; font-size: 28rpx; font-weight: 600;
+  background: $app-surface; color: $brand-primary-deep; font-size: calc(28rpx * var(--font-scale, 1)); font-weight: 600;
   padding: 18rpx 44rpx; border-radius: 999rpx;
 }
 .content {
@@ -505,16 +505,16 @@ export default {
   background: $dim-body;
 }
 .action-btn-accent { background: linear-gradient(135deg, $status-success, $status-success-light-3); }
-.action-btn-text-accent { font-size: 24rpx; color: $app-surface; }
+.action-btn-text-accent { font-size: calc(24rpx * var(--font-scale, 1)); color: $app-surface; }
 .action-btn-disabled {
   opacity: 0.4;
 }
 .action-btn-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 .action-btn-text-primary {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $app-surface;
 }
 
@@ -550,7 +550,7 @@ export default {
   flex-shrink: 0;
 }
 .ingredient-badge-text {
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: $app-surface;
   font-weight: 600;
 }
@@ -631,10 +631,10 @@ export default {
 .nav-icon-red   { background: linear-gradient(135deg, #E8F8F1, #C8F0E0); }
 .nav-item:active .nav-icon-wrap { transform: scale(0.92); }
 .nav-icon {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
 }
 .nav-label {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-strong;
 }
 
@@ -680,7 +680,7 @@ export default {
   padding: 40rpx 0;
 }
 .empty-icon {
-  font-size: 48rpx;
+  font-size: calc(48rpx * var(--font-scale, 1));
   margin-bottom: 12rpx;
 }
 .empty-text {
@@ -729,7 +729,7 @@ export default {
   margin-bottom: 24rpx;
 }
 .modal-title {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: 600;
   color: $facade-text-strong;
 }
@@ -741,7 +741,7 @@ export default {
   justify-content: center;
 }
 .close-text {
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .search-wrap {
@@ -769,7 +769,7 @@ export default {
   color: $facade-text-strong;
 }
 .food-tag {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $dim-body;
   background: $warm-peach;
   padding: 6rpx 16rpx;

+ 5 - 5
cfc-frontend/pages/diet/meal-config.vue

@@ -227,7 +227,7 @@ export default {
 }
 .tab-item {
   flex: 1; text-align: center; padding: 18rpx 0;
-  border-radius: 999rpx; font-size: 28rpx; color: $uni-text-color-secondary;
+  border-radius: 999rpx; font-size: calc(28rpx * var(--font-scale, 1)); color: $uni-text-color-secondary;
   transition: color 0.2s ease, background-color 0.2s ease, font-weight 0.2s ease;
 }
 .tab-active {
@@ -252,7 +252,7 @@ export default {
 .meal-icon-breakfast { background: linear-gradient(135deg, $status-info-light, $tint-sky-line); }
 .meal-icon-lunch     { background: linear-gradient(135deg, $status-warning, $accent-amber-light); }
 .meal-icon-dinner    { background: linear-gradient(135deg, $facade-violet-light, $accent-violet-300); }
-.meal-count { font-size: 24rpx; color: $brand-primary; margin-left: auto; }
+.meal-count { font-size: calc(24rpx * var(--font-scale, 1)); color: $brand-primary; margin-left: auto; }
 .meal-name {
   font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: 600;
@@ -345,7 +345,7 @@ export default {
   background-color: $uni-primary-pale;
 }
 .add-member-entry-icon {
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   color: $brand-primary;
   margin-right: 12rpx;
 }
@@ -355,7 +355,7 @@ export default {
   font-weight: 600;
 }
 .add-member-entry-arrow {
-  font-size: 30rpx;
+  font-size: calc(30rpx * var(--font-scale, 1));
   color: $brand-primary;
   margin-left: 8rpx;
 }
@@ -376,7 +376,7 @@ export default {
 .save-btn {
   background: linear-gradient(135deg, $brand-primary, $brand-primary-dark);
   color: $app-surface; text-align: center; padding: 28rpx 0; border-radius: 999rpx;
-  font-size: 30rpx; font-weight: 600;
+  font-size: calc(30rpx * var(--font-scale, 1)); font-weight: 600;
   box-shadow: 0 6rpx 20rpx rgba(249, 115, 22, 0.3);
   transition: opacity 0.2s ease, transform 0.2s ease;
 }

+ 4 - 4
cfc-frontend/pages/diet/preferences.vue

@@ -414,7 +414,7 @@ $c-dp-footer-line: #FFE9D4; // 底部操作条描边
 /* ===== 内容 ===== */
 .content { flex: 1; padding: 10rpx 32rpx 30rpx; box-sizing: border-box; }
 .step-head { display: flex; align-items: center; margin: 20rpx 0 24rpx; }
-.step-icon { font-size: 52rpx; margin-right: 20rpx; }
+.step-icon { font-size: calc(52rpx * var(--font-scale, 1)); margin-right: 20rpx; }
 .step-head-text { display: flex; flex-direction: column; }
 .step-title { font-size: calc(34rpx * var(--font-scale, 1)); font-weight: 700; color: $c-dp-ink; }
 .step-sub { font-size: calc(24rpx * var(--font-scale, 1)); color: $c-dp-muted; margin-top: 6rpx; }
@@ -430,7 +430,7 @@ $c-dp-footer-line: #FFE9D4; // 底部操作条描边
 .chip-group { display: flex; flex-wrap: wrap; }
 .chip {
   padding: 14rpx 28rpx; border-radius: 999rpx; background: $c-dp-chip;
-  font-size: 26rpx; color: $c-dp-chip-ink; margin: 0 16rpx 16rpx 0;
+  font-size: calc(26rpx * var(--font-scale, 1)); color: $c-dp-chip-ink; margin: 0 16rpx 16rpx 0;
   border: 2rpx solid transparent;
 }
 .chip-active {
@@ -454,7 +454,7 @@ $c-dp-footer-line: #FFE9D4; // 底部操作条描边
 
 /* ===== 滑块 ===== */
 .slider-row { display: flex; align-items: center; }
-.slider-label { font-size: 24rpx; color: $c-dp-muted; width: 72rpx; }
+.slider-label { font-size: calc(24rpx * var(--font-scale, 1)); color: $c-dp-muted; width: 72rpx; }
 .slider { flex: 1; }
 .spice-level-label { font-size: calc(24rpx * var(--font-scale, 1)); color: $dim-body; text-align: center; margin-top: 8rpx; display: block; }
 
@@ -465,7 +465,7 @@ $c-dp-footer-line: #FFE9D4; // 底部操作条描边
 }
 .footer-btn {
   flex: 1; text-align: center; padding: 24rpx 0; border-radius: 999rpx;
-  font-size: 30rpx; font-weight: 600;
+  font-size: calc(30rpx * var(--font-scale, 1)); font-weight: 600;
 }
 .footer-btn-ghost {
   background: $c-dp-chip; color: $c-dp-chip-ink; margin-right: 20rpx;

+ 10 - 10
cfc-frontend/pages/diet/recommendation.vue

@@ -278,13 +278,13 @@ export default {
   box-shadow: 0 10rpx 30rpx rgba(255, 140, 66, 0.3);
   margin-bottom: 40rpx;
 }
-.empty-icon { font-size: 72rpx; }
+.empty-icon { font-size: calc(72rpx * var(--font-scale, 1)); }
 .empty-title { font-size: calc(34rpx * var(--font-scale, 1)); font-weight: 700; color: $facade-text-strong; display: block; margin-bottom: 16rpx; }
 .empty-sub { font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-muted; display: block; margin-bottom: 48rpx; }
 .generate-btn {
   background: linear-gradient(135deg, $dim-body, $dim-body-light);
   color: $app-surface; padding: 28rpx 60rpx; border-radius: 999rpx;
-  font-size: 30rpx; font-weight: 600;
+  font-size: calc(30rpx * var(--font-scale, 1)); font-weight: 600;
   box-shadow: 0 6rpx 20rpx rgba(255, 140, 66, 0.25);
 }
 .card {
@@ -320,7 +320,7 @@ export default {
 .status-badge {
   padding: 8rpx 20rpx;
   border-radius: 20rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
 }
 .status-pending { background: $tint-warm-soft; color: $brand-primary-deep; }
 .status-accepted {
@@ -344,7 +344,7 @@ export default {
 .meal-icon-lunch     { background: linear-gradient(135deg, $status-warning, $accent-amber-light); }
 .meal-icon-dinner    { background: linear-gradient(135deg, $facade-violet-light, $accent-violet-300); }
 .meal-icon {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   margin-right: 12rpx;
 }
 .meal-name {
@@ -354,7 +354,7 @@ export default {
   flex: 1;
 }
 .meal-count {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .dish-list {
@@ -379,7 +379,7 @@ export default {
   padding: 6rpx 16rpx;
   background-color: $facade-fill-2;
   border-radius: 20rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 .dish-method {
@@ -390,7 +390,7 @@ export default {
   color: $facade-text-muted;
 }
 .dish-actions { display: flex; gap: 16rpx; margin-top: 8rpx; }
-.action-btn { padding: 12rpx 26rpx; border-radius: 999rpx; font-size: 24rpx; }
+.action-btn { padding: 12rpx 26rpx; border-radius: 999rpx; font-size: calc(24rpx * var(--font-scale, 1)); }
 .like-btn { background: $mat-green-tint; color: $mat-green; }
 .swap-btn { background: #E8F1FB; color: $mat-blue-base; }
 .skip-btn { background: $fortune-0-tint; color: $mat-red; }
@@ -402,7 +402,7 @@ export default {
   text-align: center;
 }
 .nutrition-card .card-body { background: $flat-bg; border-radius: 0 0 20rpx 20rpx; }
-.nutrition-value { font-size: 40rpx; font-weight: 700; color: $brand-primary-deep; display: block; }
+.nutrition-value { font-size: calc(40rpx * var(--font-scale, 1)); font-weight: 700; color: $brand-primary-deep; display: block; }
 .nutrition-unit {
   font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
@@ -423,13 +423,13 @@ export default {
 .btn-secondary {
   flex: 1; padding: 28rpx 0; background: $app-surface;
   border: 2rpx solid $dim-body; border-radius: 999rpx;
-  text-align: center; font-size: 28rpx; color: $brand-primary-deep;
+  text-align: center; font-size: calc(28rpx * var(--font-scale, 1)); color: $brand-primary-deep;
 }
 .btn-primary {
   flex: 1; padding: 28rpx 0;
   background: linear-gradient(135deg, $dim-body, $dim-body-light);
   border-radius: 999rpx; text-align: center;
-  font-size: 28rpx; color: $app-surface; font-weight: 600;
+  font-size: calc(28rpx * var(--font-scale, 1)); color: $app-surface; font-weight: 600;
   box-shadow: 0 6rpx 20rpx rgba(255, 140, 66, 0.25);
 }
 </style>

+ 8 - 8
cfc-frontend/pages/diet/record-detail.vue

@@ -233,11 +233,11 @@ export default {
   border-bottom: none;
 }
 .info-label {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 .info-value {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-strong;
   font-weight: 500;
 }
@@ -252,7 +252,7 @@ export default {
   border-bottom: none;
 }
 .ai-name {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-strong;
 }
 .ai-confidence {
@@ -268,7 +268,7 @@ export default {
   flex: 1;
 }
 .confidence-text {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $mat-blue-base;
   white-space: nowrap;
 }
@@ -281,7 +281,7 @@ export default {
   padding: 12rpx 24rpx;
   background-color: $flat-card;
   border-radius: 30rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $dim-body;
 }
 .action-area {
@@ -296,7 +296,7 @@ export default {
   border: 1rpx solid $facade-border-soft;
   border-radius: 16rpx;
   text-align: center;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-body;
 }
 .btn-delete {
@@ -305,7 +305,7 @@ export default {
   background-color: $fortune-1-tint;
   border-radius: 16rpx;
   text-align: center;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $mat-deep-orange;
 }
 .empty-state {
@@ -313,7 +313,7 @@ export default {
   display: flex;
   align-items: center;
   justify-content: center;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 </style>

+ 30 - 30
cfc-frontend/pages/diet/records.vue

@@ -407,11 +407,11 @@ export default {
 .week-day-active .week-day-label,
 .week-day-active .week-day-num { color: $app-surface; }
 .week-day-has .week-dot-wrap { margin-top: 6rpx; }
-.week-day-label { font-size: 20rpx; color: $facade-text-muted; }
-.week-day-num { font-size: 28rpx; font-weight: 600; color: $facade-text-strong; }
+.week-day-label { font-size: calc(20rpx * var(--font-scale, 1)); color: $facade-text-muted; }
+.week-day-num { font-size: calc(28rpx * var(--font-scale, 1)); font-weight: 600; color: $facade-text-strong; }
 .week-dot-wrap { display: flex; align-items: center; gap: 6rpx; }
 .week-dot { width: 10rpx; height: 10rpx; border-radius: 50%; background: $dim-body; }
-.week-day-count { font-size: 18rpx; color: $brand-primary-deep; }
+.week-day-count { font-size: calc(18rpx * var(--font-scale, 1)); color: $brand-primary-deep; }
 
 /* 内容区 */
 .content { flex: 1; padding: 24rpx 24rpx 180rpx; overflow-y: auto; }
@@ -428,9 +428,9 @@ export default {
 /* 统计行 */
 .stat-row { display: flex; justify-content: space-around; }
 .stat-item { text-align: center; }
-.stat-val { font-size: 36rpx; font-weight: 700; color: $dim-body; display: block; }
-.stat-unit { font-size: 20rpx; color: $facade-text-muted; }
-.stat-label { font-size: 22rpx; color: $facade-text-body; display: block; margin-top: 4rpx; }
+.stat-val { font-size: calc(36rpx * var(--font-scale, 1)); font-weight: 700; color: $dim-body; display: block; }
+.stat-unit { font-size: calc(20rpx * var(--font-scale, 1)); color: $facade-text-muted; }
+.stat-label { font-size: calc(22rpx * var(--font-scale, 1)); color: $facade-text-body; display: block; margin-top: 4rpx; }
 
 /* 食材提示 */
 .alert-card {
@@ -438,28 +438,28 @@ export default {
   box-shadow: 0 2rpx 12rpx rgba(0,0,0,0.05); overflow: hidden;
 }
 .alert-header { display: flex; align-items: center; gap: 12rpx; padding: 24rpx 28rpx 16rpx; border-bottom: 1rpx solid $fortune-1-tint; }
-.alert-icon { font-size: 36rpx; }
-.alert-title { font-size: 28rpx; font-weight: 600; color: $facade-text-strong; }
+.alert-icon { font-size: calc(36rpx * var(--font-scale, 1)); }
+.alert-title { font-size: calc(28rpx * var(--font-scale, 1)); font-weight: 600; color: $facade-text-strong; }
 .alert-section { padding: 16rpx 28rpx; }
-.alert-label { font-size: 24rpx; font-weight: 600; display: block; margin-bottom: 12rpx; }
+.alert-label { font-size: calc(24rpx * var(--font-scale, 1)); font-weight: 600; display: block; margin-bottom: 12rpx; }
 .alert-label.over { color: $status-danger-strong-2; }
 .alert-label.under { color: $mat-blue-strong; }
 .alert-tags { display: flex; flex-wrap: wrap; gap: 12rpx; }
-.alert-tag { display: flex; align-items: center; gap: 6rpx; padding: 8rpx 16rpx; border-radius: 20rpx; font-size: 24rpx; }
+.alert-tag { display: flex; align-items: center; gap: 6rpx; padding: 8rpx 16rpx; border-radius: 20rpx; font-size: calc(24rpx * var(--font-scale, 1)); }
 .tag-over { background: $fortune-0-tint; color: $status-danger-strong-2; }
 .tag-under { background: $mat-blue-tint; color: $mat-blue-strong; }
-.tag-count { font-size: 20rpx; opacity: 0.8; }
-.alert-hint { font-size: 22rpx; color: $facade-text-faint; margin-top: 8rpx; display: block; }
+.tag-count { font-size: calc(20rpx * var(--font-scale, 1)); opacity: 0.8; }
+.alert-hint { font-size: calc(22rpx * var(--font-scale, 1)); color: $facade-text-faint; margin-top: 8rpx; display: block; }
 
 /* 高频食材 */
 .top-foods-list { display: flex; flex-direction: column; gap: 12rpx; }
 .top-food-item { display: flex; align-items: center; gap: 16rpx; }
 .top-food-rank {
   width: 36rpx; height: 36rpx; border-radius: 50%; background: $tint-warm-soft; color: $dim-body;
-  font-size: 22rpx; font-weight: 700; display: flex; align-items: center; justify-content: center;
+  font-size: calc(22rpx * var(--font-scale, 1)); font-weight: 700; display: flex; align-items: center; justify-content: center;
 }
-.top-food-name { flex: 1; font-size: 26rpx; color: $facade-text-strong; }
-.top-food-count { font-size: 24rpx; color: $facade-text-muted; }
+.top-food-name { flex: 1; font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-strong; }
+.top-food-count { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-muted; }
 
 /* 日期切换栏 */
 .date-bar {
@@ -467,41 +467,41 @@ export default {
   background: $app-surface; border-radius: 16rpx; padding: 16rpx 24rpx; margin-bottom: 20rpx;
   box-shadow: 0 2rpx 8rpx rgba(0,0,0,0.04);
 }
-.date-prev, .date-next { font-size: 26rpx; color: $dim-body; font-weight: 600; padding: 8rpx 16rpx; }
-.date-display { font-size: 28rpx; font-weight: 600; color: $facade-text-strong; }
+.date-prev, .date-next { font-size: calc(26rpx * var(--font-scale, 1)); color: $dim-body; font-weight: 600; padding: 8rpx 16rpx; }
+.date-display { font-size: calc(28rpx * var(--font-scale, 1)); font-weight: 600; color: $facade-text-strong; }
 
 /* 记录卡片 */
 .records-title { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16rpx; }
-.records-label { font-size: 28rpx; font-weight: 600; color: $facade-text-strong; }
-.records-count { font-size: 24rpx; color: $facade-text-muted; }
+.records-label { font-size: calc(28rpx * var(--font-scale, 1)); font-weight: 600; color: $facade-text-strong; }
+.records-count { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-muted; }
 
 .record-card {
   background: $app-surface; border-radius: 16rpx; padding: 20rpx 24rpx; margin-bottom: 16rpx;
   box-shadow: 0 2rpx 8rpx rgba(255,140,66,0.06); border-left: 6rpx solid $dim-body;
 }
 .record-card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10rpx; }
-.meal-badge { padding: 6rpx 18rpx; border-radius: 20rpx; font-size: 24rpx; font-weight: 600; }
+.meal-badge { padding: 6rpx 18rpx; border-radius: 20rpx; font-size: calc(24rpx * var(--font-scale, 1)); font-weight: 600; }
 .meal-breakfast { background: $fortune-1-tint; color: $mat-orange-strong; }
 .meal-lunch     { background: $mat-amber-tint; color: $mat-orange-700; }
 .meal-dinner    { background: $fortune-3-tint; color: $fortune-3-ink; }
 .meal-snack     { background: $mat-green-tint; color: $mat-green-strong; }
 .record-meta { display: flex; align-items: center; gap: 12rpx; }
-.record-time { font-size: 24rpx; color: $facade-text-muted; }
-.record-backfill { font-size: 20rpx; padding: 2rpx 10rpx; background: $fortune-1-tint; color: $mat-orange-strong; border-radius: 8rpx; }
+.record-time { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-muted; }
+.record-backfill { font-size: calc(20rpx * var(--font-scale, 1)); padding: 2rpx 10rpx; background: $fortune-1-tint; color: $mat-orange-strong; border-radius: 8rpx; }
 .record-body { margin-bottom: 8rpx; }
 .record-foods { font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-strong; line-height: 1.5; }
 .record-footer { display: flex; gap: 20rpx; margin-bottom: 6rpx; }
-.record-cal { font-size: 22rpx; color: $dim-body; font-weight: 600; }
-.record-nut { font-size: 22rpx; color: $facade-text-muted; }
-.record-remark { font-size: 24rpx; color: $facade-text-faint; font-style: italic; }
+.record-cal { font-size: calc(22rpx * var(--font-scale, 1)); color: $dim-body; font-weight: 600; }
+.record-nut { font-size: calc(22rpx * var(--font-scale, 1)); color: $facade-text-muted; }
+.record-remark { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-faint; font-style: italic; }
 
 /* 空态 */
 .empty-state { text-align: center; padding: 80rpx 40rpx; }
-.empty-icon { font-size: 80rpx; display: block; margin-bottom: 20rpx; }
-.empty-text { font-size: 28rpx; color: $facade-text-strong; font-weight: 500; display: block; margin-bottom: 8rpx; }
-.empty-hint { font-size: 24rpx; color: $facade-text-muted; display: block; }
+.empty-icon { font-size: calc(80rpx * var(--font-scale, 1)); display: block; margin-bottom: 20rpx; }
+.empty-text { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-strong; font-weight: 500; display: block; margin-bottom: 8rpx; }
+.empty-hint { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-muted; display: block; }
 .loading-state { text-align: center; padding: 80rpx 0; }
-.loading-text { font-size: 26rpx; color: $facade-text-muted; }
+.loading-text { font-size: calc(26rpx * var(--font-scale, 1)); color: $facade-text-muted; }
 .bottom-spacer { height: 40rpx; }
 
 /* 浮动按钮 */
@@ -511,5 +511,5 @@ export default {
   display: flex; align-items: center; justify-content: center;
   box-shadow: 0 4rpx 20rpx rgba(255,140,66,0.4);
 }
-.fab-icon { font-size: 48rpx; color: $app-surface; font-weight: 300; }
+.fab-icon { font-size: calc(48rpx * var(--font-scale, 1)); color: $app-surface; font-weight: 300; }
 </style>

+ 37 - 37
cfc-frontend/pages/discover-detail/product-detail/product-detail.vue

@@ -835,7 +835,7 @@ export default {
 }
 .loading-text,
 .empty-text {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .content {
@@ -876,13 +876,13 @@ export default {
   gap: 12rpx;
 }
 .price {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: bold;
 }
 .member-tag {
   display: inline-block;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $brand-primary;
   background: $uni-primary-pale;
   border: 1rpx solid $brand-primary-light-2;
@@ -897,17 +897,17 @@ export default {
   margin-top: 6rpx;
 }
 .original-label {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .original-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   text-decoration: line-through;
 }
 .member-hint {
   margin-top: 10rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary;
   background: $uni-primary-pale;
   padding: 6rpx 16rpx;
@@ -916,7 +916,7 @@ export default {
 }
 .special-tag {
   margin-left: 8rpx;
-  font-size: 20rpx;
+  font-size: calc(20rpx * var(--font-scale, 1));
   color: #fff;
   background: $brand-primary;
   border-radius: 6rpx;
@@ -934,7 +934,7 @@ export default {
   align-items: center;
 }
 .special-deal-tag {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   font-weight: bold;
   color: #fff;
   background: $brand-primary;
@@ -946,7 +946,7 @@ export default {
 .special-deal-countdown,
 .special-deal-remain,
 .special-deal-status-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary;
 }
 .special-deal-remain {
@@ -968,7 +968,7 @@ export default {
   display: inline-block;
   margin-top: 12rpx;
   padding: 6rpx 16rpx;
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $hint-gold-ink;
   background: $brand-primary-tint-2;
   border: 1rpx solid #f0d9a8;
@@ -980,7 +980,7 @@ export default {
   margin-bottom: 12rpx;
 }
 .meta-item {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   background: $facade-fill-2;
   padding: 4rpx 16rpx;
@@ -993,7 +993,7 @@ export default {
   align-items: center;
 }
 .vendor-label {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
 }
 .vendor-name {
@@ -1028,7 +1028,7 @@ export default {
 .bundle-item-info { flex: 1; display: flex; flex-direction: column; min-width: 0; }
 .bundle-item-name { font-size: calc(28rpx * var(--font-scale, 1)); color: $facade-text-strong; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
 .bundle-item-spec { font-size: calc(24rpx * var(--font-scale, 1)); color: $facade-text-muted; margin-top: 4rpx; }
-.bundle-item-qty { font-size: 30rpx; font-weight: bold; color: $brand-primary; margin-left: 16rpx; flex-shrink: 0; }
+.bundle-item-qty { font-size: calc(30rpx * var(--font-scale, 1)); font-weight: bold; color: $brand-primary; margin-left: 16rpx; flex-shrink: 0; }
 /* SKU 选择器 */
 .sku-section {
   background: $app-surface;
@@ -1042,7 +1042,7 @@ export default {
   margin-bottom: 10rpx;
 }
 .spec-group-name {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-body;
   margin-bottom: 12rpx;
   display: block;
@@ -1072,7 +1072,7 @@ export default {
   opacity: 0.5;
 }
 .spec-option-text {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $facade-text-strong;
 }
 .selected-summary {
@@ -1081,13 +1081,13 @@ export default {
   border-top: 1rpx solid $facade-fill;
 }
 .selected-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary;
 }
 .linked-link {
   display: inline-block;
   margin-left: 20rpx;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $uni-info;
   text-decoration: underline;
 }
@@ -1101,11 +1101,11 @@ export default {
   margin-top: 12rpx;
 }
 .cf-hint-icon {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   margin-right: 8rpx;
 }
 .cf-hint-text {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: 500;
 }
@@ -1130,19 +1130,19 @@ export default {
   min-width: 0;
 }
 .coupon-name {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-strong;
   font-weight: bold;
   display: block;
 }
 .coupon-desc {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $brand-primary;
   margin-top: 6rpx;
   display: block;
 }
 .coupon-price {
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: bold;
   margin-right: 24rpx;
@@ -1150,7 +1150,7 @@ export default {
 .coupon-exchange-btn {
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   color: $app-surface;
-  font-size: 26rpx;
+  font-size: calc(26rpx * var(--font-scale, 1));
   padding: 0 32rpx;
   height: 64rpx;
   line-height: 64rpx;
@@ -1192,12 +1192,12 @@ export default {
   align-items: baseline;
 }
 .bottom-price {
-  font-size: 36rpx;
+  font-size: calc(36rpx * var(--font-scale, 1));
   color: $brand-primary;
   font-weight: bold;
 }
 .bottom-member {
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-left: 10rpx;
 }
@@ -1205,7 +1205,7 @@ export default {
 .btn-buy {
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   color: $app-surface;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   font-weight: bold;
   padding: 0 60rpx;
   height: 72rpx;
@@ -1222,7 +1222,7 @@ export default {
   margin-right: 20rpx;
 }
 .btn-favorite {
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   margin-right: 16rpx;
   padding: 0 8rpx;
 }
@@ -1230,7 +1230,7 @@ export default {
   background: $app-surface;
   color: $brand-primary;
   border: 2rpx solid $brand-primary;
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   padding: 0 24rpx;
   height: 72rpx;
   line-height: 72rpx;
@@ -1242,7 +1242,7 @@ export default {
 .btn-share {
   background: $app-surface;
   border: 2rpx solid $brand-primary;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   padding: 0 24rpx;
   height: 64rpx;
   line-height: 64rpx;
@@ -1254,8 +1254,8 @@ export default {
   font-weight: 600;
   text-align: center;
 }
-.btn-share-icon { font-size: 28rpx; margin-right: 6rpx; }
-.btn-share-text { font-size: 24rpx; }
+.btn-share-icon { font-size: calc(28rpx * var(--font-scale, 1)); margin-right: 6rpx; }
+.btn-share-text { font-size: calc(24rpx * var(--font-scale, 1)); }
 
 /* 配送信息 */
 .delivery-info-section {
@@ -1268,7 +1268,7 @@ export default {
   display: inline-block;
   background: linear-gradient(135deg, $brand-primary, $brand-primary-light);
   color: $app-surface;
-  font-size: 24rpx;
+  font-size: calc(24rpx * var(--font-scale, 1));
   padding: 6rpx 20rpx;
   border-radius: 20rpx;
   margin-bottom: 12rpx;
@@ -1279,7 +1279,7 @@ export default {
   margin-top: 12rpx;
 }
 .hint-icon {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   margin-right: 10rpx;
   flex-shrink: 0;
 }
@@ -1337,7 +1337,7 @@ export default {
   height: 80rpx;
   line-height: 80rpx;
   text-align: center;
-  font-size: 40rpx;
+  font-size: calc(40rpx * var(--font-scale, 1));
   margin-right: 16rpx;
   flex-shrink: 0;
   background: linear-gradient(135deg, #F9731622, #FB923C22);
@@ -1350,20 +1350,20 @@ export default {
   min-width: 0;
 }
 .gift-select-name {
-  font-size: 28rpx;
+  font-size: calc(28rpx * var(--font-scale, 1));
   color: $facade-text-strong;
   overflow: hidden;
   text-overflow: ellipsis;
   white-space: nowrap;
 }
 .gift-select-type {
-  font-size: 22rpx;
+  font-size: calc(22rpx * var(--font-scale, 1));
   color: $facade-text-muted;
   margin-top: 4rpx;
 }
 .gift-select-check {
   color: $brand-primary;
-  font-size: 32rpx;
+  font-size: calc(32rpx * var(--font-scale, 1));
   font-weight: bold;
   margin-left: 16rpx;
   flex-shrink: 0;

Некоторые файлы не были показаны из-за большого количества измененных файлов