Browse Source

feat(theme): 收敛 app 框架 padding:16 至 spacing.framework 单一来源

- 25 个 app 文件 padding/paddingHorizontal/paddingVertical:16 收敛为 spacing.framework(值不变=16)
- 每文件补 spacing 到 theme 导入(路径分三类,脚本按实际路径处理,无导入损坏)
- 框架16px有意比卡片宽、不被check-spacing审计;令牌化后审计仍能解析,不撕裂门禁网
- 更新项目开发状态.md 4.21 第4条及残留项改为已完成
- 验收全绿:tsc0/eslint0/check:spacing0/check:routes0/check:affordances0/check:icons0/365测试
master
doublex001 1 month ago
parent
commit
b0ed17b17b
  1. 4
      app/(enterprise)/enterprise-overview.tsx
  2. 8
      app/(enterprise)/job-management.tsx
  3. 4
      app/(enterprise)/talent-recommendation.tsx
  4. 4
      app/(tabs)/chat.tsx
  5. 4
      app/(tabs)/growth.tsx
  6. 4
      app/appeal.tsx
  7. 6
      app/candidate-detail.tsx
  8. 6
      app/guide.tsx
  9. 4
      app/holland.tsx
  10. 4
      app/hr-evaluation.tsx
  11. 6
      app/interview-score.tsx
  12. 4
      app/interview.tsx
  13. 6
      app/job-evaluations.tsx
  14. 6
      app/job-publish.tsx
  15. 6
      app/jobs/[id].tsx
  16. 4
      app/jobs/compare.tsx
  17. 4
      app/jobs/rank.tsx
  18. 6
      app/jobs/weight-settings.tsx
  19. 6
      app/onboarding.tsx
  20. 4
      app/operation-rules.tsx
  21. 10
      app/personal-data-export.tsx
  22. 4
      app/resume.tsx
  23. 4
      app/resume/export.tsx
  24. 4
      app/settings/privacy/keywords.tsx
  25. 12
      app/tools/skill-cloud.tsx
  26. 9
      项目开发状态.md

4
app/(enterprise)/enterprise-overview.tsx

