simple-resume 0.1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. simple_resume/__init__.py +132 -0
  2. simple_resume/core/__init__.py +47 -0
  3. simple_resume/core/colors.py +215 -0
  4. simple_resume/core/config.py +672 -0
  5. simple_resume/core/constants/__init__.py +207 -0
  6. simple_resume/core/constants/colors.py +98 -0
  7. simple_resume/core/constants/files.py +28 -0
  8. simple_resume/core/constants/layout.py +58 -0
  9. simple_resume/core/dependencies.py +258 -0
  10. simple_resume/core/effects.py +154 -0
  11. simple_resume/core/exceptions.py +261 -0
  12. simple_resume/core/file_operations.py +68 -0
  13. simple_resume/core/generate/__init__.py +21 -0
  14. simple_resume/core/generate/exceptions.py +69 -0
  15. simple_resume/core/generate/html.py +233 -0
  16. simple_resume/core/generate/pdf.py +659 -0
  17. simple_resume/core/generate/plan.py +131 -0
  18. simple_resume/core/hydration.py +55 -0
  19. simple_resume/core/importers/__init__.py +3 -0
  20. simple_resume/core/importers/json_resume.py +284 -0
  21. simple_resume/core/latex/__init__.py +60 -0
  22. simple_resume/core/latex/context.py +56 -0
  23. simple_resume/core/latex/conversion.py +227 -0
  24. simple_resume/core/latex/escaping.py +68 -0
  25. simple_resume/core/latex/fonts.py +93 -0
  26. simple_resume/core/latex/formatting.py +81 -0
  27. simple_resume/core/latex/sections.py +218 -0
  28. simple_resume/core/latex/types.py +84 -0
  29. simple_resume/core/markdown.py +127 -0
  30. simple_resume/core/models.py +102 -0
  31. simple_resume/core/palettes/__init__.py +38 -0
  32. simple_resume/core/palettes/common.py +73 -0
  33. simple_resume/core/palettes/data/default_palettes.json +58 -0
  34. simple_resume/core/palettes/exceptions.py +33 -0
  35. simple_resume/core/palettes/fetch_types.py +52 -0
  36. simple_resume/core/palettes/generators.py +137 -0
  37. simple_resume/core/palettes/registry.py +76 -0
  38. simple_resume/core/palettes/resolution.py +123 -0
  39. simple_resume/core/palettes/sources.py +162 -0
  40. simple_resume/core/paths.py +21 -0
  41. simple_resume/core/protocols.py +134 -0
  42. simple_resume/core/py.typed +0 -0
  43. simple_resume/core/render/__init__.py +37 -0
  44. simple_resume/core/render/manage.py +199 -0
  45. simple_resume/core/render/plan.py +405 -0
  46. simple_resume/core/result.py +226 -0
  47. simple_resume/core/resume.py +609 -0
  48. simple_resume/core/skills.py +60 -0
  49. simple_resume/core/validation.py +321 -0
  50. simple_resume/py.typed +0 -0
  51. simple_resume/shell/__init__.py +3 -0
  52. simple_resume/shell/assets/static/css/README.md +213 -0
  53. simple_resume/shell/assets/static/css/common.css +641 -0
  54. simple_resume/shell/assets/static/css/fonts.css +42 -0
  55. simple_resume/shell/assets/static/css/preview.css +82 -0
  56. simple_resume/shell/assets/static/css/print.css +99 -0
  57. simple_resume/shell/assets/static/fonts/AvenirLTStd-Book.otf +0 -0
  58. simple_resume/shell/assets/static/fonts/AvenirLTStd-Light.otf +0 -0
  59. simple_resume/shell/assets/static/fonts/AvenirLTStd-Medium.otf +0 -0
  60. simple_resume/shell/assets/static/fonts/AvenirLTStd-Oblique.otf +0 -0
  61. simple_resume/shell/assets/static/fonts/AvenirLTStd-Roman.otf +0 -0
  62. simple_resume/shell/assets/static/fonts/fontawesome/Font Awesome 6 Brands-Regular-400.otf +0 -0
  63. simple_resume/shell/assets/static/fonts/fontawesome/Font Awesome 6 Free-Solid-900.otf +0 -0
  64. simple_resume/shell/assets/static/images/default_profile_1.jpg +0 -0
  65. simple_resume/shell/assets/static/images/default_profile_2.png +0 -0
  66. simple_resume/shell/assets/static/schema.json +236 -0
  67. simple_resume/shell/assets/static/themes/README.md +208 -0
  68. simple_resume/shell/assets/static/themes/bold.yaml +64 -0
  69. simple_resume/shell/assets/static/themes/classic.yaml +64 -0
  70. simple_resume/shell/assets/static/themes/executive.yaml +64 -0
  71. simple_resume/shell/assets/static/themes/minimal.yaml +64 -0
  72. simple_resume/shell/assets/static/themes/modern.yaml +64 -0
  73. simple_resume/shell/assets/templates/html/cover.html +129 -0
  74. simple_resume/shell/assets/templates/html/demo.html +13 -0
  75. simple_resume/shell/assets/templates/html/resume_base.html +453 -0
  76. simple_resume/shell/assets/templates/html/resume_no_bars.html +316 -0
  77. simple_resume/shell/assets/templates/html/resume_with_bars.html +362 -0
  78. simple_resume/shell/cli/__init__.py +35 -0
  79. simple_resume/shell/cli/main.py +975 -0
  80. simple_resume/shell/cli/palette.py +75 -0
  81. simple_resume/shell/cli/random_palette_demo.py +407 -0
  82. simple_resume/shell/config.py +96 -0
  83. simple_resume/shell/effect_executor.py +211 -0
  84. simple_resume/shell/file_opener.py +308 -0
  85. simple_resume/shell/generate/__init__.py +37 -0
  86. simple_resume/shell/generate/core.py +650 -0
  87. simple_resume/shell/generate/lazy.py +284 -0
  88. simple_resume/shell/io_utils.py +199 -0
  89. simple_resume/shell/palettes/__init__.py +1 -0
  90. simple_resume/shell/palettes/fetch.py +63 -0
  91. simple_resume/shell/palettes/loader.py +321 -0
  92. simple_resume/shell/palettes/remote.py +179 -0
  93. simple_resume/shell/pdf_executor.py +52 -0
  94. simple_resume/shell/py.typed +0 -0
  95. simple_resume/shell/render/__init__.py +1 -0
  96. simple_resume/shell/render/latex.py +308 -0
  97. simple_resume/shell/render/operations.py +240 -0
  98. simple_resume/shell/resume_extensions.py +737 -0
  99. simple_resume/shell/runtime/__init__.py +7 -0
  100. simple_resume/shell/runtime/content.py +190 -0
  101. simple_resume/shell/runtime/generate.py +497 -0
  102. simple_resume/shell/runtime/lazy.py +138 -0
  103. simple_resume/shell/runtime/lazy_import.py +173 -0
  104. simple_resume/shell/service_locator.py +80 -0
  105. simple_resume/shell/services.py +256 -0
  106. simple_resume/shell/session/__init__.py +6 -0
  107. simple_resume/shell/session/config.py +35 -0
  108. simple_resume/shell/session/manage.py +386 -0
  109. simple_resume/shell/strategies.py +181 -0
  110. simple_resume/shell/themes/__init__.py +35 -0
  111. simple_resume/shell/themes/loader.py +230 -0
  112. simple_resume-0.1.9.dist-info/METADATA +201 -0
  113. simple_resume-0.1.9.dist-info/RECORD +116 -0
  114. simple_resume-0.1.9.dist-info/WHEEL +4 -0
  115. simple_resume-0.1.9.dist-info/entry_points.txt +5 -0
  116. simple_resume-0.1.9.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Web Preview Styles for Simple Resume
