Przeglądaj źródła

refactor(beautify): D38 第九轮跨页重复色提升为全局令牌 (hex 462->400)

- uni.scss §15:21 个在 ≥3 处重复出现的色值提升为全局令牌,按既有分族命名
  (\-fill-slate-25 / \-text-slate-600 / \-danger-tint-4 /
  \-warning-amber / \-green-700 / \-blue-300 / \-green /
  \-ink-navy 等)
- 与既有令牌区分命名:\-fill-slate-50-2 (#F7F9FC) vs 既有 #F8FAFC,
  \-sky-soft-2 (#EAF4FC) vs 既有 #F0F9FF
- replace-hex-to-token.js 第九轮规则 42 条(大小写各一),44 页面 + 3 组件共 65 处收编
- 跳过计划边界项 #8FC5E8(深面板 chrome)
- 全量自检 383 文件模板/样式/脚本 0 失败;硬编码色 462 -> 400,三项硬指标保持 0
- d38 脚本对 scripts/*.js 统一写 LF,避免行尾翻新导致的整文件 diff
liaoxg 4 dni temu
rodzic
commit
1ff115c5d3
45 zmienionych plików z 206 dodań i 63 usunięć
  1. 1 1
      cfc-frontend/components/FamilyChallengeCard.vue
  2. 1 1
      cfc-frontend/components/gate-lock.vue
  3. 1 1
      cfc-frontend/components/wuxing-sandbox.vue
  4. 2 2
      cfc-frontend/pages/activity/activity-detail/activity-detail.vue
  5. 1 1
      cfc-frontend/pages/assessment-plan/detail.vue
  6. 1 1
      cfc-frontend/pages/assessment-plan/list.vue
  7. 1 1
      cfc-frontend/pages/assessment/execution.vue
  8. 1 1
      cfc-frontend/pages/assessment/rating.vue
  9. 2 2
      cfc-frontend/pages/cognitive-test/spatial-test.vue
  10. 2 2
      cfc-frontend/pages/dan-assessment/report-result.vue
  11. 1 1
      cfc-frontend/pages/diet/meal-config.vue
  12. 1 1
      cfc-frontend/pages/diet/recommendation.vue
  13. 1 1
      cfc-frontend/pages/diet/record-detail.vue
  14. 1 1
      cfc-frontend/pages/health/components/ComprehensiveSurvey.vue
  15. 1 1
      cfc-frontend/pages/health/components/feedback-popup.vue
  16. 1 1
      cfc-frontend/pages/health/doa-stage-detail.vue
  17. 1 1
      cfc-frontend/pages/health/indicator-curve.vue
  18. 2 2
      cfc-frontend/pages/health/my-feedback.vue
  19. 1 1
      cfc-frontend/pages/health/plan-list.vue
  20. 3 3
      cfc-frontend/pages/health/report-confirm.vue
  21. 3 3
      cfc-frontend/pages/health/report-detail.vue
  22. 2 2
      cfc-frontend/pages/health/report-list.vue
  23. 3 3
      cfc-frontend/pages/health/report-upload.vue
  24. 1 1
      cfc-frontend/pages/home-pages/components/gate-guide-bar.vue
  25. 1 1
      cfc-frontend/pages/mind-detail/screening.vue
  26. 1 1
      cfc-frontend/pages/parent/child-detail.vue
  27. 1 1
      cfc-frontend/pages/profile-extra/children.vue
  28. 1 1
      cfc-frontend/pages/profile-extra/coupons.vue
  29. 1 1
      cfc-frontend/pages/profile-extra/create-child.vue
  30. 1 1
      cfc-frontend/pages/profile-extra/edit-child.vue
  31. 1 1
      cfc-frontend/pages/profile-extra/family-members.vue
  32. 1 1
      cfc-frontend/pages/profile/report-detail.vue
  33. 1 1
      cfc-frontend/pages/profile/report-management.vue
  34. 1 1
      cfc-frontend/pages/profile/service-role-apply.vue
  35. 1 1
      cfc-frontend/pages/teacher/families.vue
  36. 2 2
      cfc-frontend/pages/teacher/orders.vue
  37. 4 4
      cfc-frontend/pages/teacher/plan-create.vue
  38. 3 3
      cfc-frontend/pages/teacher/plan-detail.vue
  39. 3 3
      cfc-frontend/pages/teacher/review-family.vue
  40. 1 1
      cfc-frontend/pages/teacher/review-workbench.vue
  41. 3 3
      cfc-frontend/pages/teacher/service-tasks.vue
  42. 1 1
      cfc-frontend/pages/teacher/teacher-profile.vue
  43. 75 0
      cfc-frontend/scripts/d38-round9-tokens.js
  44. 44 0
      cfc-frontend/scripts/replace-hex-to-token.js
  45. 24 0
      cfc-frontend/uni.scss

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

@@ -370,6 +370,6 @@ export default {
 .respond-reject {
   background: $app-surface;
   color: $status-danger-deep;
-  border: 2rpx solid #FCA5A5;
+  border: 2rpx solid $status-danger-light-2;
 }
 </style>

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

@@ -90,7 +90,7 @@ export default {
   margin: 20rpx 30rpx;
 }
 .lock-card {
-  background: linear-gradient(135deg, #1A2A4A, $accent-navy);
+  background: linear-gradient(135deg, $facade-ink-navy, $accent-navy);
   border-radius: 24rpx;
   padding: 40rpx 30rpx;
   display: flex;

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

@@ -610,7 +610,7 @@ export default {
 .wuxing-sandbox {
   margin: 20rpx 30rpx;
   padding: 20rpx 24rpx 24rpx;
-  background: linear-gradient(135deg, #1A2A4A, $accent-navy, $app-ink-night-2);
+  background: linear-gradient(135deg, $facade-ink-navy, $accent-navy, $app-ink-night-2);
   border-radius: 24rpx;
   position: relative;
   overflow: hidden;

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

@@ -1060,7 +1060,7 @@ export default {
 }
 .meta-text {
   font-size: calc(26rpx * var(--font-scale, 1));
-  color: #4b5563;
+  color: $facade-text-gray-600;
   flex: 1;
   line-height: 1.4;
 }
@@ -1090,7 +1090,7 @@ export default {
 }
 .desc-text {
   font-size: calc(26rpx * var(--font-scale, 1));
-  color: #4b5563;
+  color: $facade-text-gray-600;
   line-height: 1.6;
 }
 

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

@@ -191,7 +191,7 @@ export default {
 .status-cancelled { background: $mat-bluegray-50; color: $mat-bluegray-400; }
 .status-generated { background: $fortune-1-tint; color: $mat-orange-strong; }
 .status-reviewed { background: $mat-green-tint; color: $mat-green-strong; }
-.status-rejected { background: #FDE8E8; color: $status-danger-strong-2; }
+.status-rejected { background: $status-danger-tint-4; color: $status-danger-strong-2; }
 .status-unknown { background: $mat-bluegray-50; color: $mat-bluegray-400; }
 
 /* ===== 元信息 ===== */

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

@@ -164,7 +164,7 @@ export default {
 .status-cancelled { background: $mat-bluegray-50; color: $mat-bluegray-400; }
 .status-generated { background: $fortune-1-tint; color: $mat-orange-strong; }
 .status-reviewed { background: $mat-green-tint; color: $mat-green-strong; }
-.status-rejected { background: #FDE8E8; color: $status-danger-strong-2; }
+.status-rejected { background: $status-danger-tint-4; color: $status-danger-strong-2; }
 .status-unknown { background: $mat-bluegray-50; color: $mat-bluegray-400; }
 
 /* ===== 维度 ===== */

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

@@ -350,7 +350,7 @@ export default {
 }
 
 .status-icon.completed .icon-circle {
-  background: linear-gradient(135deg, $mat-green, #388e3c);
+  background: linear-gradient(135deg, $mat-green, $mat-green-700);
 }
 
 .status-text {

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

@@ -313,7 +313,7 @@ export default {
 }
 
 .star.active {
-  color: #ffc107;
+  color: $status-warning-amber;
   text-shadow: 0 0 8rpx rgba(255, 193, 7, 0.4);
 }
 

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

@@ -398,7 +398,7 @@ export default {
 }
 .rotation-tip {
   font-size: 30rpx;
-  color: #93C5FD;
+  color: $tint-blue-300;
 }
 .options-wrap {
   width: 100%;
@@ -484,7 +484,7 @@ export default {
 }
 .dimension-name {
   font-size: 26rpx;
-  color: #93C5FD;
+  color: $tint-blue-300;
 }
 
 /* --- 按钮 --- */

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

@@ -646,11 +646,11 @@ $c-rpt-orange:       $mat-orange-300; // 需关注暖橙(徽章/渐变/边框
 $c-rpt-grid:         #EEF0F6; // 图表网格灰
 $c-rpt-violet-grid:  #F0ECFA; // 雷达网格/底(浅紫)
 $c-rpt-gray-line:    #C7C9D9; // 灰色分隔
-$c-rpt-violet-soft:  #C4B5FD; // 紫罗兰浅渐变起
+$c-rpt-violet-soft:  $accent-violet-300; // 紫罗兰浅渐变起
 $c-rpt-yellow:       $accent-amber-light; // 黄渐变起
 $c-rpt-violet-text:  $violet-700; // 紫罗兰文字
 $c-rpt-line:         #F1F2F7; // 浅紫分隔线
-$c-rpt-body:         #4B5563; // 正文灰
+$c-rpt-body:         $facade-text-gray-600; // 正文灰
 $c-rpt-foot:         #B0B3C3; // 脚注灰
 $c-rpt-mask-ink:     #000;    // 遮罩渐变异色(mask-image)
 

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

@@ -249,7 +249,7 @@ export default {
 .meal-icon-wrap { width: 72rpx; height: 72rpx; border-radius: 22rpx; display: flex; align-items: center; justify-content: center; margin-right: 16rpx; }
 .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, #C4B5FD); }
+.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-name {
   font-size: 28rpx;

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

@@ -342,7 +342,7 @@ export default {
 .meal-icon-wrap { width: 64rpx; height: 64rpx; border-radius: 20rpx; display: flex; align-items: center; justify-content: center; margin-right: 16rpx; }
 .meal-icon-breakfast { background: linear-gradient(135deg, $dim-body-light, #FFD48A); }
 .meal-icon-lunch     { background: linear-gradient(135deg, $status-warning, $accent-amber-light); }
-.meal-icon-dinner    { background: linear-gradient(135deg, $facade-violet-light, #C4B5FD); }
+.meal-icon-dinner    { background: linear-gradient(135deg, $facade-violet-light, $accent-violet-300); }
 .meal-icon {
   font-size: 36rpx;
   margin-right: 12rpx;

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

@@ -302,7 +302,7 @@ export default {
   border-radius: 16rpx;
   text-align: center;
   font-size: 28rpx;
-  color: #FF5722;
+  color: $mat-deep-orange;
 }
 .empty-state {
   flex: 1;

+ 1 - 1
cfc-frontend/pages/health/components/ComprehensiveSurvey.vue

@@ -1090,7 +1090,7 @@ $c-survey-faint:     #C4A98E; // 极淡棕提示(单位说明)
 $c-survey-divider:   #F7EFE6; // 分隔线(浅暖灰)
 $c-survey-divider-2: #F0E4D6; // 分隔线·深档(虚线 / 边框)
 $c-survey-paper:     #FFFDFA; // 近白底(量表卡)
-$c-survey-alert:     #E53E3E; // 警示红(删除 / 风险徽章)
+$c-survey-alert:     $status-danger-strong-3; // 警示红(删除 / 风险徽章)
 
 .survey-wrap { min-height: 100vh; background: linear-gradient(180deg, $uni-primary-pale, $c-survey-warm); }
 .progress-bar { padding: 24rpx 32rpx 8rpx; background: $uni-primary-pale; }

+ 1 - 1
cfc-frontend/pages/health/components/feedback-popup.vue

@@ -221,7 +221,7 @@ export default {
 }
 .fb-hint {
   font-size: 24rpx;
-  color: #E6A23C;
+  color: $status-warning-4;
   margin-bottom: 16rpx;
   line-height: 1.5;
 }

+ 1 - 1
cfc-frontend/pages/health/doa-stage-detail.vue

@@ -207,7 +207,7 @@ export default {
 }
 .btn-cancel {
   background: $app-surface; color: $status-danger; font-size: 26rpx; font-weight: 600;
-  border: 2rpx solid #FCA5A5; border-radius: 42rpx; height: 80rpx; line-height: 80rpx;
+  border: 2rpx solid $status-danger-light-2; border-radius: 42rpx; height: 80rpx; line-height: 80rpx;
   margin-top: 8rpx;
 }
 </style>

+ 1 - 1
cfc-frontend/pages/health/indicator-curve.vue

@@ -348,7 +348,7 @@ export default {
 .rank-gap {
   display: inline-block;
   margin: 4rpx 0;
-  color: #e53e3e;
+  color: $status-danger-strong-3;
   font-size: 20rpx;
 }
 .rank-empty {

+ 2 - 2
cfc-frontend/pages/health/my-feedback.vue

@@ -117,10 +117,10 @@ export default {
 }
 .mf-badge-question {
   color: $uni-info;
-  background: #EAF4FC;
+  background: $tint-sky-soft-2;
 }
 .mf-badge-suggestion {
-  color: #E6A23C;
+  color: $status-warning-4;
   background: #FDF4E7;
 }
 .mf-time {

+ 1 - 1
cfc-frontend/pages/health/plan-list.vue

@@ -252,7 +252,7 @@ export default {
 .status-pending_review { background: $mat-blue-tint; color: $mat-blue-base; }
 .status-confirmed { background: $mat-green-tint; color: $mat-green; }
 .status-published { background: $mat-green-tint; color: $mat-green; }
-.status-rejected { background: #FDE8E8; color: $status-danger-strong-2; }
+.status-rejected { background: $status-danger-tint-4; color: $status-danger-strong-2; }
 
 .card-meta {
   display: flex;

+ 3 - 3
cfc-frontend/pages/health/report-confirm.vue

@@ -953,10 +953,10 @@ export default {
 // ===== 报告确认页专属色阶(与 report-detail 同族 Material 渐变;单页专用,约定见 uni.scss §14)=====
 $c-rpcf-line:      #E8EDF2; // 浅灰分隔线
 $c-rpcf-card:      #F8FAFB; // 卡片底(浅灰白)
-$c-rpcf-red-bg:    #FFF0F0; // 警示浅红底
-$c-rpcf-amber-deep:#FFC107; // Material 琥珀深档
+$c-rpcf-red-bg:    $status-danger-tint-5; // 警示浅红底
+$c-rpcf-amber-deep:$status-warning-amber; // Material 琥珀深档
 $c-rpcf-orange-1:  #FF8A65; // 低档渐变起
-$c-rpcf-orange-2:  #FF5722; // 低档渐变终
+$c-rpcf-orange-2:  $mat-deep-orange; // 低档渐变终
 $c-rpcf-red-1:     #EF9A9A; // 无档渐变起
 $c-rpcf-red-2:     #E53935; // 无档渐变终
 

+ 3 - 3
cfc-frontend/pages/health/report-detail.vue

@@ -1308,10 +1308,10 @@ $c-rptd-blue:        #4a90d9; // 医疗蓝(标题/主元素)
 $c-rptd-blue-bg:     #eef4ff; // 医疗蓝浅底
 $c-rptd-line:        #E8EDF2; // 浅灰分隔线
 $c-rptd-card:        #F8FAFB; // 卡片底(浅灰白)
-$c-rptd-red-bg:      #FFF0F0; // 警示浅红底
-$c-rptd-amber-deep:  #FFC107; // Material 琥珀深档
+$c-rptd-red-bg:      $status-danger-tint-5; // 警示浅红底
+$c-rptd-amber-deep:  $status-warning-amber; // Material 琥珀深档
 $c-rptd-orange-1:    #FF8A65; // 低档渐变起
-$c-rptd-orange-2:    #FF5722; // 低档渐变终(deep-orange-500)
+$c-rptd-orange-2:    $mat-deep-orange; // 低档渐变终(deep-orange-500)
 $c-rptd-red-1:       #EF9A9A; // 无档渐变起
 $c-rptd-red-2:       #E53935; // 无档渐变终
 $c-rptd-orange-tint: $warm-peach; // 浅橙底(提示卡)

+ 2 - 2
cfc-frontend/pages/health/report-list.vue

@@ -671,7 +671,7 @@ export default {
   margin-top: 6rpx;
 }
 .status-pending {
-  color: #F0B429;
+  color: $status-warning-gold;
 }
 .status-approved {
   color: #34C759;
@@ -709,7 +709,7 @@ export default {
   width: 56rpx;
   height: 56rpx;
   border-radius: 50%;
-  background: #F0B429;
+  background: $status-warning-gold;
   display: flex;
   align-items: center;
   justify-content: center;

+ 3 - 3
cfc-frontend/pages/health/report-upload.vue

@@ -608,8 +608,8 @@ if (options.type === 'a2' || options.reportKind === 'a2') {
 }
 
 .card-chat {
-  background: #F0F7FF;
-  border: 2rpx dashed #93C5FD;
+  background: $tint-sky-ghost;
+  border: 2rpx dashed $tint-blue-300;
 }
 .card-chat .upload-card-icon {
   background: linear-gradient(135deg, $status-info, $status-info-deep-3);
@@ -642,7 +642,7 @@ if (options.type === 'a2' || options.reportKind === 'a2') {
   width: 56rpx;
   height: 56rpx;
   border-radius: 50%;
-  background: #F0B429;
+  background: $status-warning-gold;
   display: flex;
   align-items: center;
   justify-content: center;

+ 1 - 1
cfc-frontend/pages/home-pages/components/gate-guide-bar.vue

@@ -69,7 +69,7 @@ export default {
   align-items: center;
   padding: 16rpx 24rpx;
   margin: 16rpx 30rpx;
-  background: linear-gradient(135deg, #1A2A4A, $accent-navy);
+  background: linear-gradient(135deg, $facade-ink-navy, $accent-navy);
   border-radius: 16rpx;
   cursor: pointer;
 }

+ 1 - 1
cfc-frontend/pages/mind-detail/screening.vue

@@ -217,7 +217,7 @@ export default {
 $c-tint-blue:       $dim-wisdom-tint-3;  // 容器渐变起点(蓝灰浅底)
 $c-tint-violet-soft:#F8F6FF;  // 题目卡/选中项浅底(violet 淡档)
 $c-border-radio:    #D0D0D0;  // 单选框未选中描边
-$c-risk-ink:        #E53E3E;  // 风险条目文字(red-600)
+$c-risk-ink:        $status-danger-strong-3;  // 风险条目文字(red-600)
 $c-crisis-from:     $accent-coral;  // 危机横幅渐变起点(red-400)
 // 严重程度四级 ramp:值与全局 $status-success/$dim-wealth/$dim-body/$status-danger 同值,
 // 按「同值映射全局」纪律直接引用全局令牌(若后续建 $severity-* 语义族再收敛)

+ 1 - 1
cfc-frontend/pages/parent/child-detail.vue

@@ -215,7 +215,7 @@ $flat-green:      $flat-green; // 绿浅档
 $flat-green-deep: $flat-green-deep; // 绿深档
 $c-cd-pink:       #F093FB; // 粉紫渐变起
 $c-cd-red:        #F5576C; // 红粉渐变终
-$c-cd-danger-bg:  #FFF0F0; // 警示浅红底
+$c-cd-danger-bg:  $status-danger-tint-5; // 警示浅红底
 
 .container {
   padding: 30rpx;

+ 1 - 1
cfc-frontend/pages/profile-extra/children.vue

@@ -66,7 +66,7 @@ export default {
   margin-bottom: 40rpx;
 }
 .redirect-btn {
-  background: #07c160;
+  background: $wechat-green;
   color: $app-surface;
   border-radius: 44rpx;
   font-size: 30rpx;

+ 1 - 1
cfc-frontend/pages/profile-extra/coupons.vue

@@ -461,7 +461,7 @@ export default {
 .card-scope {
   font-size: 22rpx;
   color: $uni-info;
-  background: #f0f7ff;
+  background: $tint-sky-ghost;
   display: inline-block;
   padding: 2rpx 12rpx;
   border-radius: 8rpx;

+ 1 - 1
cfc-frontend/pages/profile-extra/create-child.vue

@@ -65,7 +65,7 @@ export default {
   margin-bottom: 40rpx;
 }
 .redirect-btn {
-  background: #07c160;
+  background: $wechat-green;
   color: $app-surface;
   border-radius: 44rpx;
   font-size: 30rpx;

+ 1 - 1
cfc-frontend/pages/profile-extra/edit-child.vue

@@ -65,7 +65,7 @@ export default {
   margin-bottom: 40rpx;
 }
 .redirect-btn {
-  background: #07c160;
+  background: $wechat-green;
   color: $app-surface;
   border-radius: 44rpx;
   font-size: 30rpx;

+ 1 - 1
cfc-frontend/pages/profile-extra/family-members.vue

@@ -791,7 +791,7 @@ $c-fam-violet-bg:    $violet-tint-100; // 紫罗兰底
 $c-fam-violet-line:  $tint-indigo-line; // 紫罗兰深底(亲密条)
 $c-elm-info-bg:      $tint-sky-soft; // Element UI 信息浅底
 $c-elm-info-bg-2:    #EEF0FF; // Element UI 蓝浅底
-$c-elm-success-bg:   #f0f9eb; // Element UI 成功浅底
+$c-elm-success-bg:   $tint-green-ghost; // Element UI 成功浅底
 $c-elm-success-text: $el-success; // Element UI 成功文字
 $c-elm-danger-bg:    #fef0f0; // Element UI 危险浅底
 $c-elm-danger-text:  $el-danger; // Element UI 危险文字

+ 1 - 1
cfc-frontend/pages/profile/report-detail.vue

@@ -173,7 +173,7 @@ var res = await getReferralCode()
 .badge-physical_exam { background: $mat-blue-tint; color: $mat-blue-strong; }
 .badge-dan { background: $fortune-3-tint; color: $fortune-3-ink; }
 .badge-insurance { background: $fortune-1-tint; color: $mat-orange-strong; }
-.badge-fortune { background: #FCE4EC; color: $status-danger-strong-2; }
+.badge-fortune { background: $accent-pink-tint-2; color: $status-danger-strong-2; }
 
 .report-title {
   font-size: 32rpx;

+ 1 - 1
cfc-frontend/pages/profile/report-management.vue

@@ -221,7 +221,7 @@ export default {
 .badge-physical_exam { background: $mat-blue-tint; color: $mat-blue-strong; }
 .badge-dan { background: $fortune-3-tint; color: $fortune-3-ink; }
 .badge-insurance { background: $fortune-1-tint; color: $mat-orange-strong; }
-.badge-fortune { background: #FCE4EC; color: $status-danger-strong-2; }
+.badge-fortune { background: $accent-pink-tint-2; color: $status-danger-strong-2; }
 
 .card-title {
   font-size: 28rpx;

+ 1 - 1
cfc-frontend/pages/profile/service-role-apply.vue

@@ -432,7 +432,7 @@ export default {
 }
 .status-card.status-rejected {
   background: linear-gradient(135deg, $status-danger-tint-2, $status-danger-soft);
-  border: 2rpx solid #FCA5A5;
+  border: 2rpx solid $status-danger-light-2;
 }
 .status-icon {
   font-size: 80rpx;

+ 1 - 1
cfc-frontend/pages/teacher/families.vue

@@ -158,7 +158,7 @@ export default {
 .family-status {
   font-size: 24rpx;
   color: $el-success;
-  background: #f0f9eb;
+  background: $tint-green-ghost;
   padding: 8rpx 16rpx;
   border-radius: 8rpx;
 }

+ 2 - 2
cfc-frontend/pages/teacher/orders.vue

@@ -158,13 +158,13 @@ export default {
 }
 
 .order-status.completed {
-  background: #f0f9eb;
+  background: $tint-green-ghost;
   color: $el-success;
 }
 
 .order-status.pending {
   background: #fdf6ec;
-  color: #E6A23C;
+  color: $status-warning-4;
 }
 
 .order-body {

+ 4 - 4
cfc-frontend/pages/teacher/plan-create.vue

@@ -114,7 +114,7 @@ export default {
 .input {
   width: 100%;
   height: 80rpx;
-  background: #F7F9FC;
+  background: $facade-fill-slate-50-2;
   border-radius: 12rpx;
   padding: 0 20rpx;
   font-size: 28rpx;
@@ -125,7 +125,7 @@ export default {
 .textarea {
   width: 100%;
   min-height: 200rpx;
-  background: #F7F9FC;
+  background: $facade-fill-slate-50-2;
   border-radius: 12rpx;
   padding: 20rpx;
   font-size: 28rpx;
@@ -156,8 +156,8 @@ export default {
 
 .btn-cancel {
   width: 100%;
-  background: #F2F4F7;
-  color: #5A6478;
+  background: $facade-fill-slate-25;
+  color: $facade-text-slate-600;
   font-size: 30rpx;
   padding: 24rpx 0;
   border-radius: 12rpx;

+ 3 - 3
cfc-frontend/pages/teacher/plan-detail.vue

@@ -138,11 +138,11 @@ export default {
 .card { background: $app-surface; border-radius: 16rpx; padding: 24rpx; margin-bottom: 20rpx; }
 .title { font-size: 32rpx; font-weight: 600; color: $ink-steel; display: block; margin-bottom: 12rpx; }
 .meta { font-size: 24rpx; color: $text-steel; display: block; margin-bottom: 6rpx; }
-.label { font-size: 26rpx; color: #5A6478; display: block; margin-bottom: 12rpx; }
-.editor { width: 100%; min-height: 400rpx; font-size: 28rpx; color: $ink-steel; padding: 16rpx; background: #F7F9FC; border-radius: 12rpx; }
+.label { font-size: 26rpx; color: $facade-text-slate-600; display: block; margin-bottom: 12rpx; }
+.editor { width: 100%; min-height: 400rpx; font-size: 28rpx; color: $ink-steel; padding: 16rpx; background: $facade-fill-slate-50-2; border-radius: 12rpx; }
 .actions { display: flex; flex-direction: row; flex-wrap: wrap; }
 .btn { flex: 1; text-align: center; padding: 20rpx 0; border-radius: 12rpx; font-size: 28rpx; margin-right: 16rpx; margin-bottom: 16rpx; min-width: 40%; }
 .btn.ghost { background: $app-surface; color: $brand-primary; border: 1rpx solid $brand-primary; }
 .btn.ok { background: $brand-primary; color: $app-surface; }
-.btn.no { background: #F2F4F7; color: #5A6478; margin-right: 0; }
+.btn.no { background: $facade-fill-slate-25; color: $facade-text-slate-600; margin-right: 0; }
 </style>

+ 3 - 3
cfc-frontend/pages/teacher/review-family.vue

@@ -180,14 +180,14 @@ export default {
 .card { background: $app-surface; border-radius: 16rpx; padding: 24rpx; margin-bottom: 20rpx; }
 .row { display: flex; flex-direction: row; align-items: center; justify-content: space-between; margin-bottom: 12rpx; }
 .name { font-size: 30rpx; color: $ink-steel; font-weight: 500; }
-.badge { font-size: 22rpx; color: $uni-info; background: #EAF4FC; padding: 4rpx 12rpx; border-radius: 8rpx; }
-.badge.grey { color: $text-steel; background: #F2F4F7; }
+.badge { font-size: 22rpx; color: $uni-info; background: $tint-sky-soft-2; padding: 4rpx 12rpx; border-radius: 8rpx; }
+.badge.grey { color: $text-steel; background: $facade-fill-slate-25; }
 .meta { font-size: 24rpx; color: $text-steel; }
 .member-bar { background: $app-surface; border-radius: 12rpx; padding: 20rpx 24rpx; margin-bottom: 20rpx; }
 .picker { font-size: 28rpx; color: $ink-steel; }
 .actions { display: flex; flex-direction: row; margin-top: 16rpx; }
 .btn { flex: 1; text-align: center; padding: 16rpx 0; border-radius: 12rpx; font-size: 26rpx; margin-right: 16rpx; }
 .btn.ok { background: $brand-primary; color: $app-surface; }
-.btn.no { background: #F2F4F7; color: #5A6478; margin-right: 0; }
+.btn.no { background: $facade-fill-slate-25; color: $facade-text-slate-600; margin-right: 0; }
 .empty { text-align: center; color: $text-steel; font-size: 28rpx; padding: 80rpx 0; }
 </style>

+ 1 - 1
cfc-frontend/pages/teacher/review-workbench.vue

@@ -85,7 +85,7 @@ export default {
 .card { background: $app-surface; border-radius: 16rpx; padding: 24rpx; margin-bottom: 20rpx; }
 .row { display: flex; flex-direction: row; align-items: center; justify-content: space-between; margin-bottom: 12rpx; }
 .name { font-size: 30rpx; color: $ink-steel; font-weight: 500; }
-.badge { font-size: 22rpx; color: $uni-info; background: #EAF4FC; padding: 4rpx 12rpx; border-radius: 8rpx; }
+.badge { font-size: 22rpx; color: $uni-info; background: $tint-sky-soft-2; padding: 4rpx 12rpx; border-radius: 8rpx; }
 .meta { font-size: 24rpx; color: $text-steel; }
 .empty { text-align: center; color: $text-steel; font-size: 28rpx; padding: 80rpx 0; }
 </style>

+ 3 - 3
cfc-frontend/pages/teacher/service-tasks.vue

@@ -253,7 +253,7 @@ export default {
 }
 
 .task-icon.completed {
-  background: linear-gradient(135deg, $mat-green, #388e3c);
+  background: linear-gradient(135deg, $mat-green, $mat-green-700);
 }
 
 .task-icon.ready {
@@ -398,7 +398,7 @@ export default {
 
 /* 规划师图标 */
 .planner-info-icon {
-  background: #fce4ec;
+  background: $accent-pink-tint-2;
 }
 .planner-info-icon::after {
   content: '';
@@ -425,7 +425,7 @@ export default {
 }
 
 .btn-complete {
-  background: linear-gradient(135deg, $mat-green, #388e3c);
+  background: linear-gradient(135deg, $mat-green, $mat-green-700);
   color: white;
   border: none;
   border-radius: 16rpx;

+ 1 - 1
cfc-frontend/pages/teacher/teacher-profile.vue

@@ -209,7 +209,7 @@ export default {
 <style scoped lang="scss">
 .container {
   padding: 24rpx;
-  background: #F0F7FF;
+  background: $tint-sky-ghost;
   min-height: 100vh;
 }
 

+ 75 - 0
cfc-frontend/scripts/d38-round9-tokens.js

@@ -0,0 +1,75 @@
+#!/usr/bin/env node
+/**
+ * D38: 第九轮——跨页重复色(≥3 处)提升为 uni.scss 全局令牌
+ *
+ * 依据 AGENTS.md / uni.scss §14 约定:同一色值在 ≥2~4 个文件出现即提升全局,
+ * 单页专有色阶仍留在页面级 `$c-*`。本脚本幂等:已存在的令牌/规则不会重复写入。
+ *
+ * 用法: node scripts/d38-round9-tokens.js [--dry]
+ */
+const fs = require('fs');
+
+const TOKENS = [
+  ['$facade-fill-slate-25', '#F2F4F7', '冷调极浅底(教师端表单/计划卡)'],
+  ['$facade-fill-slate-50-2', '#F7F9FC', '冷调浅底(与既有 $facade-fill-slate-50 #F8FAFC 区分)'],
+  ['$facade-text-slate-600', '#5A6478', '深岩灰正文(教师端计划/AI 提示)'],
+  ['$facade-text-gray-600', '#4B5563', '中性灰正文(活动详情/通用说明)'],
+  ['$facade-ink-navy', '#1A2A4A', '藏青标题(门禁/深色卡片标题)'],
+  ['$status-danger-light-2', '#FCA5A5', '错误浅色(挑战卡/失败态描边)'],
+  ['$status-danger-strong-3', '#E53E3E', '错误深色(问卷/报告异常值)'],
+  ['$status-danger-tint-4', '#FDE8E8', '错误极浅底(驳回/异常标签底)'],
+  ['$status-danger-tint-5', '#FFF0F0', '错误极浅底之二(报告确认提示底)'],
+  ['$status-warning-amber', '#FFC107', '琥珀警示(评分/星级)'],
+  ['$status-warning-4', '#E6A23C', 'Element 警示橙(反馈弹窗)'],
+  ['$status-warning-gold', '#F0B429', '暖金警示(报告列表徽标)'],
+  ['$mat-green-700', '#388E3C', 'Material 绿 700(完成/通过)'],
+  ['$mat-deep-orange', '#FF5722', 'Material 深橙(记录详情强调)'],
+  ['$tint-blue-300', '#93C5FD', '蓝 300 描边/进度(空间测试)'],
+  ['$accent-violet-300', '#C4B5FD', '紫 300 强调(DAN 报告)'],
+  ['$tint-sky-soft-2', '#EAF4FC', '天蓝浅底(健康反馈/我的反馈)'],
+  ['$tint-sky-ghost', '#F0F7FF', '天蓝极浅底(报告上传/列表)'],
+  ['$tint-green-ghost', '#F0F9EB', '绿极浅底(成员列表/成功提示)'],
+  ['$accent-pink-tint-2', '#FCE4EC', '粉浅底(报告详情/情绪标签)'],
+  ['$wechat-green', '#07C160', '微信品牌绿(授权/分享入口)'],
+];
+
+const DRY = process.argv.includes('--dry');
+
+// ---- 1) uni.scss ----
+const SCSS = 'uni.scss';
+let scss = fs.readFileSync(SCSS, 'utf8');
+const eolS = scss.includes('\r\n') ? '\r\n' : '\n';
+const missing = TOKENS.filter(([name]) => !new RegExp('^\\s*\\' + name + '\\s*:', 'm').test(scss));
+if (missing.length) {
+  const block = eolS +
+    '// ==================== §15 第九轮 · 跨页重复色提升(2026-10-21) ====================' + eolS +
+    '// 判据:同一色值在 ≥3 个页面/组件出现,且不属于页面专有色阶;单页色阶仍用 $c-* 留在页面内。' + eolS +
+    missing.map(([name, hex, desc]) => `${name}: ${hex};`.padEnd(40) + `// ${desc}`).join(eolS) + eolS;
+  scss += block;
+  if (!DRY) fs.writeFileSync(SCSS, scss, 'utf8');
+  console.log('uni.scss 新增令牌:', missing.length);
+} else {
+  console.log('uni.scss 令牌已齐备,跳过');
+}
+
+// ---- 2) replace-hex-to-token.js(脚本文件统一 LF,避免整文件行尾翻新) ----
+const RULES = 'scripts/replace-hex-to-token.js';
+let rules = fs.readFileSync(RULES, 'utf8').replace(/\r\n/g, '\n');
+const eolR = '\n';
+const newRules = [];
+for (const [name, hex] of TOKENS) {
+  if (rules.toUpperCase().includes("'" + hex.toUpperCase() + "'")) continue;
+  newRules.push(`  ['${hex.toUpperCase()}', '${name}'],`);
+  newRules.push(`  ['${hex.toLowerCase()}', '${name}'],`);
+}
+if (newRules.length) {
+  const marker = '\n].sort((a, b) => b[0].length - a[0].length)';
+  const at = rules.indexOf(marker);
+  if (at === -1) { console.log('FAIL: 规则数组锚点未找到'); process.exit(1); }
+  const block = eolR + '  // ---- 第九轮(跨页重复色提升,2026-10-21)----' + eolR + newRules.join(eolR);
+  rules = rules.slice(0, at) + block + rules.slice(at);
+  if (!DRY) fs.writeFileSync(RULES, rules, 'utf8');
+  console.log('replace-hex-to-token.js 新增规则:', newRules.length);
+} else {
+  console.log('替换规则已齐备,跳过');
+}

+ 44 - 0
cfc-frontend/scripts/replace-hex-to-token.js

@@ -437,6 +437,50 @@ const ALL_RULES = [
   ['#f0e6c0', '$hint-cream-border'],
   ['#F3E8FF', '$tint-purple-soft'],
   ['#f3e8ff', '$tint-purple-soft'],
+
+  // ---- 第九轮(跨页重复色提升,2026-10-21)----
+  ['#F2F4F7', '$facade-fill-slate-25'],
+  ['#f2f4f7', '$facade-fill-slate-25'],
+  ['#F7F9FC', '$facade-fill-slate-50-2'],
+  ['#f7f9fc', '$facade-fill-slate-50-2'],
+  ['#5A6478', '$facade-text-slate-600'],
+  ['#5a6478', '$facade-text-slate-600'],
+  ['#4B5563', '$facade-text-gray-600'],
+  ['#4b5563', '$facade-text-gray-600'],
+  ['#1A2A4A', '$facade-ink-navy'],
+  ['#1a2a4a', '$facade-ink-navy'],
+  ['#FCA5A5', '$status-danger-light-2'],
+  ['#fca5a5', '$status-danger-light-2'],
+  ['#E53E3E', '$status-danger-strong-3'],
+  ['#e53e3e', '$status-danger-strong-3'],
+  ['#FDE8E8', '$status-danger-tint-4'],
+  ['#fde8e8', '$status-danger-tint-4'],
+  ['#FFF0F0', '$status-danger-tint-5'],
+  ['#fff0f0', '$status-danger-tint-5'],
+  ['#FFC107', '$status-warning-amber'],
+  ['#ffc107', '$status-warning-amber'],
+  ['#E6A23C', '$status-warning-4'],
+  ['#e6a23c', '$status-warning-4'],
+  ['#F0B429', '$status-warning-gold'],
+  ['#f0b429', '$status-warning-gold'],
+  ['#388E3C', '$mat-green-700'],
+  ['#388e3c', '$mat-green-700'],
+  ['#FF5722', '$mat-deep-orange'],
+  ['#ff5722', '$mat-deep-orange'],
+  ['#93C5FD', '$tint-blue-300'],
+  ['#93c5fd', '$tint-blue-300'],
+  ['#C4B5FD', '$accent-violet-300'],
+  ['#c4b5fd', '$accent-violet-300'],
+  ['#EAF4FC', '$tint-sky-soft-2'],
+  ['#eaf4fc', '$tint-sky-soft-2'],
+  ['#F0F7FF', '$tint-sky-ghost'],
+  ['#f0f7ff', '$tint-sky-ghost'],
+  ['#F0F9EB', '$tint-green-ghost'],
+  ['#f0f9eb', '$tint-green-ghost'],
+  ['#FCE4EC', '$accent-pink-tint-2'],
+  ['#fce4ec', '$accent-pink-tint-2'],
+  ['#07C160', '$wechat-green'],
+  ['#07c160', '$wechat-green'],
 ].sort((a, b) => b[0].length - a[0].length)
 
 const GRAY_RULES   = ALL_RULES.filter(r => { const i = ALL_RULES.indexOf(r); return i < 30 })

+ 24 - 0
cfc-frontend/uni.scss

@@ -723,3 +723,27 @@ $facade-text-gray-800:  #1F2937; // gray-800 深文字(16 文件;vs $facade-
 $facade-text-slate-700: #334155; // slate-700 深文字(16 文件;vs $facade-text-slate-deep #475569 slate-600)
 $facade-fill-slate-50:  #F8FAFC; // slate-50 极浅灰蓝底(18 文件;vs $facade-fill-slate #F1F5F9 slate-100)
 $facade-fill-blue-ghost: #F5FAFE; // 近白冷调浅底(21 文件;vs $uni-bg-color #F5F9FC 邻档)
+
+// ==================== §15 第九轮 · 跨页重复色提升(2026-10-21) ====================
+// 判据:同一色值在 ≥3 个页面/组件出现,且不属于页面专有色阶;单页色阶仍用 $c-* 留在页面内。
+$facade-fill-slate-25: #F2F4F7;         // 冷调极浅底(教师端表单/计划卡)
+$facade-fill-slate-50-2: #F7F9FC;       // 冷调浅底(与既有 $facade-fill-slate-50 #F8FAFC 区分)
+$facade-text-slate-600: #5A6478;        // 深岩灰正文(教师端计划/AI 提示)
+$facade-text-gray-600: #4B5563;         // 中性灰正文(活动详情/通用说明)
+$facade-ink-navy: #1A2A4A;             // 藏青标题(门禁/深色卡片标题)
+$status-danger-light-2: #FCA5A5;        // 错误浅色(挑战卡/失败态描边)
+$status-danger-strong-3: #E53E3E;       // 错误深色(问卷/报告异常值)
+$status-danger-tint-4: #FDE8E8;         // 错误极浅底(驳回/异常标签底)
+$status-danger-tint-5: #FFF0F0;         // 错误极浅底之二(报告确认提示底)
+$status-warning-amber: #FFC107;         // 琥珀警示(评分/星级)
+$status-warning-4: #E6A23C;             // Element 警示橙(反馈弹窗)
+$status-warning-gold: #F0B429;          // 暖金警示(报告列表徽标)
+$mat-green-700: #388E3C;                // Material 绿 700(完成/通过)
+$mat-deep-orange: #FF5722;              // Material 深橙(记录详情强调)
+$tint-blue-300: #93C5FD;                // 蓝 300 描边/进度(空间测试)
+$accent-violet-300: #C4B5FD;            // 紫 300 强调(DAN 报告)
+$tint-sky-soft-2: #EAF4FC;              // 天蓝浅底(健康反馈/我的反馈)
+$tint-sky-ghost: #F0F7FF;               // 天蓝极浅底(报告上传/列表)
+$tint-green-ghost: #F0F9EB;             // 绿极浅底(成员列表/成功提示)
+$accent-pink-tint-2: #FCE4EC;           // 粉浅底(报告详情/情绪标签)
+$wechat-green: #07C160;                 // 微信品牌绿(授权/分享入口)