@ -12,7 +12,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { useEnterpriseOverview } from '../../src/hooks';
import { LoadingState, ErrorState } from '../../src/components/StateView';
import { useRole } from '../../src/context/RoleContext';
import { colors, headerGradient, semanticColorTokens } from '../../src/theme';
import {colors, headerGradient, semanticColorTokens, spacing} from '../../src/theme';
import type { EnterpriseOverview, EnterpriseQuickAction, EnterpriseStat, JobEvaluationSummary, MenuItem } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -306,7 +306,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
},
headerBtn: {

8
app/(enterprise)/job-management.tsx

@ -17,7 +17,7 @@ import { useJobManagement } from '../../src/hooks';
import { JOB_MANAGEMENT_SORTS, buildJobStatusAction, getJobStatusLabel } from '../../src/api';
import { ErrorState, LoadingState } from '../../src/components/StateView';
import { ENTERPRISE_DISPLAY_NAME } from '../../src/constants';
import { colors } from '../../src/theme';
import {colors, spacing} from '../../src/theme';
import { formatCompact, formatDateTime } from '../../src/utils';
import type { JobManagement, JobManagementJob, JobManagementTab } from '../../src/types';
@ -956,7 +956,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 14,
borderBottomWidth: 1,
borderBottomColor: colors.borderLight,
@ -967,10 +967,10 @@ const styles = StyleSheet.create({
color: colors.textPrimary,
},
sheetBody: {
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
},
sheetFooter: {
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingTop: 12,
},
sheetActions: {

4
app/(enterprise)/talent-recommendation.tsx

@ -13,7 +13,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import { useTalentRecommendation } from '../../src/hooks';
import { ENTERPRISE_DISPLAY_NAME } from '../../src/constants';
import { colors } from '../../src/theme';
import {colors, spacing} from '../../src/theme';
import type { TalentCandidate, TalentRecommendationTab } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -413,7 +413,7 @@ const styles = StyleSheet.create({
alignItems: 'center',
gap: 8,
backgroundColor: colors.white,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingBottom: 10,
},
searchInput: {

4
app/(tabs)/chat.tsx

@ -15,7 +15,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import { useMessageData } from '../../src/hooks';
import type { Conversation, Interview, Notification } from '../../src/types';
import { colors, headerGradient } from '../../src/theme';
import {colors, headerGradient, spacing} from '../../src/theme';
/** Tab 键 */
type TabKey = 'message' | 'notification' | 'interview';
@ -588,7 +588,7 @@ const styles = StyleSheet.create({
actionBtn: {
backgroundColor: colors.primaryBtn,
borderRadius: 18,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 8,
},
actionText: {

4
app/(tabs)/growth.tsx

@ -14,7 +14,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import Svg, { Circle, Line, Polygon } from 'react-native-svg';
import { useGrowthData } from '../../src/hooks';
import { articleThumbnailColors, colors, headerGradient, jobLevelTextColors } from '../../src/theme';
import {articleThumbnailColors, colors, headerGradient, jobLevelTextColors, spacing} from '../../src/theme';
import { formatThousands, formatViews } from '../../src/utils';
import { JOB_LEVEL_LABEL } from '../../src/constants';
import type { AbilityDimension } from '../../src/types';
@ -401,7 +401,7 @@ const styles = StyleSheet.create({
},
heroButton: {
borderRadius: 18,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 8,
backgroundColor: colors.white,
},

4
app/appeal.tsx

@ -13,7 +13,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useAppealForm, useImagePick } from '../src/hooks';
import { colors } from '../src/theme';
import {colors, spacing} from '../src/theme';
import type { AppealReason, AppealType } from '../src/types';
/** 申诉类型选项 */
@ -599,7 +599,7 @@ const styles = StyleSheet.create({
left: 0,
right: 0,
bottom: 0,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderTopWidth: 1,

6
app/candidate-detail.tsx

@ -11,7 +11,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import Svg, { Line, Path, Polygon, Text as SvgText } from 'react-native-svg';
import { useCandidateDetail } from '../src/hooks';
import { LoadingState, ErrorState } from '../src/components/StateView';
import { colors } from '../src/theme';
import {colors, spacing} from '../src/theme';
import type { CandidateAbility, CandidateReview } from '../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -364,7 +364,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -665,7 +665,7 @@ const styles = StyleSheet.create({
},
footer: {
flexDirection: 'row',
padding: 16,
padding: spacing.framework,
paddingBottom: 24,
backgroundColor: colors.white,
borderTopWidth: 1,

6
app/guide.tsx

@ -12,7 +12,7 @@ import {
View,
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { colors, onboardingGradient } from '../src/theme';
import {colors, onboardingGradient, spacing} from '../src/theme';
import { useAuth } from '../src/context/AuthContext';
import type { AssetName } from '../components/onboarding/assets';
import { ImageSlot } from '../components/onboarding/ui/ImageSlot';
@ -158,7 +158,7 @@ const styles = StyleSheet.create({
topBar: {
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 10,
},
backBtn: {
@ -191,7 +191,7 @@ const styles = StyleSheet.create({
},
bottom: {
alignItems: 'center',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingBottom: 28,
},
dots: { flexDirection: 'row', gap: 8, marginBottom: 24 },

4
app/holland.tsx

@ -10,7 +10,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useHollandIntro } from '../src/hooks';
import { colors, hollandTypeColors } from '../src/theme';
import {colors, hollandTypeColors, spacing} from '../src/theme';
import { formatThousands } from '../src/utils';
import type { HollandDimensionIntro, HollandIntro } from '../src/types';
@ -322,7 +322,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.white,
borderTopWidth: 1,
borderTopColor: colors.borderLight,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingTop: 12,
paddingBottom: 24,
},

4
app/hr-evaluation.tsx

@ -11,7 +11,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import Svg, { Circle, Line, Path, Text as SvgText } from 'react-native-svg';
import { useHREvaluation } from '../src/hooks';
import { colors, levelLabelTextColors } from '../src/theme';
import {colors, levelLabelTextColors, spacing} from '../src/theme';
import type { EvaluationDimension, EvaluationReview, EvaluationTrendPoint } from '../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -460,7 +460,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderTopWidth: 1,

6
app/interview-score.tsx

@ -13,7 +13,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import Svg, { Line, Polygon, Text as SvgText } from 'react-native-svg';
import { useInterviewScore } from '../src/hooks';
import { LoadingState, ErrorState } from '../src/components/StateView';
import { colors, semanticColorTokens } from '../src/theme';
import {colors, semanticColorTokens, spacing} from '../src/theme';
import { formatDateTime } from '../src/utils';
import type { HireSuggestion, InterviewScoreData, InterviewScoreDimension, InterviewScoreTag } from '../src/types';
@ -370,7 +370,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -586,7 +586,7 @@ const styles = StyleSheet.create({
},
footer: {
flexDirection: 'row',
padding: 16,
padding: spacing.framework,
paddingBottom: 24,
backgroundColor: colors.white,
borderTopWidth: 1,

4
app/interview.tsx

@ -13,7 +13,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { useAIInterview } from '../src/hooks';
import { buildInterviewConfigText } from '../src/api';
import { shareText } from '../src/lib/shareFile';
import { colors, semanticColorTokens } from '../src/theme';
import {colors, semanticColorTokens, spacing} from '../src/theme';
import type {
InterviewAbilityImprovement,
InterviewMode,
@ -491,7 +491,7 @@ const styles = StyleSheet.create({
left: 0,
right: 0,
bottom: 0,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderTopWidth: 1,

6
app/job-evaluations.tsx

@ -15,7 +15,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import Svg, { Line, Path, Polygon, Text as SvgText } from 'react-native-svg';
import { useJobEvaluationEmptyState, useJobEvaluations } from '../src/hooks';
import { LoadingState, ErrorState } from '../src/components/StateView';
import { colors } from '../src/theme';
import {colors, spacing} from '../src/theme';
import type {
JobEvaluationDimension,
JobEvaluationEmptyState,
@ -523,7 +523,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -807,7 +807,7 @@ const styles = StyleSheet.create({
marginTop: 16,
},
modalCancel: {
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 10,
},
modalCancelText: {

6
app/job-publish.tsx

@ -13,7 +13,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import { useJobPublish } from '../src/hooks';
import { LoadingState, ErrorState } from '../src/components/StateView';
import { colors } from '../src/theme';
import {colors, spacing} from '../src/theme';
import { EDUCATION_OPTIONS, WORK_TYPE_LABELS } from '../src/constants';
import type { JobPublishFormData } from '../src/types';
@ -402,7 +402,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -596,7 +596,7 @@ const styles = StyleSheet.create({
},
footer: {
flexDirection: 'row',
padding: 16,
padding: spacing.framework,
paddingBottom: 24,
backgroundColor: colors.white,
borderTopWidth: 1,

6
app/jobs/[id].tsx

@ -16,7 +16,7 @@ import Svg, { Circle, Line, Polygon, Text as SvgText } from 'react-native-svg';
import { useJobDetail } from '../../src/hooks';
import { buildJobShareText } from '../../src/api';
import { shareText } from '../../src/lib/shareFile';
import { colors } from '../../src/theme';
import {colors, spacing} from '../../src/theme';
import { formatThousands } from '../../src/utils';
import type { JobDimensionScore } from '../../src/types';
@ -664,7 +664,7 @@ const styles = StyleSheet.create({
commentBar: {
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 10,
backgroundColor: colors.white,
borderTopWidth: 1,
@ -675,7 +675,7 @@ const styles = StyleSheet.create({
height: 40,
borderRadius: 20,
backgroundColor: colors.pageBg,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
fontSize: 14,
color: colors.textPrimary,
},

4
app/jobs/compare.tsx

@ -7,7 +7,7 @@ import { useRouter } from 'expo-router';
import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useCompareData } from '../../src/hooks';
import { colors } from '../../src/theme';
import {colors, spacing} from '../../src/theme';
function Header({ onBack }: { onBack: () => void }) {
return (
@ -185,7 +185,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.surface,
borderBottomWidth: StyleSheet.hairlineWidth,

4
app/jobs/rank.tsx

@ -14,7 +14,7 @@ import Svg, { Circle, Rect } from 'react-native-svg';
import { useRankData } from '../../src/hooks';
import { buildRankReportText } from '../../src/api';
import { shareText } from '../../src/lib/shareFile';
import { colors } from '../../src/theme';
import {colors, spacing} from '../../src/theme';
import { formatThousands } from '../../src/utils';
import type { DimensionPercentile, RankData, RankEmptyState, TopCandidate } from '../../src/types';
@ -622,7 +622,7 @@ const styles = StyleSheet.create({
},
/* ---- 空状态 ---- */
emptyContent: {
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingTop: 24,
paddingBottom: 40,
},

6
app/jobs/weight-settings.tsx

@ -7,7 +7,7 @@ import { useRouter } from 'expo-router';
import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useWeightSettings } from '../../src/hooks';
import { colors } from '../../src/theme';
import {colors, spacing} from '../../src/theme';
const MIN_WEIGHT = 0;
const MAX_WEIGHT = 100;
@ -175,7 +175,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.surface,
borderBottomWidth: StyleSheet.hairlineWidth,
@ -268,7 +268,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.primaryLight,
},
footer: {
padding: 16,
padding: spacing.framework,
backgroundColor: colors.surface,
borderTopWidth: StyleSheet.hairlineWidth,
borderTopColor: colors.borderLight,

6
app/onboarding.tsx

@ -18,7 +18,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { buildChecklistText } from '../src/api';
import { useOnboardingChecklist } from '../src/hooks';
import { shareText } from '../src/lib/shareFile';
import { colors, headerGradientShort } from '../src/theme';
import {colors, headerGradientShort, spacing} from '../src/theme';
import type { ChecklistGroup, OnboardingChecklist, OnboardingTip } from '../src/types';
/** 分组图标配色轮转(全部来自主题 token) */
@ -543,7 +543,7 @@ const styles = StyleSheet.create({
right: 0,
bottom: 0,
flexDirection: 'row',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderTopWidth: 1,
@ -590,7 +590,7 @@ const styles = StyleSheet.create({
color: colors.textPrimary,
},
modalActions: { flexDirection: 'row', justifyContent: 'flex-end', gap: 12, marginTop: 18 },
modalCancel: { paddingHorizontal: 16, paddingVertical: 8 },
modalCancel: { paddingHorizontal: spacing.framework, paddingVertical: 8 },
modalCancelText: { fontSize: 14, color: colors.textSecondary },
modalConfirm: {
backgroundColor: colors.primaryBtn,

4
app/operation-rules.tsx

@ -13,7 +13,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useOperationRules } from '../src/hooks';
import { colors } from '../src/theme';
import {colors, spacing} from '../src/theme';
import type { MatchMode, OperationRules } from '../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -475,7 +475,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.textPrimary,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 8,
borderRadius: 18,
},

10
app/personal-data-export.tsx

@ -12,7 +12,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { usePersonalDataExport } from '../src/hooks';
import { colors } from '../src/theme';
import {colors, spacing} from '../src/theme';
import type { DataExportCategory, DataExportFormat, PersonalDataExport } from '../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -480,7 +480,7 @@ const styles = StyleSheet.create({
categoryRow: {
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 14,
},
checkbox: {
@ -563,7 +563,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 14,
},
timeLabel: {
@ -624,7 +624,7 @@ const styles = StyleSheet.create({
recentRow: {
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
},
recentIconWrap: {
@ -700,7 +700,7 @@ const styles = StyleSheet.create({
right: 0,
bottom: 0,
backgroundColor: colors.white,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingTop: 12,
paddingBottom: 24,
borderTopWidth: 1,

4
app/resume.tsx

@ -15,7 +15,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import { useResume } from '../src/hooks';
import { RESUME_EVAL_MAX_LENGTH, UNSET_LABEL } from '../src/constants';
import { colors } from '../src/theme';
import {colors, spacing} from '../src/theme';
import type { Resume as ResumeType, ResumeExperience, ResumeOptimizePoint, ResumeProject } from '../src/types';
import { formatDateTime } from '../src/utils';
@ -1057,7 +1057,7 @@ const styles = StyleSheet.create({
right: 0,
bottom: 0,
flexDirection: 'row',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderTopWidth: 1,

4
app/resume/export.tsx

@ -23,7 +23,7 @@ import {
RESUME_TEMPLATES,
} from '../../src/constants';
import { useResume, useResumeExport } from '../../src/hooks';
import { colors, templateAccentColors } from '../../src/theme';
import {colors, templateAccentColors, spacing} from '../../src/theme';
import type { ResumeExportFormat, ResumeExportSettings } from '../../src/types';
const FORMATS: { key: ResumeExportFormat; label: string; icon: keyof typeof Ionicons.glyphMap }[] = [
@ -790,7 +790,7 @@ const styles = StyleSheet.create({
right: 0,
bottom: 0,
flexDirection: 'row',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 12,
backgroundColor: colors.white,
borderTopWidth: 1,

4
app/settings/privacy/keywords.tsx

@ -14,7 +14,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useKeywordBlock } from '../../../src/hooks';
import { colors } from '../../../src/theme';
import {colors, spacing} from '../../../src/theme';
/* ===================== 子组件:顶部导航 ===================== */
@ -334,7 +334,7 @@ const styles = StyleSheet.create({
height: 40,
borderRadius: 20,
backgroundColor: colors.pageBg,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
fontSize: 14,
color: colors.textPrimary,
},

12
app/tools/skill-cloud.tsx

@ -14,7 +14,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import { IndustrySkillWordCloud } from '../../components/IndustrySkillWordCloud';
import { useSkillCloud, useSkillLearningPath } from '../../src/hooks';
import { colors } from '../../src/theme';
import {colors, spacing} from '../../src/theme';
import type { SkillLearningPath, SkillWord, TopSkill } from '../../src/types';
/** 技能分组 → 中文标签(用于选中详情) */
@ -526,7 +526,7 @@ const styles = StyleSheet.create({
// flexShrink: 0 是必需的:搜索框出现后父容器变矮,默认 flexShrink:1 会把这条横向
// ScrollView 压到内容高度以下,胶囊文字被纵向裁掉(点得到、看不见)
tabsWrap: { backgroundColor: colors.white, maxHeight: 52, flexGrow: 0, flexShrink: 0 },
tabs: { flexDirection: 'row', paddingHorizontal: 16, gap: 8, paddingVertical: 10 },
tabs: { flexDirection: 'row', paddingHorizontal: spacing.framework, gap: 8, paddingVertical: 10 },
tab: {
paddingHorizontal: 14,
paddingVertical: 6,
@ -539,7 +539,7 @@ const styles = StyleSheet.create({
filterBar: {
flexDirection: 'row',
backgroundColor: colors.white,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingBottom: 12,
gap: 10,
},
@ -655,7 +655,7 @@ const styles = StyleSheet.create({
alignItems: 'center',
gap: 8,
backgroundColor: colors.white,
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingBottom: 10,
},
searchInput: {
@ -688,14 +688,14 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 16,
paddingHorizontal: spacing.framework,
paddingVertical: 14,
borderBottomWidth: 1,
borderBottomColor: colors.borderLight,
},
modalTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary },
modalCenter: { alignItems: 'center', justifyContent: 'center', gap: 12, paddingVertical: 48 },
modalBody: { paddingHorizontal: 16, paddingBottom: 12 },
modalBody: { paddingHorizontal: spacing.framework, paddingBottom: 12 },
pathSummary: {
backgroundColor: colors.primaryLight,
borderRadius: 8,

9
项目开发状态.md

@ -1795,16 +1795,17 @@ deep-link 只能到 P1。**临时**把初始步改成目标页截图,**看完
- 每个文件补 `spacing` 导入(导入路径已确认统一为 `../../../src/theme`)。
- 收敛效果:段标题上下、提示距离、图标底块间距统一到 12,原先 14/18/22 的漂移被收口。
**4. 本批明确延期:B5(app/ 框架 `padding:16` → `spacing.framework`)**
- 框架 16px 是**有意比卡片宽**(页面骨架),且不被审计;改 26 个 app 文件导入路径多样、回归风险高、收益有限。
- `spacing.framework` 单一来源已存在,后续可单独一批做;延期不阻断任何门禁。
**4. B5(app/ 框架 `padding:16` → `spacing.framework`)——已于 2026-09-21 补做完成**
- 25 个 app 文件的 `padding:16` / `paddingHorizontal:16` / `paddingVertical:16` 全部收敛为 `spacing.framework`(值不变,仍为 16,走单一来源)。
- 每个文件补 `spacing` 到 theme 导入(路径分三类:`../../src/theme` 42 处、`../src/theme` 26 处、`../../../src/theme` 3 处,脚本按实际路径补,无双花括号 bug)。
- 框架 16px 有意比卡片宽(页面骨架),不被 `check-spacing` 审计;令牌化后审计仍能解析(resolveSpacing),不撕裂门禁网。
**5. 验证(全绿)**
`tsc` 0 · `eslint` 0 · `npm test` 26 套件 / 365 用例 · `check:spacing` 卡片全 8px · `check:routes` · `check:affordances` · `check:icons` 全绿。
**6. 残留 / 待跟进**
- ① **卡片未批量迁移到 `spacing.card`**:保留字面量 `8`,审计仍能拦(迁移是纯机械替换,风险低但非必须,留待后续)。
- ② B5 延期(见第 4 条)。
- ② B5 已完成(见第 4 条,2026-09-21 补做)。
- ③ `AGENTS.md` 第 10 行仍写「边距间隔一致,为 8px」,现非卡片块间距为 12,措辞略偏——非阻断,待文档对齐(可改成「卡片间距 8px / 块间距 12px」)。
---

Loading…
Cancel
Save