devfolio-page 0.2.8 → 0.2.10

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 (28) hide show
  1. package/README.md +88 -0
  2. package/dist/cli/schemas/portfolio.schema.js +12 -0
  3. package/dist/generator/builder.js +16 -0
  4. package/dist/generator/themes/dark-academia/templates/about.html +2 -2
  5. package/dist/generator/themes/dark-academia/templates/experiments-index.html +2 -2
  6. package/dist/generator/themes/dark-academia/templates/projects-index.html +2 -2
  7. package/dist/generator/themes/dark-academia/templates/writing-index.html +2 -2
  8. package/dist/generator/themes/modern/templates/about.html +2 -2
  9. package/dist/generator/themes/modern/templates/experiments-index.html +2 -2
  10. package/dist/generator/themes/modern/templates/projects-index.html +2 -2
  11. package/dist/generator/themes/modern/templates/writing-index.html +2 -2
  12. package/dist/generator/themes/srcl/templates/about.html +2 -2
  13. package/dist/generator/themes/srcl/templates/experiments-index.html +2 -2
  14. package/dist/generator/themes/srcl/templates/projects-index.html +2 -2
  15. package/dist/generator/themes/srcl/templates/writing-index.html +2 -2
  16. package/package.json +1 -1
  17. package/src/generator/themes/dark-academia/templates/about.html +2 -2
  18. package/src/generator/themes/dark-academia/templates/experiments-index.html +2 -2
  19. package/src/generator/themes/dark-academia/templates/projects-index.html +2 -2
  20. package/src/generator/themes/dark-academia/templates/writing-index.html +2 -2
  21. package/src/generator/themes/modern/templates/about.html +2 -2
  22. package/src/generator/themes/modern/templates/experiments-index.html +2 -2
  23. package/src/generator/themes/modern/templates/projects-index.html +2 -2
  24. package/src/generator/themes/modern/templates/writing-index.html +2 -2
  25. package/src/generator/themes/srcl/templates/about.html +2 -2
  26. package/src/generator/themes/srcl/templates/experiments-index.html +2 -2
  27. package/src/generator/themes/srcl/templates/projects-index.html +2 -2
  28. package/src/generator/themes/srcl/templates/writing-index.html +2 -2
package/README.md CHANGED
@@ -95,12 +95,16 @@ devfolio-page validate portfolio.yaml
95
95
 
96
96
  ## YAML Schema
97
97
 
98
+ ### Basic Example
99
+
98
100
  ```yaml
99
101
  meta:
100
102
  name: Your Name
101
103
  title: Your Title
102
104
  location: Your Location
103
105
  timezone: America/Los_Angeles # optional
106
+ tagline: A short tagline # optional
107
+ avatar: images/avatar.jpg # optional
104
108
 
105
109
  contact:
106
110
  email: you@example.com
@@ -113,6 +117,14 @@ bio: |
113
117
  A few sentences about yourself.
114
118
  Can be multiple lines.
115
119
 
120
+ # Extended about section (generates dedicated /about page)
121
+ about:
122
+ short: Brief intro for homepage
123
+ long: |
124
+ Longer bio with markdown support.
125
+
126
+ Multiple paragraphs work great here.
127
+
116
128
  sections:
117
129
  experience:
118
130
  - company: Company Name
@@ -142,6 +154,7 @@ sections:
142
154
  url: https://...
143
155
  date: 2024-12
144
156
  description: Brief description # optional
157
+ featured: true # optional
145
158
 
146
159
  education:
147
160
  - institution: University Name
@@ -163,6 +176,81 @@ settings:
163
176
  animate: subtle # none, subtle, or full
164
177
  ```
165
178
 
