Browse Source

refactor(theme): 卡片间隔令牌化收尾,borderRadius/padding:8 收敛为 spacing.card

- 82 个 .tsx 文件的卡片 borderRadius/padding(含 H/V):8 收敛为 spacing.card(值恒 8,零视觉变化)
- 自动补齐 spacing 的 theme 导入(复用已有导入或按目录深度计算相对路径)
- check-spacing 令牌引用命中 954 处且仍 0 违规,审计网未撕裂
- 更新项目开发状态.md(4.21 残留①标记完成 + 新增 4.23)
master
doublex001 1 month ago
parent
commit
410b1b7386
  1. 36
      app/(enterprise)/enterprise-chat.tsx
  2. 16
      app/(enterprise)/enterprise-overview.tsx
  3. 46
      app/(enterprise)/job-management.tsx
  4. 36
      app/(enterprise)/talent-recommendation.tsx
  5. 36
      app/(tabs)/chat.tsx
  6. 34
      app/(tabs)/growth.tsx
  7. 22
      app/(tabs)/jobs.tsx
  8. 50
      app/(tabs)/profile.tsx
  9. 26
      app/ability.tsx
  10. 26
      app/appeal.tsx
  11. 10
      app/article/[id].tsx
  12. 14
      app/assessment.tsx
  13. 20
      app/audit-report.tsx
  14. 30
      app/candidate-detail.tsx
  15. 24
      app/chat/[id].tsx
  16. 24
      app/enterprise-certification.tsx
  17. 6
      app/favorites.tsx
  18. 16
      app/game.tsx
  19. 34
      app/game/level.tsx
  20. 6
      app/history.tsx
  21. 28
      app/holland-result.tsx
  22. 20
      app/holland.tsx
  23. 20
      app/holland/question.tsx
  24. 32
      app/hr-evaluation.tsx
  25. 28
      app/interview-score.tsx
  26. 20
      app/interview.tsx
  27. 40
      app/job-evaluations.tsx
  28. 6
      app/job-preference.tsx
  29. 8
      app/job-publish.tsx
  30. 16
      app/jobs/[id].tsx
  31. 16
      app/jobs/compare.tsx
  32. 24
      app/jobs/offer-compare.tsx
  33. 24
      app/jobs/rank.tsx
  34. 18
      app/jobs/weight-settings.tsx
  35. 40
      app/legal.tsx
  36. 16
      app/legal/chat.tsx
  37. 16
      app/legal/checkout.tsx
  38. 10
      app/legal/faq.tsx
  39. 28
      app/legal/service.tsx
  40. 14
      app/legal/template.tsx
  41. 10
      app/legal/templates.tsx
  42. 16
      app/legal/upgrade.tsx
  43. 20
      app/onboarding.tsx
  44. 18
      app/operation-rules.tsx
  45. 22
      app/personal-data-export.tsx
  46. 32
      app/progress.tsx
  47. 24
      app/resume.tsx
  48. 4
      app/resume/basic.tsx
  49. 8
      app/resume/education.tsx
  50. 8
      app/resume/experience.tsx
  51. 22
      app/resume/export.tsx
  52. 6
      app/resume/preview.tsx
  53. 8
      app/resume/project.tsx
  54. 14
      app/settings.tsx
  55. 18
      app/settings/about.tsx
  56. 14
      app/settings/account-cancel.tsx
  57. 12
      app/settings/account.tsx
  58. 20
      app/settings/delete-data.tsx
  59. 12
      app/settings/notification.tsx
  60. 12
      app/settings/password.tsx
  61. 16
      app/settings/privacy.tsx
  62. 18
      app/settings/privacy/[id].tsx
  63. 20
      app/settings/privacy/dnd.tsx
  64. 18
      app/settings/privacy/keywords.tsx
  65. 20
      app/settings/qualifications.tsx
  66. 20
      app/tools/salary-calculator.tsx
  67. 36
      app/tools/skill-cloud.tsx
  68. 2
      components/onboarding/screens/B1Wechat.tsx
  69. 6
      components/onboarding/screens/P12Company.tsx
  70. 4
      components/onboarding/screens/P17Reference.tsx
  71. 2
      components/onboarding/screens/P1Login.tsx
  72. 2
      components/onboarding/screens/P2WechatCode.tsx
  73. 2
      components/onboarding/screens/P3Identity.tsx
  74. 2
      components/onboarding/ui/BrandHeader.tsx
  75. 4
      components/onboarding/ui/CountdownButton.tsx
  76. 4
      components/onboarding/ui/Modal.tsx
  77. 8
      components/onboarding/ui/RadioRow.tsx
  78. 2
      components/onboarding/ui/ScreenShell.tsx
  79. 8
      components/resume/EditKit.tsx
  80. 11
      src/components/JobCard.tsx
  81. 11
      src/components/LegalDocScreen.tsx
  82. 3
      src/components/StateView.tsx
  83. 23
      项目开发状态.md

36
app/(enterprise)/enterprise-chat.tsx

