Browse Source

style: 全站卡片圆角统一 8px 并去除卡片阴影

依据 AGENTS.md 于 2026-09-20 14:12 新增的硬规则「整个项目所有卡片的圆角都必须是
8px,无阴影」,改造 147 处卡片圆角、删除 54 行卡片阴影。同一次 AGENTS.md 编辑还把
提交规则由「每天 17:50 提交」改为「提交并推送到远端」,本次 17:50 动作按新规执行
两步(commit → push),故本提交同时包含该 AGENTS.md 改动。

为什么不能直接 grep borderRadius 全量替换
  项目没有「卡片」的样式键约定:同一屏内 card / box / panel / section 混用,且
  cardBtn(48 高胶囊按钮)、cardTag(标签)、cardIcon(圆形图标底)共用 card 前缀。
  直接全量替换会把胶囊按钮与圆形头像一并压成方角。

判定口径(本轮定义)
  卡片:样式键为 card 或以 Card 结尾/内嵌;另经逐条读块复核,纳入 17 个非 card 命名
        的「独立承载一组内容的面板」(emptyBox / emptyList / emptyHint / searchEmpty /
        pathSummary / section / cardBase / cardOffer / salaryBox / draftBanner /
        matchBox / aiTip)。
  非卡片:CardBtn|CardBullet|CardDot|CardBadge|CardIcon|CardWrap|CardTag|CardChip,
        以及按钮、标签、chip、输入框、Tab 项、列表行(row / *Item)、头像与圆点。
  圆/胶囊排除:半径 × 2 ≥ min(字面量宽, 字面量高) 时判为圆或胶囊,不动
        (如 cardBtn 48 高/r24、radioOuter 18×18/r9、countdownCard 60×60/r30、
         Holland 结果页类型序号圆标)。

改动规模(git diff 实测)
  圆角改为 8:147 处,分布 50 个 .tsx/.ts
  删除阴影行(shadowColor/Offset/Opacity/Radius、elevation):54 行,7 个文件
  其中 app/jobs/[id].tsx 删除模块级 const shadow 常量及其 ...shadow 展开点(共 7 行)
  卡片类样式 167 个,其中仍非 8px:0

审计脚本自身的两个缺陷(差点改错别人的圆角,已在文档中如实记录)
  ① 单行样式块(modalCard: { …, borderRadius: 16, … },)被当普通块解析,会把下一个
     样式块的值算作它自己的 —— 不是漏改,是取到邻居半径然后改到邻居头上。
  ② shadowOffset: { width, height } 被当成元素尺寸,导致所有带阴影的卡片都被判为
     胶囊而整类静默跳过(带阴影的恰是最该改的)。
  两处均为静默漏判而非崩溃,故本批不采信脚本输出,改用 git diff -U0 逐行反查证明:
  147 行新增半径中,130 行在 card 命名样式内、17 行在人工复核白名单内、0 行在名单外。

范围边界(刻意不动,非遗漏)
  components/onboarding/ui/SliderCaptcha.tsx:294-297 滑块阴影保留(控件非卡片,
  去阴影会使滑块与轨道糊在一起);src/theme/colors.ts 的 shadow token 保留
  (colors.test.ts:11 仍断言)。全库 elevation:/shadowOpacity: 现仅此一处。
  另有 116 条「像卡片但不叫 card」的样式未动,逐类看过几乎全是按钮/标签/chip/输入框/
  Tab/列表行/头像底,压成 8px 反而是错的 —— 这是本轮口径的边界,不是余数。

回归锁
  新增 0 例测试;本批为纯样式常量改动,不改变任何数据逻辑,靠既有 365 例与新立的
  圆角审计脚本(167 个卡片类样式非 8px = 0)看守。

真机实测(Android 模拟器 emulator-5554,截图核对,非代码走查)
  jobs 列表、jobs/1 详情、profile 求职端、enterprise-overview(本轮删除阴影最多的页面,
  4 张卡 15 行)| job-publish | tools/skill-cloud | holland-result | resume/export
  —— 均确认 8px 直角、无阴影,且内部胶囊标签与圆形序号标未被误伤,
  白底卡片与 pageBg #F6F8F9 仍可区分、未塌成一片。
  未实测(仅代码级验证):components/resume/EditKit.tsx、components/onboarding/ui/
  Modal.tsx、components/onboarding/screens/P3Identity.tsx、LegalDocScreen
  —— 嵌在弹层/引导流/长文档中,深链直达需先走完前置流程。

已知缝隙
  「8px」目前仍是各 StyleSheet 里的字面量,未如颜色那样收敛为 theme 常量,
  新增卡片没有强制来源。是否立 theme 层面的圆角 token,留待下一批定夺。

门槛:npx tsc --noEmit 0 错误 · npx eslint . 0 error/0 warning · npm test 26 套件
365 例全绿 · node scripts/check-routes.mjs 0 失效跳转 · npm run check:affordances 0 处 ·
npm run check:icons 0 处无效字形(194 文件 / 1357 字形) ·
node scripts/check-backend-stubs.mjs 140 个接口函数 · git diff --check 通过
master
doublex001 1 month ago
parent
commit
c3a3fa0eac
  1. 4
      AGENTS.md
  2. 12
      app/(enterprise)/enterprise-chat.tsx
  3. 21
      app/(enterprise)/enterprise-overview.tsx
  4. 8
      app/(enterprise)/job-management.tsx
  5. 12
      app/(enterprise)/talent-recommendation.tsx
  6. 2
      app/(tabs)/growth.tsx
  7. 5
      app/(tabs)/jobs.tsx
  8. 4
      app/(tabs)/profile.tsx
  9. 10
      app/ability.tsx
  10. 6
      app/appeal.tsx
  11. 4
      app/assessment.tsx
  12. 6
      app/audit-report.tsx
  13. 20
      app/candidate-detail.tsx
  14. 4
      app/chat/[id].tsx
  15. 8
      app/enterprise-certification.tsx
  16. 8
      app/holland-result.tsx
  17. 6
      app/holland.tsx
  18. 4
      app/holland/question.tsx
  19. 10
      app/hr-evaluation.tsx
  20. 15
      app/interview-score.tsx
  21. 4
      app/interview.tsx
  22. 19
      app/job-evaluations.tsx
  23. 7
      app/job-publish.tsx
  24. 13
      app/jobs/[id].tsx
  25. 4
      app/jobs/compare.tsx
  26. 6
      app/jobs/offer-compare.tsx
  27. 8
      app/jobs/rank.tsx
  28. 6
      app/jobs/weight-settings.tsx
  29. 2
      app/legal.tsx
  30. 4
      app/legal/template.tsx
  31. 8
      app/onboarding.tsx
  32. 2
      app/operation-rules.tsx
  33. 8
      app/personal-data-export.tsx
  34. 12
      app/progress.tsx
  35. 6
      app/resume.tsx
  36. 8
      app/resume/export.tsx
  37. 4
      app/settings/account-cancel.tsx
  38. 6
      app/settings/delete-data.tsx
  39. 6
      app/settings/privacy.tsx
  40. 6
      app/settings/privacy/[id].tsx
  41. 6
      app/settings/privacy/dnd.tsx
  42. 6
      app/settings/privacy/keywords.tsx
  43. 4
      app/settings/qualifications.tsx
  44. 4
      app/tools/salary-calculator.tsx
  45. 12
      app/tools/skill-cloud.tsx
  46. 2
      components/onboarding/screens/P17Reference.tsx
  47. 2
      components/onboarding/screens/P3Identity.tsx
  48. 2
      components/onboarding/ui/Modal.tsx
  49. 2
      components/resume/EditKit.tsx
  50. 2
      src/components/JobCard.tsx
  51. 2
      src/components/LegalDocScreen.tsx
  52. 126
      项目开发状态.md