179
+ ### Rich Projects (Case Studies)
180
+
181
+ For a multi-page portfolio with dedicated project pages, use the top-level `projects` field:
182
+
183
+ ```yaml
184
+ projects:
185
+ - id: my-project # URL slug: /projects/my-project.html
186
+ title: My Project
187
+ subtitle: A brief tagline
188
+ featured: true
189
+ thumbnail: images/project-thumb.jpg
190
+ hero: images/project-hero.jpg
191
+ meta:
192
+ year: 2024
193
+ role: Lead Developer
194
+ timeline: 3 months
195
+ tech: [React, Node.js, PostgreSQL]
196
+ links:
197
+ github: https://github.com/...
198
+ demo: https://demo.example.com
199
+ live: https://example.com
200
+ sections:
201
+ - type: overview
202
+ content: |
203
+ Markdown content describing the project.
204
+ - type: image
205
+ src: images/screenshot.png
206
+ caption: Main dashboard view
207
+ - type: metrics
208
+ data:
209
+ - label: Users
210
+ value: "10,000+"
211
+ - label: Uptime
212
+ value: "99.9%"
213
+ - type: outcomes
214
+ content: |
215
+ What was achieved and lessons learned.
216
+ ```
217
+
218
+ ### Experiments
219
+
220
+ For side projects and explorations:
221
+
222
+ ```yaml
223
+ experiments:
224
+ - title: Creative Coding
225
+ description: Generative art experiments
226
+ image: images/experiment.png
227
+ github: https://github.com/...
228
+ demo: https://demo.example.com
229
+ tags: [p5.js, WebGL]
230
+ ```
231
+
232
+ ### Page Customization
233
+
234
+ Customize titles and descriptions for each page:
235
+
236
+ ```yaml
237
+ pages:
238
+ projects:
239
+ title: My Work
240
+ description: A curated selection of projects and case studies.
241
+ about:
242
+ title: About Me
243
+ description: Designer, developer, and coffee enthusiast.
244
+ experiments:
245
+ title: Lab
246
+ description: Creative experiments and explorations.
247
+ writing:
248
+ title: Blog
249
+ description: Thoughts on design and technology.
250
+ ```
251
+
252
+ If not specified, each theme provides sensible defaults.
253
+
166
254
  ## Themes
167
255
 
168
256
  ### SRCL (Default)
@@ -220,6 +220,16 @@ const layoutSchema = z.object({
220
220
  show_experiments: z.boolean().optional(),
221
221
  show_timeline: z.boolean().optional(),
222
222
  });
223
+ const pageContentSchema = z.object({
224
+ title: z.string().optional().nullable(),
225
+ description: z.string().optional().nullable(),
226
+ });
227
+ const pagesSchema = z.object({
228
+ projects: pageContentSchema.optional().nullable(),
229
+ about: pageContentSchema.optional().nullable(),
230
+ experiments: pageContentSchema.optional().nullable(),
231
+ writing: pageContentSchema.optional().nullable(),
232
+ });
223
233
  // =============================================================================
224
234
  // Main Portfolio Schema
225
235
  // =============================================================================
@@ -271,6 +281,8 @@ export const portfolioSchema = z.object({
271
281
  layout: layoutSchema.optional().nullable(),
272
282
  // Settings
273
283
  settings: settingsSchema.optional().nullable(),
284
+ // Page content customization
285
+ pages: pagesSchema.optional().nullable(),
274
286
  });
275
287
  // =============================================================================
276
288
  // Helper Functions
@@ -235,6 +235,8 @@ async function generateProjectsIndex(portfolio, themePath, outputDir, theme) {
235
235
  projects: portfolio.projects || [],
236
236
  colorScheme: settings.color_scheme || defaultColorScheme,
237
237
  nav_links: generateNavLinks(portfolio, true, 'projects'),
238
+ page_title: portfolio.pages?.projects?.title,
239
+ page_description: portfolio.pages?.projects?.description,
238
240
  };
239
241
  const html = Mustache.render(template, data);
240
242
  await fs.writeFile(path.join(outputDir, 'projects/index.html'), html);
@@ -273,6 +275,8 @@ async function generateAboutPage(portfolio, themePath, outputDir, theme) {
273
275
  hasEducation: (portfolio.sections?.education?.length ?? 0) > 0,
274
276
  colorScheme: settings.color_scheme || defaultColorScheme,
275
277
  nav_links: generateNavLinks(portfolio, true, 'about'),
278
+ page_title: portfolio.pages?.about?.title,
279
+ page_description: portfolio.pages?.about?.description,
276
280
  };
