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

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

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

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

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

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

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

36
app/(tabs)/chat.tsx

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

34
app/(tabs)/growth.tsx

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

22
app/(tabs)/jobs.tsx

@ -23,7 +23,7 @@ import {
SALARY_RANGES, SALARY_RANGES,
} from '../../src/constants'; } from '../../src/constants';
import type { Job, SortType } from '../../src/types'; import type { Job, SortType } from '../../src/types';
import { colors, headerGradient, jobLevelTextColors } from '../../src/theme'; import { colors, headerGradient, jobLevelTextColors , spacing } from '../../src/theme';
/** 筛选项(下拉占位) */ /** 筛选项(下拉占位) */
const FILTERS = ['全部行业', '薪资', '经验', '更多筛选']; const FILTERS = ['全部行业', '薪资', '经验', '更多筛选'];
@ -416,7 +416,7 @@ const styles = StyleSheet.create({
nav: { nav: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingTop: 4, paddingTop: 4,
paddingBottom: 8, paddingBottom: 8,
}, },
@ -462,7 +462,7 @@ const styles = StyleSheet.create({
marginTop: 12, marginTop: 12,
}, },
filterContent: { filterContent: {
paddingHorizontal: 8, paddingHorizontal: spacing.card,
gap: 12, gap: 12,
}, },
filterChip: { filterChip: {
@ -484,7 +484,7 @@ const styles = StyleSheet.create({
marginLeft: 4, marginLeft: 4,
minWidth: 16, minWidth: 16,
height: 16, height: 16,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 4, paddingHorizontal: 4,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
@ -500,7 +500,7 @@ const styles = StyleSheet.create({
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
marginTop: 16, marginTop: 16,
marginBottom: 12, marginBottom: 12,
}, },
@ -530,7 +530,7 @@ const styles = StyleSheet.create({
compareBtn: { compareBtn: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 4, paddingVertical: 4,
borderRadius: 12, borderRadius: 12,
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
@ -562,7 +562,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
}, },
@ -575,13 +575,13 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
listContent: { listContent: {
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
cardPressed: { cardPressed: {
@ -695,7 +695,7 @@ const styles = StyleSheet.create({
}, },
optionChip: { optionChip: {
paddingHorizontal: 14, paddingHorizontal: 14,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.pageBg, backgroundColor: colors.pageBg,
borderWidth: 1, 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 { Avatar } from '../../components/onboarding/ui/Avatar';
import { isAvatarPreset } from '../../components/onboarding/assets'; import { isAvatarPreset } from '../../components/onboarding/assets';
import { useRole } from '../../src/context/RoleContext'; 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'; import type { Badge, DimensionScore, EnterpriseEntry, JobPreference, MenuItem, UserStats } from '../../src/types';
/* ===================== 展示层映射(全部使用主题令牌) ===================== */ /* ===================== 展示层映射(全部使用主题令牌) ===================== */
@ -398,7 +398,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
}, },
@ -409,7 +409,7 @@ const styles = StyleSheet.create({
}, },
/* ---- 顶部渐变头部 ---- */ /* ---- 顶部渐变头部 ---- */
headerGradient: { headerGradient: {
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingTop: 8, paddingTop: 8,
paddingBottom: 24, paddingBottom: 24,
borderBottomLeftRadius: 24, borderBottomLeftRadius: 24,
@ -466,7 +466,7 @@ const styles = StyleSheet.create({
paddingBottom: 24, paddingBottom: 24,
}, },
content: { content: {
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingTop: 16, paddingTop: 16,
}, },
/* ---- 综合评分卡片 ---- */ /* ---- 综合评分卡片 ---- */
@ -474,9 +474,9 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
}, },
scoreValue: { scoreValue: {
fontSize: 40, fontSize: 40,
@ -536,9 +536,9 @@ const styles = StyleSheet.create({
/* ---- 八大维度(横向评分条) ---- */ /* ---- 八大维度(横向评分条) ---- */
dimCard: { dimCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
}, },
dimRow: { dimRow: {
flexDirection: 'row', flexDirection: 'row',
@ -570,7 +570,7 @@ const styles = StyleSheet.create({
}, },
levelTag: { levelTag: {
marginLeft: 10, marginLeft: 10,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 2, paddingVertical: 2,
borderRadius: 10, borderRadius: 10,
}, },
@ -581,9 +581,9 @@ const styles = StyleSheet.create({
/* ---- 求职偏好 ---- */ /* ---- 求职偏好 ---- */
prefCard: { prefCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
}, },
prefRow: { prefRow: {
flexDirection: 'row', flexDirection: 'row',
@ -633,14 +633,14 @@ const styles = StyleSheet.create({
marginHorizontal: -8, marginHorizontal: -8,
}, },
hScrollContent: { hScrollContent: {
paddingHorizontal: 8, paddingHorizontal: spacing.card,
gap: 8, gap: 8,
}, },
badgeCard: { badgeCard: {
width: 140, width: 140,
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
}, },
badgeIcon: { badgeIcon: {
@ -697,8 +697,8 @@ const styles = StyleSheet.create({
statsCard: { statsCard: {
flexDirection: 'row', flexDirection: 'row',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
statItem: { statItem: {
@ -715,9 +715,9 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
enterpriseIconWrap: { enterpriseIconWrap: {
@ -735,8 +735,8 @@ const styles = StyleSheet.create({
/* ---- 功能菜单 ---- */ /* ---- 功能菜单 ---- */
menuCard: { menuCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
}, },
menuRow: { menuRow: {
flexDirection: 'row', flexDirection: 'row',
@ -751,7 +751,7 @@ const styles = StyleSheet.create({
menuIconWrap: { menuIconWrap: {
width: 32, width: 32,
height: 32, height: 32,
borderRadius: 8, borderRadius: spacing.card,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
marginRight: 12, marginRight: 12,

26
app/ability.tsx

@ -11,7 +11,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import Svg, { Circle, Line, Path, Text as SvgText } from 'react-native-svg'; import Svg, { Circle, Line, Path, Text as SvgText } from 'react-native-svg';
import { useAbilityAssessment } from '../src/hooks'; 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 { JOB_LEVEL_LABEL } from '../src/constants';
import type { AbilityDimension, AbilityTrendPoint, JobLevel } from '../src/types'; import type { AbilityDimension, AbilityTrendPoint, JobLevel } from '../src/types';
@ -277,12 +277,12 @@ const styles = StyleSheet.create({
}, },
headerBtn: { width: 40, alignItems: 'center' }, headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary }, headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 8, paddingBottom: 32 }, body: { padding: spacing.card, paddingBottom: 32 },
scoreCard: { scoreCard: {
flexDirection: 'row', flexDirection: 'row',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -299,8 +299,8 @@ const styles = StyleSheet.create({
section: { marginTop: 16 }, section: { marginTop: 16 },
emptyBox: { emptyBox: {
backgroundColor: colors.surface, backgroundColor: colors.surface,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
gap: 8, gap: 8,
}, },
@ -308,8 +308,8 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginBottom: 12 }, sectionTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginBottom: 12 },
dimCard: { dimCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -344,8 +344,8 @@ const styles = StyleSheet.create({
subItemScore: { width: 50, fontSize: 12, color: colors.textPrimary, textAlign: 'right' }, subItemScore: { width: 50, fontSize: 12, color: colors.textPrimary, textAlign: 'right' },
chartCard: { chartCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginTop: 8, marginTop: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -359,8 +359,8 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -370,6 +370,6 @@ const styles = StyleSheet.create({
improveDesc: { fontSize: 12, color: colors.textSecondary, marginTop: 2, lineHeight: 18 }, improveDesc: { fontSize: 12, color: colors.textSecondary, marginTop: 2, lineHeight: 18 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 }, center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary }, 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 }, 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' }, headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary }, 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 }, center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary }, tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { retryBtn: {
paddingHorizontal: 18, paddingHorizontal: 18,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 16, borderRadius: 16,
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
}, },
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText }, retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
noticeCard: { noticeCard: {
backgroundColor: colors.infoLight, backgroundColor: colors.infoLight,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.infoBorder, borderColor: colors.infoBorder,
@ -490,8 +490,8 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -513,7 +513,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
paddingHorizontal: 14, paddingHorizontal: 14,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.white, backgroundColor: colors.white,
borderWidth: 1, borderWidth: 1,
@ -526,9 +526,9 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -564,7 +564,7 @@ const styles = StyleSheet.create({
evidenceImage: { evidenceImage: {
width: 72, width: 72,
height: 72, height: 72,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.pageBg, backgroundColor: colors.pageBg,
}, },
evidenceRemove: { evidenceRemove: {
@ -580,8 +580,8 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, 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 { SafeAreaView } from 'react-native-safe-area-context';
import { useGrowthData } from '../../src/hooks'; import { useGrowthData } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView'; 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'; import { formatViews } from '../../src/utils';
type IconName = ComponentProps<typeof Ionicons>['name']; type IconName = ComponentProps<typeof Ionicons>['name'];
@ -81,7 +81,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -102,7 +102,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
thumb: { thumb: {
@ -129,9 +129,9 @@ const styles = StyleSheet.create({
fontSize: 11, fontSize: 11,
color: colors.primaryText, color: colors.primaryText,
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 2, paddingVertical: 2,
borderRadius: 8, borderRadius: spacing.card,
overflow: 'hidden', overflow: 'hidden',
marginRight: 10, marginRight: 10,
}, },

14
app/assessment.tsx

@ -10,7 +10,7 @@ import {
} from 'react-native'; } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useGrowthData } from '../src/hooks'; 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 { JOB_LEVEL_LABEL } from '../src/constants';
import type { JobLevel } from '../src/types'; import type { JobLevel } from '../src/types';
@ -166,14 +166,14 @@ const styles = StyleSheet.create({
}, },
headerBtn: { width: 40, alignItems: 'center' }, headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary }, headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 8, paddingBottom: 32 }, body: { padding: spacing.card, paddingBottom: 32 },
abilityCard: { abilityCard: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -190,8 +190,8 @@ const styles = StyleSheet.create({
entryCard: { entryCard: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
}, },
entryIcon: { entryIcon: {
width: 44, width: 44,
@ -205,6 +205,6 @@ const styles = StyleSheet.create({
entryDesc: { fontSize: 13, color: colors.textSecondary, marginTop: 2 }, entryDesc: { fontSize: 13, color: colors.textSecondary, marginTop: 2 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 }, center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary }, 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 }, 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 { SafeAreaView } from 'react-native-safe-area-context';
import Svg, { Line, Path, Rect, Text as SvgText } from 'react-native-svg'; import Svg, { Line, Path, Rect, Text as SvgText } from 'react-native-svg';
import { useAuditReport } from '../src/hooks'; import { useAuditReport } from '../src/hooks';
import { colors } from '../src/theme'; import { colors , spacing } from '../src/theme';
import type { AuditKPI, AuditTrendPoint, RiskDistributionItem } from '../src/types'; import type { AuditKPI, AuditTrendPoint, RiskDistributionItem } from '../src/types';
/* ===================== 子组件:顶部导航 ===================== */ /* ===================== 子组件:顶部导航 ===================== */
@ -253,19 +253,19 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
}, },
headerBtn: { width: 36, height: 36, alignItems: 'center', justifyContent: 'center' }, headerBtn: { width: 36, height: 36, alignItems: 'center', justifyContent: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary }, headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
scroll: { flex: 1 }, scroll: { flex: 1 },
content: { padding: 8 }, content: { padding: spacing.card },
center: { flex: 1, alignItems: 'center', justifyContent: 'center' }, center: { flex: 1, alignItems: 'center', justifyContent: 'center' },
tip: { fontSize: 14, color: colors.textSecondary }, tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { retryBtn: {
marginTop: 12, marginTop: 12,
paddingHorizontal: 18, paddingHorizontal: 18,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 16, borderRadius: 16,
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
}, },
@ -274,8 +274,8 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.success, backgroundColor: colors.success,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
}, },
gradeCircle: { gradeCircle: {
width: 72, width: 72,
@ -307,8 +307,8 @@ const styles = StyleSheet.create({
kpiCard: { kpiCard: {
width: '48%', width: '48%',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
kpiIconWrap: { kpiIconWrap: {
@ -326,8 +326,8 @@ const styles = StyleSheet.create({
kpiChange: { fontSize: 12, fontWeight: '600', marginLeft: 3 }, kpiChange: { fontSize: 12, fontWeight: '600', marginLeft: 3 },
chartCard: { chartCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
}, },
chartGap: { height: 12 }, chartGap: { height: 12 },
chartHeader: { chartHeader: {

30
app/candidate-detail.tsx

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

24
app/chat/[id].tsx

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

24
app/enterprise-certification.tsx

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

16
app/game.tsx

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

34
app/game/level.tsx

@ -12,7 +12,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useMemo, useState } from 'react'; import { useMemo, useState } from 'react';
import { useGameData } from '../../src/hooks'; import { useGameData } from '../../src/hooks';
import { colors } from '../../src/theme'; import { colors , spacing } from '../../src/theme';
import type { GameAnswer, GameQuestion } from '../../src/types'; import type { GameAnswer, GameQuestion } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */ /* ===================== 子组件:顶部导航 ===================== */
@ -262,7 +262,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -283,7 +283,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
levelDesc: { levelDesc: {
@ -291,14 +291,14 @@ const styles = StyleSheet.create({
lineHeight: 20, lineHeight: 20,
color: colors.textSecondary, color: colors.textSecondary,
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
questionCard: { questionCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
questionIndex: { questionIndex: {
@ -321,9 +321,9 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
backgroundColor: colors.white, backgroundColor: colors.white,
@ -368,8 +368,8 @@ const styles = StyleSheet.create({
}, },
explanation: { explanation: {
marginTop: 8, marginTop: 8,
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.infoLight, backgroundColor: colors.infoLight,
}, },
explanationLabel: { explanationLabel: {
@ -386,8 +386,8 @@ const styles = StyleSheet.create({
resultCard: { resultCard: {
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
resultTitle: { resultTitle: {
@ -406,7 +406,7 @@ const styles = StyleSheet.create({
submitBtn: { submitBtn: {
marginTop: 8, marginTop: 8,
height: 48, height: 48,
borderRadius: 8, borderRadius: spacing.card,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
@ -422,7 +422,7 @@ const styles = StyleSheet.create({
nextBtn: { nextBtn: {
marginTop: 8, marginTop: 8,
height: 48, height: 48,
borderRadius: 8, borderRadius: spacing.card,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
backgroundColor: colors.successBtn, backgroundColor: colors.successBtn,
@ -445,7 +445,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, 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 { useHistory } from '../src/hooks';
import { JobCard } from '../src/components/JobCard'; import { JobCard } from '../src/components/JobCard';
import { LoadingState, ErrorState, EmptyState } from '../src/components/StateView'; 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -79,7 +79,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingTop: 12, paddingTop: 12,
paddingBottom: 24, 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 { useHollandAssessment } from '../src/hooks';
import { buildHollandReportText } from '../src/api'; import { buildHollandReportText } from '../src/api';
import { shareText } from '../src/lib/shareFile'; 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'; import type { HollandAction, HollandDimension, HollandTypeAnalysis } from '../src/types';
const RADAR_SIZE = 160; const RADAR_SIZE = 160;
@ -310,10 +310,10 @@ const styles = StyleSheet.create({
}, },
headerBtn: { width: 40, alignItems: 'center' }, headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary }, headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 8, paddingBottom: 32 }, body: { padding: spacing.card, paddingBottom: 32 },
heroCard: { heroCard: {
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
marginBottom: 8, marginBottom: 8,
@ -327,8 +327,8 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginBottom: 12 }, sectionTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginBottom: 12 },
typeCard: { typeCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -356,8 +356,8 @@ const styles = StyleSheet.create({
careerTagText: { fontSize: 12, color: colors.primaryText }, careerTagText: { fontSize: 12, color: colors.primaryText },
jobCard: { jobCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -368,15 +368,15 @@ const styles = StyleSheet.create({
matchTag: { matchTag: {
backgroundColor: colors.successLight, backgroundColor: colors.successLight,
borderRadius: 10, borderRadius: 10,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 2, paddingVertical: 2,
}, },
matchText: { fontSize: 11, color: colors.successText, fontWeight: '600' }, matchText: { fontSize: 11, color: colors.successText, fontWeight: '600' },
jobTags: { flexDirection: 'row', gap: 8, marginTop: 10 }, jobTags: { flexDirection: 'row', gap: 8, marginTop: 10 },
tag: { tag: {
backgroundColor: colors.pageBg, backgroundColor: colors.pageBg,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 2, paddingVertical: 2,
}, },
tagText: { fontSize: 11, color: colors.textSecondary }, tagText: { fontSize: 11, color: colors.textSecondary },
@ -385,8 +385,8 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -396,6 +396,6 @@ const styles = StyleSheet.create({
actionDesc: { fontSize: 12, color: colors.textSecondary, marginTop: 2 }, actionDesc: { fontSize: 12, color: colors.textSecondary, marginTop: 2 },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 }, center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary }, 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 }, 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' }, headerBtn: { width: 50, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary }, headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
headerRecord: { fontSize: 14, color: colors.primary, fontWeight: '500' }, 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 }, center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary }, 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 }, retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
heroCard: { heroCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
marginBottom: 8, marginBottom: 8,
}, },
@ -228,8 +228,8 @@ const styles = StyleSheet.create({
dimItem: { dimItem: {
width: '30.8%', width: '30.8%',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
}, },
dimBadge: { dimBadge: {
@ -264,8 +264,8 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
}, },
featureIcon: { featureIcon: {
width: 44, width: 44,
@ -292,8 +292,8 @@ const styles = StyleSheet.create({
}, },
advantageCard: { advantageCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
}, },
advantageTitle: { advantageTitle: {
fontSize: 15, fontSize: 15,

20
app/holland/question.tsx

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

32
app/hr-evaluation.tsx

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

28
app/interview-score.tsx

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

20
app/interview.tsx

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

40
app/job-evaluations.tsx

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

6
app/job-preference.tsx

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

8
app/job-publish.tsx

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

16
app/jobs/[id].tsx

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

16
app/jobs/compare.tsx

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

24
app/jobs/offer-compare.tsx

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

24
app/jobs/rank.tsx

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

18
app/jobs/weight-settings.tsx

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

40
app/legal.tsx

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

16
app/legal/chat.tsx

@ -14,7 +14,7 @@ import {
} from 'react-native'; } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData } from '../../src/hooks'; import { useLegalData } from '../../src/hooks';
import { colors } from '../../src/theme'; import { colors , spacing } from '../../src/theme';
import type { LegalMessage } from '../../src/types'; import type { LegalMessage } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */ /* ===================== 子组件:顶部导航 ===================== */
@ -151,7 +151,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -172,7 +172,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
scrollContent: { scrollContent: {
padding: 8, padding: spacing.card,
paddingBottom: 16, paddingBottom: 16,
}, },
tipCard: { tipCard: {
@ -180,8 +180,8 @@ const styles = StyleSheet.create({
alignItems: 'center', alignItems: 'center',
gap: 8, gap: 8,
backgroundColor: colors.infoLight, backgroundColor: colors.infoLight,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
tipText: { tipText: {
@ -243,7 +243,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
gap: 8, gap: 8,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 10, paddingVertical: 10,
backgroundColor: colors.white, backgroundColor: colors.white,
borderTopWidth: 1, borderTopWidth: 1,
@ -257,7 +257,7 @@ const styles = StyleSheet.create({
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
paddingHorizontal: 14, paddingHorizontal: 14,
paddingVertical: 8, paddingVertical: spacing.card,
fontSize: 14, fontSize: 14,
color: colors.textPrimary, color: colors.textPrimary,
backgroundColor: colors.pageBg, backgroundColor: colors.pageBg,
@ -286,7 +286,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, 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 { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData, useLegalMembership } from '../../src/hooks'; import { useLegalData, useLegalMembership } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView'; 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'; import type { LegalPaymentChannel } from '../../src/types';
/* ===================== 付款方式 ===================== */ /* ===================== 付款方式 ===================== */
@ -198,7 +198,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -219,12 +219,12 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
summaryCard: { summaryCard: {
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
@ -280,8 +280,8 @@ const styles = StyleSheet.create({
channelRow: { channelRow: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
@ -353,7 +353,7 @@ const styles = StyleSheet.create({
}, },
payBtn: { payBtn: {
height: 48, height: 48,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
alignItems: 'center', alignItems: 'center',
justifyContent: '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 { useState } from 'react';
import { useLegalData } from '../../src/hooks'; import { useLegalData } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView'; 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'; import type { LegalFAQ } from '../../src/types';
/* ===================== 顶部导航 ===================== */ /* ===================== 顶部导航 ===================== */
@ -82,7 +82,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -103,13 +103,13 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
faqCard: { faqCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
}, },
faqItem: { faqItem: {
paddingVertical: 12, paddingVertical: 12,

28
app/legal/service.tsx

@ -14,7 +14,7 @@ import {
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData, useLegalMembership, useLegalServiceRequests } from '../../src/hooks'; import { useLegalData, useLegalMembership, useLegalServiceRequests } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView'; 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -254,12 +254,12 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
card: { card: {
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
@ -310,7 +310,7 @@ const styles = StyleSheet.create({
input: { input: {
minHeight: 120, minHeight: 120,
padding: 12, padding: 12,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
@ -327,7 +327,7 @@ const styles = StyleSheet.create({
submitBtn: { submitBtn: {
marginTop: 16, marginTop: 16,
height: 48, height: 48,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
@ -347,8 +347,8 @@ const styles = StyleSheet.create({
marginTop: 16, marginTop: 16,
}, },
emptyCard: { emptyCard: {
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
alignItems: 'center', alignItems: 'center',
}, },
@ -357,8 +357,8 @@ const styles = StyleSheet.create({
color: colors.textSecondary, color: colors.textSecondary,
}, },
errorCard: { errorCard: {
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.dangerLight, backgroundColor: colors.dangerLight,
borderWidth: 1, borderWidth: 1,
borderColor: colors.dangerBorder, borderColor: colors.dangerBorder,
@ -378,8 +378,8 @@ const styles = StyleSheet.create({
gap: 8, gap: 8,
}, },
requestCard: { requestCard: {
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
@ -397,7 +397,7 @@ const styles = StyleSheet.create({
marginRight: 8, marginRight: 8,
}, },
statusTag: { statusTag: {
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 2, paddingVertical: 2,
borderRadius: 4, borderRadius: 4,
backgroundColor: colors.primaryLight, 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 { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData } from '../../src/hooks'; import { useLegalData } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView'; 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -99,14 +99,14 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
headCard: { headCard: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
marginBottom: 8, marginBottom: 8,
}, },
@ -125,8 +125,8 @@ const styles = StyleSheet.create({
color: colors.textSecondary, color: colors.textSecondary,
}, },
contentCard: { contentCard: {
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, 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 { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData } from '../../src/hooks'; import { useLegalData } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView'; 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'; import type { LegalTemplate } from '../../src/types';
/* ===================== 顶部导航 ===================== */ /* ===================== 顶部导航 ===================== */
@ -81,7 +81,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -102,7 +102,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
templateGrid: { templateGrid: {
@ -111,8 +111,8 @@ const styles = StyleSheet.create({
templateCard: { templateCard: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
}, },
templateBody: { 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 { SafeAreaView } from 'react-native-safe-area-context';
import { useLegalData, useLegalMembership } from '../../src/hooks'; import { useLegalData, useLegalMembership } from '../../src/hooks';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView'; 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'; import type { LegalPlan } from '../../src/types';
/* ===================== 顶部导航 ===================== */ /* ===================== 顶部导航 ===================== */
@ -126,7 +126,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -147,7 +147,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
tip: { tip: {
@ -159,8 +159,8 @@ const styles = StyleSheet.create({
gap: 8, gap: 8,
}, },
planCard: { planCard: {
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
@ -184,9 +184,9 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
gap: 6, gap: 6,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.actionLight, backgroundColor: colors.actionLight,
borderWidth: 1, borderWidth: 1,
borderColor: colors.action, borderColor: colors.action,

20
app/onboarding.tsx

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

18
app/operation-rules.tsx

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

22
app/personal-data-export.tsx

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

32
app/progress.tsx

@ -12,7 +12,7 @@ import {
} from 'react-native'; } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useJobProgress } from '../src/hooks'; 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'; import type { JobProgressCompany, JobProgressStage } from '../src/types';
const TABS: { key: 'all' | JobProgressStage; label: string }[] = [ const TABS: { key: 'all' | JobProgressStage; label: string }[] = [
@ -344,7 +344,7 @@ const styles = StyleSheet.create({
}, },
headerBtn: { width: 40, alignItems: 'center' }, headerBtn: { width: 40, alignItems: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary }, headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 8, paddingBottom: 32 }, body: { padding: spacing.card, paddingBottom: 32 },
viewAllBtn: { viewAllBtn: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
@ -359,8 +359,8 @@ const styles = StyleSheet.create({
marginRight: 2, marginRight: 2,
}, },
statsCard: { statsCard: {
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
statsRow: { flexDirection: 'row', justifyContent: 'space-between' }, statsRow: { flexDirection: 'row', justifyContent: 'space-between' },
@ -371,8 +371,8 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.actionBorder, borderColor: colors.actionBorder,
@ -396,8 +396,8 @@ const styles = StyleSheet.create({
tabTextActive: { color: colors.white, fontWeight: '600' }, tabTextActive: { color: colors.white, fontWeight: '600' },
emptyBox: { emptyBox: {
backgroundColor: colors.surface, backgroundColor: colors.surface,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
gap: 8, gap: 8,
}, },
@ -413,8 +413,8 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary }, sectionTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary },
companyCard: { companyCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -448,8 +448,8 @@ const styles = StyleSheet.create({
nextAction: { fontSize: 12, color: colors.textSecondary }, nextAction: { fontSize: 12, color: colors.textSecondary },
offerCard: { offerCard: {
backgroundColor: colors.successLight, backgroundColor: colors.successLight,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.successBorder, borderColor: colors.successBorder,
@ -459,7 +459,7 @@ const styles = StyleSheet.create({
offerTag: { offerTag: {
backgroundColor: colors.success, backgroundColor: colors.success,
borderRadius: 10, borderRadius: 10,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 2, paddingVertical: 2,
}, },
offerTagText: { fontSize: 11, fontWeight: '700', color: colors.white }, offerTagText: { fontSize: 11, fontWeight: '700', color: colors.white },
@ -469,8 +469,8 @@ const styles = StyleSheet.create({
offerDeadline: { fontSize: 12, color: colors.actionText, marginLeft: 4 }, offerDeadline: { fontSize: 12, color: colors.actionText, marginLeft: 4 },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginTop: 8, marginTop: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -493,6 +493,6 @@ const styles = StyleSheet.create({
barValue: { width: 20, fontSize: 11, color: colors.textSecondary, textAlign: 'right' }, barValue: { width: 20, fontSize: 11, color: colors.textSecondary, textAlign: 'right' },
center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 }, center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary }, 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 }, 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 }, headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
headerActions: { flexDirection: 'row', gap: 4 }, headerActions: { flexDirection: 'row', gap: 4 },
headerActionBtn: { width: 36, alignItems: 'center' }, 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 }, center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary }, 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 }, retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
}, },
scoreCard: { scoreCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -926,7 +926,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
borderRadius: 16, borderRadius: 16,
paddingHorizontal: 18, paddingHorizontal: 18,
paddingVertical: 8, paddingVertical: spacing.card,
}, },
optimizeBtnDisabled: { backgroundColor: colors.textDisabled }, optimizeBtnDisabled: { backgroundColor: colors.textDisabled },
optimizeBtnText: { fontSize: 14, fontWeight: '700', color: colors.white }, optimizeBtnText: { fontSize: 14, fontWeight: '700', color: colors.white },
@ -986,7 +986,7 @@ const styles = StyleSheet.create({
alignSelf: 'flex-start', alignSelf: 'flex-start',
backgroundColor: colors.successLight, backgroundColor: colors.successLight,
borderRadius: 10, borderRadius: 10,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 2, paddingVertical: 2,
}, },
intentionTagText: { fontSize: 12, color: colors.successText, fontWeight: '600' }, intentionTagText: { fontSize: 12, color: colors.successText, fontWeight: '600' },
@ -1014,9 +1014,9 @@ const styles = StyleSheet.create({
alignItems: 'center', alignItems: 'center',
marginTop: 8, marginTop: 8,
backgroundColor: colors.infoLight, backgroundColor: colors.infoLight,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
}, },
aiTipText: { flex: 1, fontSize: 12, color: colors.infoText, marginLeft: 6 }, aiTipText: { flex: 1, fontSize: 12, color: colors.infoText, marginLeft: 6 },
aiOptimizeMiniBtn: { aiOptimizeMiniBtn: {
@ -1033,7 +1033,7 @@ const styles = StyleSheet.create({
marginTop: 8, marginTop: 8,
backgroundColor: colors.successLight, backgroundColor: colors.successLight,
borderRadius: 10, borderRadius: 10,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 2, paddingVertical: 2,
}, },
optimizedText: { fontSize: 12, color: colors.successText, marginLeft: 4 }, 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 { PrimaryButton } from '../../components/onboarding/ui/PrimaryButton';
import { CenterState, EditHeader, Field, FormNote, PageFooter } from '../../components/resume/EditKit'; import { CenterState, EditHeader, Field, FormNote, PageFooter } from '../../components/resume/EditKit';
import { useResume } from '../../src/hooks'; import { useResume } from '../../src/hooks';
import { colors } from '../../src/theme'; import { colors , spacing } from '../../src/theme';
import { isValidEmail, isValidPhone } from '../../src/utils'; import { isValidEmail, isValidPhone } from '../../src/utils';
/** /**
@ -131,6 +131,6 @@ interface BasicForm {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: colors.pageBg }, 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 }, formError: { fontSize: 13, color: colors.dangerText, marginBottom: 8 },
}); });

8
app/resume/education.tsx

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

8
app/resume/experience.tsx

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

22
app/resume/export.tsx

@ -622,15 +622,15 @@ const styles = StyleSheet.create({
headerBtn: { width: 60, justifyContent: 'center' }, headerBtn: { width: 60, justifyContent: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary }, headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
headerSave: { fontSize: 14, color: colors.primary, textAlign: 'right' }, 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 }, center: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: 40, gap: 12 },
tip: { fontSize: 14, color: colors.textSecondary }, 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 }, retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
previewCard: { previewCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
@ -661,8 +661,8 @@ const styles = StyleSheet.create({
formatCard: { formatCard: {
flex: 1, flex: 1,
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -678,8 +678,8 @@ const styles = StyleSheet.create({
templateCard: { templateCard: {
flex: 1, flex: 1,
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -688,7 +688,7 @@ const styles = StyleSheet.create({
templateThumb: { templateThumb: {
width: '100%', width: '100%',
height: 80, height: 80,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.primary, backgroundColor: colors.primary,
padding: 12, padding: 12,
marginBottom: 8, marginBottom: 8,
@ -700,8 +700,8 @@ const styles = StyleSheet.create({
templateNameActive: { color: colors.primaryText, fontWeight: '700' }, templateNameActive: { color: colors.primaryText, fontWeight: '700' },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, 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 { CenterState, EditHeader, PageFooter } from '../../components/resume/EditKit';
import { useResume } from '../../src/hooks'; import { useResume } from '../../src/hooks';
import { UNSET_LABEL } from '../../src/constants'; 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'; import type { Resume, ResumeEducation, ResumeExperience, ResumeProject } from '../../src/types';
/** /**
@ -198,10 +198,10 @@ function hasIntention(intention: Resume['jobIntention']): boolean {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
container: { flex: 1, backgroundColor: colors.pageBg }, container: { flex: 1, backgroundColor: colors.pageBg },
body: { padding: 8, paddingBottom: 24 }, body: { padding: spacing.card, paddingBottom: 24 },
paper: { paper: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 20, padding: 20,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,

8
app/resume/project.tsx

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

14
app/settings.tsx

@ -2,7 +2,7 @@ import { Ionicons } from '@expo/vector-icons';
import { useRouter } from 'expo-router'; import { useRouter } from 'expo-router';
import { Alert, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native'; import { Alert, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; 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 { useAppCache } from '../src/hooks';
import { formatBytes } from '../src/utils'; import { formatBytes } from '../src/utils';
import { useAuth } from '../src/context/AuthContext'; import { useAuth } from '../src/context/AuthContext';
@ -240,7 +240,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
}, },
headerBtn: { headerBtn: {
width: 36, width: 36,
@ -261,7 +261,7 @@ const styles = StyleSheet.create({
}, },
group: { group: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
}, },
groupTitle: { groupTitle: {
marginBottom: 8, marginBottom: 8,
@ -271,8 +271,8 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.surface, backgroundColor: colors.surface,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
}, },
row: { row: {
flexDirection: 'row', flexDirection: 'row',
@ -287,7 +287,7 @@ const styles = StyleSheet.create({
iconWrap: { iconWrap: {
width: 32, width: 32,
height: 32, height: 32,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
@ -308,7 +308,7 @@ const styles = StyleSheet.create({
marginTop: 24, marginTop: 24,
marginHorizontal: 8, marginHorizontal: 8,
backgroundColor: colors.surface, backgroundColor: colors.surface,
borderRadius: 8, borderRadius: spacing.card,
paddingVertical: 14, paddingVertical: 14,
alignItems: 'center', 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 { ActivityIndicator, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useAboutInfo } from '../../src/hooks'; 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -145,14 +145,14 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
brandCard: { brandCard: {
alignItems: 'center', alignItems: 'center',
paddingVertical: 8, paddingVertical: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
brandLogo: { brandLogo: {
@ -176,9 +176,9 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
cardTitle: { cardTitle: {
@ -251,7 +251,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
}, },

14
app/settings/account-cancel.tsx

@ -11,7 +11,7 @@ import {
} from 'react-native'; } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useAccountCancel } from '../../src/hooks'; 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -203,7 +203,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
stateBox: { stateBox: {
@ -222,7 +222,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
}, },
@ -235,8 +235,8 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
gap: 8, gap: 8,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
warnText: { warnText: {
@ -256,7 +256,7 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
overflow: 'hidden', overflow: 'hidden',
}, },
bulletRow: { 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 { ActivityIndicator, Pressable, ScrollView, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useAccountSecurity } from '../../src/hooks'; 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -125,7 +125,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
tip: { tip: {
@ -137,8 +137,8 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
}, },
row: { row: {
flexDirection: 'row', flexDirection: 'row',
@ -188,7 +188,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
}, },

20
app/settings/delete-data.tsx

@ -12,7 +12,7 @@ import {
} from 'react-native'; } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useDeleteAllData } from '../../src/hooks'; 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -222,7 +222,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
stateBox: { stateBox: {
@ -241,7 +241,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
}, },
@ -252,8 +252,8 @@ const styles = StyleSheet.create({
}, },
introCard: { introCard: {
backgroundColor: colors.infoLight, backgroundColor: colors.infoLight,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
introText: { introText: {
@ -272,9 +272,9 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
overflow: 'hidden', overflow: 'hidden',
padding: 8, padding: spacing.card,
}, },
row: { row: {
flexDirection: 'row', flexDirection: 'row',
@ -319,8 +319,8 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'flex-start', alignItems: 'flex-start',
gap: 8, gap: 8,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
warnText: { 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 { ActivityIndicator, Pressable, ScrollView, StyleSheet, Switch, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context'; import { SafeAreaView } from 'react-native-safe-area-context';
import { useNotificationSettings } from '../../src/hooks'; 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -111,7 +111,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
tip: { tip: {
@ -123,8 +123,8 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
}, },
row: { row: {
flexDirection: 'row', flexDirection: 'row',
@ -165,7 +165,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, 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 { useChangePassword } from '../../src/hooks';
import { useAuth } from '../../src/context/AuthContext'; import { useAuth } from '../../src/context/AuthContext';
import { PasswordField } from '../../src/components/PasswordField'; 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -155,7 +155,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 24, paddingBottom: 24,
}, },
tip: { tip: {
@ -167,9 +167,9 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
}, },
gap: { gap: {
height: 6, height: 6,

16
app/settings/privacy.tsx

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

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

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

20
app/settings/privacy/dnd.tsx

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

18
app/settings/privacy/keywords.tsx

@ -185,7 +185,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -208,7 +208,7 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 16, paddingBottom: 16,
}, },
stateBox: { stateBox: {
@ -225,7 +225,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, backgroundColor: colors.primaryBtn,
}, },
@ -235,8 +235,8 @@ const styles = StyleSheet.create({
color: colors.white, color: colors.white,
}, },
statCard: { statCard: {
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
marginBottom: 8, marginBottom: 8,
}, },
@ -251,8 +251,8 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
}, },
cardTitle: { cardTitle: {
@ -309,8 +309,8 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'flex-start', alignItems: 'flex-start',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
gap: 8, gap: 8,
}, },
noteText: { 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 { SafeAreaView } from 'react-native-safe-area-context';
import { EmptyState, ErrorState, LoadingState } from '../../src/components/StateView'; import { EmptyState, ErrorState, LoadingState } from '../../src/components/StateView';
import { useQualifications } from '../../src/hooks'; import { useQualifications } from '../../src/hooks';
import { colors } from '../../src/theme'; import { colors , spacing } from '../../src/theme';
import type { QualificationLicense } from '../../src/types'; import type { QualificationLicense } from '../../src/types';
/* ===================== 子组件:顶部导航 ===================== */ /* ===================== 子组件:顶部导航 ===================== */
@ -127,7 +127,7 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
height: 48, height: 48,
backgroundColor: colors.white, backgroundColor: colors.white,
borderBottomWidth: 1, borderBottomWidth: 1,
@ -148,16 +148,16 @@ const styles = StyleSheet.create({
flex: 1, flex: 1,
}, },
content: { content: {
padding: 8, padding: spacing.card,
paddingBottom: 32, paddingBottom: 32,
gap: 8, gap: 8,
}, },
companyCard: { companyCard: {
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
borderRadius: 8, borderRadius: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.primaryBorder, borderColor: colors.primaryBorder,
padding: 8, padding: spacing.card,
}, },
companyLabel: { companyLabel: {
fontSize: 12, fontSize: 12,
@ -179,10 +179,10 @@ const styles = StyleSheet.create({
}, },
card: { card: {
backgroundColor: colors.surface, backgroundColor: colors.surface,
borderRadius: 8, borderRadius: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
padding: 8, padding: spacing.card,
}, },
cardHeader: { cardHeader: {
flexDirection: 'row', flexDirection: 'row',
@ -198,21 +198,21 @@ const styles = StyleSheet.create({
marginTop: 8, marginTop: 8,
width: '100%', width: '100%',
height: 180, height: 180,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.pageBg, backgroundColor: colors.pageBg,
}, },
/* 图片占位:用「提醒卡片底 + 弱警示描边」语义色,一眼看出「这里是待办」 */ /* 图片占位:用「提醒卡片底 + 弱警示描边」语义色,一眼看出「这里是待办」 */
imagePlaceholder: { imagePlaceholder: {
marginTop: 8, marginTop: 8,
height: 132, height: 132,
borderRadius: 8, borderRadius: spacing.card,
borderWidth: 1, borderWidth: 1,
borderStyle: 'dashed', borderStyle: 'dashed',
borderColor: colors.actionBorder, borderColor: colors.actionBorder,
backgroundColor: colors.actionLight, backgroundColor: colors.actionLight,
alignItems: 'center', alignItems: 'center',
justifyContent: 'center', justifyContent: 'center',
paddingHorizontal: 8, paddingHorizontal: spacing.card,
gap: 8, gap: 8,
}, },
placeholderText: { 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 { useSalaryCalculator, useSalaryRecords, useSalaryToolLinks } from '../../src/hooks';
import { clampSocialBase } from '../../src/api'; import { clampSocialBase } from '../../src/api';
import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView'; import { LoadingState, ErrorState, EmptyState } from '../../src/components/StateView';
import { colors, headerGradientShort } from '../../src/theme'; import { colors, headerGradientShort , spacing } from '../../src/theme';
import { import {
CITIES, CITIES,
DEFAULT_SOCIAL_PROFILE, DEFAULT_SOCIAL_PROFILE,
@ -569,11 +569,11 @@ const styles = StyleSheet.create({
headerBtn: { width: 60, justifyContent: 'center' }, headerBtn: { width: 60, justifyContent: 'center' },
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary }, headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
headerAction: { fontSize: 14, color: colors.primary, textAlign: 'right' }, headerAction: { fontSize: 14, color: colors.primary, textAlign: 'right' },
body: { padding: 8, paddingBottom: 32 }, body: { padding: spacing.card, paddingBottom: 32 },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -594,7 +594,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.pageBg, backgroundColor: colors.pageBg,
borderRadius: 10, borderRadius: 10,
paddingHorizontal: 12, paddingHorizontal: 12,
paddingVertical: 8, paddingVertical: spacing.card,
}, },
input: { input: {
minWidth: 80, minWidth: 80,
@ -607,8 +607,8 @@ const styles = StyleSheet.create({
selectBox: { flexDirection: 'row', alignItems: 'center' }, selectBox: { flexDirection: 'row', alignItems: 'center' },
selectValue: { fontSize: 15, fontWeight: '600', color: colors.textPrimary, marginRight: 4 }, selectValue: { fontSize: 15, fontWeight: '600', color: colors.textPrimary, marginRight: 4 },
resultCard: { resultCard: {
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
alignItems: 'center', alignItems: 'center',
marginBottom: 8, marginBottom: 8,
}, },
@ -637,15 +637,15 @@ const styles = StyleSheet.create({
taxItem: { taxItem: {
flex: 1, flex: 1,
backgroundColor: colors.pageBg, backgroundColor: colors.pageBg,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
}, },
taxItemLabel: { fontSize: 12, color: colors.textSecondary, marginBottom: 6 }, taxItemLabel: { fontSize: 12, color: colors.textSecondary, marginBottom: 6 },
taxItemValue: { fontSize: 18, fontWeight: '800', color: colors.textPrimary }, taxItemValue: { fontSize: 18, fontWeight: '800', color: colors.textPrimary },
taxRow: { taxRow: {
flexDirection: 'row', flexDirection: 'row',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingVertical: 8, paddingVertical: spacing.card,
}, },
taxRowLabel: { fontSize: 14, color: colors.textPrimary }, taxRowLabel: { fontSize: 14, color: colors.textPrimary },
taxRowValue: { fontSize: 15, fontWeight: '700', 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', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
backgroundColor: colors.pageBg, backgroundColor: colors.pageBg,
borderRadius: 8, borderRadius: spacing.card,
paddingHorizontal: 10, paddingHorizontal: 10,
paddingVertical: 5, paddingVertical: 5,
}, },
@ -564,13 +564,13 @@ const styles = StyleSheet.create({
categoryTabActive: { backgroundColor: colors.primaryLight, borderColor: colors.primary }, categoryTabActive: { backgroundColor: colors.primaryLight, borderColor: colors.primary },
categoryText: { fontSize: 12, color: colors.textSecondary }, categoryText: { fontSize: 12, color: colors.textSecondary },
categoryTextActive: { color: colors.primaryText, fontWeight: '600' }, 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 }, sectionTitle: { fontSize: 15, fontWeight: '700', color: colors.textPrimary, marginBottom: 10 },
cloudCard: { cloudCard: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
paddingVertical: 8, paddingVertical: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
}, },
@ -579,8 +579,8 @@ const styles = StyleSheet.create({
card: { card: {
marginTop: 8, marginTop: 8,
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
}, },
@ -588,7 +588,7 @@ const styles = StyleSheet.create({
skillRow: { skillRow: {
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
paddingVertical: 8, paddingVertical: spacing.card,
borderTopWidth: 1, borderTopWidth: 1,
borderTopColor: colors.borderLight, borderTopColor: colors.borderLight,
}, },
@ -623,8 +623,8 @@ const styles = StyleSheet.create({
matchCard: { matchCard: {
marginTop: 8, marginTop: 8,
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
}, },
@ -663,16 +663,16 @@ const styles = StyleSheet.create({
backgroundColor: colors.pageBg, backgroundColor: colors.pageBg,
borderRadius: 10, borderRadius: 10,
paddingHorizontal: 12, paddingHorizontal: 12,
paddingVertical: 8, paddingVertical: spacing.card,
fontSize: 14, fontSize: 14,
color: colors.textPrimary, color: colors.textPrimary,
}, },
searchEmpty: { searchEmpty: {
alignItems: 'center', alignItems: 'center',
gap: 10, gap: 10,
padding: 8, padding: spacing.card,
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
}, },
@ -698,8 +698,8 @@ const styles = StyleSheet.create({
modalBody: { paddingHorizontal: spacing.framework, paddingBottom: 12 }, modalBody: { paddingHorizontal: spacing.framework, paddingBottom: 12 },
pathSummary: { pathSummary: {
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginTop: 8, marginTop: 8,
marginBottom: 8, marginBottom: 8,
}, },
@ -728,8 +728,8 @@ const styles = StyleSheet.create({
detailCard: { detailCard: {
marginTop: 8, marginTop: 8,
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.successBorder, borderColor: colors.successBorder,
}, },
@ -757,7 +757,7 @@ const styles = StyleSheet.create({
tip: { fontSize: 14, color: colors.textSecondary }, tip: { fontSize: 14, color: colors.textSecondary },
retryBtn: { retryBtn: {
paddingHorizontal: 18, paddingHorizontal: 18,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 16, borderRadius: 16,
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
}, },

2
components/onboarding/screens/B1Wechat.tsx

@ -32,7 +32,7 @@ export function B1Wechat() {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
center: { flex: 1, alignItems: 'center', justifyContent: 'center', gap: spacing.block, paddingBottom: 40 }, 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 }, previewText: { gap: 4 },
nick: { fontSize: 15, fontWeight: '700', color: colors.textPrimary }, nick: { fontSize: 15, fontWeight: '700', color: colors.textPrimary },
tip: { fontSize: 12, color: colors.textHint }, tip: { fontSize: 12, color: colors.textHint },

6
components/onboarding/screens/P12Company.tsx

@ -1,5 +1,5 @@
import { StyleSheet, Text, View } from 'react-native'; import { StyleSheet, Text, View } from 'react-native';
import { colors } from '../../../src/theme'; import { colors , spacing } from '../../../src/theme';
import { useOnboarding } from '../../../src/hooks'; import { useOnboarding } from '../../../src/hooks';
import { ScreenShell } from '../ui/ScreenShell'; import { ScreenShell } from '../ui/ScreenShell';
import { SearchInput } from '../ui/SearchInput'; import { SearchInput } from '../ui/SearchInput';
@ -34,8 +34,8 @@ export function P12Company() {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
notice: { notice: {
marginTop: 8, marginTop: 8,
padding: 8, padding: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
}, },
noticeText: { fontSize: 12, color: colors.primaryText, lineHeight: 18 }, 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' }, swapText: { fontSize: 13, color: colors.primary, fontWeight: '600' },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
gap: spacing.block, gap: spacing.block,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,

2
components/onboarding/screens/P1Login.tsx

@ -76,7 +76,7 @@ export function P1Login() {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
screen: { flex: 1, backgroundColor: colors.pageBg }, screen: { flex: 1, backgroundColor: colors.pageBg },
topGlow: { position: 'absolute', top: 0, left: 0, right: 0, height: 200 }, 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%' }, brandArea: { alignItems: 'center', marginTop: '22%' },
flexSpacer: { flex: 1, minHeight: 28 }, flexSpacer: { flex: 1, minHeight: 28 },
quickBtn: { quickBtn: {

2
components/onboarding/screens/P2WechatCode.tsx

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

2
components/onboarding/screens/P3Identity.tsx

@ -70,7 +70,7 @@ export function P3Identity() {
const styles = StyleSheet.create({ const styles = StyleSheet.create({
heading: { fontSize: 22, fontWeight: '800', color: colors.textPrimary, textAlign: 'center', marginVertical: 16 }, 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 }, cardTop: { marginBottom: 16 },
cardBtn: { cardBtn: {
width: '100%', width: '100%',

2
components/onboarding/ui/BrandHeader.tsx

@ -14,7 +14,7 @@ export function BrandHeader({ slogan }: { slogan?: string }) {
} }
const styles = StyleSheet.create({ 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 }, name: { fontSize: 26, fontWeight: '800', color: colors.textPrimary },
slogan: { fontSize: 13, color: colors.textHint }, slogan: { fontSize: 13, color: colors.textHint },
}); });

4
components/onboarding/ui/CountdownButton.tsx

@ -1,6 +1,6 @@
import { useEffect, useRef, useState } from 'react'; import { useEffect, useRef, useState } from 'react';
import { Pressable, StyleSheet, Text } from 'react-native'; import { Pressable, StyleSheet, Text } from 'react-native';
import { colors } from '../../../src/theme'; import { colors , spacing } from '../../../src/theme';
interface Props { interface Props {
disabled?: boolean; disabled?: boolean;
@ -47,7 +47,7 @@ export function CountdownButton({ disabled = false, onSend, seconds = 60 }: Prop
} }
const styles = StyleSheet.create({ 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 }, btnDisabled: { backgroundColor: colors.borderLight },
text: { fontSize: 13, fontWeight: '600', color: colors.primaryText }, text: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
textDisabled: { color: colors.textDisabled }, textDisabled: { color: colors.textDisabled },

4
components/onboarding/ui/Modal.tsx

@ -31,8 +31,8 @@ const styles = StyleSheet.create({
card: { card: {
width: '84%', width: '84%',
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
maxHeight: '80%', maxHeight: '80%',
}, },
title: { fontSize: 18, fontWeight: '800', color: colors.textPrimary, marginBottom: spacing.block, textAlign: 'center' }, 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 { Ionicons } from '@expo/vector-icons';
import { Pressable, StyleSheet, Text, View } from 'react-native'; import { Pressable, StyleSheet, Text, View } from 'react-native';
import { colors } from '../../../src/theme'; import { colors , spacing } from '../../../src/theme';
interface Props { interface Props {
label: string; label: string;
@ -29,9 +29,9 @@ const styles = StyleSheet.create({
flexDirection: 'row', flexDirection: 'row',
alignItems: 'center', alignItems: 'center',
justifyContent: 'space-between', justifyContent: 'space-between',
paddingVertical: 8, paddingVertical: spacing.card,
paddingHorizontal: 8, paddingHorizontal: spacing.card,
borderRadius: 8, borderRadius: spacing.card,
borderWidth: 1, borderWidth: 1,
borderColor: colors.border, borderColor: colors.border,
backgroundColor: colors.white, 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 }, titleInline: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
titleCenter: { fontSize: 18, fontWeight: '800', color: colors.textPrimary, textAlign: 'center', paddingVertical: spacing.block }, titleCenter: { fontSize: 18, fontWeight: '800', color: colors.textPrimary, textAlign: 'center', paddingVertical: spacing.block },
scroll: { flex: 1 }, 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 }, 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 { Ionicons } from '@expo/vector-icons';
import type { ReactNode } from 'react'; import type { ReactNode } from 'react';
import { Pressable, StyleSheet, Text, TextInput, View } from 'react-native'; 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 }) { 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 }, note: { fontSize: 12, color: colors.textHint, lineHeight: 18 },
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -200,7 +200,7 @@ const styles = StyleSheet.create({
centerText: { fontSize: 14, color: colors.textSecondary }, centerText: { fontSize: 14, color: colors.textSecondary },
centerBtn: { centerBtn: {
paddingHorizontal: 18, paddingHorizontal: 18,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 16, borderRadius: 16,
backgroundColor: colors.primaryLight, 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 { Pressable, StyleSheet, Text, View } from 'react-native';
import { colors } from '../theme'; import { colors } from '../theme';
import type { Job } from '../types'; import type { Job } from '../types';
@ -49,8 +50,8 @@ export function JobCard({ job, onPress }: { job: JobSummary; onPress: () => void
const styles = StyleSheet.create({ const styles = StyleSheet.create({
card: { card: {
backgroundColor: colors.white, backgroundColor: colors.white,
borderRadius: 8, borderRadius: spacing.card,
padding: 8, padding: spacing.card,
marginBottom: 8, marginBottom: 8,
borderWidth: 1, borderWidth: 1,
borderColor: colors.borderLight, borderColor: colors.borderLight,
@ -68,9 +69,9 @@ const styles = StyleSheet.create({
marginRight: 8, marginRight: 8,
}, },
scoreBadge: { scoreBadge: {
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 2, paddingVertical: 2,
borderRadius: 8, borderRadius: spacing.card,
backgroundColor: colors.primaryLight, backgroundColor: colors.primaryLight,
}, },
scoreText: { scoreText: {
@ -110,7 +111,7 @@ const styles = StyleSheet.create({
marginTop: 10, marginTop: 10,
}, },
tag: { tag: {
paddingHorizontal: 8, paddingHorizontal: spacing.card,
paddingVertical: 3, paddingVertical: 3,
borderRadius: 6, borderRadius: 6,
backgroundColor: colors.borderLight, backgroundColor: colors.borderLight,

11
src/components/LegalDocScreen.tsx

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

3
src/components/StateView.tsx

@ -1,3 +1,4 @@
import { spacing } from '../../src/theme';
import { Ionicons } from '@expo/vector-icons'; import { Ionicons } from '@expo/vector-icons';
import type { ReactNode } from 'react'; import type { ReactNode } from 'react';
import { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native'; import { ActivityIndicator, Pressable, StyleSheet, Text, View } from 'react-native';
@ -95,7 +96,7 @@ const styles = StyleSheet.create({
retryBtn: { retryBtn: {
marginTop: 16, marginTop: 16,
paddingHorizontal: 24, paddingHorizontal: 24,
paddingVertical: 8, paddingVertical: spacing.card,
borderRadius: 18, borderRadius: 18,
backgroundColor: colors.primaryBtn, 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` 全绿。 `tsc` 0 · `eslint` 0 · `npm test` 26 套件 / 365 用例 · `check:spacing` 卡片全 8px · `check:routes` · `check:affordances` · `check:icons` 全绿。
**6. 残留 / 待跟进** **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 补做)。 - ② B5 已完成(见第 4 条,2026-09-21 补做)。
- ③ `AGENTS.md` 第 10 行仍写「边距间隔一致,为 8px」,现非卡片块间距为 12,措辞略偏——非阻断,待文档对齐(可改成「卡片间距 8px / 块间距 12px」)。 - ③ `AGENTS.md` 第 10 行仍写「边距间隔一致,为 8px」,现非卡片块间距为 12,措辞略偏——非阻断,待文档对齐(可改成「卡片间距 8px / 块间距 12px」)。
@ -1898,3 +1898,24 @@ npx expo export --platform android --output-dir <临时目录>
# 启动 # 启动
npm start # 即 expo start 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