4
AGENTS.md

@ -12,9 +12,9 @@ Read the exact versioned docs at https://docs.expo.dev/versions/v57.0.0/ before
你是react native+expo开发工程师
做任务前,先检查问题有没有错误前提、逻辑跳跃和信息缺失。 不要迎合我,要独立判断,区分事实、预测和主观观点。 涉及数字、人物和结论时尽量核实来源。 不同意就直接指出并给出依据、风险和替代解释。 还要主动提醒我忽略的变量、成本和偏差。
需要填充图片的地方,没有图片的话,请标明这里需要填充什么图片,便于后续填充。
整个项目所有卡片的圆角都必须是8px,无阴影,边距间隔一致
仓库:https://gitea.baskbuddy.com/baskbuddy/mydreamjob
请在每周的周一-周五的9:20的时候拉取一次远端仓库、每天17:50提交一次git仓库,其他时间可以改动但不需要提交,说明今天新增与改动的内容,上班时间是9:00-18:00,有页面出口就一定要有入口。
严格要求:请在每周的工作日的9:20的时候拉取一次远端仓库、每天17:50提交一次git仓库并推送到远端,每天一次,其他时间可以改动但不需要提交,说明今天新增与改动的内容,上班时间是9:00-18:00,有页面出口就一定要有入口。
> **提交之后必须推送(2026-09-18 补充)**。原约定只写了「提交」,没写「推送」,实际后果是
> **2026-09-11 至 09-17 整整一周的 12 个提交从未离开本机**,远端一直停在 09-10:

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

