diff --git a/app/(enterprise)/enterprise-overview.tsx b/app/(enterprise)/enterprise-overview.tsx index 1a4834b..d02dc76 100644 --- a/app/(enterprise)/enterprise-overview.tsx +++ b/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: { diff --git a/app/(enterprise)/job-management.tsx b/app/(enterprise)/job-management.tsx index dbcc41a..0af7137 100644 --- a/app/(enterprise)/job-management.tsx +++ b/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: { diff --git a/app/(enterprise)/talent-recommendation.tsx b/app/(enterprise)/talent-recommendation.tsx index a8f736e..9143bb7 100644 --- a/app/(enterprise)/talent-recommendation.tsx +++ b/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: { diff --git a/app/(tabs)/chat.tsx b/app/(tabs)/chat.tsx index 295f40f..80ca8c6 100644 --- a/app/(tabs)/chat.tsx +++ b/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: { diff --git a/app/(tabs)/growth.tsx b/app/(tabs)/growth.tsx index 884e124..61b350b 100644 --- a/app/(tabs)/growth.tsx +++ b/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, }, diff --git a/app/appeal.tsx b/app/appeal.tsx index f9fcdd9..3679858 100644 --- a/app/appeal.tsx +++ b/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, diff --git a/app/candidate-detail.tsx b/app/candidate-detail.tsx index c8f495f..174b7c0 100644 --- a/app/candidate-detail.tsx +++ b/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, diff --git a/app/guide.tsx b/app/guide.tsx index 05df129..ac02e5a 100644 --- a/app/guide.tsx +++ b/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 }, diff --git a/app/holland.tsx b/app/holland.tsx index 9ec2801..4780871 100644 --- a/app/holland.tsx +++ b/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, }, diff --git a/app/hr-evaluation.tsx b/app/hr-evaluation.tsx index 3b416d7..c08d528 100644 --- a/app/hr-evaluation.tsx +++ b/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, diff --git a/app/interview-score.tsx b/app/interview-score.tsx index 19d4f4a..6759dbb 100644 --- a/app/interview-score.tsx +++ b/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, diff --git a/app/interview.tsx b/app/interview.tsx index 816ec80..4393de2 100644 --- a/app/interview.tsx +++ b/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, diff --git a/app/job-evaluations.tsx b/app/job-evaluations.tsx index 7eb4ec8..1783353 100644 --- a/app/job-evaluations.tsx +++ b/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: { diff --git a/app/job-publish.tsx b/app/job-publish.tsx index 0835aa6..788addd 100644 --- a/app/job-publish.tsx +++ b/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, diff --git a/app/jobs/[id].tsx b/app/jobs/[id].tsx index 992eaeb..20f3f83 100644 --- a/app/jobs/[id].tsx +++ b/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, }, diff --git a/app/jobs/compare.tsx b/app/jobs/compare.tsx index 4411655..a437928 100644 --- a/app/jobs/compare.tsx +++ b/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, diff --git a/app/jobs/rank.tsx b/app/jobs/rank.tsx index efe43ff..b8a27a5 100644 --- a/app/jobs/rank.tsx +++ b/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, }, diff --git a/app/jobs/weight-settings.tsx b/app/jobs/weight-settings.tsx index d1ccc39..1fccde8 100644 --- a/app/jobs/weight-settings.tsx +++ b/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, diff --git a/app/onboarding.tsx b/app/onboarding.tsx index c9cec32..d05483a 100644 --- a/app/onboarding.tsx +++ b/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, diff --git a/app/operation-rules.tsx b/app/operation-rules.tsx index 869ae8e..2461afe 100644 --- a/app/operation-rules.tsx +++ b/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, }, diff --git a/app/personal-data-export.tsx b/app/personal-data-export.tsx index 256480f..e078f0e 100644 --- a/app/personal-data-export.tsx +++ b/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, diff --git a/app/resume.tsx b/app/resume.tsx index 684a75b..87a8b77 100644 --- a/app/resume.tsx +++ b/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, diff --git a/app/resume/export.tsx b/app/resume/export.tsx index 3e210d1..b5641a8 100644 --- a/app/resume/export.tsx +++ b/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, diff --git a/app/settings/privacy/keywords.tsx b/app/settings/privacy/keywords.tsx index 1ef9301..6964047 100644 --- a/app/settings/privacy/keywords.tsx +++ b/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, }, diff --git a/app/tools/skill-cloud.tsx b/app/tools/skill-cloud.tsx index 37f67e2..9a40cab 100644 --- a/app/tools/skill-cloud.tsx +++ b/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, diff --git a/项目开发状态.md b/项目开发状态.md index 3d256ba..5a78a58 100644 --- a/项目开发状态.md +++ b/项目开发状态.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」)。 ---