277
281
  const html = Mustache.render(template, data);
278
282
  await fs.writeFile(path.join(outputDir, 'about/index.html'), html);
@@ -296,6 +300,8 @@ async function generateExperimentsIndex(portfolio, themePath, outputDir, theme)
296
300
  experiments: portfolio.experiments || [],
297
301
  colorScheme: settings.color_scheme || defaultColorScheme,
298
302
  nav_links: generateNavLinks(portfolio, true, 'experiments'),
303
+ page_title: portfolio.pages?.experiments?.title,
304
+ page_description: portfolio.pages?.experiments?.description,
299
305
  };
300
306
  const html = Mustache.render(template, data);
301
307
  await fs.writeFile(path.join(outputDir, 'experiments/index.html'), html);
@@ -319,6 +325,8 @@ async function generateWritingIndex(portfolio, themePath, outputDir, theme) {
319
325
  writing: portfolio.sections.writing || [],
320
326
  colorScheme: settings.color_scheme || defaultColorScheme,
321
327
  nav_links: generateNavLinks(portfolio, true, 'writing'),
328
+ page_title: portfolio.pages?.writing?.title,
329
+ page_description: portfolio.pages?.writing?.description,
322
330
  };
323
331
  const html = Mustache.render(template, data);
324
332
  await fs.writeFile(path.join(outputDir, 'writing/index.html'), html);
@@ -824,6 +832,8 @@ async function generateProjectsIndexInMemory(portfolio, themePath, theme, files)
824
832
  projects: portfolio.projects || [],
825
833
  colorScheme: settings.color_scheme || defaultColorScheme,
826
834
  nav_links: generateNavLinks(portfolio, true, 'projects'),
835
+ page_title: portfolio.pages?.projects?.title,
836
+ page_description: portfolio.pages?.projects?.description,
827
837
  };
828
838
  const html = Mustache.render(template, data);
829
839
  files.set('projects/index.html', Buffer.from(html, 'utf-8'));
@@ -860,6 +870,8 @@ async function generateAboutPageInMemory(portfolio, themePath, theme, files) {
860
870
  hasEducation: (portfolio.sections?.education?.length ?? 0) > 0,
861
871
  colorScheme: settings.color_scheme || defaultColorScheme,
862
872
  nav_links: generateNavLinks(portfolio, true, 'about'),
873
+ page_title: portfolio.pages?.about?.title,
874
+ page_description: portfolio.pages?.about?.description,
863
875
  };
864
876
  const html = Mustache.render(template, data);
865
877
  files.set('about/index.html', Buffer.from(html, 'utf-8'));
@@ -881,6 +893,8 @@ async function generateExperimentsIndexInMemory(portfolio, themePath, theme, fil
881
893
  experiments: portfolio.experiments || [],
882
894
  colorScheme: settings.color_scheme || defaultColorScheme,
883
895
  nav_links: generateNavLinks(portfolio, true, 'experiments'),
896
+ page_title: portfolio.pages?.experiments?.title,
897
+ page_description: portfolio.pages?.experiments?.description,
884
898
  };
885
899
  const html = Mustache.render(template, data);
886
900
  files.set('experiments/index.html', Buffer.from(html, 'utf-8'));
@@ -902,6 +916,8 @@ async function generateWritingIndexInMemory(portfolio, themePath, theme, files)
902
916
  writing: portfolio.sections.writing || [],
903
917
  colorScheme: settings.color_scheme || defaultColorScheme,
904
918
  nav_links: generateNavLinks(portfolio, true, 'writing'),
919
+ page_title: portfolio.pages?.writing?.title,
920
+ page_description: portfolio.pages?.writing?.description,
905
921
  };
906
922
  const html = Mustache.render(template, data);
907
923
  files.set('writing/index.html', Buffer.from(html, 'utf-8'));
@@ -47,8 +47,8 @@
47
47
  <main class="page-content">
48
48
  <header class="page-header">
