Skip to content

Commit 8aa1e82

Browse files
Merge pull request #21 from javiera-vasquez/add-classic-resume-template
feat: Add classic resume and cover letter theme
2 parents 2375660 + 1ed8758 commit 8aa1e82

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1350
-115
lines changed

.claude/commands/tailor.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ After running this command, all subsequent interactions will:
5454
2. **Validate Metadata File**: Check that `metadata.yaml` exists in company folder
5555
3. **Read Pre-built Metadata**: Load complete metadata from `resume-data/tailor/$1/metadata.yaml`
5656
4. **Update State**: Copy entire metadata to `.claude/tailor-context.yaml` and update:
57-
- last_updated: Current timestamp (only field that changes)
57+
- last_updated: Current timestamp
58+
- active_company: Current Company
59+
- active_template: 'modern' or 'classic' default value is 'modern' - If user prompt to update the 'active_template' we need to update `tailor-context.yaml` and `metadata.yaml`
60+
- available_files: list of available files on `resume-data/tailor/$1/`
5861
5. **Provide Summary**: Display company context overview from loaded metadata
5962

6063
## Example Output:

.claude/tailor-context.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ available_files:
2323
- 'cover_letter.yaml'
2424

2525
# Timestamp when context was last updated (ISO format)
26-
last_updated: '2025-10-06T17:36:00Z'
26+
last_updated: '2025-10-07T16:00:00Z'
2727

2828
# ========== OPTIONAL DISPLAY CACHE ==========
2929
# Cached information from metadata.yaml for quick display

CHANGELOG.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.8.3] - 2025-10-07
11+
12+
### Added
13+
14+
- **Classic Theme**: New professional resume and cover letter theme with clean, traditional layout
15+
- **Theme Components**: Complete component set for classic theme (Header, Summary, Experience, Education, Skills, Languages, Additional, Contact)
16+
- **Cover Letter Components**: Classic theme cover letter with Header, Title, DateLine, Body, and Signature components
17+
- **Single-Column Layout**: Simplified resume structure with improved visual hierarchy
18+
19+
### Changed
20+
21+
- **Design Token System**: Unified token imports across all templates for better consistency
22+
- **Theme Initialization**: Updated to prioritize `active_template` from metadata, defaulting to 'modern'
23+
- **PDF Viewer**: Enhanced key generation to include theme and document type for proper re-renders
24+
- **Tailor Command**: Expanded metadata management with `active_company`, `active_template`, and `available_files` fields
25+
- **UI Simplification**: Removed theme selector dropdown from Header component
26+
27+
### Improved
28+
29+
- **Component Organization**: Better structured classic theme components with Summary and Additional sections
30+
- **Design Tokens**: Enhanced token structure for improved styling consistency and maintainability
31+
- **Styling System**: Consolidated color management using modern design tokens in PDF wrapper
32+
- **Metadata Tracking**: Streamlined template management with automatic timestamp updates
33+
34+
### Removed
35+
36+
- **Template Configuration**: Removed redundant template section from metadata.yaml
37+
- **Unused Logic**: Cleaned up contact formatting code from Header component
38+
- **UI Elements**: Removed manual theme selector in favor of metadata-driven theme selection
39+
1040
## [0.8.2] - 2025-10-07
1141

1242
### Added

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
Claude-powered resume generator that treats your career as structured data. Write your experience once in YAML files, then automatically generate tailored PDF cover letters and resumes optimized for any job posting using Claude Code.
99