3
+ *
4
+ * Enhancements for web browser preview mode.
5
+ * These styles make the resume look better in a browser context.
6
+ */
7
+
8
+ /* ========================================================================
9
+ PREVIEW FRAME
10
+ ======================================================================== */
11
+
12
+ /* The frame wraps the page when in preview mode */
13
+ .frame {
14
+ /* Add subtle shadow for depth */
15
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
16
+
17
+ /* Center the preview */
18
+ margin: 20px auto;
19
+
20
+ /* Ensure it doesn't stretch too wide */
21
+ max-width: fit-content;
22
+ }
23
+
24
+ /* ========================================================================
25
+ BROWSER-SPECIFIC ENHANCEMENTS
26
+ ======================================================================== */
27
+
28
+ /* Smooth font rendering in browsers */
29
+ body {
30
+ -webkit-font-smoothing: antialiased;
31
+ -moz-osx-font-smoothing: grayscale;
32
+ }
33
+
34
+ /* Interactive elements */
35
+ a:hover {
36
+ opacity: 0.8;
37
+ }
38
+
39
+ /* ========================================================================
40
+ SCROLLING & VIEWPORT
41
+ ======================================================================== */
42
+
43
+ /* Ensure smooth scrolling */
44
+ html {
45
+ scroll-behavior: smooth;
46
+ }
47
+
48
+ /* Add some breathing room */
49
+ body {
50
+ padding: 20px 0;
51
+ min-height: 100vh;
52
+ }
53
+
54
+ /* ========================================================================
55
+ RESPONSIVE PREVIEW
56
+ ======================================================================== */
57
+
58
+ @media screen and (max-width: 250mm) {
59
+ .frame {
60
+ /* Scale down for smaller screens */
61
+ transform-origin: top center;
62
+ margin: 10px auto;
63
+ }
64
+
65
+ body {
66
+ padding: 10px;
67
+ overflow-x: auto;
68
+ }
69
+ }
70
+
71
+ /* ========================================================================
72
+ DEBUG HELPERS (development only)
73
+ ======================================================================== */
74
+
75
+ /*
76
+ * Uncomment these for debugging layout issues:
77
+ *
78
+ * .sidebar { outline: 1px solid red; }
79
+ * .body { outline: 1px solid blue; }
80
+ * .content { outline: 1px solid green; }
81
+ * .description-container { outline: 1px solid orange; }
82
+ */
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Print/PDF Styles for Simple Resume
3
+ *
4
+ * PDF-specific styles and WeasyPrint workarounds.
5
+ * Used for PDF generation via WeasyPrint.
6
+ *
7
+ * Note: @page size is dynamically set via inline CSS for each resume
8
+ * based on resume_config values. This file contains base print rules.
9
+ */
10
+
11
+ /* ========================================================================
12
+ PAGE RULES
13
+ ======================================================================== */
14
+
15
+ @page {
16
+ /* Base page rule - actual size is set dynamically via inline CSS */
17
+ margin: 0;
18
+ }
19
+
20
+ @page resume {
21
+ /* Named page for resume content flow */
22
+ margin: 0;
23
+ }
24
+
25
+ /* ========================================================================
26
+ PRINT-SPECIFIC LAYOUT
27
+ ======================================================================== */
28
+
29
+ @media print {
30
+ html, body {
31
+ margin: 0 !important;
32
+ padding: 0 !important;
33
+ }
34
+
35
+ .page {
36
+ page-break-after: always;
37
+ page-break-inside: avoid;
38
+ }
39
+
40
+ /* Ensure sidebar flows across pages properly */
41
+ .sidebar-container {
42
+ page-break-inside: auto;
43
+ break-inside: auto;
44
+ }
45
+
46
+ /* Prevent orphan headings */
47
+ h2, h3 {
48
+ page-break-after: avoid;
49
+ }
50
+
51
+ /* Keep content blocks together when possible */
52
+ .content {
53
+ page-break-inside: auto;
54
+ }
55
+
56
+ .description-container {
57
+ page-break-inside: auto;
58
+ }
59
+
60
+ /* Section headings should not be separated from content */
61
+ .section-heading {
62
+ page-break-after: avoid;
63
+ }
64
+ }
65
+
66
+ /* ========================================================================
67
+ WEASYPRINT WORKAROUNDS
68
+ ======================================================================== */
69
+
70
+ /*
71
+ * WeasyPrint has some CSS limitations. Document known issues here.
72
+ *
73
+ * Known issues:
74
+ * - calc() with CSS variables can be unreliable in some contexts
75
+ * - Some flexbox edge cases may render differently than browsers
76
+ * - @font-face src: format() hint is optional but recommended
77
+ *
78
+ * Workarounds applied:
79
+ * - Use explicit dimensions where possible instead of calc()
80
+ * - Test all flexbox layouts thoroughly
81
+ * - Font paths use relative URLs from template location
82
+ */
83
+
84
+ /* Ensure proper box-sizing for WeasyPrint */
85
+ *, *::before, *::after {
86
+ box-sizing: border-box;
87
+ }
88
+
89
+ /* WeasyPrint handles background gradients well, but explicit sizing helps */
90
+ .page {
91
+ -webkit-print-color-adjust: exact;
92
+ print-color-adjust: exact;
93
+ }
94
+
95
+ /* Ensure SVG icons render properly in PDF */
96
+ .icon svg,
97
+ .icon-inline svg {
98
+ overflow: visible;
99
+ }
@@ -0,0 +1,236 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://athola.github.io/simple-resume/schema.json",
4
+ "title": "simple-resume YAML schema",
5
+ "description": "JSON Schema for simple-resume YAML/JSON inputs. Use this schema in YAML editors (e.g., VS Code YAML extension) for autocomplete and validation.",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "required": ["full_name", "email", "config"],
9
+ "properties": {
10
+ "template": {
11
+ "description": "Template to render with. Known templates are provided, but custom templates are allowed.",
12
+ "anyOf": [
13
+ {"enum": ["resume_no_bars", "resume_with_bars", "demo"]},
14
+ {"type": "string", "pattern": "^[A-Za-z0-9_-]+$"}
15
+ ],
16
+ "default": "resume_no_bars"
17
+ },
18
+ "theme": {
19
+ "description": "Optional named theme. Theme config is merged into config as defaults.",
20
+ "type": "string",
21
+ "enum": ["classic", "bold", "minimal", "modern", "executive"]
22
+ },
23
+ "full_name": {"type": "string"},
24
+ "email": {"type": "string", "format": "email"},
25
+ "job_title": {"type": "string"},
26
+ "phone": {"type": "string"},
27
+ "web": {"type": "string"},
28
+ "linkedin": {"type": "string"},
29
+ "github": {"type": "string"},
30
+ "image_uri": {"type": "string"},
31
+ "image_link": {"type": "string"},
32
+ "headline": {"type": "string"},
33
+ "description": {"type": "string", "description": "Markdown-supported pitch/summary."},
34
+ "address": {"type": "array", "items": {"type": "string"}},
35
+
36
+ "titles": {
37
+ "type": "object",
38
+ "description": "Optional label overrides used by templates.",
39
+ "additionalProperties": {"type": "string"}
40
+ },
41
+
42
+ "expertise": {"type": "array", "items": {"type": "string"}},
43
+ "certification": {"type": "array", "items": {"type": "string"}},
44
+ "keyskills": {"type": "array", "items": {"type": "string"}},
45
+
46
+ "skills": {
47
+ "description": "Sidebar skills with proficiency values (0-100).",
48
+ "type": "object",
49
+ "additionalProperties": {"type": "number"}
50
+ },
51
+
52
+ "languages": {
53
+ "description": "Sidebar languages with proficiency values (0-100).",
54
+ "type": "object",
55
+ "additionalProperties": {"type": "number"}
56
+ },
57
+
58
+ "body": {
59
+ "description": "Main resume sections. Each key is a section heading, mapped to a list of entries.",
60
+ "type": "object",
61
+ "additionalProperties": {
62
+ "type": "array",
63
+ "items": {"$ref": "#/$defs/bodyEntry"}
64
+ }
65
+ },
66
+
67
+ "config": {"$ref": "#/$defs/config"},
68
+
69
+ "meta": {
70
+ "type": "object",
71
+ "description": "Internal metadata (e.g., palette metadata).",
72
+ "additionalProperties": true
73
+ }
74
+ },
75
+
76
+ "$defs": {
77
+ "hexColor": {
78
+ "type": "string",
79
+ "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$",
80
+ "examples": ["#0395DE", "#FFF"]
81
+ },
82
+
83
+ "dimension": {
84
+ "description": "A numeric value (number/int) or a string with optional units (e.g., '8.6mm').",
85
+ "anyOf": [
86
+ {"type": "number"},
87
+ {"type": "integer"},
88
+ {"type": "string", "pattern": "^-?\\d+(?:\\.\\d+)?(?:mm|pt|px)?$"}
89
+ ]
90
+ },
91
+
92
+ "bodyEntry": {
93
+ "type": "object",
94
+ "additionalProperties": true,
95
+ "properties": {
96
+ "start": {"type": ["string", "number"]},
97
+ "end": {"type": ["string", "number"]},
98
+ "title": {"type": "string"},
99
+ "title_link": {"type": "string"},
100
+ "company": {"type": "string"},
101
+ "company_link": {"type": "string"},
102
+ "description": {"type": "string"},
103
+ "tech_stack": {
104
+ "description": "Optional list of technologies.",
105
+ "type": "array",
106
+ "items": {"type": "string"}
107
+ }
108
+ }
109
+ },
110
+
111
+ "palette": {
112
+ "type": "object",
113
+ "additionalProperties": true,
114
+ "properties": {
115
+ "source": {"type": "string", "description": "Palette source (e.g., 'registry', 'generator', 'remote', or direct colors)."},
116
+ "name": {"type": "string"},
117
+ "type": {"type": "string", "description": "Generator type (e.g., 'hcl')."},
118
+ "colors": {"type": "array", "items": {"$ref": "#/$defs/hexColor"}},
119
+ "size": {"type": "integer", "minimum": 1},
120
+ "seed": {"type": "integer"},
121
+ "hue_range": {
122
+ "type": "array",
123
+ "items": {"type": "number"},
124
+ "minItems": 2,
125
+ "maxItems": 2
126
+ },
127
+ "luminance_range": {
128
+ "type": "array",
129
+ "items": {"type": "number"},
130
+ "minItems": 2,
131
+ "maxItems": 2
132
+ },
133
+ "chroma": {"type": "number"},
134
+ "keywords": {"type": "array", "items": {"type": "string"}},
135
+ "num_results": {"type": "integer", "minimum": 1},
136
+ "order_by": {"type": "string"}
137
+ }
138
+ },
139
+
140
+ "config": {
141
+ "type": "object",
142
+ "description": "Rendering configuration. Most fields are optional; defaults are applied by simple-resume.",
143
+ "additionalProperties": true,
144
+ "properties": {
145
+ "template": {
146
+ "description": "Template override (used by core planning); usually matches top-level template.",
147
+ "anyOf": [
148
+ {"enum": ["resume_no_bars", "resume_with_bars", "demo"]},
149
+ {"type": "string", "pattern": "^[A-Za-z0-9_-]+$"}
150
+ ],
151
+ "default": "resume_no_bars"
152
+ },
153
+ "output_mode": {
154
+ "type": "string",
155
+ "enum": ["markdown", "latex"],
156
+ "default": "markdown"
157
+ },
158
+ "color_scheme": {
159
+ "type": "string",
160
+ "description": "Palette name (e.g., 'Professional Blue') or 'generator ...' shorthand.",
161
+ "default": "default"
162
+ },
163
+ "theme": {
164
+ "description": "Theme name (alternative location to top-level theme).",
165
+ "type": "string",
166
+ "enum": ["classic", "bold", "minimal", "modern", "executive"]
167
+ },
168
+
169
+ "palette": {"$ref": "#/$defs/palette"},
170
+
171
+ "page_width": {"$ref": "#/$defs/dimension", "default": 210},
172
+ "page_height": {"$ref": "#/$defs/dimension", "default": 297},
173
+ "sidebar_width": {"$ref": "#/$defs/dimension", "default": 65},
174
+
175
+ "padding": {"$ref": "#/$defs/dimension", "default": 12},
176
+ "sidebar_padding_left": {"$ref": "#/$defs/dimension", "default": 10},
177
+ "sidebar_padding_right": {"$ref": "#/$defs/dimension", "default": 10},
178
+ "sidebar_padding_top": {"$ref": "#/$defs/dimension", "default": 0},
179
+ "sidebar_padding_bottom": {"$ref": "#/$defs/dimension", "default": 12},
180
+
181
+ "pitch_padding_top": {"$ref": "#/$defs/dimension", "default": 10},
182
+ "pitch_padding_bottom": {"$ref": "#/$defs/dimension", "default": 8},
183
+ "pitch_padding_left": {"$ref": "#/$defs/dimension", "default": 6},
184
+
185
+ "h2_padding_left": {"$ref": "#/$defs/dimension", "default": 6},
186
+ "h2_padding_top": {"$ref": "#/$defs/dimension", "default": 8},
187
+ "h3_padding_top": {"$ref": "#/$defs/dimension", "default": 7},
188
+
189
+ "section_heading_margin_top": {"$ref": "#/$defs/dimension", "default": 7},
190
+ "section_heading_margin_bottom": {"$ref": "#/$defs/dimension", "default": 1},
191
+ "section_heading_text_margin": {"$ref": "#/$defs/dimension", "default": -6},
192
+ "section_icon_design_scale": {"$ref": "#/$defs/dimension", "default": 1},
193
+ "entry_margin_bottom": {"$ref": "#/$defs/dimension", "default": 4},
194
+ "tech_stack_margin_bottom": {"$ref": "#/$defs/dimension", "default": 2},
195
+
196
+ "section_icon_circle_size": {"$ref": "#/$defs/dimension", "default": 7.8},
197
+ "section_icon_circle_x_offset": {"$ref": "#/$defs/dimension", "default": 0},
198
+ "section_icon_design_size": {"$ref": "#/$defs/dimension", "default": 3.5},
199
+ "section_icon_design_x_offset": {"$ref": "#/$defs/dimension", "default": 0},
200
+ "section_icon_design_y_offset": {"$ref": "#/$defs/dimension", "default": 0},
201
+
202
+ "date_container_width": {"$ref": "#/$defs/dimension", "default": 15},
203
+ "date_container_padding_left": {"$ref": "#/$defs/dimension"},
204
+ "description_container_padding_left": {"$ref": "#/$defs/dimension", "default": 4},
205
+ "skill_container_padding_top": {"$ref": "#/$defs/dimension", "default": 3},
206
+ "skill_spacer_padding_top": {"$ref": "#/$defs/dimension", "default": 3},
207
+ "profile_image_padding_bottom": {"$ref": "#/$defs/dimension", "default": 8},
208
+
209
+ "frame_padding": {"$ref": "#/$defs/dimension", "default": 15},
210
+
211
+ "cover_padding_top": {"$ref": "#/$defs/dimension", "default": 15},
212
+ "cover_padding_bottom": {"$ref": "#/$defs/dimension", "default": 15},
213
+ "cover_padding_h": {"$ref": "#/$defs/dimension", "default": 20},
214
+
215
+ "contact_icon_size": {"$ref": "#/$defs/dimension", "default": 5},
216
+ "contact_icon_margin_top": {"$ref": "#/$defs/dimension", "default": 0.5},
217
+ "contact_text_padding_left": {"$ref": "#/$defs/dimension", "default": 2},
218
+
219
+ "bold_font_weight": {"type": "integer", "default": 600},
220
+ "description_font_size": {"$ref": "#/$defs/dimension", "default": 8.5},
221
+ "date_font_size": {"$ref": "#/$defs/dimension", "default": 9},
222
+ "sidebar_font_size": {"$ref": "#/$defs/dimension", "default": 8.5},
223
+
224
+ "theme_color": {"$ref": "#/$defs/hexColor", "default": "#0395DE"},
225
+ "sidebar_color": {"$ref": "#/$defs/hexColor", "default": "#F6F6F6"},
226
+ "sidebar_text_color": {"$ref": "#/$defs/hexColor", "default": "#000000"},
227
+ "bar_background_color": {"$ref": "#/$defs/hexColor", "default": "#DFDFDF"},
228
+ "date2_color": {"$ref": "#/$defs/hexColor", "default": "#616161"},
229
+ "frame_color": {"$ref": "#/$defs/hexColor", "default": "#757575"},
230
+ "heading_icon_color": {"$ref": "#/$defs/hexColor", "default": "#0395DE"},
231
+ "bold_color": {"$ref": "#/$defs/hexColor", "default": "#585858"},
232
+ "sidebar_bold_color": {"$ref": "#/$defs/hexColor"}
233
+ }
234
+ }
235
+ }
236
+ }
@@ -0,0 +1,208 @@
1
+ # Theme Gallery for Simple Resume
2
+
3
+ This directory contains pre-built theme presets that you can use as-is or customize to create your own unique resume style.
4
+
5
+ ## Available Themes
6
+
7
+ | Theme | Description | Best For |
8
+ |-------|-------------|----------|
9
+ | **modern** | Clean, contemporary design with soft blue-gray tones | Tech, startups, creative roles |
10
+ | **classic** | Traditional professional design with navy/burgundy | Finance, law, consulting |
11
+ | **bold** | High-contrast with vibrant accents | Design, marketing, standout applications |
12
+ | **minimal** | Light and airy with maximum whitespace | Academic, research, writing |
13
+ | **executive** | Sophisticated dark with gold accents | C-suite, senior leadership |
14
+
15
+ ## Quick Start
16
+
17
+ ### Option 1: Copy and Customize
18
+
19
+ 1. Copy a theme file (e.g., `modern.yaml`) to your project
20
+ 2. Rename it (e.g., `my-theme.yaml`)
21
+ 3. Modify the values you want to change
22
+ 4. Reference it in your resume YAML:
23
+
24
+ ```yaml
25
+ # In your resume.yaml, copy the config section from the theme
26
+ config:
27
+ palette:
28
+ source: generator
29
+ type: hcl
30
+ size: 5
31
+ seed: 2024
32
+ hue_range: [200, 220]
33
+ luminance_range: [0.35, 0.75]
34
+ chroma: 0.12
35
+ # ... rest of config
36
+ ```
37
+
38
+ ### Option 2: Use Theme Values Directly
39
+
40
+ Copy just the `config:` block from any theme into your resume YAML:
41
+
42
+ ```yaml
43
+ # my_resume.yaml
44
+ template: resume_with_bars
45
+ full_name: Jane Developer
46
+ job_title: Software Engineer
47
+
48
+ # Paste the config block from modern.yaml, classic.yaml, etc.
49
+ config:
50
+ palette:
51
+ source: generator
52
+ type: hcl
53
+ size: 5
54
+ seed: 2024
55
+ hue_range: [200, 220]
56
+ luminance_range: [0.35, 0.75]
57
+ chroma: 0.12
58
+
59
+ page_width: 210
60
+ page_height: 297
61
+ # ... etc
62
+ ```
63
+
64
+ ## Customization Guide
65
+
66
+ ### Color Palette
67
+
68
+ The palette generator creates harmonious colors automatically:
69
+
70
+ ```yaml
71
+ config:
72
+ palette:
73
+ source: generator
74
+ type: hcl # HCL color space (perceptually uniform)
75
+ size: 5 # Number of colors to generate
76
+ seed: 2024 # Change this for different colors!
77
+ hue_range: [200, 220] # Color hue range (0-360)
78
+ luminance_range: [0.35, 0.75] # Light to dark range (0-1)
79
+ chroma: 0.12 # Color saturation (0-1)
80
+ ```
81
+
82
+ **Quick color adjustments:**
83
+
84
+ - Want different colors? → Change `seed` to any number
85
+ - Want warmer colors? → Use `hue_range: [0, 60]` (red-yellow)
86
+ - Want cooler colors? → Use `hue_range: [180, 270]` (cyan-purple)
87
+ - Want darker sidebar? → Lower `luminance_range` (e.g., `[0.10, 0.30]`)
88
+ - Want more vibrant? → Increase `chroma` (e.g., `0.25`)
89
+
90
+ ### Hue Reference Chart
91
+
92
+ | Hue Range | Colors |
93
+ |-----------|--------|
94
+ | 0-30 | Red, Orange |
95
+ | 30-60 | Orange, Yellow |
96
+ | 60-120 | Yellow, Green |
97
+ | 120-180 | Green, Cyan |
98
+ | 180-240 | Cyan, Blue |
99
+ | 240-300 | Blue, Purple |
100
+ | 300-360 | Purple, Red |
101
+
102
+ ### Layout Dimensions
103
+
104
+ All dimensions are in millimeters (mm) for print accuracy:
105
+
106
+ ```yaml
107
+ config:
108
+ # Page size (A4 default)
109
+ page_width: 210
110
+ page_height: 297
111
+ padding: 12 # Overall page padding
112
+
113
+ # Sidebar
114
+ sidebar_width: 60 # Width of left sidebar
115
+ sidebar_padding_top: 5
116
+ sidebar_padding_bottom: 5
117
+ sidebar_padding_left: 5
118
+ sidebar_padding_right: 5
119
+
120
+ # Profile image
121
+ profile_width: 50 # Profile photo width
122
+ profile_image_padding_bottom: 6
123
+
124
+ # Main content
125
+ pitch_padding_top: 10 # Space above summary
126
+ pitch_padding_bottom: 5
127
+ pitch_padding_left: 5
128
+ h2_padding_left: 5 # Section header indent
129
+ h2_width: 140 # Section header width
130
+
131
+ # Experience entries
132
+ h3_padding_top: 3 # Space above job titles
133
+ date_container_width: 25 # Date column width
134
+ description_container_padding_left: 5
135
+ skill_container_padding_top: 2
136
+ ```
137
+
138
+ ### Section Icons
139
+
140
+ Customize the circular icons next to section headings:
141
+
142
+ ```yaml
143
+ config:
144
+ section_icon_circle_size: "10mm" # Circle diameter
145
+ section_icon_circle_x_offset: "0mm" # Horizontal adjustment
146
+ section_icon_design_size: "5mm" # Icon size inside circle
147
+ section_icon_design_x_offset: "0mm" # Icon horizontal position
148
+ section_icon_design_y_offset: "0mm" # Icon vertical position
149
+ section_heading_text_margin: "-5mm" # Text margin from icon
150
+ section_heading_marker_margin_left: "-10mm"
151
+ section_heading_marker_line_height: "15mm"
152
+ ```
153
+
154
+ ## Creating Your Own Theme
155
+
156
+ 1. **Start from an existing theme** - Copy the one closest to your vision
157
+ 2. **Change the seed** - Get new colors instantly with a different `seed` value
158
+ 3. **Adjust hue_range** - Pick your brand colors
159
+ 4. **Fine-tune luminance** - Control light/dark balance
160
+ 5. **Test with preview** - Use `--preview` flag to see changes in browser
161
+
162
+ ### Example: Creating a "Tech Startup" Theme
163
+
164
+ ```yaml
165
+ config:
166
+ # Vibrant purple-pink tech colors
167
+ palette:
168
+ source: generator
169
+ type: hcl
170
+ size: 5
171
+ seed: 42
172
+ hue_range: [280, 330] # Purple to pink
173
+ luminance_range: [0.30, 0.70]
174
+ chroma: 0.20 # Vibrant but professional
175
+
176
+ # Compact modern layout
177
+ sidebar_width: 55
178
+ padding: 10
179
+ h3_padding_top: 3
180
+ date_container_width: 12
181
+
182
+ # Smaller, subtle icons
183
+ section_icon_circle_size: "7mm"
184
+ section_icon_design_size: "3.5mm"
185
+ ```
186
+
187
+ ## Tips for Great Themes
188
+
189
+ 1. **Contrast matters** - Verify text readability on sidebar backgrounds
190
+ 2. **Consistency** - Keep padding values proportional (e.g., all multiples of 5)
191
+ 3. **Test with real content** - Long names and descriptions reveal layout issues
192
+ 4. **Print preview** - Colors look different on screen vs paper
193
+ 5. **PDF check** - Always generate a PDF to verify final output
194
+
195
+ ## Sharing Your Theme
196
+
197
+ Created a great theme? Consider contributing it back!
198
+
199
+ 1. Add your theme YAML to this directory
200
+ 2. Include a descriptive header comment
201
+ 3. Test with multiple sample resumes
202
+ 4. Submit a pull request
203
+
204
+ ## See Also
205
+
206
+ - [CSS Architecture](../css/README.md) - How CSS styling works
207
+ - [Palette Generator](../../../../wiki/Palette-Generator.md) - Deep dive on color generation
208
+ - [Sample Resumes](../../../../../../sample/input/) - Example resumes using different themes