@ -12,7 +12,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import { useEnterpriseCommunication } from '../../src/hooks';
import { ENTERPRISE_DISPLAY_NAME } from '../../src/constants';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { EnterpriseChatItem, EnterpriseCommunicationTab, PendingTask } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -420,7 +420,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.primary,
},
body: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
center: {
@ -433,15 +433,15 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 8,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
retryText: { color: colors.white, fontSize: 13, fontWeight: '600' },
pendingCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
pendingTitle: {
@ -457,8 +457,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.pageBg,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
pendingIconWrap: {
width: 40,
@ -483,7 +483,7 @@ const styles = StyleSheet.create({
pendingBadge: {
backgroundColor: colors.actionLight,
borderRadius: 10,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
marginLeft: 8,
},
@ -516,14 +516,14 @@ const styles = StyleSheet.create({
emptyList: {
alignItems: 'center',
gap: 10,
padding: 8,
padding: spacing.card,
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
},
emptyListText: { fontSize: 13, color: colors.textSecondary },
chatListCard: {
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
overflow: 'hidden',
marginBottom: 8,
},
@ -569,7 +569,7 @@ const styles = StyleSheet.create({
},
chatLabelTag: {
backgroundColor: colors.compareOrange + '20',
borderRadius: 8,
borderRadius: spacing.card,
paddingHorizontal: 6,
paddingVertical: 2,
marginLeft: 8,
@ -615,8 +615,8 @@ const styles = StyleSheet.create({
quickActionsCard: {
flexDirection: 'row',
backgroundColor: colors.white,
borderRadius: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingVertical: spacing.card,
},
quickAction: {
flex: 1,
@ -629,8 +629,8 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
},
emptyIconWrap: {
@ -669,8 +669,8 @@ const styles = StyleSheet.create({
dataCard: {
width: '100%',
backgroundColor: colors.primaryLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'flex-start',
},
dataTitle: {

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

@ -323,9 +323,9 @@ const styles = StyleSheet.create({
companyCard: {
marginHorizontal: 8,
marginTop: 8,
padding: 8,
padding: spacing.card,
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
},
companyHeader: {
flexDirection: 'row',
@ -389,13 +389,13 @@ const styles = StyleSheet.create({
flex: 1,
},
scrollContent: {
padding: 8,
padding: spacing.card,
paddingBottom: 32,
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
cardHeader: {
@ -453,7 +453,7 @@ const styles = StyleSheet.create({
quickItem: {
flex: 1,
alignItems: 'center',
paddingVertical: 8,
paddingVertical: spacing.card,
},
quickIcon: {
width: 48,
@ -532,8 +532,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
candidateIconWrap: {

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

@ -654,7 +654,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.primary,
},
body: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
center: {
@ -667,7 +667,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 8,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -683,8 +683,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
statIconWrap: {
width: 40,
@ -723,9 +723,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
paddingHorizontal: 10,
paddingVertical: 8,
paddingVertical: spacing.card,
},
searchInput: {
flex: 1,
@ -737,9 +737,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
paddingHorizontal: 10,
paddingVertical: 8,
paddingVertical: spacing.card,
},
filterBtnText: {
fontSize: 13,
@ -750,9 +750,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
paddingHorizontal: 10,
paddingVertical: 8,
paddingVertical: spacing.card,
},
sortBtnText: {
fontSize: 13,
@ -761,8 +761,8 @@ const styles = StyleSheet.create({
},
jobCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
jobHeader: {
@ -814,8 +814,8 @@ const styles = StyleSheet.create({
},
rankTag: {
backgroundColor: colors.primaryLight,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: 2,
marginLeft: 8,
},
@ -833,7 +833,7 @@ const styles = StyleSheet.create({
jobTag: {
backgroundColor: colors.pageBg,
borderRadius: 6,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 3,
},
jobTagText: {
@ -889,8 +889,8 @@ const styles = StyleSheet.create({
},
statusTag: {
backgroundColor: colors.pageBg,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: 2,
},
statusTagText: {
@ -903,7 +903,7 @@ const styles = StyleSheet.create({
filterBadge: {
minWidth: 16,
height: 16,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.primaryBtn,
alignItems: 'center',
justifyContent: 'center',
@ -929,7 +929,7 @@ const styles = StyleSheet.create({
emptyResultBtn: {
marginTop: 4,
paddingHorizontal: 20,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryLight,
},
@ -1056,8 +1056,8 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
},
emptyIconWrap: {
@ -1096,8 +1096,8 @@ const styles = StyleSheet.create({
benefitCard: {
width: '100%',
backgroundColor: colors.primaryLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'flex-start',
},
benefitTitle: {

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

@ -421,21 +421,21 @@ const styles = StyleSheet.create({
backgroundColor: colors.pageBg,
borderRadius: 10,
paddingHorizontal: 12,
paddingVertical: 8,
paddingVertical: spacing.card,
fontSize: 14,
color: colors.textPrimary,
},
emptyList: {
alignItems: 'center',
gap: 10,
padding: 8,
padding: spacing.card,
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
},
emptyListText: { fontSize: 13, color: colors.textSecondary },
emptyListBtn: {
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},
@ -479,7 +479,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.primary,
},
body: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
center: {
@ -492,7 +492,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 8,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -538,8 +538,8 @@ const styles = StyleSheet.create({
},
candidateCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
candidateHeader: {
@ -575,7 +575,7 @@ const styles = StyleSheet.create({
matchTag: {
backgroundColor: colors.successLight,
borderRadius: 10,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
},
matchTagText: {
@ -628,7 +628,7 @@ const styles = StyleSheet.create({
tag: {
backgroundColor: colors.pageBg,
borderRadius: 6,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 3,
},
tagText: {
@ -666,8 +666,8 @@ const styles = StyleSheet.create({
},
poolCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
},
poolTitle: {
@ -712,8 +712,8 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
},
emptyIconWrap: {
@ -752,8 +752,8 @@ const styles = StyleSheet.create({
actionCard: {
width: '100%',
backgroundColor: colors.actionLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
alignItems: 'flex-start',
},
@ -790,8 +790,8 @@ const styles = StyleSheet.create({
dataCard: {
width: '100%',
backgroundColor: colors.primaryLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'flex-start',
},
dataTitle: {

36
app/(tabs)/chat.tsx

@ -315,7 +315,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -331,7 +331,7 @@ const styles = StyleSheet.create({
textAlign: 'center',
},
nav: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingTop: 8,
paddingBottom: 12,
},
@ -342,7 +342,7 @@ const styles = StyleSheet.create({
},
tabBar: {
flexDirection: 'row',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
borderBottomWidth: 1,
borderBottomColor: colors.border,
},
@ -374,15 +374,15 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingTop: 16,
paddingBottom: 24,
},
// 匹配横幅
matchBanner: {
backgroundColor: colors.primaryLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
matchBannerTitle: {
@ -400,8 +400,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
avatarWrap: {
@ -456,7 +456,7 @@ const styles = StyleSheet.create({
matchedTag: {
marginTop: 6,
backgroundColor: colors.primaryLight,
borderRadius: 8,
borderRadius: spacing.card,
paddingHorizontal: 6,
paddingVertical: 2,
},
@ -470,8 +470,8 @@ const styles = StyleSheet.create({
alignItems: 'center',
justifyContent: 'space-between',
backgroundColor: colors.actionLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
offerTitle: {
@ -488,8 +488,8 @@ const styles = StyleSheet.create({
// 通知卡片
notiCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
notiTitleRow: {
@ -537,8 +537,8 @@ const styles = StyleSheet.create({
},
interviewCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
interviewHeader: {
@ -565,8 +565,8 @@ const styles = StyleSheet.create({
marginTop: 12,
},
typeTag: {
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: 3,
},
typeTagVideo: {
@ -589,7 +589,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.primaryBtn,
borderRadius: 18,
paddingHorizontal: spacing.framework,
paddingVertical: 8,
paddingVertical: spacing.card,
},
actionText: {
fontSize: 13,

34
app/(tabs)/growth.tsx

@ -328,7 +328,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -341,7 +341,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingBottom: 24,
},
/* ---- 顶部导航 ---- */
@ -368,8 +368,8 @@ const styles = StyleSheet.create({
heroCard: {
flexDirection: 'row',
marginTop: 8,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
heroIcon: {
width: 52,
@ -402,7 +402,7 @@ const styles = StyleSheet.create({
heroButton: {
borderRadius: 18,
paddingHorizontal: spacing.framework,
paddingVertical: 8,
paddingVertical: spacing.card,
backgroundColor: colors.white,
},
heroButtonText: {
@ -419,8 +419,8 @@ const styles = StyleSheet.create({
/* ---- 通用分区标题 ---- */
emptyBox: {
backgroundColor: colors.surface,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
gap: 8,
},
@ -444,8 +444,8 @@ const styles = StyleSheet.create({
/* ---- 四维能力测评卡片 ---- */
abilityCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
abilityTop: {
flexDirection: 'row',
@ -472,9 +472,9 @@ const styles = StyleSheet.create({
},
levelBadge: {
marginLeft: 10,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 3,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.primaryLight,
},
levelBadgeText: {
@ -534,8 +534,8 @@ const styles = StyleSheet.create({
},
toolCard: {
flex: 1,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
borderWidth: 1,
},
toolTitle: {
@ -558,8 +558,8 @@ const styles = StyleSheet.create({
articleCard: {
flexDirection: 'row',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
articleThumb: {
@ -590,9 +590,9 @@ const styles = StyleSheet.create({
fontSize: 11,
color: colors.primaryText,
backgroundColor: colors.primaryLight,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
borderRadius: 8,
borderRadius: spacing.card,
overflow: 'hidden',
},
articleViews: {

22
app/(tabs)/jobs.tsx

@ -23,7 +23,7 @@ import {
SALARY_RANGES,
} from '../../src/constants';
import type { Job, SortType } from '../../src/types';
import { colors, headerGradient, jobLevelTextColors } from '../../src/theme';
import { colors, headerGradient, jobLevelTextColors , spacing } from '../../src/theme';
/** 筛选项(下拉占位) */
const FILTERS = ['全部行业', '薪资', '经验', '更多筛选'];
@ -416,7 +416,7 @@ const styles = StyleSheet.create({
nav: {
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingTop: 4,
paddingBottom: 8,
},
@ -462,7 +462,7 @@ const styles = StyleSheet.create({
marginTop: 12,
},
filterContent: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
gap: 12,
},
filterChip: {
@ -484,7 +484,7 @@ const styles = StyleSheet.create({
marginLeft: 4,
minWidth: 16,
height: 16,
borderRadius: 8,
borderRadius: spacing.card,
paddingHorizontal: 4,
alignItems: 'center',
justifyContent: 'center',
@ -500,7 +500,7 @@ const styles = StyleSheet.create({
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
marginTop: 16,
marginBottom: 12,
},
@ -530,7 +530,7 @@ const styles = StyleSheet.create({
compareBtn: {
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 4,
borderRadius: 12,
backgroundColor: colors.primaryLight,
@ -562,7 +562,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -575,13 +575,13 @@ const styles = StyleSheet.create({
flex: 1,
},
listContent: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingBottom: 24,
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
cardPressed: {
@ -695,7 +695,7 @@ const styles = StyleSheet.create({
},
optionChip: {
paddingHorizontal: 14,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.pageBg,
borderWidth: 1,

50
app/(tabs)/profile.tsx

@ -15,7 +15,7 @@ import { UNSET_LABEL } from '../../src/constants';
import { Avatar } from '../../components/onboarding/ui/Avatar';
import { isAvatarPreset } from '../../components/onboarding/assets';
import { useRole } from '../../src/context/RoleContext';
import { colors, headerGradientSolid, jobLevelTextColors } from '../../src/theme';
import { colors, headerGradientSolid, jobLevelTextColors , spacing } from '../../src/theme';
import type { Badge, DimensionScore, EnterpriseEntry, JobPreference, MenuItem, UserStats } from '../../src/types';
/* ===================== 展示层映射(全部使用主题令牌) ===================== */
@ -398,7 +398,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -409,7 +409,7 @@ const styles = StyleSheet.create({
},
/* ---- 顶部渐变头部 ---- */
headerGradient: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingTop: 8,
paddingBottom: 24,
borderBottomLeftRadius: 24,
@ -466,7 +466,7 @@ const styles = StyleSheet.create({
paddingBottom: 24,
},
content: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingTop: 16,
},
/* ---- 综合评分卡片 ---- */
@ -474,9 +474,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
},
scoreValue: {
fontSize: 40,
@ -536,9 +536,9 @@ const styles = StyleSheet.create({
/* ---- 八大维度(横向评分条) ---- */
dimCard: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
},
dimRow: {
flexDirection: 'row',
@ -570,7 +570,7 @@ const styles = StyleSheet.create({
},
levelTag: {
marginLeft: 10,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
borderRadius: 10,
},
@ -581,9 +581,9 @@ const styles = StyleSheet.create({
/* ---- 求职偏好 ---- */
prefCard: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
},
prefRow: {
flexDirection: 'row',
@ -633,14 +633,14 @@ const styles = StyleSheet.create({
marginHorizontal: -8,
},
hScrollContent: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
gap: 8,
},
badgeCard: {
width: 140,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
},
badgeIcon: {
@ -697,8 +697,8 @@ const styles = StyleSheet.create({
statsCard: {
flexDirection: 'row',
backgroundColor: colors.white,
borderRadius: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingVertical: spacing.card,
marginBottom: 8,
},
statItem: {
@ -715,9 +715,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
marginBottom: 8,
},
enterpriseIconWrap: {
@ -735,8 +735,8 @@ const styles = StyleSheet.create({
/* ---- 功能菜单 ---- */
menuCard: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
},
menuRow: {
flexDirection: 'row',
@ -751,7 +751,7 @@ const styles = StyleSheet.create({
menuIconWrap: {
width: 32,
height: 32,
borderRadius: 8,
borderRadius: spacing.card,
alignItems: 'center',
justifyContent: 'center',
marginRight: 12,

26
app/ability.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 { useAbilityAssessment } from '../src/hooks';
import { colors, jobLevelTextColors } from '../src/theme';
import { colors, jobLevelTextColors , spacing } from '../src/theme';
import { JOB_LEVEL_LABEL } from '../src/constants';
import type { AbilityDimension, AbilityTrendPoint, JobLevel } from '../src/types';
@ -277,12 +277,12 @@ const styles = StyleSheet.create({
},
headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 8, paddingBottom: 32 },
body: { padding: spacing.card, paddingBottom: 32 },
scoreCard: {
flexDirection: 'row',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -299,8 +299,8 @@ const styles = StyleSheet.create({
section: { marginTop: 16 },
emptyBox: {
backgroundColor: colors.surface,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
gap: 8,
},
@ -308,8 +308,8 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginBottom: 12 },
dimCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -344,8 +344,8 @@ const styles = StyleSheet.create({
subItemScore: { width: 50, fontSize: 12, color: colors.textPrimary, textAlign: 'right' },
chartCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -359,8 +359,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -370,6 +370,6 @@ const styles = StyleSheet.create({
improveDesc: { fontSize: 12, color: colors.textSecondary, marginTop: 2, lineHeight: 18 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { paddingHorizontal: 18, paddingVertical: 8, borderRadius: 16, backgroundColor: colors.primaryLight },
retryBtn: { paddingHorizontal: 18, paddingVertical: spacing.card, borderRadius: 16, backgroundColor: colors.primaryLight },
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
});

26
app/appeal.tsx

@ -461,20 +461,20 @@ const styles = StyleSheet.create({
},
headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { paddingHorizontal: 8, paddingBottom: 100, paddingTop: 12 },
body: { paddingHorizontal: spacing.card, paddingBottom: 100, paddingTop: 12 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
noticeCard: {
backgroundColor: colors.infoLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.infoBorder,
@ -490,8 +490,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -513,7 +513,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 14,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.white,
borderWidth: 1,
@ -526,9 +526,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
paddingVertical: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingVertical: spacing.card,
paddingHorizontal: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -564,7 +564,7 @@ const styles = StyleSheet.create({
evidenceImage: {
width: 72,
height: 72,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.pageBg,
},
evidenceRemove: {
@ -580,8 +580,8 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
},

10
app/article/[id].tsx

@ -5,7 +5,7 @@ import type { ComponentProps } from 'react';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useGrowthData } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView';
import { articleThumbnailColors, colors } from '../../src/theme';
import { articleThumbnailColors, colors , spacing } from '../../src/theme';
import { formatViews } from '../../src/utils';
type IconName = ComponentProps<typeof Ionicons>['name'];
@ -81,7 +81,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -102,7 +102,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
thumb: {
@ -129,9 +129,9 @@ const styles = StyleSheet.create({
fontSize: 11,
color: colors.primaryText,
backgroundColor: colors.primaryLight,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
borderRadius: 8,
borderRadius: spacing.card,
overflow: 'hidden',
marginRight: 10,
},

14
app/assessment.tsx

@ -10,7 +10,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useGrowthData } from '../src/hooks';
import { colors, jobLevelTextColors } from '../src/theme';
import { colors, jobLevelTextColors , spacing } from '../src/theme';
import { JOB_LEVEL_LABEL } from '../src/constants';
import type { JobLevel } from '../src/types';
@ -166,14 +166,14 @@ const styles = StyleSheet.create({
},
headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 8, paddingBottom: 32 },
body: { padding: spacing.card, paddingBottom: 32 },
abilityCard: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -190,8 +190,8 @@ const styles = StyleSheet.create({
entryCard: {
flexDirection: 'row',
alignItems: 'center',
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
entryIcon: {
width: 44,
@ -205,6 +205,6 @@ const styles = StyleSheet.create({
entryDesc: { fontSize: 13, color: colors.textSecondary, marginTop: 2 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { paddingHorizontal: 18, paddingVertical: 8, borderRadius: 16, backgroundColor: colors.primaryLight },
retryBtn: { paddingHorizontal: 18, paddingVertical: spacing.card, borderRadius: 16, backgroundColor: colors.primaryLight },
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
});

20
app/audit-report.tsx

@ -4,7 +4,7 @@ import { ActivityIndicator, Pressable, ScrollView, StyleSheet, Text, View } from
import { SafeAreaView } from 'react-native-safe-area-context';
import Svg, { Line, Path, Rect, Text as SvgText } from 'react-native-svg';
import { useAuditReport } from '../src/hooks';
import { colors } from '../src/theme';
import { colors , spacing } from '../src/theme';
import type { AuditKPI, AuditTrendPoint, RiskDistributionItem } from '../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -253,19 +253,19 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
backgroundColor: colors.white,
},
headerBtn: { width: 36, height: 36, alignItems: 'center', justifyContent: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
scroll: { flex: 1 },
content: { padding: 8 },
content: { padding: spacing.card },
center: { flex: 1, alignItems: 'center', justifyContent: 'center' },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
marginTop: 12,
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},
@ -274,8 +274,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.success,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
gradeCircle: {
width: 72,
@ -307,8 +307,8 @@ const styles = StyleSheet.create({
kpiCard: {
width: '48%',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
kpiIconWrap: {
@ -326,8 +326,8 @@ const styles = StyleSheet.create({
kpiChange: { fontSize: 12, fontWeight: '600', marginLeft: 3 },
chartCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
chartGap: { height: 12 },
chartHeader: {

30
app/candidate-detail.tsx

@ -385,13 +385,13 @@ const styles = StyleSheet.create({
flex: 1,
},
scrollContent: {
padding: 8,
padding: spacing.card,
paddingBottom: 100,
},
infoCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
infoHeader: {
@ -429,9 +429,9 @@ const styles = StyleSheet.create({
matchBox: {
alignItems: 'center',
backgroundColor: colors.successLight,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
},
matchValue: {
fontSize: 20,
@ -470,8 +470,8 @@ const styles = StyleSheet.create({
},
scoreCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
flexDirection: 'row',
justifyContent: 'space-between',
@ -502,8 +502,8 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
cardTitle: {
@ -594,7 +594,7 @@ const styles = StyleSheet.create({
marginBottom: 8,
},
reviewTag: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 4,
borderRadius: 12,
backgroundColor: colors.primaryLight,
@ -612,8 +612,8 @@ const styles = StyleSheet.create({
suggestionRow: {
flexDirection: 'row',
alignItems: 'center',
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
marginBottom: 8,
@ -639,8 +639,8 @@ const styles = StyleSheet.create({
},
salaryBox: {
marginTop: 8,
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.infoLight,
},
salaryLabel: {

24
app/chat/[id].tsx

@ -15,7 +15,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useConversation } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { ChatCard, ChatMessage } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -427,7 +427,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 52,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -487,8 +487,8 @@ const styles = StyleSheet.create({
alignItems: 'center',
marginHorizontal: 8,
marginTop: 8,
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.successLight,
},
bannerIconWrap: {
@ -517,7 +517,7 @@ const styles = StyleSheet.create({
flex: 1,
},
scrollContent: {
padding: 8,
padding: spacing.card,
paddingBottom: 8,
},
systemWrap: {
@ -579,8 +579,8 @@ const styles = StyleSheet.create({
cardBase: {
width: 260,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
},
cardHeader: {
@ -608,7 +608,7 @@ const styles = StyleSheet.create({
cardBullet: {
width: 16,
height: 16,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.successLight,
alignItems: 'center',
justifyContent: 'center',
@ -634,8 +634,8 @@ const styles = StyleSheet.create({
cardOffer: {
width: 260,
backgroundColor: colors.actionLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
},
cardOfferHeader: {
@ -674,7 +674,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 6,
paddingVertical: 8,
paddingVertical: spacing.card,
backgroundColor: colors.white,
borderTopWidth: 1,
borderTopColor: colors.borderLight,
@ -737,7 +737,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},

24
app/enterprise-certification.tsx

@ -13,7 +13,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import { useEnterpriseCertification } from '../src/hooks';
import { useAuth } from '../src/context/AuthContext';
import { colors } from '../src/theme';
import { colors , spacing } from '../src/theme';
import type { EnterpriseCertificationForm, EnterpriseCertificationStatus } from '../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -250,7 +250,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
backgroundColor: colors.white,
},
headerBtn: { width: 36, height: 36, alignItems: 'center', justifyContent: 'center' },
@ -261,7 +261,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 12,
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},
@ -269,8 +269,8 @@ const styles = StyleSheet.create({
topCard: {
margin: 8,
backgroundColor: colors.primary,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
topHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 16 },
shieldWrap: {
@ -290,7 +290,7 @@ const styles = StyleSheet.create({
statusBadge: {
alignSelf: 'flex-start',
marginTop: 6,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
borderRadius: 10,
},
@ -298,8 +298,8 @@ const styles = StyleSheet.create({
formCard: {
marginHorizontal: 8,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
formTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary, marginBottom: 16 },
field: { marginBottom: 16 },
@ -326,8 +326,8 @@ const styles = StyleSheet.create({
successCard: {
marginHorizontal: 8,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
},
successTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginTop: 16 },
@ -343,8 +343,8 @@ const styles = StyleSheet.create({
pendingCard: {
marginHorizontal: 8,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
},
pendingTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginTop: 16 },

6
app/favorites.tsx

@ -5,7 +5,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { useFavorites } from '../src/hooks';
import { JobCard } from '../src/components/JobCard';
import { LoadingState, ErrorState, EmptyState } from '../src/components/StateView';
import { colors } from '../src/theme';
import { colors , spacing } from '../src/theme';
/**
* 我的收藏页(职位)
@ -58,7 +58,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -79,7 +79,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingTop: 12,
paddingBottom: 24,
},

16
app/game.tsx

@ -10,7 +10,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useGameData } from '../src/hooks';
import { colors } from '../src/theme';
import { colors , spacing } from '../src/theme';
import type { GameLevel, GameLevelStatus, GameProgress } from '../src/types';
/** 关卡状态 → 样式配置 */
@ -180,7 +180,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -201,13 +201,13 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
progressCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
progressHead: {
@ -242,8 +242,8 @@ const styles = StyleSheet.create({
levelCard: {
flexDirection: 'row',
alignItems: 'center',
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
borderWidth: 1,
backgroundColor: colors.white,
},
@ -289,7 +289,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},

34
app/game/level.tsx

@ -12,7 +12,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import { useMemo, useState } from 'react';
import { useGameData } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { GameAnswer, GameQuestion } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -262,7 +262,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -283,7 +283,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
levelDesc: {
@ -291,14 +291,14 @@ const styles = StyleSheet.create({
lineHeight: 20,
color: colors.textSecondary,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
questionCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
questionIndex: {
@ -321,9 +321,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: 8,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
borderRadius: spacing.card,
borderWidth: 1,
borderColor: colors.border,
backgroundColor: colors.white,
@ -368,8 +368,8 @@ const styles = StyleSheet.create({
},
explanation: {
marginTop: 8,
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.infoLight,
},
explanationLabel: {
@ -386,8 +386,8 @@ const styles = StyleSheet.create({
resultCard: {
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
resultTitle: {
@ -406,7 +406,7 @@ const styles = StyleSheet.create({
submitBtn: {
marginTop: 8,
height: 48,
borderRadius: 8,
borderRadius: spacing.card,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: colors.primaryBtn,
@ -422,7 +422,7 @@ const styles = StyleSheet.create({
nextBtn: {
marginTop: 8,
height: 48,
borderRadius: 8,
borderRadius: spacing.card,
alignItems: 'center',
justifyContent: 'center',
backgroundColor: colors.successBtn,
@ -445,7 +445,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},

6
app/history.tsx

@ -5,7 +5,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { useHistory } from '../src/hooks';
import { JobCard } from '../src/components/JobCard';
import { LoadingState, ErrorState, EmptyState } from '../src/components/StateView';
import { colors } from '../src/theme';
import { colors , spacing } from '../src/theme';
/**
* 浏览历史页(职位)
@ -58,7 +58,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -79,7 +79,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingTop: 12,
paddingBottom: 24,
},

28
app/holland-result.tsx

@ -15,7 +15,7 @@ import Svg, { Circle, Line, Polygon } from 'react-native-svg';
import { useHollandAssessment } from '../src/hooks';
import { buildHollandReportText } from '../src/api';
import { shareText } from '../src/lib/shareFile';
import { colors, headerGradientShort, hollandTypeColors } from '../src/theme';
import { colors, headerGradientShort, hollandTypeColors , spacing } from '../src/theme';
import type { HollandAction, HollandDimension, HollandTypeAnalysis } from '../src/types';
const RADAR_SIZE = 160;
@ -310,10 +310,10 @@ const styles = StyleSheet.create({
},
headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 8, paddingBottom: 32 },
body: { padding: spacing.card, paddingBottom: 32 },
heroCard: {
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
flexDirection: 'row',
alignItems: 'center',
marginBottom: 8,
@ -327,8 +327,8 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginBottom: 12 },
typeCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -356,8 +356,8 @@ const styles = StyleSheet.create({
careerTagText: { fontSize: 12, color: colors.primaryText },
jobCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -368,15 +368,15 @@ const styles = StyleSheet.create({
matchTag: {
backgroundColor: colors.successLight,
borderRadius: 10,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
},
matchText: { fontSize: 11, color: colors.successText, fontWeight: '600' },
jobTags: { flexDirection: 'row', gap: 8, marginTop: 10 },
tag: {
backgroundColor: colors.pageBg,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: 2,
},
tagText: { fontSize: 11, color: colors.textSecondary },
@ -385,8 +385,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -396,6 +396,6 @@ const styles = StyleSheet.create({
actionDesc: { fontSize: 12, color: colors.textSecondary, marginTop: 2 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { paddingHorizontal: 18, paddingVertical: 8, borderRadius: 16, backgroundColor: colors.primaryLight },
retryBtn: { paddingHorizontal: 18, paddingVertical: spacing.card, borderRadius: 16, backgroundColor: colors.primaryLight },
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
});

20
app/holland.tsx

@ -173,15 +173,15 @@ const styles = StyleSheet.create({
headerBtn: { width: 50, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
headerRecord: { fontSize: 14, color: colors.primary, fontWeight: '500' },
body: { padding: 8, paddingBottom: 24 },
body: { padding: spacing.card, paddingBottom: 24 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { paddingHorizontal: 18, paddingVertical: 8, borderRadius: 16, backgroundColor: colors.primaryLight },
retryBtn: { paddingHorizontal: 18, paddingVertical: spacing.card, borderRadius: 16, backgroundColor: colors.primaryLight },
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
heroCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
marginBottom: 8,
},
@ -228,8 +228,8 @@ const styles = StyleSheet.create({
dimItem: {
width: '30.8%',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
},
dimBadge: {
@ -264,8 +264,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
featureIcon: {
width: 44,
@ -292,8 +292,8 @@ const styles = StyleSheet.create({
},
advantageCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
advantageTitle: {
fontSize: 15,

20
app/holland/question.tsx

@ -11,7 +11,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useHollandAssessment } from '../../src/hooks';
import { colors, hollandTypeColors } from '../../src/theme';
import { colors, hollandTypeColors , spacing } from '../../src/theme';
import type { HollandDimension, HollandOption } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -200,11 +200,11 @@ const styles = StyleSheet.create({
headerCenter: { alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
headerSub: { fontSize: 12, color: colors.textHint, marginTop: 2 },
body: { padding: 8, paddingBottom: 32 },
body: { padding: spacing.card, paddingBottom: 32 },
dimCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -244,8 +244,8 @@ const styles = StyleSheet.create({
},
questionCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -265,9 +265,9 @@ const styles = StyleSheet.create({
alignItems: 'center',
justifyContent: 'space-between',
backgroundColor: colors.white,
borderRadius: 8,
paddingVertical: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingVertical: spacing.card,
paddingHorizontal: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
},
@ -306,7 +306,7 @@ const styles = StyleSheet.create({
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},

32
app/hr-evaluation.tsx

@ -321,12 +321,12 @@ const styles = StyleSheet.create({
backgroundColor: colors.primaryLight,
},
headerAppealText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
body: { paddingHorizontal: 8, paddingBottom: 100, paddingTop: 12 },
body: { paddingHorizontal: spacing.card, paddingBottom: 100, paddingTop: 12 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},
@ -336,8 +336,8 @@ const styles = StyleSheet.create({
justifyContent: 'space-between',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -361,16 +361,16 @@ const styles = StyleSheet.create({
scoreIcon: { alignItems: 'center', justifyContent: 'center' },
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
},
chartCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -388,8 +388,8 @@ const styles = StyleSheet.create({
dimScore: { fontSize: 14, fontWeight: '700', color: colors.textPrimary, marginRight: 8 },
dimTag: {
backgroundColor: colors.pageBg,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: 2,
marginRight: 8,
},
@ -404,8 +404,8 @@ const styles = StyleSheet.create({
sectionHeader: { marginBottom: 10, marginTop: 4 },
emptyBox: {
backgroundColor: colors.surface,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
gap: 8,
},
@ -413,8 +413,8 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary },
reviewCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -437,8 +437,8 @@ const styles = StyleSheet.create({
reviewTags: { flexDirection: 'row', flexWrap: 'wrap', gap: 8, marginTop: 10 },
reviewTag: {
backgroundColor: colors.primaryLight,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: 2,
},
reviewTagText: { fontSize: 11, color: colors.primaryText },

28
app/interview-score.tsx

@ -391,13 +391,13 @@ const styles = StyleSheet.create({
flex: 1,
},
scrollContent: {
padding: 8,
padding: spacing.card,
paddingBottom: 100,
},
infoCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
infoRow: {
@ -419,8 +419,8 @@ const styles = StyleSheet.create({
},
scoreCard: {
backgroundColor: colors.primary,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
flexDirection: 'row',
justifyContent: 'space-between',
@ -447,8 +447,8 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
cardTitle: {
@ -536,8 +536,8 @@ const styles = StyleSheet.create({
suggestionRow: {
flexDirection: 'row',
alignItems: 'center',
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
marginBottom: 8,
@ -566,8 +566,8 @@ const styles = StyleSheet.create({
justifyContent: 'space-between',
alignItems: 'center',
backgroundColor: colors.infoLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
salaryRange: {
fontSize: 24,
@ -615,9 +615,9 @@ const styles = StyleSheet.create({
backgroundColor: colors.infoLight,
borderWidth: 1,
borderColor: colors.infoBorder,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
marginBottom: 8,
},
draftBannerBody: { flex: 1 },

20
app/interview.tsx

@ -377,12 +377,12 @@ const styles = StyleSheet.create({
},
headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { paddingHorizontal: 8, paddingBottom: 100, paddingTop: 12 },
body: { paddingHorizontal: spacing.card, paddingBottom: 100, paddingTop: 12 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},
@ -393,8 +393,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -413,8 +413,8 @@ const styles = StyleSheet.create({
modeDesc: { fontSize: 12, color: colors.textSecondary, marginTop: 2 },
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -436,7 +436,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 14,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.white,
borderWidth: 1,
@ -446,7 +446,7 @@ const styles = StyleSheet.create({
typeTextActive: { color: colors.white, fontWeight: '600' },
specialTag: {
paddingHorizontal: 14,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.pageBg,
borderWidth: 1,
@ -458,7 +458,7 @@ const styles = StyleSheet.create({
improvementRow: {
flexDirection: 'row',
alignItems: 'center',
paddingVertical: 8,
paddingVertical: spacing.card,
},
improvementLabel: { width: 70, fontSize: 13, color: colors.textPrimary },
improvementTrack: {
@ -484,7 +484,7 @@ const styles = StyleSheet.create({
},
recentDate: { width: 60, fontSize: 12, color: colors.textHint },
recentTitle: { flex: 1, fontSize: 14, color: colors.textPrimary },
recentTag: { borderRadius: 10, paddingHorizontal: 8, paddingVertical: 2 },
recentTag: { borderRadius: 10, paddingHorizontal: spacing.card, paddingVertical: 2 },
recentResult: { fontSize: 12, fontWeight: '600' },
footer: {
position: 'absolute',

40
app/job-evaluations.tsx

@ -544,13 +544,13 @@ const styles = StyleSheet.create({
flex: 1,
},
scrollContent: {
padding: 8,
padding: spacing.card,
paddingBottom: 32,
},
scoreCard: {
backgroundColor: colors.primary,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
scoreMain: {
@ -605,8 +605,8 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
cardTitle: {
@ -617,15 +617,15 @@ const styles = StyleSheet.create({
},
chartCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
alignItems: 'center',
},
radarCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
alignItems: 'center',
},
@ -710,7 +710,7 @@ const styles = StyleSheet.create({
marginBottom: 10,
},
reviewTag: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 4,
borderRadius: 12,
backgroundColor: colors.primaryLight,
@ -750,8 +750,8 @@ const styles = StyleSheet.create({
/* ---- 回复内容块 ---- */
replyBlock: {
marginTop: 8,
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.successLight,
},
replyBlockLabel: {
@ -774,8 +774,8 @@ const styles = StyleSheet.create({
},
modalCard: {
backgroundColor: colors.surface,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
modalTitle: {
fontSize: 16,
@ -791,7 +791,7 @@ const styles = StyleSheet.create({
modalInput: {
marginTop: 12,
minHeight: 88,
borderRadius: 8,
borderRadius: spacing.card,
borderWidth: 1,
borderColor: colors.border,
paddingHorizontal: 12,
@ -833,7 +833,7 @@ const styles = StyleSheet.create({
marginBottom: 16,
},
emptyTabContent: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 12,
gap: 8,
},
@ -869,8 +869,8 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
marginTop: 8,
},
@ -905,8 +905,8 @@ const styles = StyleSheet.create({
tipCard: {
width: '100%',
backgroundColor: colors.actionLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'flex-start',
},
tipHeader: {

6
app/job-preference.tsx

@ -11,7 +11,7 @@ import {
View,
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { colors } from '../src/theme';
import { colors , spacing } from '../src/theme';
import { useAuth } from '../src/context/AuthContext';
import { useJobPreference } from '../src/hooks';
import {
@ -195,12 +195,12 @@ export default function JobPreferenceScreen() {
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: colors.pageBg },
body: { padding: 8, paddingBottom: 24 },
body: { padding: spacing.card, paddingBottom: 24 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},

8
app/job-publish.tsx

@ -431,13 +431,13 @@ const styles = StyleSheet.create({
flex: 1,
},
scrollContent: {
padding: 8,
padding: spacing.card,
paddingBottom: 100,
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
cardTitle: {
@ -480,7 +480,7 @@ const styles = StyleSheet.create({
},
radioTag: {
paddingHorizontal: 14,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
borderWidth: 1,
borderColor: colors.border,

16
app/jobs/[id].tsx

@ -369,7 +369,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -418,21 +418,21 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingBottom: 24,
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
/* ---- 空态 ---- */
emptyCard: {
backgroundColor: colors.white,
borderRadius: 8,
paddingVertical: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingVertical: spacing.card,
paddingHorizontal: spacing.card,
marginBottom: 8,
alignItems: 'center',
gap: 8,
@ -465,7 +465,7 @@ const styles = StyleSheet.create({
},
statusTag: {
backgroundColor: colors.successLight,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 3,
borderRadius: 10,
},

16
app/jobs/compare.tsx

@ -193,7 +193,7 @@ const styles = StyleSheet.create({
},
headerBtn: { width: 32, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '500', color: colors.textPrimary },
content: { padding: 8, paddingBottom: 32 },
content: { padding: spacing.card, paddingBottom: 32 },
stateWrap: {
flex: 1,
alignItems: 'center',
@ -204,8 +204,8 @@ const styles = StyleSheet.create({
stateText: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
paddingHorizontal: 20,
paddingVertical: 8,
borderRadius: 8,
paddingVertical: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.primaryLight,
},
retryText: { fontSize: 14, color: colors.primaryText },
@ -231,8 +231,8 @@ const styles = StyleSheet.create({
jobRow: { flexDirection: 'row', gap: 8 },
jobCard: {
flex: 1,
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.surface,
borderWidth: StyleSheet.hairlineWidth,
borderColor: colors.borderLight,
@ -252,11 +252,11 @@ const styles = StyleSheet.create({
},
sectionTitle: { fontSize: 15, fontWeight: '500', color: colors.textPrimary },
card: {
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.surface,
borderWidth: StyleSheet.hairlineWidth,
borderColor: colors.borderLight,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
},
scoreRow: {
paddingVertical: 12,
@ -296,7 +296,7 @@ const styles = StyleSheet.create({
benefitJob: { fontSize: 13, color: colors.textPrimary, marginBottom: 8 },
benefitTags: { flexDirection: 'row', flexWrap: 'wrap', gap: 6 },
benefitTag: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 3,
borderRadius: 4,
backgroundColor: colors.primaryLight,

24
app/jobs/offer-compare.tsx

@ -15,7 +15,7 @@ import { useOfferCompareData } from '../../src/hooks';
import { buildOfferCompareText } from '../../src/api';
import { shareText } from '../../src/lib/shareFile';
import { EmptyState } from '../../src/components/StateView';
import { colors, headerGradientSolid } from '../../src/theme';
import { colors, headerGradientSolid , spacing } from '../../src/theme';
import type { OfferBenefitGroup, OfferItem, OfferScore, WorkLifeBalanceRow } from '../../src/types';
/* ===================== 子组件 ===================== */
@ -335,7 +335,7 @@ const styles = StyleSheet.create({
height: 48,
flexDirection: 'row',
alignItems: 'center',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
backgroundColor: colors.pageBg,
},
headerBtn: {
@ -368,7 +368,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -383,7 +383,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingTop: 8,
paddingBottom: 12,
},
@ -398,8 +398,8 @@ const styles = StyleSheet.create({
},
offerCard: {
width: 150,
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.border,
@ -447,8 +447,8 @@ const styles = StyleSheet.create({
/* ---- 通用卡片与分区标题 ---- */
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
},
sectionHeader: {
@ -536,9 +536,9 @@ const styles = StyleSheet.create({
flex: 1,
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 8,
paddingVertical: spacing.card,
marginHorizontal: 2,
borderRadius: 8,
borderRadius: spacing.card,
},
tableHeaderText: {
fontSize: 13,
@ -576,8 +576,8 @@ const styles = StyleSheet.create({
/* ---- AI 建议 ---- */
aiCard: {
marginTop: 8,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
aiHeader: {
flexDirection: 'row',

24
app/jobs/rank.tsx

@ -394,7 +394,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 4,
},
headerBtn: {
@ -436,7 +436,7 @@ const styles = StyleSheet.create({
flex: 1,
},
scrollContent: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingBottom: 40,
},
bottomSpacer: {
@ -460,8 +460,8 @@ const styles = StyleSheet.create({
/* ---- 综合排名卡片 ---- */
rankCard: {
backgroundColor: colors.primaryLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
borderWidth: 1,
borderColor: colors.primaryBorder,
},
@ -494,7 +494,7 @@ const styles = StyleSheet.create({
},
levelBadge: {
backgroundColor: colors.successLight,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
borderRadius: 4,
marginLeft: 8,
@ -523,8 +523,8 @@ const styles = StyleSheet.create({
/* ---- 分区 ---- */
section: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
},
sectionTitle: {
@ -628,8 +628,8 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
},
emptyIconWrap: {
@ -667,8 +667,8 @@ const styles = StyleSheet.create({
},
progressCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
},
progressTitle: {
@ -754,7 +754,7 @@ const styles = StyleSheet.create({
justifyContent: 'space-between',
alignItems: 'center',
backgroundColor: colors.primaryLight,
borderRadius: 8,
borderRadius: spacing.card,
paddingHorizontal: 14,
paddingVertical: 12,
marginTop: 8,

18
app/jobs/weight-settings.tsx

@ -183,13 +183,13 @@ const styles = StyleSheet.create({
},
headerBtn: { width: 32, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '500', color: colors.textPrimary },
content: { padding: 8, paddingBottom: 24 },
content: { padding: spacing.card, paddingBottom: 24 },
stateWrap: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: 12 },
stateText: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
paddingHorizontal: 20,
paddingVertical: 8,
borderRadius: 8,
paddingVertical: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.primaryLight,
},
retryText: { fontSize: 14, color: colors.primaryText },
@ -197,8 +197,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.primaryLight,
},
summaryCardWarn: { backgroundColor: colors.dangerLight },
@ -218,8 +218,8 @@ const styles = StyleSheet.create({
templateRow: { gap: 8, paddingRight: 16 },
templateCard: {
width: 140,
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.surface,
borderWidth: StyleSheet.hairlineWidth,
borderColor: colors.borderLight,
@ -227,11 +227,11 @@ const styles = StyleSheet.create({
templateName: { fontSize: 14, fontWeight: '500', color: colors.textPrimary, marginBottom: 4 },
templateDesc: { fontSize: 11, color: colors.textSecondary },
dimensionCard: {
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.surface,
borderWidth: StyleSheet.hairlineWidth,
borderColor: colors.borderLight,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
},
dimRow: {
paddingVertical: 14,

40
app/legal.tsx

@ -11,7 +11,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData, useLegalMembership } from '../src/hooks';
import { colors } from '../src/theme';
import { colors , spacing } from '../src/theme';
import type { LegalFAQ, LegalPlan, LegalService, LegalTemplate } from '../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -336,7 +336,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -357,15 +357,15 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
brandCard: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.primaryLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.primaryBorder,
@ -424,8 +424,8 @@ const styles = StyleSheet.create({
},
emptyHint: {
backgroundColor: colors.surface,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
gap: 8,
},
@ -436,8 +436,8 @@ const styles = StyleSheet.create({
serviceCard: {
flexDirection: 'row',
alignItems: 'center',
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
},
serviceCardFree: {
@ -494,8 +494,8 @@ const styles = StyleSheet.create({
templateCard: {
flexDirection: 'row',
alignItems: 'center',
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
},
templateBody: {
@ -514,8 +514,8 @@ const styles = StyleSheet.create({
},
faqCard: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
},
faqItem: {
paddingVertical: 12,
@ -546,8 +546,8 @@ const styles = StyleSheet.create({
},
planCard: {
flex: 1,
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.border,
@ -571,9 +571,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
gap: 6,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: 8,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.actionLight,
borderWidth: 1,
borderColor: colors.action,
@ -646,7 +646,7 @@ const styles = StyleSheet.create({
gap: 8,
marginTop: 20,
height: 48,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.primaryBtn,
},
consultText: {
@ -667,7 +667,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},

16
app/legal/chat.tsx

@ -14,7 +14,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { LegalMessage } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -151,7 +151,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -172,7 +172,7 @@ const styles = StyleSheet.create({
flex: 1,
},
scrollContent: {
padding: 8,
padding: spacing.card,
paddingBottom: 16,
},
tipCard: {
@ -180,8 +180,8 @@ const styles = StyleSheet.create({
alignItems: 'center',
gap: 8,
backgroundColor: colors.infoLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
tipText: {
@ -243,7 +243,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
gap: 8,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 10,
backgroundColor: colors.white,
borderTopWidth: 1,
@ -257,7 +257,7 @@ const styles = StyleSheet.create({
borderWidth: 1,
borderColor: colors.border,
paddingHorizontal: 14,
paddingVertical: 8,
paddingVertical: spacing.card,
fontSize: 14,
color: colors.textPrimary,
backgroundColor: colors.pageBg,
@ -286,7 +286,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},

16
app/legal/checkout.tsx

@ -5,7 +5,7 @@ import { ActivityIndicator, Alert, Pressable, ScrollView, StyleSheet, Text, View
import { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData, useLegalMembership } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { LegalPaymentChannel } from '../../src/types';
/* ===================== 付款方式 ===================== */
@ -198,7 +198,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -219,12 +219,12 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
summaryCard: {
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.border,
@ -280,8 +280,8 @@ const styles = StyleSheet.create({
channelRow: {
flexDirection: 'row',
alignItems: 'center',
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.border,
@ -353,7 +353,7 @@ const styles = StyleSheet.create({
},
payBtn: {
height: 48,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.primaryBtn,
alignItems: 'center',
justifyContent: 'center',

10
app/legal/faq.tsx

@ -5,7 +5,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { useState } from 'react';
import { useLegalData } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { LegalFAQ } from '../../src/types';
/* ===================== 顶部导航 ===================== */
@ -82,7 +82,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -103,13 +103,13 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
faqCard: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
},
faqItem: {
paddingVertical: 12,

28
app/legal/service.tsx

@ -14,7 +14,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData, useLegalMembership, useLegalServiceRequests } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
/* ===================== 顶部导航 ===================== */
@ -233,7 +233,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -254,12 +254,12 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
card: {
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.border,
@ -310,7 +310,7 @@ const styles = StyleSheet.create({
input: {
minHeight: 120,
padding: 12,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.border,
@ -327,7 +327,7 @@ const styles = StyleSheet.create({
submitBtn: {
marginTop: 16,
height: 48,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.primaryBtn,
alignItems: 'center',
justifyContent: 'center',
@ -347,8 +347,8 @@ const styles = StyleSheet.create({
marginTop: 16,
},
emptyCard: {
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
alignItems: 'center',
},
@ -357,8 +357,8 @@ const styles = StyleSheet.create({
color: colors.textSecondary,
},
errorCard: {
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.dangerLight,
borderWidth: 1,
borderColor: colors.dangerBorder,
@ -378,8 +378,8 @@ const styles = StyleSheet.create({
gap: 8,
},
requestCard: {
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.border,
@ -397,7 +397,7 @@ const styles = StyleSheet.create({
marginRight: 8,
},
statusTag: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
borderRadius: 4,
backgroundColor: colors.primaryLight,

14
app/legal/template.tsx

@ -4,7 +4,7 @@ import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
/* ===================== 顶部导航 ===================== */
@ -78,7 +78,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -99,14 +99,14 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
headCard: {
flexDirection: 'row',
alignItems: 'center',
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
marginBottom: 8,
},
@ -125,8 +125,8 @@ const styles = StyleSheet.create({
color: colors.textSecondary,
},
contentCard: {
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.borderLight,

10
app/legal/templates.tsx

@ -4,7 +4,7 @@ import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { LegalTemplate } from '../../src/types';
/* ===================== 顶部导航 ===================== */
@ -81,7 +81,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -102,7 +102,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
templateGrid: {
@ -111,8 +111,8 @@ const styles = StyleSheet.create({
templateCard: {
flexDirection: 'row',
alignItems: 'center',
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
},
templateBody: {

16
app/legal/upgrade.tsx

@ -5,7 +5,7 @@ import { Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData, useLegalMembership } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { LegalPlan } from '../../src/types';
/* ===================== 顶部导航 ===================== */
@ -126,7 +126,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -147,7 +147,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
tip: {
@ -159,8 +159,8 @@ const styles = StyleSheet.create({
gap: 8,
},
planCard: {
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.border,
@ -184,9 +184,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
gap: 6,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: 8,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.actionLight,
borderWidth: 1,
borderColor: colors.action,

20
app/onboarding.tsx

@ -434,17 +434,17 @@ const styles = StyleSheet.create({
},
headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { paddingHorizontal: 8, paddingBottom: 100, paddingTop: 12 },
body: { paddingHorizontal: spacing.card, paddingBottom: 100, paddingTop: 12 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
countdownCard: { borderRadius: 8, padding: 8, marginBottom: 8 },
countdownCard: { borderRadius: spacing.card, padding: spacing.card, marginBottom: 8 },
countdownTop: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },
countdownLabel: { fontSize: 13, color: colors.textInverse, opacity: 0.9 },
countdownValueRow: { flexDirection: 'row', alignItems: 'baseline', marginTop: 6 },
@ -477,7 +477,7 @@ const styles = StyleSheet.create({
countdownFill: { height: 8, borderRadius: 4, backgroundColor: colors.white },
groupCard: {
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -510,15 +510,15 @@ const styles = StyleSheet.create({
itemTitleDone: { textDecorationLine: 'line-through', color: colors.textHint },
requiredTag: {
backgroundColor: colors.dangerLight,
borderRadius: 8,
borderRadius: spacing.card,
paddingHorizontal: 6,
paddingVertical: 2,
},
requiredText: { fontSize: 10, color: colors.dangerText, fontWeight: '600' },
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -577,7 +577,7 @@ const styles = StyleSheet.create({
justifyContent: 'center',
paddingHorizontal: 32,
},
modalCard: { backgroundColor: colors.white, borderRadius: 8, padding: 8 },
modalCard: { backgroundColor: colors.white, borderRadius: spacing.card, padding: spacing.card },
modalTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary },
modalInput: {
marginTop: 14,
@ -590,13 +590,13 @@ const styles = StyleSheet.create({
color: colors.textPrimary,
},
modalActions: { flexDirection: 'row', justifyContent: 'flex-end', gap: 12, marginTop: 18 },
modalCancel: { paddingHorizontal: spacing.framework, paddingVertical: 8 },
modalCancel: { paddingHorizontal: spacing.framework, paddingVertical: spacing.card },
modalCancelText: { fontSize: 14, color: colors.textSecondary },
modalConfirm: {
backgroundColor: colors.primaryBtn,
borderRadius: 18,
paddingHorizontal: 20,
paddingVertical: 8,
paddingVertical: spacing.card,
},
modalConfirmText: { fontSize: 14, fontWeight: '700', color: colors.white },
});

18
app/operation-rules.tsx

@ -326,7 +326,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
backgroundColor: colors.white,
},
headerBtn: { width: 36, height: 36, alignItems: 'center', justifyContent: 'center' },
@ -337,7 +337,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 12,
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},
@ -354,9 +354,9 @@ const styles = StyleSheet.create({
card: {
marginHorizontal: 8,
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
},
modeRow: {
flexDirection: 'row',
@ -375,7 +375,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.successLight,
paddingHorizontal: 6,
paddingVertical: 2,
borderRadius: 8,
borderRadius: spacing.card,
},
recommendedText: { fontSize: 10, fontWeight: '600', color: colors.successText },
modeDesc: { fontSize: 12, color: colors.textSecondary, lineHeight: 18 },
@ -414,7 +414,7 @@ const styles = StyleSheet.create({
marginLeft: -8,
width: 16,
height: 16,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.white,
borderWidth: 2,
borderColor: colors.primary,
@ -439,7 +439,7 @@ const styles = StyleSheet.create({
height: 32,
borderWidth: 1,
borderColor: colors.border,
borderRadius: 8,
borderRadius: spacing.card,
textAlign: 'center',
fontSize: 14,
color: colors.textPrimary,
@ -476,7 +476,7 @@ const styles = StyleSheet.create({
alignItems: 'center',
backgroundColor: colors.textPrimary,
paddingHorizontal: spacing.framework,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
},
savingText: { marginLeft: 8, fontSize: 13, color: colors.textInverse },

22
app/personal-data-export.tsx

@ -387,7 +387,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -405,7 +405,7 @@ const styles = StyleSheet.create({
color: colors.textPrimary,
},
body: {
padding: 8,
padding: spacing.card,
paddingBottom: 100,
},
center: {
@ -418,7 +418,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 8,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -426,8 +426,8 @@ const styles = StyleSheet.create({
introCard: {
flexDirection: 'row',
backgroundColor: colors.primaryLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
introIconWrap: {
@ -470,7 +470,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
overflow: 'hidden',
},
rowBorder: {
@ -519,8 +519,8 @@ const styles = StyleSheet.create({
formatCard: {
flex: 1,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
},
@ -594,8 +594,8 @@ const styles = StyleSheet.create({
},
previewCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
previewTitle: {
fontSize: 14,
@ -659,7 +659,7 @@ const styles = StyleSheet.create({
statusTag: {
paddingHorizontal: 6,
paddingVertical: 2,
borderRadius: 8,
borderRadius: spacing.card,
},
statusCompleted: {
backgroundColor: colors.successLight,

32
app/progress.tsx

@ -12,7 +12,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useJobProgress } from '../src/hooks';
import { colors, headerGradientShort } from '../src/theme';
import { colors, headerGradientShort , spacing } from '../src/theme';
import type { JobProgressCompany, JobProgressStage } from '../src/types';
const TABS: { key: 'all' | JobProgressStage; label: string }[] = [
@ -344,7 +344,7 @@ const styles = StyleSheet.create({
},
headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 8, paddingBottom: 32 },
body: { padding: spacing.card, paddingBottom: 32 },
viewAllBtn: {
flexDirection: 'row',
alignItems: 'center',
@ -359,8 +359,8 @@ const styles = StyleSheet.create({
marginRight: 2,
},
statsCard: {
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
statsRow: { flexDirection: 'row', justifyContent: 'space-between' },
@ -371,8 +371,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.actionBorder,
@ -396,8 +396,8 @@ const styles = StyleSheet.create({
tabTextActive: { color: colors.white, fontWeight: '600' },
emptyBox: {
backgroundColor: colors.surface,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
gap: 8,
},
@ -413,8 +413,8 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary },
companyCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -448,8 +448,8 @@ const styles = StyleSheet.create({
nextAction: { fontSize: 12, color: colors.textSecondary },
offerCard: {
backgroundColor: colors.successLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.successBorder,
@ -459,7 +459,7 @@ const styles = StyleSheet.create({
offerTag: {
backgroundColor: colors.success,
borderRadius: 10,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
},
offerTagText: { fontSize: 11, fontWeight: '700', color: colors.white },
@ -469,8 +469,8 @@ const styles = StyleSheet.create({
offerDeadline: { fontSize: 12, color: colors.actionText, marginLeft: 4 },
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -493,6 +493,6 @@ const styles = StyleSheet.create({
barValue: { width: 20, fontSize: 11, color: colors.textSecondary, textAlign: 'right' },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { paddingHorizontal: 18, paddingVertical: 8, borderRadius: 16, backgroundColor: colors.primaryLight },
retryBtn: { paddingHorizontal: 18, paddingVertical: spacing.card, borderRadius: 16, backgroundColor: colors.primaryLight },
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
});

24
app/resume.tsx

@ -886,23 +886,23 @@ const styles = StyleSheet.create({
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
headerActions: { flexDirection: 'row', gap: 4 },
headerActionBtn: { width: 36, alignItems: 'center' },
body: { padding: 8, paddingBottom: 100 },
body: { padding: spacing.card, paddingBottom: 100 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { paddingHorizontal: 18, paddingVertical: 8, borderRadius: 16, backgroundColor: colors.primaryLight },
retryBtn: { paddingHorizontal: 18, paddingVertical: spacing.card, borderRadius: 16, backgroundColor: colors.primaryLight },
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
},
scoreCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -926,7 +926,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.primaryBtn,
borderRadius: 16,
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
},
optimizeBtnDisabled: { backgroundColor: colors.textDisabled },
optimizeBtnText: { fontSize: 14, fontWeight: '700', color: colors.white },
@ -986,7 +986,7 @@ const styles = StyleSheet.create({
alignSelf: 'flex-start',
backgroundColor: colors.successLight,
borderRadius: 10,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
},
intentionTagText: { fontSize: 12, color: colors.successText, fontWeight: '600' },
@ -1014,9 +1014,9 @@ const styles = StyleSheet.create({
alignItems: 'center',
marginTop: 8,
backgroundColor: colors.infoLight,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
},
aiTipText: { flex: 1, fontSize: 12, color: colors.infoText, marginLeft: 6 },
aiOptimizeMiniBtn: {
@ -1033,7 +1033,7 @@ const styles = StyleSheet.create({
marginTop: 8,
backgroundColor: colors.successLight,
borderRadius: 10,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
},
optimizedText: { fontSize: 12, color: colors.successText, marginLeft: 4 },

4
app/resume/basic.tsx

@ -5,7 +5,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { PrimaryButton } from '../../components/onboarding/ui/PrimaryButton';
import { CenterState, EditHeader, Field, FormNote, PageFooter } from '../../components/resume/EditKit';
import { useResume } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import { isValidEmail, isValidPhone } from '../../src/utils';
/**
@ -131,6 +131,6 @@ interface BasicForm {
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: colors.pageBg },
body: { padding: 8, paddingBottom: 24 },
body: { padding: spacing.card, paddingBottom: 24 },
formError: { fontSize: 13, color: colors.dangerText, marginBottom: 8 },
});

8
app/resume/education.tsx

@ -12,7 +12,7 @@ import {
PageFooter,
} from '../../components/resume/EditKit';
import { useResume } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { ResumeEducation } from '../../src/types';
/**
@ -250,13 +250,13 @@ const toForm = (edu: ResumeEducation): EduForm => ({
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: colors.pageBg },
body: { padding: 8, paddingBottom: 24 },
body: { padding: spacing.card, paddingBottom: 24 },
row: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,

8
app/resume/experience.tsx

@ -13,7 +13,7 @@ import {
PageFooter,
} from '../../components/resume/EditKit';
import { useResume } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { ResumeExperience } from '../../src/types';
import { splitYearMonth, yearMonthValue } from '../../src/utils';
@ -296,7 +296,7 @@ const toForm = (exp: ResumeExperience): ExpForm => {
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: colors.pageBg },
body: { padding: 8, paddingBottom: 24 },
body: { padding: spacing.card, paddingBottom: 24 },
section: { marginBottom: 18 },
label: { fontSize: 15, fontWeight: '700', color: colors.textPrimary },
labelTop: { marginTop: 14, marginBottom: 10 },
@ -308,8 +308,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,

22
app/resume/export.tsx

@ -622,15 +622,15 @@ const styles = StyleSheet.create({
headerBtn: { width: 60, justifyContent: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
headerSave: { fontSize: 14, color: colors.primary, textAlign: 'right' },
body: { padding: 8, paddingBottom: 100 },
body: { padding: spacing.card, paddingBottom: 100 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { paddingHorizontal: 18, paddingVertical: 8, borderRadius: 16, backgroundColor: colors.primaryLight },
retryBtn: { paddingHorizontal: 18, paddingVertical: spacing.card, borderRadius: 16, backgroundColor: colors.primaryLight },
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
previewCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
marginBottom: 8,
borderWidth: 1,
@ -661,8 +661,8 @@ const styles = StyleSheet.create({
formatCard: {
flex: 1,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
borderWidth: 1,
borderColor: colors.borderLight,
@ -678,8 +678,8 @@ const styles = StyleSheet.create({
templateCard: {
flex: 1,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
borderWidth: 1,
borderColor: colors.borderLight,
@ -688,7 +688,7 @@ const styles = StyleSheet.create({
templateThumb: {
width: '100%',
height: 80,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.primary,
padding: 12,
marginBottom: 8,
@ -700,8 +700,8 @@ const styles = StyleSheet.create({
templateNameActive: { color: colors.primaryText, fontWeight: '700' },
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
},

6
app/resume/preview.tsx

@ -5,7 +5,7 @@ import { PrimaryButton } from '../../components/onboarding/ui/PrimaryButton';
import { CenterState, EditHeader, PageFooter } from '../../components/resume/EditKit';
import { useResume } from '../../src/hooks';
import { UNSET_LABEL } from '../../src/constants';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { Resume, ResumeEducation, ResumeExperience, ResumeProject } from '../../src/types';
/**
@ -198,10 +198,10 @@ function hasIntention(intention: Resume['jobIntention']): boolean {
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: colors.pageBg },
body: { padding: 8, paddingBottom: 24 },
body: { padding: spacing.card, paddingBottom: 24 },
paper: {
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
padding: 20,
borderWidth: 1,
borderColor: colors.borderLight,

8
app/resume/project.tsx

@ -12,7 +12,7 @@ import {
PageFooter,
} from '../../components/resume/EditKit';
import { useResume } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { ResumeProject } from '../../src/types';
/**
@ -205,13 +205,13 @@ const toForm = (proj: ResumeProject): ProjForm => ({
const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: colors.pageBg },
body: { padding: 8, paddingBottom: 24 },
body: { padding: spacing.card, paddingBottom: 24 },
row: {
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,

14
app/settings.tsx

@ -2,7 +2,7 @@ import { Ionicons } from '@expo/vector-icons';
import { useRouter } from 'expo-router';
import { Alert, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { colors } from '../src/theme';
import { colors , spacing } from '../src/theme';
import { useAppCache } from '../src/hooks';
import { formatBytes } from '../src/utils';
import { useAuth } from '../src/context/AuthContext';
@ -240,7 +240,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
},
headerBtn: {
width: 36,
@ -261,7 +261,7 @@ const styles = StyleSheet.create({
},
group: {
marginTop: 16,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
},
groupTitle: {
marginBottom: 8,
@ -271,8 +271,8 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.surface,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
},
row: {
flexDirection: 'row',
@ -287,7 +287,7 @@ const styles = StyleSheet.create({
iconWrap: {
width: 32,
height: 32,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.primaryLight,
alignItems: 'center',
justifyContent: 'center',
@ -308,7 +308,7 @@ const styles = StyleSheet.create({
marginTop: 24,
marginHorizontal: 8,
backgroundColor: colors.surface,
borderRadius: 8,
borderRadius: spacing.card,
paddingVertical: 14,
alignItems: 'center',
},

18
app/settings/about.tsx

@ -3,7 +3,7 @@ import { useRouter } from 'expo-router';
import { ActivityIndicator, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useAboutInfo } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
/* ===================== 子组件:顶部导航 ===================== */
@ -124,7 +124,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -145,14 +145,14 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
brandCard: {
alignItems: 'center',
paddingVertical: 8,
paddingVertical: spacing.card,
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
marginBottom: 8,
},
brandLogo: {
@ -176,9 +176,9 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
marginBottom: 8,
},
cardTitle: {
@ -251,7 +251,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},

14
app/settings/account-cancel.tsx

@ -11,7 +11,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useAccountCancel } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
/* ===================== 子组件:顶部导航 ===================== */
@ -180,7 +180,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -203,7 +203,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
stateBox: {
@ -222,7 +222,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -235,8 +235,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
gap: 8,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
warnText: {
@ -256,7 +256,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
overflow: 'hidden',
},
bulletRow: {

12
app/settings/account.tsx

@ -3,7 +3,7 @@ import { useRouter } from 'expo-router';
import { ActivityIndicator, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useAccountSecurity } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
/* ===================== 子组件:顶部导航 ===================== */
@ -104,7 +104,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -125,7 +125,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
tip: {
@ -137,8 +137,8 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
},
row: {
flexDirection: 'row',
@ -188,7 +188,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},

20
app/settings/delete-data.tsx

@ -12,7 +12,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useDeleteAllData } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
/* ===================== 子组件:顶部导航 ===================== */
@ -199,7 +199,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -222,7 +222,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
stateBox: {
@ -241,7 +241,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -252,8 +252,8 @@ const styles = StyleSheet.create({
},
introCard: {
backgroundColor: colors.infoLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
introText: {
@ -272,9 +272,9 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
overflow: 'hidden',
padding: 8,
padding: spacing.card,
},
row: {
flexDirection: 'row',
@ -319,8 +319,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'flex-start',
gap: 8,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
warnText: {

12
app/settings/notification.tsx

@ -3,7 +3,7 @@ import { useRouter } from 'expo-router';
import { ActivityIndicator, Pressable, ScrollView, StyleSheet, Switch, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useNotificationSettings } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
/* ===================== 子组件:顶部导航 ===================== */
@ -90,7 +90,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -111,7 +111,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
tip: {
@ -123,8 +123,8 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
},
row: {
flexDirection: 'row',
@ -165,7 +165,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},

12
app/settings/password.tsx

@ -6,7 +6,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { useChangePassword } from '../../src/hooks';
import { useAuth } from '../../src/context/AuthContext';
import { PasswordField } from '../../src/components/PasswordField';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
/* ===================== 子组件:顶部导航 ===================== */
@ -132,7 +132,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -155,7 +155,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
tip: {
@ -167,9 +167,9 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
paddingHorizontal: 8,
paddingVertical: 8,
borderRadius: spacing.card,
paddingHorizontal: spacing.card,
paddingVertical: spacing.card,
},
gap: {
height: 6,

16
app/settings/privacy.tsx

@ -6,7 +6,7 @@ import { usePrivacyCenter } from '../../src/hooks';
import { buildPrivacySummaryText } from '../../src/api';
import { shareText } from '../../src/lib/shareFile';
import { ErrorState, LoadingState } from '../../src/components/StateView';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { PrivacyLevelInfo, PrivacySettingItem, PrivacySection } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -206,7 +206,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -227,12 +227,12 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
levelCard: {
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
levelRow: {
@ -276,7 +276,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
overflow: 'hidden',
},
row: {
@ -321,8 +321,8 @@ const styles = StyleSheet.create({
},
explanationCard: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
explanationTitle: {

18
app/settings/privacy/[id].tsx

@ -11,7 +11,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { usePrivacyDetailSetting } from '../../../src/hooks';
import { colors } from '../../../src/theme';
import { colors , spacing } from '../../../src/theme';
import type { PrivacyDetailOption } from '../../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -159,7 +159,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -182,7 +182,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
stateBox: {
@ -199,7 +199,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -210,8 +210,8 @@ const styles = StyleSheet.create({
},
introCard: {
backgroundColor: colors.infoLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
introText: {
@ -230,7 +230,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
overflow: 'hidden',
},
row: {
@ -266,8 +266,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'flex-start',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
gap: 8,
},
noteText: {

20
app/settings/privacy/dnd.tsx

@ -12,7 +12,7 @@ import {
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { useDndSetting } from '../../../src/hooks';
import { colors } from '../../../src/theme';
import { colors , spacing } from '../../../src/theme';
/* ===================== 子组件:顶部导航 ===================== */
@ -165,7 +165,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -188,7 +188,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 24,
},
stateBox: {
@ -205,7 +205,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -215,8 +215,8 @@ const styles = StyleSheet.create({
color: colors.white,
},
statCard: {
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
marginBottom: 8,
},
@ -240,7 +240,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
overflow: 'hidden',
},
row: {
@ -276,14 +276,14 @@ const styles = StyleSheet.create({
fontWeight: '600',
color: colors.primary,
paddingVertical: 4,
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
},
noteCard: {
flexDirection: 'row',
alignItems: 'flex-start',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
gap: 8,
},
noteText: {

18
app/settings/privacy/keywords.tsx

@ -185,7 +185,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -208,7 +208,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 16,
},
stateBox: {
@ -225,7 +225,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -235,8 +235,8 @@ const styles = StyleSheet.create({
color: colors.white,
},
statCard: {
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
marginBottom: 8,
},
@ -251,8 +251,8 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
cardTitle: {
@ -309,8 +309,8 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'flex-start',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
gap: 8,
},
noteText: {

20
app/settings/qualifications.tsx

@ -4,7 +4,7 @@ import { Image, Pressable, ScrollView, StyleSheet, Text, View } from 'react-nati
import { SafeAreaView } from 'react-native-safe-area-context';
import { EmptyState, ErrorState, LoadingState } from '../../src/components/StateView';
import { useQualifications } from '../../src/hooks';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
import type { QualificationLicense } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */
@ -127,7 +127,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -148,16 +148,16 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 32,
gap: 8,
},
companyCard: {
backgroundColor: colors.primaryLight,
borderRadius: 8,
borderRadius: spacing.card,
borderWidth: 1,
borderColor: colors.primaryBorder,
padding: 8,
padding: spacing.card,
},
companyLabel: {
fontSize: 12,
@ -179,10 +179,10 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.surface,
borderRadius: 8,
borderRadius: spacing.card,
borderWidth: 1,
borderColor: colors.border,
padding: 8,
padding: spacing.card,
},
cardHeader: {
flexDirection: 'row',
@ -198,21 +198,21 @@ const styles = StyleSheet.create({
marginTop: 8,
width: '100%',
height: 180,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.pageBg,
},
/* 图片占位:用「提醒卡片底 + 弱警示描边」语义色,一眼看出「这里是待办」 */
imagePlaceholder: {
marginTop: 8,
height: 132,
borderRadius: 8,
borderRadius: spacing.card,
borderWidth: 1,
borderStyle: 'dashed',
borderColor: colors.actionBorder,
backgroundColor: colors.actionLight,
alignItems: 'center',
justifyContent: 'center',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
gap: 8,
},
placeholderText: {

20
app/tools/salary-calculator.tsx

@ -16,7 +16,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import { useSalaryCalculator, useSalaryRecords, useSalaryToolLinks } from '../../src/hooks';
import { clampSocialBase } from '../../src/api';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView';
import { colors, headerGradientShort } from '../../src/theme';
import { colors, headerGradientShort , spacing } from '../../src/theme';
import {
CITIES,
DEFAULT_SOCIAL_PROFILE,
@ -569,11 +569,11 @@ const styles = StyleSheet.create({
headerBtn: { width: 60, justifyContent: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
headerAction: { fontSize: 14, color: colors.primary, textAlign: 'right' },
body: { padding: 8, paddingBottom: 32 },
body: { padding: spacing.card, paddingBottom: 32 },
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -594,7 +594,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.pageBg,
borderRadius: 10,
paddingHorizontal: 12,
paddingVertical: 8,
paddingVertical: spacing.card,
},
input: {
minWidth: 80,
@ -607,8 +607,8 @@ const styles = StyleSheet.create({
selectBox: { flexDirection: 'row', alignItems: 'center' },
selectValue: { fontSize: 15, fontWeight: '600', color: colors.textPrimary, marginRight: 4 },
resultCard: {
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
alignItems: 'center',
marginBottom: 8,
},
@ -637,15 +637,15 @@ const styles = StyleSheet.create({
taxItem: {
flex: 1,
backgroundColor: colors.pageBg,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
},
taxItemLabel: { fontSize: 12, color: colors.textSecondary, marginBottom: 6 },
taxItemValue: { fontSize: 18, fontWeight: '800', color: colors.textPrimary },
taxRow: {
flexDirection: 'row',
justifyContent: 'space-between',
paddingVertical: 8,
paddingVertical: spacing.card,
},
taxRowLabel: { fontSize: 14, color: colors.textPrimary },
taxRowValue: { fontSize: 15, fontWeight: '700', color: colors.textPrimary },

36
app/tools/skill-cloud.tsx

@ -547,7 +547,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.pageBg,
borderRadius: 8,
borderRadius: spacing.card,
paddingHorizontal: 10,
paddingVertical: 5,
},
@ -564,13 +564,13 @@ const styles = StyleSheet.create({
categoryTabActive: { backgroundColor: colors.primaryLight, borderColor: colors.primary },
categoryText: { fontSize: 12, color: colors.textSecondary },
categoryTextActive: { color: colors.primaryText, fontWeight: '600' },
body: { paddingHorizontal: 8, paddingBottom: 32 },
body: { paddingHorizontal: spacing.card, paddingBottom: 32 },
sectionTitle: { fontSize: 15, fontWeight: '700', color: colors.textPrimary, marginBottom: 10 },
cloudCard: {
backgroundColor: colors.white,
borderRadius: 8,
paddingVertical: 8,
paddingHorizontal: 8,
borderRadius: spacing.card,
paddingVertical: spacing.card,
paddingHorizontal: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
},
@ -579,8 +579,8 @@ const styles = StyleSheet.create({
card: {
marginTop: 8,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
},
@ -588,7 +588,7 @@ const styles = StyleSheet.create({
skillRow: {
flexDirection: 'row',
alignItems: 'center',
paddingVertical: 8,
paddingVertical: spacing.card,
borderTopWidth: 1,
borderTopColor: colors.borderLight,
},
@ -623,8 +623,8 @@ const styles = StyleSheet.create({
matchCard: {
marginTop: 8,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
},
@ -663,16 +663,16 @@ const styles = StyleSheet.create({
backgroundColor: colors.pageBg,
borderRadius: 10,
paddingHorizontal: 12,
paddingVertical: 8,
paddingVertical: spacing.card,
fontSize: 14,
color: colors.textPrimary,
},
searchEmpty: {
alignItems: 'center',
gap: 10,
padding: 8,
padding: spacing.card,
backgroundColor: colors.white,
borderRadius: 8,
borderRadius: spacing.card,
borderWidth: 1,
borderColor: colors.borderLight,
},
@ -698,8 +698,8 @@ const styles = StyleSheet.create({
modalBody: { paddingHorizontal: spacing.framework, paddingBottom: 12 },
pathSummary: {
backgroundColor: colors.primaryLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginTop: 8,
marginBottom: 8,
},
@ -728,8 +728,8 @@ const styles = StyleSheet.create({
detailCard: {
marginTop: 8,
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
borderWidth: 1,
borderColor: colors.successBorder,
},
@ -757,7 +757,7 @@ const styles = StyleSheet.create({
tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: {
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},

2
components/onboarding/screens/B1Wechat.tsx

@ -32,7 +32,7 @@ export function B1Wechat() {
const styles = StyleSheet.create({
center: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: spacing.block, paddingBottom: 40 },
preview: { flexDirection: 'row', alignItems: 'center', gap: spacing.block, backgroundColor: colors.white, padding: 8, borderRadius: 8, borderWidth: 1, borderColor: colors.border },
preview: { flexDirection: 'row', alignItems: 'center', gap: spacing.block, backgroundColor: colors.white, padding: spacing.card, borderRadius: spacing.card, borderWidth: 1, borderColor: colors.border },
previewText: { gap: 4 },
nick: { fontSize: 15, fontWeight: '700', color: colors.textPrimary },
tip: { fontSize: 12, color: colors.textHint },

6
components/onboarding/screens/P12Company.tsx

@ -1,5 +1,5 @@
import { StyleSheet, Text, View } from 'react-native';
import { colors } from '../../../src/theme';
import { colors , spacing } from '../../../src/theme';
import { useOnboarding } from '../../../src/hooks';
import { ScreenShell } from '../ui/ScreenShell';
import { SearchInput } from '../ui/SearchInput';
@ -34,8 +34,8 @@ export function P12Company() {
const styles = StyleSheet.create({
notice: {
marginTop: 8,
padding: 8,
borderRadius: 8,
padding: spacing.card,
borderRadius: spacing.card,
backgroundColor: colors.primaryLight,
},
noticeText: { fontSize: 12, color: colors.primaryText, lineHeight: 18 },

4
components/onboarding/screens/P17Reference.tsx

@ -80,8 +80,8 @@ const styles = StyleSheet.create({
swapText: { fontSize: 13, color: colors.primary, fontWeight: '600' },
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
gap: spacing.block,
borderWidth: 1,
borderColor: colors.border,

2
components/onboarding/screens/P1Login.tsx

@ -76,7 +76,7 @@ export function P1Login() {
const styles = StyleSheet.create({
screen: { flex: 1, backgroundColor: colors.pageBg },
topGlow: { position: 'absolute', top: 0, left: 0, right: 0, height: 200 },
content: { flexGrow: 1, paddingHorizontal: 8, paddingBottom: spacing.block },
content: { flexGrow: 1, paddingHorizontal: spacing.card, paddingBottom: spacing.block },
brandArea: { alignItems: 'center', marginTop: '22%' },
flexSpacer: { flex: 1, minHeight: 28 },
quickBtn: {

2
components/onboarding/screens/P2WechatCode.tsx

@ -132,7 +132,7 @@ const styles = StyleSheet.create({
marginTop: 30,
paddingHorizontal: 18,
paddingVertical: spacing.sm,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.borderLight,
},
toastText: { fontSize: 13, color: colors.textDisabled },

2
components/onboarding/screens/P3Identity.tsx

@ -70,7 +70,7 @@ export function P3Identity() {
const styles = StyleSheet.create({
heading: { fontSize: 22, fontWeight: '800', color: colors.textPrimary, textAlign: 'center', marginVertical: 16 },
card: { backgroundColor: colors.white, borderRadius: 8, padding: 8, alignItems: 'center', borderWidth: 1, borderColor: colors.border },
card: { backgroundColor: colors.white, borderRadius: spacing.card, padding: spacing.card, alignItems: 'center', borderWidth: 1, borderColor: colors.border },
cardTop: { marginBottom: 16 },
cardBtn: {
width: '100%',

2
components/onboarding/ui/BrandHeader.tsx

@ -14,7 +14,7 @@ export function BrandHeader({ slogan }: { slogan?: string }) {
}
const styles = StyleSheet.create({
wrap: { alignItems: 'center', gap: spacing.block, paddingVertical: 8 },
wrap: { alignItems: 'center', gap: spacing.block, paddingVertical: spacing.card },
name: { fontSize: 26, fontWeight: '800', color: colors.textPrimary },
slogan: { fontSize: 13, color: colors.textHint },
});

4
components/onboarding/ui/CountdownButton.tsx

@ -1,6 +1,6 @@
import { useEffect, useRef, useState } from 'react';
import { Pressable, StyleSheet, Text } from 'react-native';
import { colors } from '../../../src/theme';
import { colors , spacing } from '../../../src/theme';
interface Props {
disabled?: boolean;
@ -47,7 +47,7 @@ export function CountdownButton({ disabled = false, onSend, seconds = 60 }: Prop
}
const styles = StyleSheet.create({
btn: { paddingHorizontal: 14, paddingVertical: 8, borderRadius: 16, backgroundColor: colors.primaryLight },
btn: { paddingHorizontal: 14, paddingVertical: spacing.card, borderRadius: 16, backgroundColor: colors.primaryLight },
btnDisabled: { backgroundColor: colors.borderLight },
text: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
textDisabled: { color: colors.textDisabled },

4
components/onboarding/ui/Modal.tsx

@ -31,8 +31,8 @@ const styles = StyleSheet.create({
card: {
width: '84%',
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
maxHeight: '80%',
},
title: { fontSize: 18, fontWeight: '800', color: colors.textPrimary, marginBottom: spacing.block, textAlign: 'center' },

8
components/onboarding/ui/RadioRow.tsx

@ -1,6 +1,6 @@
import { Ionicons } from '@expo/vector-icons';
import { Pressable, StyleSheet, Text, View } from 'react-native';
import { colors } from '../../../src/theme';
import { colors , spacing } from '../../../src/theme';
interface Props {
label: string;
@ -29,9 +29,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingVertical: 8,
paddingHorizontal: 8,
borderRadius: 8,
paddingVertical: spacing.card,
paddingHorizontal: spacing.card,
borderRadius: spacing.card,
borderWidth: 1,
borderColor: colors.border,
backgroundColor: colors.white,

2
components/onboarding/ui/ScreenShell.tsx

@ -47,6 +47,6 @@ const styles = StyleSheet.create({
titleInline: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
titleCenter: { fontSize: 18, fontWeight: '800', color: colors.textPrimary, textAlign: 'center', paddingVertical: spacing.block },
scroll: { flex: 1 },
scrollContent: { flexGrow: 1, padding: 8, paddingBottom: 28 },
scrollContent: { flexGrow: 1, padding: spacing.card, paddingBottom: 28 },
footer: { padding: 16, paddingBottom: spacing.section, backgroundColor: colors.pageBg },
});

8
components/resume/EditKit.tsx

@ -7,7 +7,7 @@
import { Ionicons } from '@expo/vector-icons';
import type { ReactNode } from 'react';
import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';
import { colors } from '../../src/theme';
import { colors , spacing } from '../../src/theme';
/** 顶部导航:返回 + 居中标题(右侧留同宽占位,保证标题居中) */
export function EditHeader({ title, onBack }: { title: string; onBack: () => void }) {
@ -176,8 +176,8 @@ const styles = StyleSheet.create({
note: { fontSize: 12, color: colors.textHint, lineHeight: 18 },
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -200,7 +200,7 @@ const styles = StyleSheet.create({
centerText: { fontSize: 14, color: colors.textSecondary },
centerBtn: {
paddingHorizontal: 18,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 16,
backgroundColor: colors.primaryLight,
},

11
src/components/JobCard.tsx

@ -1,3 +1,4 @@
import { spacing } from '../../src/theme';
import { Pressable, StyleSheet, Text, View } from 'react-native';
import { colors } from '../theme';
import type { Job } from '../types';
@ -49,8 +50,8 @@ export function JobCard({ job, onPress }: { job: JobSummary; onPress: () => void
const styles = StyleSheet.create({
card: {
backgroundColor: colors.white,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
borderWidth: 1,
borderColor: colors.borderLight,
@ -68,9 +69,9 @@ const styles = StyleSheet.create({
marginRight: 8,
},
scoreBadge: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 2,
borderRadius: 8,
borderRadius: spacing.card,
backgroundColor: colors.primaryLight,
},
scoreText: {
@ -110,7 +111,7 @@ const styles = StyleSheet.create({
marginTop: 10,
},
tag: {
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
paddingVertical: 3,
borderRadius: 6,
backgroundColor: colors.borderLight,

11
src/components/LegalDocScreen.tsx

@ -1,3 +1,4 @@
import { spacing } from '../../src/theme';
import { Ionicons } from '@expo/vector-icons';
import { useRouter } from 'expo-router';
import {
@ -111,7 +112,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 8,
paddingHorizontal: spacing.card,
height: 48,
backgroundColor: colors.white,
borderBottomWidth: 1,
@ -134,7 +135,7 @@ const styles = StyleSheet.create({
flex: 1,
},
content: {
padding: 8,
padding: spacing.card,
paddingBottom: 32,
},
stateBox: {
@ -151,7 +152,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},
@ -171,8 +172,8 @@ const styles = StyleSheet.create({
},
preambleCard: {
backgroundColor: colors.infoLight,
borderRadius: 8,
padding: 8,
borderRadius: spacing.card,
padding: spacing.card,
marginBottom: 8,
},
preambleText: {

3
src/components/StateView.tsx

@ -1,3 +1,4 @@
import { spacing } from '../../src/theme';
import { Ionicons } from '@expo/vector-icons';
import type { ReactNode } from 'react';
import { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native';
@ -95,7 +96,7 @@ const styles = StyleSheet.create({
retryBtn: {
marginTop: 16,
paddingHorizontal: 24,
paddingVertical: 8,
paddingVertical: spacing.card,
borderRadius: 18,
backgroundColor: colors.primaryBtn,
},

23
项目开发状态.md

@ -1804,7 +1804,7 @@ deep-link 只能到 P1。**临时**把初始步改成目标页截图,**看完
`tsc` 0 · `eslint` 0 · `npm test` 26 套件 / 365 用例 · `check:spacing` 卡片全 8px · `check:routes` · `check:affordances` · `check:icons` 全绿。
**6. 残留 / 待跟进**
- ① **卡片未批量迁移到 `spacing.card`**:保留字面量 `8`,审计仍能拦(迁移是纯机械替换,风险低但非必须,留待后续)。
- ① **卡片未批量迁移到 `spacing.card`**:~~保留字面量 `8`~~ **已于 2026-09-21 收尾完成(见 4.23)—— 全仓卡片 `borderRadius / padding(含 Horizontal/Vertical): 8` 收敛为 `spacing.card`,审计令牌引用命中 954 处且仍 0 违规,审计网未撕裂**。
- ② B5 已完成(见第 4 条,2026-09-21 补做)。
- ③ `AGENTS.md` 第 10 行仍写「边距间隔一致,为 8px」,现非卡片块间距为 12,措辞略偏——非阻断,待文档对齐(可改成「卡片间距 8px / 块间距 12px」)。
@ -1898,3 +1898,24 @@ npx expo export --platform android --output-dir <临时目录>
# 启动
npm start # 即 expo start
```
---
### 4.23 卡片间隔令牌化收尾(2026-09-21 批次,接 4.21 残留 ①)
**目标**:把 4.21 起新增的 `spacing` 令牌层彻底闭环——卡片相关的字面量 `8` 全部收敛为 `spacing.card`(值恒 8,纯令牌化、零视觉变化),消除「卡片圆角/内边距仍写死数字」的最后残留,统一走 `src/theme` 单一来源。
**改动范围(82 个 .tsx 文件)**
- 目标属性:`borderRadius: 8` / `padding: 8` / `paddingHorizontal: 8` / `paddingVertical: 8` → `spacing.card`(正则按属性名精确匹配,不动 `margin` / `gap` / 其它数字,避免误伤非卡片间距)。
- 自动补齐 `spacing` 的 theme 导入:已有 theme 导入则并入命名列表;无则按文件目录深度计算相对路径(`../` 层数)插入 `import { spacing } from '<相对路径>src/theme'`。
- 数值恒等(8 === spacing.card),故 tsc / eslint / 运行行为均无变化,仅代码形态令牌化。
**防回归(与 4.21 同一顾虑)**
- `scripts/check-spacing.mjs` 的 `resolveSpacing` 已支持解析 `spacing.card`(SPACING_TOKENS.card = 8),令牌化后审计仍能解析数值,不会把卡片静默跳过。
- 迁移后审计输出「令牌引用命中 954 处」且仍为 0 违规,证明令牌化后审计网未撕裂、仍在工作。
**验收**:tsc 0 · eslint 0 · check:spacing 0(196 卡片全 8px、令牌命中 954)· check:routes 0 · check:affordances 0 · check:icons 0 · check:backend-stubs 0 · 365 测试全绿(26 套件)。
**残留 / 待跟进**
- ① `AGENTS.md` 第 10 行仍写「边距间隔一致,为 8px」,现非卡片块间距为 12,措辞略偏——非阻断,待文档对齐(可改成「卡片间距 8px / 块间距 12px」)。(同 4.21 残留 ③,仍未动)
- ② 本次为机械令牌化,未逐屏核对视觉(行为不变,风险低);如需 100% 把握可补一次真机走查,但非必须。

Loading…
Cancel
Save