@ -440,7 +440,7 @@ const styles = StyleSheet.create({
retryText: { color: colors.white, fontSize: 13, fontWeight: '600' },
pendingCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 12,
},
@ -518,12 +518,12 @@ const styles = StyleSheet.create({
gap: 10,
paddingVertical: 32,
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
},
emptyListText: { fontSize: 13, color: colors.textSecondary },
chatListCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
overflow: 'hidden',
marginBottom: 12,
},
@ -615,7 +615,7 @@ const styles = StyleSheet.create({
quickActionsCard: {
flexDirection: 'row',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
paddingVertical: 14,
},
quickAction: {
@ -629,7 +629,7 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 28,
alignItems: 'center',
},
@ -669,7 +669,7 @@ const styles = StyleSheet.create({
dataCard: {
width: '100%',
backgroundColor: colors.primaryLight,
borderRadius: 12,
borderRadius: 8,
padding: 16,
alignItems: 'flex-start',
},

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

@ -325,12 +325,7 @@ const styles = StyleSheet.create({
marginTop: 8,
padding: 16,
backgroundColor: colors.white,
borderRadius: 16,
shadowColor: colors.shadow,
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.06,
shadowRadius: 8,
elevation: 3,
borderRadius: 8,
},
companyHeader: {
flexDirection: 'row',
@ -399,14 +394,9 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
shadowColor: colors.shadow,
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.04,
shadowRadius: 6,
elevation: 2,
},
cardHeader: {
flexDirection: 'row',
@ -542,14 +532,9 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
shadowColor: colors.shadow,
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.04,
shadowRadius: 6,
elevation: 2,
},
candidateIconWrap: {
width: 44,

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

@ -683,7 +683,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 12,
},
statIconWrap: {
@ -761,7 +761,7 @@ const styles = StyleSheet.create({
},
jobCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 12,
},
@ -1056,7 +1056,7 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 28,
alignItems: 'center',
},
@ -1096,7 +1096,7 @@ const styles = StyleSheet.create({
benefitCard: {
width: '100%',
backgroundColor: colors.primaryLight,
borderRadius: 12,
borderRadius: 8,
padding: 16,
alignItems: 'flex-start',
},

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

@ -430,7 +430,7 @@ const styles = StyleSheet.create({
gap: 10,
paddingVertical: 32,
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
},
emptyListText: { fontSize: 13, color: colors.textSecondary },
emptyListBtn: {
@ -538,7 +538,7 @@ const styles = StyleSheet.create({
},
candidateCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 12,
},
@ -666,7 +666,7 @@ const styles = StyleSheet.create({
},
poolCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginTop: 4,
},
@ -712,7 +712,7 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 28,
alignItems: 'center',
},
@ -752,7 +752,7 @@ const styles = StyleSheet.create({
actionCard: {
width: '100%',
backgroundColor: colors.actionLight,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 16,
alignItems: 'flex-start',
@ -790,7 +790,7 @@ const styles = StyleSheet.create({
dataCard: {
width: '100%',
backgroundColor: colors.primaryLight,
borderRadius: 12,
borderRadius: 8,
padding: 16,
alignItems: 'flex-start',
},

2
app/(tabs)/growth.tsx

@ -419,7 +419,7 @@ const styles = StyleSheet.create({
/* ---- 通用分区标题 ---- */
emptyBox: {
backgroundColor: colors.surface,
borderRadius: 12,
borderRadius: 8,
paddingVertical: 32,
paddingHorizontal: 16,
alignItems: 'center',

5
app/(tabs)/jobs.tsx

@ -449,11 +449,6 @@ const styles = StyleSheet.create({
paddingHorizontal: 14,
marginHorizontal: 8,
marginTop: 4,
shadowColor: colors.shadow,
shadowOpacity: 0.06,
shadowRadius: 8,
shadowOffset: { width: 0, height: 2 },
elevation: 2,
},
searchInput: {
flex: 1,

4
app/(tabs)/profile.tsx

@ -697,7 +697,7 @@ const styles = StyleSheet.create({
statsCard: {
flexDirection: 'row',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
paddingVertical: 16,
marginBottom: 12,
},
@ -715,7 +715,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
paddingHorizontal: 16,
paddingVertical: 16,
marginBottom: 12,

10
app/ability.tsx

@ -281,7 +281,7 @@ const styles = StyleSheet.create({
scoreCard: {
flexDirection: 'row',
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 18,
marginBottom: 12,
borderWidth: 1,
@ -299,7 +299,7 @@ const styles = StyleSheet.create({
section: { marginTop: 16 },
emptyBox: {
backgroundColor: colors.surface,
borderRadius: 12,
borderRadius: 8,
paddingVertical: 28,
paddingHorizontal: 16,
alignItems: 'center',
@ -309,7 +309,7 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginBottom: 12 },
dimCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 10,
borderWidth: 1,
@ -345,7 +345,7 @@ const styles = StyleSheet.create({
subItemScore: { width: 50, fontSize: 12, color: colors.textPrimary, textAlign: 'right' },
chartCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginTop: 16,
borderWidth: 1,
@ -360,7 +360,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 10,
borderWidth: 1,

6
app/appeal.tsx

@ -473,7 +473,7 @@ const styles = StyleSheet.create({
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
noticeCard: {
backgroundColor: colors.infoLight,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 16,
borderWidth: 1,
@ -490,7 +490,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 10,
borderWidth: 1,
@ -580,7 +580,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 10,
borderRadius: 8,
paddingHorizontal: 14,
borderWidth: 1,
borderColor: colors.borderLight,

4
app/assessment.tsx

@ -172,7 +172,7 @@ const styles = StyleSheet.create({
alignItems: 'center',
justifyContent: 'space-between',
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 18,
marginBottom: 16,
borderWidth: 1,
@ -190,7 +190,7 @@ const styles = StyleSheet.create({
entryCard: {
flexDirection: 'row',
alignItems: 'center',
borderRadius: 12,
borderRadius: 8,
padding: 16,
},
entryIcon: {

6
app/audit-report.tsx

@ -274,7 +274,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.success,
borderRadius: 16,
borderRadius: 8,
padding: 20,
},
gradeCircle: {
@ -307,7 +307,7 @@ const styles = StyleSheet.create({
kpiCard: {
width: '48%',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 12,
},
@ -326,7 +326,7 @@ const styles = StyleSheet.create({
kpiChange: { fontSize: 12, fontWeight: '600', marginLeft: 3 },
chartCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
},
chartGap: { height: 12 },

20
app/candidate-detail.tsx

@ -390,14 +390,9 @@ const styles = StyleSheet.create({
},
infoCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
shadowColor: colors.shadow,
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.04,
shadowRadius: 6,
elevation: 2,
},
infoHeader: {
flexDirection: 'row',
@ -434,7 +429,7 @@ const styles = StyleSheet.create({
matchBox: {
alignItems: 'center',
backgroundColor: colors.successLight,
borderRadius: 12,
borderRadius: 8,
paddingHorizontal: 12,
paddingVertical: 8,
},
@ -475,7 +470,7 @@ const styles = StyleSheet.create({
},
scoreCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 20,
marginBottom: 16,
flexDirection: 'row',
@ -507,14 +502,9 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
shadowColor: colors.shadow,
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.04,
shadowRadius: 6,
elevation: 2,
},
cardTitle: {
fontSize: 16,
@ -650,7 +640,7 @@ const styles = StyleSheet.create({
salaryBox: {
marginTop: 12,
padding: 14,
borderRadius: 12,
borderRadius: 8,
backgroundColor: colors.infoLight,
},
salaryLabel: {

4
app/chat/[id].tsx

@ -579,7 +579,7 @@ const styles = StyleSheet.create({
cardBase: {
width: 260,
backgroundColor: colors.white,
borderRadius: 10,
borderRadius: 8,
padding: 12,
marginTop: 6,
},
@ -634,7 +634,7 @@ const styles = StyleSheet.create({
cardOffer: {
width: 260,
backgroundColor: colors.actionLight,
borderRadius: 10,
borderRadius: 8,
padding: 12,
marginTop: 6,
},

8
app/enterprise-certification.tsx

@ -269,7 +269,7 @@ const styles = StyleSheet.create({
topCard: {
margin: 12,
backgroundColor: colors.primary,
borderRadius: 16,
borderRadius: 8,
padding: 20,
},
topHeader: { flexDirection: 'row', alignItems: 'center', marginBottom: 16 },
@ -298,7 +298,7 @@ const styles = StyleSheet.create({
formCard: {
marginHorizontal: 12,
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 20,
},
formTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary, marginBottom: 16 },
@ -326,7 +326,7 @@ const styles = StyleSheet.create({
successCard: {
marginHorizontal: 12,
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 32,
alignItems: 'center',
},
@ -343,7 +343,7 @@ const styles = StyleSheet.create({
pendingCard: {
marginHorizontal: 12,
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 32,
alignItems: 'center',
},

8
app/holland-result.tsx

@ -312,7 +312,7 @@ const styles = StyleSheet.create({
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 16, paddingBottom: 32 },
heroCard: {
borderRadius: 16,
borderRadius: 8,
padding: 20,
flexDirection: 'row',
alignItems: 'center',
@ -327,7 +327,7 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 18, fontWeight: '700', color: colors.textPrimary, marginBottom: 12 },
typeCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 10,
borderWidth: 1,
@ -356,7 +356,7 @@ const styles = StyleSheet.create({
careerTagText: { fontSize: 12, color: colors.primaryText },
jobCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 10,
borderWidth: 1,
@ -385,7 +385,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 10,
borderWidth: 1,

6
app/holland.tsx

@ -180,7 +180,7 @@ const styles = StyleSheet.create({
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
heroCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 28,
alignItems: 'center',
marginBottom: 20,
@ -264,7 +264,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
},
featureIcon: {
@ -292,7 +292,7 @@ const styles = StyleSheet.create({
},
advantageCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
},
advantageTitle: {

4
app/holland/question.tsx

@ -203,7 +203,7 @@ const styles = StyleSheet.create({
body: { padding: 16, paddingBottom: 32 },
dimCard: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
marginBottom: 12,
borderWidth: 1,
@ -244,7 +244,7 @@ const styles = StyleSheet.create({
},
questionCard: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 24,
marginBottom: 12,
borderWidth: 1,

10
app/hr-evaluation.tsx

@ -336,7 +336,7 @@ const styles = StyleSheet.create({
justifyContent: 'space-between',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 18,
marginBottom: 12,
borderWidth: 1,
@ -361,7 +361,7 @@ const styles = StyleSheet.create({
scoreIcon: { alignItems: 'center', justifyContent: 'center' },
card: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
marginBottom: 12,
borderWidth: 1,
@ -369,7 +369,7 @@ const styles = StyleSheet.create({
},
chartCard: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
marginBottom: 12,
borderWidth: 1,
@ -404,7 +404,7 @@ const styles = StyleSheet.create({
sectionHeader: { marginBottom: 10, marginTop: 4 },
emptyBox: {
backgroundColor: colors.surface,
borderRadius: 12,
borderRadius: 8,
paddingVertical: 28,
paddingHorizontal: 16,
alignItems: 'center',
@ -414,7 +414,7 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary },
reviewCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 10,
borderWidth: 1,

15
app/interview-score.tsx

@ -396,7 +396,7 @@ const styles = StyleSheet.create({
},
infoCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
},
@ -419,7 +419,7 @@ const styles = StyleSheet.create({
},
scoreCard: {
backgroundColor: colors.primary,
borderRadius: 16,
borderRadius: 8,
padding: 20,
marginBottom: 16,
flexDirection: 'row',
@ -447,14 +447,9 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
shadowColor: colors.shadow,
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.04,
shadowRadius: 6,
elevation: 2,
},
cardTitle: {
fontSize: 16,
@ -571,7 +566,7 @@ const styles = StyleSheet.create({
justifyContent: 'space-between',
alignItems: 'center',
backgroundColor: colors.infoLight,
borderRadius: 12,
borderRadius: 8,
padding: 16,
},
salaryRange: {
@ -620,7 +615,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.infoLight,
borderWidth: 1,
borderColor: colors.infoBorder,
borderRadius: 12,
borderRadius: 8,
paddingHorizontal: 12,
paddingVertical: 10,
marginBottom: 12,

4
app/interview.tsx

@ -393,7 +393,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 10,
borderWidth: 1,
@ -413,7 +413,7 @@ const styles = StyleSheet.create({
modeDesc: { fontSize: 12, color: colors.textSecondary, marginTop: 2 },
card: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
marginBottom: 12,
borderWidth: 1,

19
app/job-evaluations.tsx

@ -549,7 +549,7 @@ const styles = StyleSheet.create({
},
scoreCard: {
backgroundColor: colors.primary,
borderRadius: 16,
borderRadius: 8,
padding: 20,
marginBottom: 16,
},
@ -605,14 +605,9 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
shadowColor: colors.shadow,
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.04,
shadowRadius: 6,
elevation: 2,
},
cardTitle: {
fontSize: 16,
@ -622,14 +617,14 @@ const styles = StyleSheet.create({
},
chartCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
alignItems: 'center',
},
radarCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
alignItems: 'center',
@ -779,7 +774,7 @@ const styles = StyleSheet.create({
},
modalCard: {
backgroundColor: colors.surface,
borderRadius: 14,
borderRadius: 8,
padding: 18,
},
modalTitle: {
@ -874,7 +869,7 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 28,
alignItems: 'center',
marginTop: 8,
@ -910,7 +905,7 @@ const styles = StyleSheet.create({
tipCard: {
width: '100%',
backgroundColor: colors.actionLight,
borderRadius: 12,
borderRadius: 8,
padding: 16,
alignItems: 'flex-start',
},

7
app/job-publish.tsx

@ -439,14 +439,9 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
shadowColor: colors.shadow,
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.04,
shadowRadius: 6,
elevation: 2,
},
cardTitle: {
fontSize: 16,

13
app/jobs/[id].tsx

@ -350,14 +350,6 @@ export default function JobDetailScreen() {
);
}
// 跨平台阴影
const shadow = {
shadowColor: colors.textPrimary,
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.06,
shadowRadius: 8,
elevation: 3,
};
const styles = StyleSheet.create({
safeArea: {
@ -431,15 +423,14 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 16,
...shadow,
},
/* ---- 空态 ---- */
emptyCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
paddingVertical: 32,
paddingHorizontal: 16,
marginBottom: 16,

4
app/jobs/compare.tsx

@ -232,7 +232,7 @@ const styles = StyleSheet.create({
jobCard: {
flex: 1,
padding: 12,
borderRadius: 12,
borderRadius: 8,
backgroundColor: colors.surface,
borderWidth: StyleSheet.hairlineWidth,
borderColor: colors.borderLight,
@ -252,7 +252,7 @@ const styles = StyleSheet.create({
},
sectionTitle: { fontSize: 15, fontWeight: '500', color: colors.textPrimary },
card: {
borderRadius: 12,
borderRadius: 8,
backgroundColor: colors.surface,
borderWidth: StyleSheet.hairlineWidth,
borderColor: colors.borderLight,

6
app/jobs/offer-compare.tsx

@ -400,7 +400,7 @@ const styles = StyleSheet.create({
offerCard: {
width: 150,
padding: 14,
borderRadius: 12,
borderRadius: 8,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.border,
@ -448,7 +448,7 @@ const styles = StyleSheet.create({
/* ---- 通用卡片与分区标题 ---- */
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginTop: 12,
},
@ -577,7 +577,7 @@ const styles = StyleSheet.create({
/* ---- AI 建议 ---- */
aiCard: {
marginTop: 12,
borderRadius: 12,
borderRadius: 8,
padding: 16,
},
aiHeader: {

8
app/jobs/rank.tsx

@ -460,7 +460,7 @@ const styles = StyleSheet.create({
/* ---- 综合排名卡片 ---- */
rankCard: {
backgroundColor: colors.primaryLight,
borderRadius: 12,
borderRadius: 8,
padding: 16,
borderWidth: 1,
borderColor: colors.primaryBorder,
@ -523,7 +523,7 @@ const styles = StyleSheet.create({
/* ---- 分区 ---- */
section: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginTop: 16,
},
@ -628,7 +628,7 @@ const styles = StyleSheet.create({
},
emptyCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 28,
alignItems: 'center',
},
@ -667,7 +667,7 @@ const styles = StyleSheet.create({
},
progressCard: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 20,
marginTop: 16,
},

6
app/jobs/weight-settings.tsx

@ -198,7 +198,7 @@ const styles = StyleSheet.create({
alignItems: 'center',
justifyContent: 'space-between',
padding: 16,
borderRadius: 12,
borderRadius: 8,
backgroundColor: colors.primaryLight,
},
summaryCardWarn: { backgroundColor: colors.dangerLight },
@ -219,7 +219,7 @@ const styles = StyleSheet.create({
templateCard: {
width: 140,
padding: 12,
borderRadius: 10,
borderRadius: 8,
backgroundColor: colors.surface,
borderWidth: StyleSheet.hairlineWidth,
borderColor: colors.borderLight,
@ -227,7 +227,7 @@ const styles = StyleSheet.create({
templateName: { fontSize: 14, fontWeight: '500', color: colors.textPrimary, marginBottom: 4 },
templateDesc: { fontSize: 11, color: colors.textSecondary },
dimensionCard: {
borderRadius: 12,
borderRadius: 8,
backgroundColor: colors.surface,
borderWidth: StyleSheet.hairlineWidth,
borderColor: colors.borderLight,

2
app/legal.tsx

@ -424,7 +424,7 @@ const styles = StyleSheet.create({
},
emptyHint: {
backgroundColor: colors.surface,
borderRadius: 12,
borderRadius: 8,
paddingVertical: 28,
alignItems: 'center',
gap: 8,

4
app/legal/template.tsx

@ -106,7 +106,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
padding: 16,
borderRadius: 12,
borderRadius: 8,
backgroundColor: colors.white,
marginBottom: 12,
},
@ -126,7 +126,7 @@ const styles = StyleSheet.create({
},
contentCard: {
padding: 16,
borderRadius: 12,
borderRadius: 8,
backgroundColor: colors.white,
borderWidth: 1,
borderColor: colors.borderLight,

8
app/onboarding.tsx

@ -444,7 +444,7 @@ const styles = StyleSheet.create({
backgroundColor: colors.primaryLight,
},
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
countdownCard: { borderRadius: 16, padding: 18, marginBottom: 12 },
countdownCard: { borderRadius: 8, padding: 18, marginBottom: 12 },
countdownTop: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center' },
countdownLabel: { fontSize: 13, color: colors.textInverse, opacity: 0.9 },
countdownValueRow: { flexDirection: 'row', alignItems: 'baseline', marginTop: 6 },
@ -477,7 +477,7 @@ const styles = StyleSheet.create({
countdownFill: { height: 8, borderRadius: 4, backgroundColor: colors.white },
groupCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
marginBottom: 10,
borderWidth: 1,
borderColor: colors.borderLight,
@ -517,7 +517,7 @@ const styles = StyleSheet.create({
requiredText: { fontSize: 10, color: colors.dangerText, fontWeight: '600' },
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginTop: 8,
borderWidth: 1,
@ -577,7 +577,7 @@ const styles = StyleSheet.create({
justifyContent: 'center',
paddingHorizontal: 32,
},
modalCard: { backgroundColor: colors.white, borderRadius: 16, padding: 20 },
modalCard: { backgroundColor: colors.white, borderRadius: 8, padding: 20 },
modalTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary },
modalInput: {
marginTop: 14,

2
app/operation-rules.tsx

@ -354,7 +354,7 @@ const styles = StyleSheet.create({
card: {
marginHorizontal: 12,
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
paddingHorizontal: 16,
paddingVertical: 8,
},

8
app/personal-data-export.tsx

@ -426,7 +426,7 @@ const styles = StyleSheet.create({
introCard: {
flexDirection: 'row',
backgroundColor: colors.primaryLight,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 16,
},
@ -470,7 +470,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
overflow: 'hidden',
},
rowBorder: {
@ -519,7 +519,7 @@ const styles = StyleSheet.create({
formatCard: {
flex: 1,
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
borderWidth: 1,
borderColor: colors.borderLight,
@ -594,7 +594,7 @@ const styles = StyleSheet.create({
},
previewCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
},
previewTitle: {

12
app/progress.tsx

@ -320,7 +320,7 @@ const styles = StyleSheet.create({
headerTitle: { fontSize: 17, fontWeight: '700', color: colors.textPrimary },
body: { padding: 16, paddingBottom: 32 },
statsCard: {
borderRadius: 16,
borderRadius: 8,
padding: 20,
marginBottom: 12,
},
@ -332,7 +332,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 12,
borderWidth: 1,
@ -357,7 +357,7 @@ const styles = StyleSheet.create({
tabTextActive: { color: colors.white, fontWeight: '600' },
emptyBox: {
backgroundColor: colors.surface,
borderRadius: 12,
borderRadius: 8,
paddingVertical: 32,
paddingHorizontal: 16,
alignItems: 'center',
@ -375,7 +375,7 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 16, fontWeight: '700', color: colors.textPrimary },
companyCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 10,
borderWidth: 1,
@ -410,7 +410,7 @@ const styles = StyleSheet.create({
nextAction: { fontSize: 12, color: colors.textSecondary },
offerCard: {
backgroundColor: colors.successLight,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 10,
borderWidth: 1,
@ -431,7 +431,7 @@ const styles = StyleSheet.create({
offerDeadline: { fontSize: 12, color: colors.actionText, marginLeft: 4 },
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginTop: 8,
borderWidth: 1,

6
app/resume.tsx

@ -893,7 +893,7 @@ const styles = StyleSheet.create({
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
card: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
marginBottom: 12,
borderWidth: 1,
@ -901,7 +901,7 @@ const styles = StyleSheet.create({
},
scoreCard: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 18,
marginBottom: 12,
borderWidth: 1,
@ -1014,7 +1014,7 @@ const styles = StyleSheet.create({
alignItems: 'center',
marginTop: 10,
backgroundColor: colors.infoLight,
borderRadius: 10,
borderRadius: 8,
paddingHorizontal: 10,
paddingVertical: 6,
},

8
app/resume/export.tsx

@ -629,7 +629,7 @@ const styles = StyleSheet.create({
retryText: { fontSize: 13, fontWeight: '600', color: colors.primaryText },
previewCard: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 20,
alignItems: 'center',
marginBottom: 16,
@ -661,7 +661,7 @@ const styles = StyleSheet.create({
formatCard: {
flex: 1,
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
alignItems: 'center',
borderWidth: 1,
@ -678,7 +678,7 @@ const styles = StyleSheet.create({
templateCard: {
flex: 1,
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 10,
alignItems: 'center',
borderWidth: 1,
@ -700,7 +700,7 @@ const styles = StyleSheet.create({
templateNameActive: { color: colors.primaryText, fontWeight: '700' },
card: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
borderWidth: 1,
borderColor: colors.borderLight,

4
app/settings/account-cancel.tsx

@ -235,7 +235,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'center',
gap: 8,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 16,
},
@ -256,7 +256,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
overflow: 'hidden',
},
bulletRow: {

6
app/settings/delete-data.tsx

@ -252,7 +252,7 @@ const styles = StyleSheet.create({
},
introCard: {
backgroundColor: colors.infoLight,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 16,
},
@ -272,7 +272,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
overflow: 'hidden',
padding: 4,
},
@ -319,7 +319,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'flex-start',
gap: 8,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 16,
},

6
app/settings/privacy.tsx

@ -231,7 +231,7 @@ const styles = StyleSheet.create({
paddingBottom: 24,
},
levelCard: {
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 16,
},
@ -276,7 +276,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
overflow: 'hidden',
},
row: {
@ -321,7 +321,7 @@ const styles = StyleSheet.create({
},
explanationCard: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 8,
},

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

@ -210,7 +210,7 @@ const styles = StyleSheet.create({
},
introCard: {
backgroundColor: colors.infoLight,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 16,
},
@ -230,7 +230,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
overflow: 'hidden',
},
row: {
@ -266,7 +266,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'flex-start',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
gap: 8,
},

6
app/settings/privacy/dnd.tsx

@ -215,7 +215,7 @@ const styles = StyleSheet.create({
color: colors.white,
},
statCard: {
borderRadius: 12,
borderRadius: 8,
padding: 20,
alignItems: 'center',
marginBottom: 16,
@ -240,7 +240,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
overflow: 'hidden',
},
row: {
@ -282,7 +282,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'flex-start',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
gap: 8,
},

6
app/settings/privacy/keywords.tsx

@ -235,7 +235,7 @@ const styles = StyleSheet.create({
color: colors.white,
},
statCard: {
borderRadius: 12,
borderRadius: 8,
padding: 20,
alignItems: 'center',
marginBottom: 16,
@ -251,7 +251,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 16,
marginBottom: 16,
},
@ -309,7 +309,7 @@ const styles = StyleSheet.create({
flexDirection: 'row',
alignItems: 'flex-start',
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
gap: 8,
},

4
app/settings/qualifications.tsx

@ -154,7 +154,7 @@ const styles = StyleSheet.create({
},
companyCard: {
backgroundColor: colors.primaryLight,
borderRadius: 12,
borderRadius: 8,
borderWidth: 1,
borderColor: colors.primaryBorder,
padding: 16,
@ -179,7 +179,7 @@ const styles = StyleSheet.create({
},
card: {
backgroundColor: colors.surface,
borderRadius: 12,
borderRadius: 8,
borderWidth: 1,
borderColor: colors.border,
padding: 16,

4
app/tools/salary-calculator.tsx

@ -572,7 +572,7 @@ const styles = StyleSheet.create({
body: { padding: 16, paddingBottom: 32 },
card: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
marginBottom: 12,
borderWidth: 1,
@ -607,7 +607,7 @@ const styles = StyleSheet.create({
selectBox: { flexDirection: 'row', alignItems: 'center' },
selectValue: { fontSize: 15, fontWeight: '600', color: colors.textPrimary, marginRight: 4 },
resultCard: {
borderRadius: 16,
borderRadius: 8,
padding: 24,
alignItems: 'center',
marginBottom: 12,

12
app/tools/skill-cloud.tsx

@ -566,7 +566,7 @@ const styles = StyleSheet.create({
sectionTitle: { fontSize: 15, fontWeight: '700', color: colors.textPrimary, marginBottom: 10 },
cloudCard: {
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
paddingVertical: 8,
paddingHorizontal: 4,
borderWidth: 1,
@ -577,7 +577,7 @@ const styles = StyleSheet.create({
card: {
marginTop: 16,
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
borderWidth: 1,
borderColor: colors.borderLight,
@ -621,7 +621,7 @@ const styles = StyleSheet.create({
matchCard: {
marginTop: 16,
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
borderWidth: 1,
borderColor: colors.borderLight,
@ -670,7 +670,7 @@ const styles = StyleSheet.create({
gap: 10,
paddingVertical: 32,
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
borderWidth: 1,
borderColor: colors.borderLight,
},
@ -696,7 +696,7 @@ const styles = StyleSheet.create({
modalBody: { paddingHorizontal: 16, paddingBottom: 12 },
pathSummary: {
backgroundColor: colors.primaryLight,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginTop: 14,
marginBottom: 4,
@ -726,7 +726,7 @@ const styles = StyleSheet.create({
detailCard: {
marginTop: 12,
backgroundColor: colors.white,
borderRadius: 14,
borderRadius: 8,
padding: 16,
borderWidth: 1,
borderColor: colors.successBorder,

2
components/onboarding/screens/P17Reference.tsx

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

2
components/onboarding/screens/P3Identity.tsx

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

2
components/onboarding/ui/Modal.tsx

@ -31,7 +31,7 @@ const styles = StyleSheet.create({
card: {
width: '84%',
backgroundColor: colors.white,
borderRadius: 20,
borderRadius: 8,
padding: 22,
maxHeight: '80%',
},

2
components/resume/EditKit.tsx

@ -176,7 +176,7 @@ const styles = StyleSheet.create({
note: { fontSize: 12, color: colors.textHint, lineHeight: 18 },
card: {
backgroundColor: colors.white,
borderRadius: 16,
borderRadius: 8,
padding: 16,
marginBottom: 12,
borderWidth: 1,

2
src/components/JobCard.tsx

@ -49,7 +49,7 @@ export function JobCard({ job, onPress }: { job: JobSummary; onPress: () => void
const styles = StyleSheet.create({
card: {
backgroundColor: colors.white,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 10,
borderWidth: 1,

2
src/components/LegalDocScreen.tsx

@ -171,7 +171,7 @@ const styles = StyleSheet.create({
},
preambleCard: {
backgroundColor: colors.infoLight,
borderRadius: 12,
borderRadius: 8,
padding: 14,
marginBottom: 16,
},

126
项目开发状态.md

@ -1318,12 +1318,136 @@ export function clampSocialBase(city: string, value: number): number {
---
### 4.17 全站卡片圆角统一 8px + 去卡片阴影(2026-09-20 批次,接 4.16)
#### 1. 起点:一条新增的硬规则,来自用户而非本轮排查
`AGENTS.md` 于 2026-09-20 14:12 新增一行(用户改动,本轮首次实现):
> 整个项目所有卡片的圆角都必须是8px,无阴影
同一次编辑还把提交规则从「每天 17:50 提交」改成「**提交并推送到远端**」。两处都写进本批。
**为什么不能靠 `grep 'borderRadius'` 一把梭**:项目从来没有「卡片」的样式键约定 ——
同一屏里 `card` / `box` / `panel` / `section` / `wrapper` 混用,`cardBtn`(胶囊按钮)、
`cardTag`(标签)、`cardIcon`(圆形图标底)也共用 `card` 前缀。**先立判定口径,再动手**,
否则「统一 8px」会连胶囊按钮和圆形头像一起压成方角,这是本批最大的一次性风险。
#### 2. 判定口径(本轮定义,后续沿用)
| 判为「卡片」 | 判为「非卡片」 |
|---|---|
| 样式键为 `card` 或以 Card 结尾/内嵌(`scoreCard`、`emptyCard`、`preambleCard`) | 同名前缀的子件:`CardBtn`/`CardBullet`/`CardDot`/`CardBadge`/`CardIcon`/`CardWrap`/`CardTag`/`CardChip` |
| 逐条读过块体、确认是「独立承载一组内容的面板」的 17 个非 card 命名样式(`emptyBox`/`emptyList`/`emptyHint`/`searchEmpty`/`pathSummary`/`section`/`cardBase`/`cardOffer`/`salaryBox`/`draftBanner`/`matchBox`/`aiTip`) | 按钮、标签、chip、输入框、Tab、列表行(`row`/`*Item`)、头像与圆点 |
**圆 / 胶囊排除规则**:`半径 × 2 ≥ min(字面量宽, 字面量高)` 时判为圆或胶囊,**不动**。
命中并被正确跳过的实例:`cardBtn` 48 高 / 半径 24、`radioOuter` 18×18 / 半径 9、
`countdownCard` 60×60 / 半径 30、Holland 结果的类型序号圆标。
#### 3. 改动规模(`git diff` 实测,非估计)
| 项 | 数量 |
|---|---|
| 圆角半径改为 8 | **147 处**(分布于 50 个 `.tsx`/`.ts`) |
| 删除的阴影行(`shadowColor`/`shadowOffset`/`shadowOpacity`/`shadowRadius`/`elevation`) | **54 行**,7 个文件 |
| 其中:删除模块级 `const shadow = {…}` 常量 + 其 `...shadow` 展开点 | `app/jobs/[id].tsx` 共 7 行 |
| 卡片类样式总数 / 其中仍非 8px | **167 / 0** |
改动前 `167` 个卡片类样式里,`130` 个由脚本改、`37` 个本来已是 8;
另有 `17` 个走人工复核的面板命名,`130 + 17 = 147` 与 `git diff` 行数**逐一对上**。
#### 4. 两个审计脚本自身的缺陷(差点改错别人的圆角,如实记录)
审计脚本(临时工具,不入库)第一版把**单行样式块**当成普通块解析:
```ts
modalCard: { backgroundColor: colors.white, borderRadius: 16, padding: 20 },
```
这类样式在本行内就闭合了,脚本却继续往下读,**把下一个样式块的值算成了它的值**。
后果不是漏改,是**可能取到邻居的半径然后改到邻居头上**。发现的路径是抽样复核时看到
`countdownCard` 被报成「半径 30 / 60×60 的圆」(它实际是单行 `borderRadius: 16`,
那个 60×60 是隔壁 `countdownItem` 的),以及 `P3Identity` 的 `card` 被误判成
「100%×48 的胶囊」而整块漏掉 —— 修掉解析后它才被正确识别并改成 8。
第二个缺陷更隐蔽:`shadowOffset: { width: 0, height: 2 }` 里的 `width`/`height`
被当成**元素尺寸**,于是所有带阴影的卡片都满足「半径×2 ≥ 尺寸」而被判为胶囊、
**整类静默跳过** —— 而带阴影的恰恰是最该改的卡片。修法是取尺寸前先剔掉 `shadowOffset`
与全部 `shadow*` 行。修复后重新审计,`P3Identity` 等一批真卡片才浮出来。
两个缺陷都属于「**报错方式为静默漏判**」而非崩溃,所以本批不采信任何一次性的脚本输出,
而是用 `verify-radius.js` 对 `git diff -U0` 的**每一行新增半径**反查它落在哪个样式块内
(结论:`147` 行中 `130` 行在 card 命名样式内、`17` 行在人工复核的面板白名单内、**0 行在名单外**)。
#### 5. 一次被拒绝的批量回滚,以及随之改走的「前向验证」
第一版脚本在 `app/onboarding.tsx:580` 崩溃(单行块无独立 `borderRadius` 行),
此时已写入 79 处改动。我尝试用 `git diff --name-only | grep -v AGENTS.md | xargs git checkout --`
整体回滚重来,**被权限策略拒绝**(判定为对未提交工作的不可逆本地销毁)。
我没有绕过它,而是改走**前向验证**:不回滚,直接证明这 79 处(连后续的 68 处)全部合法。
事后看这个方向更对 —— 那次回滚还会连带**抹掉用户自己刚写的 `AGENTS.md` 编辑**,
而当时我并不知道那份编辑的存在(它不在我这条命令的视野里)。**教训:把「回到干净状态」
当作修复手段之前,先确认干净状态里没有别人的东西。**
#### 6. 刻意不动的两处(范围边界,不是遗漏)
- `components/onboarding/ui/SliderCaptcha.tsx:294-297` 的滑块阴影**保留**:
它是**控件**不是卡片,去阴影会让滑块与轨道在视觉上糊成一体。全库 `elevation:` /
`shadowOpacity:` 现仅此一处(已 `grep` 全库确认)。
- `src/theme/colors.ts` 的 `shadow: '#000000'` token **保留**:`colors.test.ts:11` 仍在断言它。
代价是「卡片不再用阴影」这条约定**在 token 层看不出来**,属已知的文档-代码缝隙,未加注释(避免
为一个零引用的 token 增加维护面)。
#### 7. 覆盖边界:116 条「像卡片但不叫 card」的样式**未动**
以「白/浅底 + 内边距或描边 + 圆角 ≠ 8 + 非圆非胶囊」反查,全库仍有 **116 条**这样的样式
(口径见审计脚本注释)。逐类看过:**几乎全是按钮、标签、chip、输入框、Tab 项、列表行、头像底**
—— 它们不是卡片,压成 8 反而是错的。**这不是「差不多改完了」的余数,是本轮口径的边界**;
若将来真要把某一类纳入,需要单独一次「这一类算不算卡片」的判定,不能顺手改。
#### 8. 真机实测(Android 模拟器 `emulator-5554`,截图核对,非代码走查)
| 页面 | 看什么 | 结果 |
|---|---|---|
| `jobs` 岗位列表 | 卡片原本带阴影(`searchBox` 5 行) | 已平;8px 直角;仍能与 `pageBg #F6F8F9` 区分 |
| `jobs/1` 岗位详情 | 3 张卡片 + 模块级 `shadow` 常量已删 | 已平;层级靠白底与描边区分,未塌成一片 |
| `(tabs)/profile` 求职端 | `statsCard`/`enterpriseCard` | 8px;语义色(蓝/橙/绿)未受影响 |
| `(enterprise)/enterprise-overview` | 4 张卡片共删 15 行阴影(本批最多) | 已平;数据块仍可辨认 |
| `job-publish` | `card` 删 5 行阴影 | 已平;表单分区仍清晰 |
| `tools/skill-cloud` | 4 张卡由 14 → 8 | 8px;**注:行业 Tab 行存在既有的纵向裁切/重叠,与本批无关,未追** |
| `holland-result` | 渐变横幅 + 3 张类型卡 | 8px;内部序号圆标与标签胶囊**未误伤** |
| `resume/export` | 预览卡 / 格式卡 / 模板卡 | 8px;模板缩略图内框圆角独立,未被压平 |
**未实测**:`components/resume/EditKit.tsx`、`components/onboarding/ui/Modal.tsx`、
`components/onboarding/screens/P3Identity.tsx`、`LegalDocScreen` 的圆角改动只有代码级验证
(它们嵌在弹层/引导流/长文档里,深链直达需先走完前置流程),**未截图**。
#### 9. 本批次门槛复跑(2026-09-20 实测)
`tsc --noEmit` **0 错误** · `eslint .` **0 error / 0 warning** · `npm test`
**26 个文件 365 例全绿** · `check-routes` **0 失效跳转** · `check-affordances` **0 处** ·
`check:icons` **0 处无效图标名**(194 文件 / 1357 字形) · `check-backend-stubs` **140 个接口函数**。
#### 10. 本批次仍未做
- 第 7 条的 **116 条同名前缀样式**是否要纳入「卡片」口径(需产品/设计定夺,不擅自扩大)。
- 4.16 第 5/6 条的两项产品定夺(「良好」取色分歧、`'1年以内'` 死值)**状态不变**。
- 4.15/4.16 列的其余开放项**状态不变**(`companies` 全量 vs 抽样、`formatSalaryRange` 未下沉、
`chats: 8` 与测评勋章字面量、`CITIES` / `EXPECTED_CITY_OPTIONS` 两份词表有意保留、
数据层 `color: string` 未收紧)。
- **4.16 第七节列出的 A–E 五条重复声明发现**(skill-cloud 行业 Tab 6 选 3 有数据、
`GROUP_LABEL` ≡ `SKILL_GROUP_LABEL`、发岗表单选项表未上锁、「全部行业」同音异义、
jobs 页三个筛选 chip 落在假交互脚本盲区)**本批未实现**,已分析完,留待下一批。
---
## 五、后续增量开发建议(优先级)
- **P0(上架前必做)**:~~图标替换~~ **应用图标【已完成,`878710c`,1024×1024「有职」logo】** · ~~隐私 / 协议内容填充~~ **隐私/协议草案【已存在,含 18 岁门槛,待填【待确认】占位】** · ~~EAS 初始化~~ **EAS 配置骨架【已完成,`owner` / `projectId` 两处占位符阻塞 `eas build`,需 `eas init` 注入,详见 4.5】** · ~~18 岁门槛核对~~ **18 岁门槛【已在隐私政策第六章 + 用户协议前言落地】** · ~~微信登录接入评估~~ **微信登录接入评估【已完成 → 见 `微信登录接入方案.md`,SDK 接入阻塞于微信开放平台 AppID】** · ~~启动屏接线~~ **启动屏【已完成,`expo-splash-screen` + `splash-icon.png`,需出包验证】**。
- **P0(补充 · 2026-09-15 新发现)**:① ~~页脚服务热线 / 举报监督电话待填~~ **已填 `15154608969`**,且 **`SupportFooter` 已挂在 P1Login / P2QuickLogin 两页上,页脚实际渲染**(2026-09-20 复核;4.10 第 7 条那句「无消费者 / 缺页脚组件」已撤回,见 4.14 第 7 条);**隐私政策里【待确认】的客服电话应与之对齐**(同一个号,两处别填成两个)。② ~~缺「资质证照」页~~ **页面【已完成,见 4.10】—— 四层链路齐备(`src/types/qualification.ts` / `fetchQualifications` / `useQualifications` / `app/settings/qualifications.tsx`),设置页与「关于我们」页两处入口已恢复,三类证照的补图占位已逐张标明;**但证照的真实编号 / 发证机关 / 有效期 / 证照图仍全部待法务与资质方提供**(材料到位后只改 `MOCK_QUALIFICATIONS` 字段 + 更新测试断言),**未编造任何证件编号**。③ **注册引导链 + 简历导出的真机手工验证均未执行**(见 4.3 / 4.4 末条)。
- **P1(核心差异化)**:~~微信登录接入方案~~ **微信登录接入方案【已落文档,真实 SDK 接入阻塞于微信开放平台移动应用申请】** · ~~企业端快捷入口话术统一~~ **企业端快捷入口话术统一【已完成,6 处 label 对齐规范词;含沟通页快捷操作 onPress 接线,tsc/eslint 0 问题】** · ~~付费法律服务支付~~ **付费法律服务支付【已完成:mock 支付闭环,选套餐→结算→模拟支付→会员激活持久化,tsc/eslint 0 问题】** · ~~通关小游戏 7 关内容~~ **通关小游戏 7 关内容【已完成:结构原已建成,本次增厚至 7 关 22 题,tsc/eslint 0 问题】**。
- **P2(打磨)**:~~技术债清理~~ **技术债已清理(8 处 `any` → 明确类型,`eslint` 0 warning)** · ~~死控件清零~~ **死控件已清零(22 → 0,2026-09-17,见 4.8)** · ~~假交互清零~~ **假交互已清零(37 → 0,2026-09-18,**但 4.8 当时的「已完成」结论是错的,见 4.9 首条**)** · 真实后端对接 · OTA 通道验证。
- **P2(打磨)**:~~技术债清理~~ **技术债已清理(8 处 `any` → 明确类型,`eslint` 0 warning)** · ~~死控件清零~~ **死控件已清零(22 → 0,2026-09-17,见 4.8)** · ~~假交互清零~~ **假交互已清零(37 → 0,2026-09-18,**但 4.8 当时的「已完成」结论是错的,见 4.9 首条**)** · ~~卡片圆角统一 8px + 去阴影~~ **已完成(147 处圆角 + 54 行阴影,覆盖边界见 4.17;新增卡片须从 `src/theme` 出圆角常量这一层尚未建立)** · 真实后端对接 · OTA 通道验证。
- **P1(补充 · 2026-09-20 第三批,需产品定夺)**:① **「良好」这一档在个人页与其余五处取色不同** ——
`app/(tabs)/profile.tsx` 的 `DIMENSION_LEVEL.good.text` 是 `textSecondary`(灰),
而岗位评级那五处一律 `primary`(蓝)。两处不同屏、后果有限,故**未擅自统一**;

Loading…
Cancel
Save