49
49
  <div class="header-ornament"></div>
50
- <h1>About</h1>
51
- {{#tagline}}<p>{{tagline}}</p>{{/tagline}}
50
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}About{{/page_title}}</h1>
51
+ {{#page_description}}<p>{{page_description}}</p>{{/page_description}}{{^page_description}}{{#tagline}}<p>{{tagline}}</p>{{/tagline}}{{/page_description}}
52
52
  </header>
53
53
 
54
54
  <div class="about-content">
@@ -47,8 +47,8 @@
47
47
  <main class="page-content">
48
48
  <header class="page-header">
49
49
  <div class="header-ornament"></div>
50
- <h1>Experiments</h1>
51
- <p>Explorations, studies, and curious investigations.</p>
50
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Experiments{{/page_title}}</h1>
51
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Explorations, studies, and curious investigations.{{/page_description}}</p>
52
52
  </header>
53
53
 
54
54
  <div class="experiments-list">
@@ -47,8 +47,8 @@
47
47
  <main class="page-content">
48
48
  <header class="page-header">
49
49
  <div class="header-ornament"></div>
50
- <h1>Complete Works</h1>
51
- <p>A collection of projects spanning research, development, and creative endeavors.</p>
50
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Complete Works{{/page_title}}</h1>
51
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}A collection of projects spanning research, development, and creative endeavors.{{/page_description}}</p>
52
52
  </header>
53
53
 
54
54
  <div class="projects-list">
@@ -47,8 +47,8 @@
47
47
  <main class="page-content">
48
48
  <header class="page-header">
49
49
  <div class="header-ornament"></div>
50
- <h1>Publications</h1>
51
- <p>Articles, essays, and scholarly writings.</p>
50
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Publications{{/page_title}}</h1>
51
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Articles, essays, and scholarly writings.{{/page_description}}</p>
52
52
  </header>
53
53
 
54
54
  <div class="writing-list">
@@ -46,8 +46,8 @@
46
46
 
47
47
  <main class="main-content">
48
48
  <header class="page-header">
49
- <h1>About</h1>
50
- {{#tagline}}<p>{{tagline}}</p>{{/tagline}}
49
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}About{{/page_title}}</h1>
50
+ {{#page_description}}<p>{{page_description}}</p>{{/page_description}}{{^page_description}}{{#tagline}}<p>{{tagline}}</p>{{/tagline}}{{/page_description}}
51
51
  </header>
52
52
 
53
53
  <div class="about-content">
@@ -46,8 +46,8 @@
46
46
 
47
47
  <main class="main-content">
48
48
  <header class="page-header">
49
- <h1>Experiments</h1>
50
- <p>Side projects, explorations, and things I'm tinkering with.</p>
49
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Experiments{{/page_title}}</h1>
50
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Side projects, explorations, and things I'm tinkering with.{{/page_description}}</p>
51
51
  </header>
52
52
 
53
53
  <div class="experiments-grid">
@@ -46,8 +46,8 @@
46
46
 
47
47
  <main class="main-content">
48
48
  <header class="page-header">
49
- <h1>Projects</h1>
50
- <p>A collection of work spanning product development, open source, and research.</p>
49
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Projects{{/page_title}}</h1>
50
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}A collection of work spanning product development, open source, and research.{{/page_description}}</p>
51
51
  </header>
52
52
 
53
53
  <div class="projects-grid">
@@ -46,8 +46,8 @@
46
46
 
47
47
  <main class="main-content">
48
48
  <header class="page-header">
49
- <h1>Writing</h1>
50
- <p>Articles, blog posts, and technical writing.</p>
49
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Writing{{/page_title}}</h1>
50
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Articles, blog posts, and technical writing.{{/page_description}}</p>
51
51
  </header>
52
52
 
53
53
  <div class="writing-list">
@@ -35,8 +35,8 @@
35
35
 
36
36
  <main class="content">
37
37
  <header class="page-header">
38
- <h1>About</h1>
39
- {{#tagline}}<p class="page-description">{{tagline}}</p>{{/tagline}}
38
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}About{{/page_title}}</h1>
39
+ {{#page_description}}<p class="page-description">{{page_description}}</p>{{/page_description}}{{^page_description}}{{#tagline}}<p class="page-description">{{tagline}}</p>{{/tagline}}{{/page_description}}
40
40
  </header>
41
41
 
42
42
  <div class="about-content">
@@ -35,8 +35,8 @@
35
35
 
36
36
  <main class="content">
37
37
  <header class="page-header">
38
- <h1>Experiments</h1>
39
- <p class="page-description">Side projects, explorations, and things I'm tinkering with.</p>
38
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Experiments{{/page_title}}</h1>
39
+ <p class="page-description">{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Side projects, explorations, and things I'm tinkering with.{{/page_description}}</p>
40
40
  </header>
41
41
 
42
42
  <div class="experiments-grid full-width">
@@ -35,8 +35,8 @@
35
35
 
36
36
  <main class="content">
37
37
  <header class="page-header">
38
- <h1>Projects</h1>
39
- <p class="page-description">A collection of work spanning product development, open source, and research.</p>
38
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Projects{{/page_title}}</h1>
39
+ <p class="page-description">{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}A collection of work spanning product development, open source, and research.{{/page_description}}</p>
40
40
  </header>
41
41
 
42
42
  <div class="projects-grid full-width">
@@ -35,8 +35,8 @@
35
35
 
36
36
  <main class="content">
37
37
  <header class="page-header">
38
- <h1>Writing</h1>
39
- <p class="page-description">Articles, blog posts, and technical writing.</p>
38
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Writing{{/page_title}}</h1>
39
+ <p class="page-description">{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Articles, blog posts, and technical writing.{{/page_description}}</p>
40
40
  </header>
41
41
 
42
42
  <ul class="writing-list full-width">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devfolio-page",
3
- "version": "0.2.8",
3
+ "version": "0.2.10",
4
4
  "description": "Your portfolio as code. Version control it like software.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -47,8 +47,8 @@
47
47
  <main class="page-content">
48
48
  <header class="page-header">
49
49
  <div class="header-ornament"></div>
50
- <h1>About</h1>
51
- {{#tagline}}<p>{{tagline}}</p>{{/tagline}}
50
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}About{{/page_title}}</h1>
51
+ {{#page_description}}<p>{{page_description}}</p>{{/page_description}}{{^page_description}}{{#tagline}}<p>{{tagline}}</p>{{/tagline}}{{/page_description}}
52
52
  </header>
53
53
 
54
54
  <div class="about-content">
@@ -47,8 +47,8 @@
47
47
  <main class="page-content">
48
48
  <header class="page-header">
49
49
  <div class="header-ornament"></div>
50
- <h1>Experiments</h1>
51
- <p>Explorations, studies, and curious investigations.</p>
50
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Experiments{{/page_title}}</h1>
51
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Explorations, studies, and curious investigations.{{/page_description}}</p>
52
52
  </header>
53
53
 
54
54
  <div class="experiments-list">
@@ -47,8 +47,8 @@
47
47
  <main class="page-content">
48
48
  <header class="page-header">
49
49
  <div class="header-ornament"></div>
50
- <h1>Complete Works</h1>
51
- <p>A collection of projects spanning research, development, and creative endeavors.</p>
50
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Complete Works{{/page_title}}</h1>
51
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}A collection of projects spanning research, development, and creative endeavors.{{/page_description}}</p>
52
52
  </header>
53
53
 
54
54
  <div class="projects-list">
@@ -47,8 +47,8 @@
47
47
  <main class="page-content">
48
48
  <header class="page-header">
49
49
  <div class="header-ornament"></div>
50
- <h1>Publications</h1>
51
- <p>Articles, essays, and scholarly writings.</p>
50
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Publications{{/page_title}}</h1>
51
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Articles, essays, and scholarly writings.{{/page_description}}</p>
52
52
  </header>
53
53
 
54
54
  <div class="writing-list">
@@ -46,8 +46,8 @@
46
46
 
47
47
  <main class="main-content">
48
48
  <header class="page-header">
49
- <h1>About</h1>
50
- {{#tagline}}<p>{{tagline}}</p>{{/tagline}}
49
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}About{{/page_title}}</h1>
50
+ {{#page_description}}<p>{{page_description}}</p>{{/page_description}}{{^page_description}}{{#tagline}}<p>{{tagline}}</p>{{/tagline}}{{/page_description}}
51
51
  </header>
52
52
 
53
53
  <div class="about-content">
@@ -46,8 +46,8 @@
46
46
 
47
47
  <main class="main-content">
48
48
  <header class="page-header">
49
- <h1>Experiments</h1>
50
- <p>Side projects, explorations, and things I'm tinkering with.</p>
49
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Experiments{{/page_title}}</h1>
50
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Side projects, explorations, and things I'm tinkering with.{{/page_description}}</p>
51
51
  </header>
52
52
 
53
53
  <div class="experiments-grid">
@@ -46,8 +46,8 @@
46
46
 
47
47
  <main class="main-content">
48
48
  <header class="page-header">
49
- <h1>Projects</h1>
50
- <p>A collection of work spanning product development, open source, and research.</p>
49
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Projects{{/page_title}}</h1>
50
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}A collection of work spanning product development, open source, and research.{{/page_description}}</p>
51
51
  </header>
52
52
 
53
53
  <div class="projects-grid">
@@ -46,8 +46,8 @@
46
46
 
47
47
  <main class="main-content">
48
48
  <header class="page-header">
49
- <h1>Writing</h1>
50
- <p>Articles, blog posts, and technical writing.</p>
49
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Writing{{/page_title}}</h1>
50
+ <p>{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Articles, blog posts, and technical writing.{{/page_description}}</p>
51
51
  </header>
52
52
 
53
53
  <div class="writing-list">
@@ -35,8 +35,8 @@
35
35
 
36
36
  <main class="content">
37
37
  <header class="page-header">
38
- <h1>About</h1>
39
- {{#tagline}}<p class="page-description">{{tagline}}</p>{{/tagline}}
38
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}About{{/page_title}}</h1>
39
+ {{#page_description}}<p class="page-description">{{page_description}}</p>{{/page_description}}{{^page_description}}{{#tagline}}<p class="page-description">{{tagline}}</p>{{/tagline}}{{/page_description}}
40
40
  </header>
41
41
 
42
42
  <div class="about-content">
@@ -35,8 +35,8 @@
35
35
 
36
36
  <main class="content">
37
37
  <header class="page-header">
38
- <h1>Experiments</h1>
39
- <p class="page-description">Side projects, explorations, and things I'm tinkering with.</p>
38
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Experiments{{/page_title}}</h1>
39
+ <p class="page-description">{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Side projects, explorations, and things I'm tinkering with.{{/page_description}}</p>
40
40
  </header>
41
41
 
42
42
  <div class="experiments-grid full-width">
@@ -35,8 +35,8 @@
35
35
 
36
36
  <main class="content">
37
37
  <header class="page-header">
38
- <h1>Projects</h1>
39
- <p class="page-description">A collection of work spanning product development, open source, and research.</p>
38
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Projects{{/page_title}}</h1>
39
+ <p class="page-description">{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}A collection of work spanning product development, open source, and research.{{/page_description}}</p>
40
40
  </header>
41
41
 
42
42
  <div class="projects-grid full-width">
@@ -35,8 +35,8 @@
35
35
 
36
36
  <main class="content">
37
37
  <header class="page-header">
38
- <h1>Writing</h1>
39
- <p class="page-description">Articles, blog posts, and technical writing.</p>
38
+ <h1>{{#page_title}}{{page_title}}{{/page_title}}{{^page_title}}Writing{{/page_title}}</h1>
39
+ <p class="page-description">{{#page_description}}{{page_description}}{{/page_description}}{{^page_description}}Articles, blog posts, and technical writing.{{/page_description}}</p>
40
40
  </header>
41
41
 
42
42
  <ul class="writing-list full-width">