Skip to content

Commit ace19ac

Browse files
authored
refactor(resume): 회사 단위 페이지 나눔 및 고아 헤더 방지 (#185)
* feat(resume): 이력서 PDF를 미니멀 타이포 디자인으로 개편 - 섹션 헤더를 대문자 letterspaced 라벨 + 헤어라인으로 변경 - 테크 스택 인라인 표기, 링크·연락처 모노톤 정리 - 성과는 파란 점 마커로 표시, 강조는 검은 볼드로 통일 - 회사 계층 강화(회사명 확대 + 구분선)와 페이지 경계 처리 - 좌우 여백 축소로 밀도 개선 * refactor(resume): 회사 단위 페이지 나눔 및 고아 헤더 방지 - 회사 블록을 break로 분리해 회사마다 새 페이지에서 시작 - 페이지 나눔이 구분을 대신하므로 회사 구분선 제거 - 프로젝트 제목·테크·첫 태스크를 wrap 불가 단위로 묶어 페이지 바닥 고아 헤더 방지
1 parent bda245e commit ace19ac

1 file changed

Lines changed: 23 additions & 19 deletions

File tree

‎src/components/ResumePdf.tsx‎

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,6 @@ const s = StyleSheet.create({
7474
skillList: { flex: 1, fontSize: 8.5, color: colors.secondary },
7575
// Company
7676
companyOuterFirst: { marginTop: 6 },
77-
companyOuter: { marginTop: 18 },
78-
companyIntro: {},
79-
companyIntroDivided: { paddingTop: 16, borderTopWidth: 1, borderTopColor: colors.border },
8077
companyHeader: { flexDirection: "row", justifyContent: "space-between", alignItems: "baseline", marginBottom: 3 },
8178
companyName: { fontSize: 13, fontWeight: 700, letterSpacing: -0.2 },
8279
companyPeriod: { fontSize: 8.5, color: colors.muted },
@@ -124,14 +121,31 @@ function BoldText({ style, children }: { style: Styles[string]; children: string
124121
)
125122
}
126123

124+
function TaskGroup({ task }: { task: (typeof PROJECTS)[number]["tasks"][number] }) {
125+
return (
126+
<View style={s.taskGroup} wrap={false}>
127+
<View style={s.taskRow}>
128+
<Text style={s.taskBullet}>·</Text>
129+
<BoldText style={s.taskItem}>{task.content}</BoldText>
130+
</View>
131+
{task.details?.map((detail, j) => (
132+
<View key={j} style={s.detailRow}>
133+
<Text style={s.detailArrow}>→</Text>
134+
<BoldText style={s.detailItem}>{detail}</BoldText>
135+
</View>
136+
))}
137+
</View>
138+
)
139+
}
140+
127141
function CompanySection({ company, isFirst }: { company: Company; isFirst: boolean }) {
128142
const companyProjects = company.projects
129143
.map((ps) => PROJECTS.find((p) => p.slug === ps.slug))
130144
.filter(Boolean)
131145

132146
return (
133-
<View style={isFirst ? s.companyOuterFirst : s.companyOuter}>
134-
<View wrap={false} minPresenceAhead={80} style={isFirst ? s.companyIntro : s.companyIntroDivided}>
147+
<View break={!isFirst} style={isFirst ? s.companyOuterFirst : undefined}>
148+
<View wrap={false} minPresenceAhead={80}>
135149
<View style={s.companyHeader}>
136150
<Text style={s.companyName}>{company.name}</Text>
137151
<Text style={s.companyPeriod}>{company.period}</Text>
@@ -141,23 +155,13 @@ function CompanySection({ company, isFirst }: { company: Company; isFirst: boole
141155

142156
{companyProjects.map((project) => (
143157
<View key={project!.slug} style={s.projectBox}>
144-
<View wrap={false} minPresenceAhead={50}>
158+
<View wrap={false}>
145159
<Text style={s.projectName}>{project!.name}</Text>
146160
<Text style={s.techInline}>{project!.tech.join(" · ")}</Text>
161+
{project!.tasks[0] && <TaskGroup task={project!.tasks[0]} />}
147162
</View>
148-
{project!.tasks.map((task, i) => (
149-
<View key={i} style={s.taskGroup} wrap={false}>
150-
<View style={s.taskRow}>
151-
<Text style={s.taskBullet}>·</Text>
152-
<BoldText style={s.taskItem}>{task.content}</BoldText>
153-
</View>
154-
{task.details?.map((detail, j) => (
155-
<View key={j} style={s.detailRow}>
156-
<Text style={s.detailArrow}>→</Text>
157-
<BoldText style={s.detailItem}>{detail}</BoldText>
158-
</View>
159-
))}
160-
</View>
163+
{project!.tasks.slice(1).map((task, i) => (
164+
<TaskGroup key={i} task={task} />
161165
))}
162166
{project!.achievements && project!.achievements.length > 0 && (
163167
<View style={s.achGroup}>

0 commit comments

Comments
 (0)