10-
![Tailor in action!](https://s6.imgcdn.dev/Yitx9N.gif)
10+
![Tailor in action!](https://s6.imgcdn.dev/YnKNew.gif)
1111

1212
**Example Usage:**
1313

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"version": "0.8.2",
2+
"version": "0.8.3",
33
"dependencies": {
44
"@radix-ui/react-select": "^2.2.6",
55
"@radix-ui/react-separator": "^1.1.7",

resume-data/mapping-rules/metadata.yaml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -136,18 +136,6 @@ transformation_rules:
136136
target: 'metadata.job_details.user_scale'
137137
description: 'Extract scale information about users/impact'
138138

139-
# Template configuration
140-
template_configuration:
141-
- source: 'metadata.active_template'
142-
target: 'metadata.active_template'
143-
default: 'modern'
144-
description: 'Template/theme to use for PDF generation'
145-
validation_logic: |
146-
1. Check if active_template is provided in metadata
147-
2. Validate against available themes in src/templates/
148-
3. Default to 'modern' if not specified or invalid
149-
4. Must match theme IDs in themes registry
150-
151139
# Timestamp
152140
timestamp_generation:
153141
- source: 'current_date'

src/data/application.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// @ts-nocheck
22
// Auto-generated application data - TypeScript validation disabled
33
// Company: tech-corp
4-
// Generated at: 2025-10-07T08:41:31.926Z
4+
// Generated at: 2025-10-07T12:08:20.383Z
55

66
import type { ApplicationData } from '@types';
77

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import React from 'react';
2+
import { Text, View, StyleSheet } from '@react-pdf/renderer';
3+
import { tokens } from '@template-core/design-tokens';
4+
import type { CoverLetterSchema } from '@types';
5+
6+
const { colors, spacing } = tokens.classic;
7+
8+
const styles = StyleSheet.create({
9+
bodyContainer: {
10+
flexDirection: 'column',
11+
marginBottom: spacing.pagePadding / 2,
12+
},
13+
paragraph: {
14+
fontSize: 10,
15+
fontFamily: 'Lato',
16+
color: colors.primary,
17+
marginBottom: spacing.pagePadding / 3,
18+
lineHeight: 1.5,
19+
},
20+
});
21+
22+
const Body = ({ data }: { data: CoverLetterSchema }) => {
23+
return (
24+
<View style={styles.bodyContainer}>
25+
<Text style={styles.paragraph}>{data.content.opening_line}</Text>
26+
{data.content.body.map((paragraph, index) => (
27+
<Text key={index} style={styles.paragraph}>
28+
{paragraph}
29+
</Text>
30+
))}
31+
</View>
32+
);
33+
};
34+
35+
export default Body;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React from 'react';
2+
import { Text, View, StyleSheet } from '@react-pdf/renderer';
3+
import { tokens } from '@template-core/design-tokens';
4+
import type { CoverLetterSchema } from '@types';
5+
6+
const { colors, spacing } = tokens.classic;
7+
8+
const styles = StyleSheet.create({
9+
dateContainer: {
10+
flexDirection: 'row',
11+
marginBottom: spacing.pagePadding * 1.5,
12+
},
13+
dateText: {
14+
fontSize: 9,
15+
fontFamily: 'Lato',
16+
color: colors.mediumGray,
17+
},
18+
});
19+
20+
const DateLine = ({ data }: { data: CoverLetterSchema }) => (
21+
<View style={styles.dateContainer}>
22+
<Text style={styles.dateText}>{data.date}</Text>
23+
</View>
24+
);
25+
26+
export default DateLine;
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import React from 'react';
2+
import { Text, View, StyleSheet, Link } from '@react-pdf/renderer';
3+
import { tokens } from '@template-core/design-tokens';
4+
import type { CoverLetterSchema } from '@types';
5+
6+
const { colors, spacing } = tokens.classic;
7+
8+
const styles = StyleSheet.create({
9+
headerContainer: {
10+
flexDirection: 'row',
11+
justifyContent: 'space-between',
12+
alignItems: 'flex-start',
13+
marginBottom: spacing.pagePadding / 2, // Reduced spacing to account for separator
14+
width: '100%',
15+
},
16+
separatorLine: {
17+
borderBottom: `1px solid ${colors.separatorGray}`,
18+
marginBottom: spacing.pagePadding / 2, // Space after separator
19+
width: '100%',
20+
},
21+
companyArea: {
22+
flexDirection: 'column',
23+
alignItems: 'flex-start',
24+
},
25+
companyName: {
26+
fontSize: 9,
27+
fontFamily: 'Lato Bold',
28+
color: colors.darkGray,
29+
},
30+
contactArea: {
31+
flexDirection: 'column',
32+
alignItems: 'flex-end',
33+
textAlign: 'right',
34+
},
35+
contactName: {
36+
fontSize: 9,
37+
fontFamily: 'Lato',
38+
lineHeight: 1.44,
39+
color: colors.darkGray,
40+
},
41+
contactDetails: {
42+
fontFamily: 'Lato',
43+
fontSize: 9,
44+
lineHeight: 1.44,
45+
color: colors.mediumGray,
46+
},
47+
});
48+
49+
const Header = ({ data }: { data: CoverLetterSchema }) => (
50+
<View>
51+
<View style={styles.headerContainer}>
52+
<View style={styles.companyArea}>
53+
<Text style={styles.companyName}>{data.company}</Text>
54+
</View>
55+
56+
<View style={styles.contactArea}>
57+
<Text style={styles.contactName}>{data.personal_info.name}</Text>
58+
<Text style={styles.contactDetails}>{data.personal_info.address}</Text>
59+
<Text style={styles.contactDetails}>
60+
<Link style={styles.contactDetails} src={data.personal_info.email}>
61+
{data.personal_info.email}
62+
</Link>
63+
</Text>
64+
<Text style={styles.contactDetails}>{data.personal_info.phone}</Text>
65+
</View>
66+
</View>
67+
{/* Separator line to match mockup */}
68+
<View style={styles.separatorLine} />
69+
</View>
70+
);
71+
72+
export default Header;

0 commit comments

Comments
 (0)