devfolio-page 0.1.0
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.
- package/README.md +219 -0
- package/dist/cli/commands/init.js +282 -0
- package/dist/cli/commands/render.js +105 -0
- package/dist/cli/commands/themes.js +40 -0
- package/dist/cli/commands/validate.js +86 -0
- package/dist/cli/helpers/validate.js +99 -0
- package/dist/cli/index.js +51 -0
- package/dist/cli/postinstall.js +20 -0
- package/dist/cli/schemas/portfolio.schema.js +299 -0
- package/dist/generator/builder.js +551 -0
- package/dist/generator/markdown.js +57 -0
- package/dist/generator/themes/dark-academia/partials/education.html +15 -0
- package/dist/generator/themes/dark-academia/partials/experience.html +23 -0
- package/dist/generator/themes/dark-academia/partials/hero.html +15 -0
- package/dist/generator/themes/dark-academia/partials/projects.html +17 -0
- package/dist/generator/themes/dark-academia/partials/skills.html +11 -0
- package/dist/generator/themes/dark-academia/partials/writing.html +15 -0
- package/dist/generator/themes/dark-academia/script.js +91 -0
- package/dist/generator/themes/dark-academia/styles.css +913 -0
- package/dist/generator/themes/dark-academia/template.html +46 -0
- package/dist/generator/themes/dark-academia/templates/experiments-index.html +80 -0
- package/dist/generator/themes/dark-academia/templates/homepage.html +125 -0
- package/dist/generator/themes/dark-academia/templates/project.html +101 -0
- package/dist/generator/themes/dark-academia/templates/projects-index.html +80 -0
- package/dist/generator/themes/dark-academia/templates/writing-index.html +75 -0
- package/dist/generator/themes/modern/partials/education.html +14 -0
- package/dist/generator/themes/modern/partials/experience.html +21 -0
- package/dist/generator/themes/modern/partials/hero.html +15 -0
- package/dist/generator/themes/modern/partials/projects.html +17 -0
- package/dist/generator/themes/modern/partials/skills.html +11 -0
- package/dist/generator/themes/modern/partials/writing.html +14 -0
- package/dist/generator/themes/modern/script.js +136 -0
- package/dist/generator/themes/modern/styles.css +835 -0
- package/dist/generator/themes/modern/template.html +59 -0
- package/dist/generator/themes/modern/templates/experiments-index.html +78 -0
- package/dist/generator/themes/modern/templates/homepage.html +125 -0
- package/dist/generator/themes/modern/templates/project.html +98 -0
- package/dist/generator/themes/modern/templates/projects-index.html +79 -0
- package/dist/generator/themes/modern/templates/writing-index.html +73 -0
- package/dist/generator/themes/srcl/partials/education.html +27 -0
- package/dist/generator/themes/srcl/partials/experience.html +25 -0
- package/dist/generator/themes/srcl/partials/hero.html +22 -0
- package/dist/generator/themes/srcl/partials/projects.html +24 -0
- package/dist/generator/themes/srcl/partials/sections/code.html +8 -0
- package/dist/generator/themes/srcl/partials/sections/demo.html +8 -0
- package/dist/generator/themes/srcl/partials/sections/gallery.html +12 -0
- package/dist/generator/themes/srcl/partials/sections/image.html +6 -0
- package/dist/generator/themes/srcl/partials/sections/interactive.html +8 -0
- package/dist/generator/themes/srcl/partials/sections/metrics.html +10 -0
- package/dist/generator/themes/srcl/partials/sections/outcomes.html +5 -0
- package/dist/generator/themes/srcl/partials/sections/overview.html +5 -0
- package/dist/generator/themes/srcl/partials/sections/process.html +5 -0
- package/dist/generator/themes/srcl/partials/skills.html +21 -0
- package/dist/generator/themes/srcl/partials/writing.html +14 -0
- package/dist/generator/themes/srcl/script.js +354 -0
- package/dist/generator/themes/srcl/styles.css +1260 -0
- package/dist/generator/themes/srcl/template.html +46 -0
- package/dist/generator/themes/srcl/templates/experiments-index.html +66 -0
- package/dist/generator/themes/srcl/templates/homepage.html +136 -0
- package/dist/generator/themes/srcl/templates/project.html +96 -0
- package/dist/generator/themes/srcl/templates/projects-index.html +70 -0
- package/dist/generator/themes/srcl/templates/writing-index.html +61 -0
- package/dist/types/portfolio.js +4 -0
- package/package.json +58 -0
- package/src/generator/themes/dark-academia/partials/education.html +15 -0
- package/src/generator/themes/dark-academia/partials/experience.html +23 -0
- package/src/generator/themes/dark-academia/partials/hero.html +15 -0
- package/src/generator/themes/dark-academia/partials/projects.html +17 -0
- package/src/generator/themes/dark-academia/partials/skills.html +11 -0
- package/src/generator/themes/dark-academia/partials/writing.html +15 -0
- package/src/generator/themes/dark-academia/script.js +91 -0
- package/src/generator/themes/dark-academia/styles.css +913 -0
- package/src/generator/themes/dark-academia/template.html +46 -0
- package/src/generator/themes/dark-academia/templates/experiments-index.html +80 -0
- package/src/generator/themes/dark-academia/templates/homepage.html +125 -0
- package/src/generator/themes/dark-academia/templates/project.html +101 -0
- package/src/generator/themes/dark-academia/templates/projects-index.html +80 -0
- package/src/generator/themes/dark-academia/templates/writing-index.html +75 -0
- package/src/generator/themes/modern/partials/education.html +14 -0
- package/src/generator/themes/modern/partials/experience.html +21 -0
- package/src/generator/themes/modern/partials/hero.html +15 -0
- package/src/generator/themes/modern/partials/projects.html +17 -0
- package/src/generator/themes/modern/partials/skills.html +11 -0
- package/src/generator/themes/modern/partials/writing.html +14 -0
- package/src/generator/themes/modern/script.js +136 -0
- package/src/generator/themes/modern/styles.css +835 -0
- package/src/generator/themes/modern/template.html +59 -0
- package/src/generator/themes/modern/templates/experiments-index.html +78 -0
- package/src/generator/themes/modern/templates/homepage.html +125 -0
- package/src/generator/themes/modern/templates/project.html +98 -0
- package/src/generator/themes/modern/templates/projects-index.html +79 -0
- package/src/generator/themes/modern/templates/writing-index.html +73 -0
- package/src/generator/themes/srcl/partials/education.html +27 -0
- package/src/generator/themes/srcl/partials/experience.html +25 -0
- package/src/generator/themes/srcl/partials/hero.html +22 -0
- package/src/generator/themes/srcl/partials/projects.html +24 -0
- package/src/generator/themes/srcl/partials/sections/code.html +8 -0
- package/src/generator/themes/srcl/partials/sections/demo.html +8 -0
- package/src/generator/themes/srcl/partials/sections/gallery.html +12 -0
- package/src/generator/themes/srcl/partials/sections/image.html +6 -0
- package/src/generator/themes/srcl/partials/sections/interactive.html +8 -0
- package/src/generator/themes/srcl/partials/sections/metrics.html +10 -0
- package/src/generator/themes/srcl/partials/sections/outcomes.html +5 -0
- package/src/generator/themes/srcl/partials/sections/overview.html +5 -0
- package/src/generator/themes/srcl/partials/sections/process.html +5 -0
- package/src/generator/themes/srcl/partials/skills.html +21 -0
- package/src/generator/themes/srcl/partials/writing.html +14 -0
- package/src/generator/themes/srcl/script.js +354 -0
- package/src/generator/themes/srcl/styles.css +1260 -0
- package/src/generator/themes/srcl/template.html +46 -0
- package/src/generator/themes/srcl/templates/experiments-index.html +66 -0
- package/src/generator/themes/srcl/templates/homepage.html +136 -0
- package/src/generator/themes/srcl/templates/project.html +96 -0
- package/src/generator/themes/srcl/templates/projects-index.html +70 -0
- package/src/generator/themes/srcl/templates/writing-index.html +61 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>{{name}} - Portfolio</title>
|
|
7
|
+
<meta name="description" content="{{title}} based in {{location}}">
|
|
8
|
+
<link rel="stylesheet" href="./assets/styles.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body class="srcl-theme" data-theme="{{colorScheme}}">
|
|
11
|
+
{{#showGrid}}<div class="grid-overlay"></div>{{/showGrid}}
|
|
12
|
+
|
|
13
|
+
<!-- Action Bar -->
|
|
14
|
+
<div class="srcl-action-bar">
|
|
15
|
+
<nav class="primary">
|
|
16
|
+
{{#hasExperience}}<a href="#experience">EXPERIENCE</a>{{/hasExperience}}
|
|
17
|
+
{{#hasProjects}}<a href="#projects">PROJECTS</a>{{/hasProjects}}
|
|
18
|
+
{{#hasSkills}}<a href="#skills">SKILLS</a>{{/hasSkills}}
|
|
19
|
+
{{#hasWriting}}<a href="#writing">WRITING</a>{{/hasWriting}}
|
|
20
|
+
{{#hasEducation}}<a href="#education">EDUCATION</a>{{/hasEducation}}
|
|
21
|
+
</nav>
|
|
22
|
+
{{#enableHotkeys}}
|
|
23
|
+
<div class="secondary">
|
|
24
|
+
<button class="hotkey" data-hotkey="ctrl+t" title="Toggle theme">
|
|
25
|
+
<span class="key">^T</span>
|
|
26
|
+
</button>
|
|
27
|
+
</div>
|
|
28
|
+
{{/enableHotkeys}}
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<main class="content">
|
|
32
|
+
{{{hero}}}
|
|
33
|
+
{{{experience}}}
|
|
34
|
+
{{{projects}}}
|
|
35
|
+
{{{skills}}}
|
|
36
|
+
{{{writing}}}
|
|
37
|
+
{{{education}}}
|
|
38
|
+
</main>
|
|
39
|
+
|
|
40
|
+
<footer class="srcl-footer">
|
|
41
|
+
<p>Built with <a href="https://devfolio.page" target="_blank">devfolio.page</a> using <a href="https://sacred.computer" target="_blank">SRCL</a></p>
|
|
42
|
+
</footer>
|
|
43
|
+
|
|
44
|
+
{{#enableHotkeys}}<script src="./assets/script.js"></script>{{/enableHotkeys}}
|
|
45
|
+
</body>
|
|
46
|
+
</html>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Experiments - {{site_name}}</title>
|
|
7
|
+
<meta name="description" content="Experiments and side projects by {{site_name}}">
|
|
8
|
+
<link rel="stylesheet" href="../assets/styles.css">
|
|
9
|
+
<script>
|
|
10
|
+
// Load theme preference before render to prevent flash
|
|
11
|
+
(function() {
|
|
12
|
+
try {
|
|
13
|
+
var saved = localStorage.getItem('srcl-theme');
|
|
14
|
+
if (saved) document.documentElement.dataset.theme = saved;
|
|
15
|
+
} catch(e) {}
|
|
16
|
+
})();
|
|
17
|
+
</script>
|
|
18
|
+
</head>
|
|
19
|
+
<body class="srcl-theme" data-theme="{{colorScheme}}">
|
|
20
|
+
|
|
21
|
+
<!-- Action Bar -->
|
|
22
|
+
<div class="srcl-action-bar">
|
|
23
|
+
<nav class="primary">
|
|
24
|
+
<a href="../" class="nav-home">{{site_name}}</a>
|
|
25
|
+
{{#nav_links}}
|
|
26
|
+
<a href="{{href}}"{{#active}} class="active"{{/active}}>{{label}}</a>
|
|
27
|
+
{{/nav_links}}
|
|
28
|
+
</nav>
|
|
29
|
+
<div class="secondary">
|
|
30
|
+
<button class="hotkey" data-hotkey="ctrl+t" title="Toggle theme (Ctrl+T)">
|
|
31
|
+
<span class="key">^T</span>
|
|
32
|
+
</button>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<main class="content">
|
|
37
|
+
<header class="page-header">
|
|
38
|
+
<h1>Experiments</h1>
|
|
39
|
+
<p class="page-description">Side projects, explorations, and things I'm tinkering with.</p>
|
|
40
|
+
</header>
|
|
41
|
+
|
|
42
|
+
<div class="experiments-grid full-width">
|
|
43
|
+
{{#experiments}}
|
|
44
|
+
<div class="experiment-card">
|
|
45
|
+
<h3>{{title}}</h3>
|
|
46
|
+
<p>{{description}}</p>
|
|
47
|
+
<div class="experiment-links">
|
|
48
|
+
{{#github}}<a href="{{github}}" target="_blank">GitHub</a>{{/github}}
|
|
49
|
+
{{#demo}}<a href="{{demo}}" target="_blank">Demo</a>{{/demo}}
|
|
50
|
+
{{#url}}<a href="{{url}}" target="_blank">View</a>{{/url}}
|
|
51
|
+
</div>
|
|
52
|
+
<div class="tech-tags">
|
|
53
|
+
{{#tags}}<span class="tag">{{.}}</span>{{/tags}}
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
{{/experiments}}
|
|
57
|
+
</div>
|
|
58
|
+
</main>
|
|
59
|
+
|
|
60
|
+
<footer class="srcl-footer">
|
|
61
|
+
<p>Built with <a href="https://devfolio.page" target="_blank">devfolio.page</a> using <a href="https://sacred.computer" target="_blank">SRCL</a></p>
|
|
62
|
+
</footer>
|
|
63
|
+
|
|
64
|
+
<script src="../assets/script.js"></script>
|
|
65
|
+
</body>
|
|
66
|
+
</html>
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>{{name}} - Portfolio</title>
|
|
7
|
+
<meta name="description" content="{{title}} based in {{location}}">
|
|
8
|
+
<link rel="stylesheet" href="./assets/styles.css">
|
|
9
|
+
<script>
|
|
10
|
+
// Load theme preference before render to prevent flash
|
|
11
|
+
(function() {
|
|
12
|
+
try {
|
|
13
|
+
var saved = localStorage.getItem('srcl-theme');
|
|
14
|
+
if (saved) document.documentElement.dataset.theme = saved;
|
|
15
|
+
} catch(e) {}
|
|
16
|
+
})();
|
|
17
|
+
</script>
|
|
18
|
+
</head>
|
|
19
|
+
<body class="srcl-theme" data-theme="{{colorScheme}}">
|
|
20
|
+
{{#showGrid}}<div class="grid-overlay"></div>{{/showGrid}}
|
|
21
|
+
|
|
22
|
+
<!-- Action Bar -->
|
|
23
|
+
<div class="srcl-action-bar">
|
|
24
|
+
<nav class="primary">
|
|
25
|
+
<a href="./" class="nav-home">{{name}}</a>
|
|
26
|
+
{{#hasProjects}}<a href="./projects/">Projects</a>{{/hasProjects}}
|
|
27
|
+
{{#hasExperiments}}<a href="./experiments/">Experiments</a>{{/hasExperiments}}
|
|
28
|
+
{{#hasWriting}}<a href="./writing/">Writing</a>{{/hasWriting}}
|
|
29
|
+
</nav>
|
|
30
|
+
<div class="secondary">
|
|
31
|
+
<button class="hotkey" data-hotkey="ctrl+t" title="Toggle theme (Ctrl+T)">
|
|
32
|
+
<span class="key">^T</span>
|
|
33
|
+
</button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<main class="content">
|
|
38
|
+
<!-- Hero Section -->
|
|
39
|
+
<section class="srcl-hero">
|
|
40
|
+
<div class="hero-content">
|
|
41
|
+
<h1 class="name">{{name}}</h1>
|
|
42
|
+
<p class="title">{{title}}</p>
|
|
43
|
+
<p class="location">{{location}}{{#timezone}} <span class="timezone">({{timezone}})</span>{{/timezone}}</p>
|
|
44
|
+
|
|
45
|
+
<div class="bio">
|
|
46
|
+
{{{bio_html}}}
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<div class="contact-links">
|
|
50
|
+
{{#email}}<a href="mailto:{{email}}" class="contact-link">email</a>{{/email}}
|
|
51
|
+
{{#github}}<a href="https://github.com/{{github}}" target="_blank" class="contact-link">github</a>{{/github}}
|
|
52
|
+
{{#linkedin}}<a href="https://linkedin.com/in/{{linkedin}}" target="_blank" class="contact-link">linkedin</a>{{/linkedin}}
|
|
53
|
+
{{#twitter}}<a href="https://twitter.com/{{twitter}}" target="_blank" class="contact-link">twitter</a>{{/twitter}}
|
|
54
|
+
{{#website}}<a href="{{website}}" target="_blank" class="contact-link">website</a>{{/website}}
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</section>
|
|
58
|
+
|
|
59
|
+
{{#hasProjects}}
|
|
60
|
+
<!-- Featured Projects -->
|
|
61
|
+
<section class="srcl-section" id="projects">
|
|
62
|
+
<h2 class="section-title">Featured Projects</h2>
|
|
63
|
+
<div class="projects-grid">
|
|
64
|
+
{{#featured_projects}}
|
|
65
|
+
<a href="./projects/{{id}}.html" class="project-card">
|
|
66
|
+
<div class="project-thumbnail">
|
|
67
|
+
<img src="{{thumbnail}}" alt="{{title}}">
|
|
68
|
+
</div>
|
|
69
|
+
<div class="project-info">
|
|
70
|
+
<h3>{{title}}</h3>
|
|
71
|
+
{{#subtitle}}<p class="subtitle">{{subtitle}}</p>{{/subtitle}}
|
|
72
|
+
<div class="project-meta">
|
|
73
|
+
<span class="year">{{meta.year}}</span>
|
|
74
|
+
<span class="role">{{meta.role}}</span>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="tech-tags">
|
|
77
|
+
{{#meta.tech}}<span class="tag">{{.}}</span>{{/meta.tech}}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</a>
|
|
81
|
+
{{/featured_projects}}
|
|
82
|
+
</div>
|
|
83
|
+
<a href="./projects/" class="view-all">View all projects →</a>
|
|
84
|
+
</section>
|
|
85
|
+
{{/hasProjects}}
|
|
86
|
+
|
|
87
|
+
{{#show_experiments}}
|
|
88
|
+
{{#hasExperiments}}
|
|
89
|
+
<!-- Experiments Preview -->
|
|
90
|
+
<section class="srcl-section" id="experiments">
|
|
91
|
+
<h2 class="section-title">Experiments</h2>
|
|
92
|
+
<div class="experiments-grid">
|
|
93
|
+
{{#experiments}}
|
|
94
|
+
<div class="experiment-card">
|
|
95
|
+
<h3>{{title}}</h3>
|
|
96
|
+
<p>{{description}}</p>
|
|
97
|
+
<div class="experiment-links">
|
|
98
|
+
{{#github}}<a href="{{github}}" target="_blank">GitHub</a>{{/github}}
|
|
99
|
+
{{#demo}}<a href="{{demo}}" target="_blank">Demo</a>{{/demo}}
|
|
100
|
+
</div>
|
|
101
|
+
<div class="tech-tags">
|
|
102
|
+
{{#tags}}<span class="tag">{{.}}</span>{{/tags}}
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
{{/experiments}}
|
|
106
|
+
</div>
|
|
107
|
+
</section>
|
|
108
|
+
{{/hasExperiments}}
|
|
109
|
+
{{/show_experiments}}
|
|
110
|
+
|
|
111
|
+
{{#hasWriting}}
|
|
112
|
+
<!-- Featured Writing -->
|
|
113
|
+
<section class="srcl-section" id="writing">
|
|
114
|
+
<h2 class="section-title">Writing</h2>
|
|
115
|
+
<ul class="writing-list">
|
|
116
|
+
{{#featured_writing}}
|
|
117
|
+
<li class="writing-item">
|
|
118
|
+
<a href="{{url}}" target="_blank">
|
|
119
|
+
<span class="writing-title">{{title}}</span>
|
|
120
|
+
<span class="writing-date">{{date}}</span>
|
|
121
|
+
</a>
|
|
122
|
+
</li>
|
|
123
|
+
{{/featured_writing}}
|
|
124
|
+
</ul>
|
|
125
|
+
<a href="./writing/" class="view-all">View all writing →</a>
|
|
126
|
+
</section>
|
|
127
|
+
{{/hasWriting}}
|
|
128
|
+
</main>
|
|
129
|
+
|
|
130
|
+
<footer class="srcl-footer">
|
|
131
|
+
<p>Built with <a href="https://devfolio.page" target="_blank">devfolio.page</a> using <a href="https://sacred.computer" target="_blank">SRCL</a></p>
|
|
132
|
+
</footer>
|
|
133
|
+
|
|
134
|
+
<script src="./assets/script.js"></script>
|
|
135
|
+
</body>
|
|
136
|
+
</html>
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>{{title}} - {{site_name}}</title>
|
|
7
|
+
<meta name="description" content="{{subtitle}}">
|
|
8
|
+
<link rel="stylesheet" href="../assets/styles.css">
|
|
9
|
+
<script>
|
|
10
|
+
// Load theme preference before render to prevent flash
|
|
11
|
+
(function() {
|
|
12
|
+
try {
|
|
13
|
+
var saved = localStorage.getItem('srcl-theme');
|
|
14
|
+
if (saved) document.documentElement.dataset.theme = saved;
|
|
15
|
+
} catch(e) {}
|
|
16
|
+
})();
|
|
17
|
+
</script>
|
|
18
|
+
</head>
|
|
19
|
+
<body class="srcl-theme" data-theme="{{colorScheme}}">
|
|
20
|
+
{{#showGrid}}<div class="grid-overlay"></div>{{/showGrid}}
|
|
21
|
+
|
|
22
|
+
<!-- Action Bar -->
|
|
23
|
+
<div class="srcl-action-bar">
|
|
24
|
+
<nav class="primary">
|
|
25
|
+
<a href="../" class="nav-home">{{site_name}}</a>
|
|
26
|
+
{{#nav_links}}
|
|
27
|
+
<a href="{{href}}"{{#active}} class="active"{{/active}}>{{label}}</a>
|
|
28
|
+
{{/nav_links}}
|
|
29
|
+
</nav>
|
|
30
|
+
<div class="secondary">
|
|
31
|
+
<button class="hotkey" data-hotkey="ctrl+t" title="Toggle theme (Ctrl+T)">
|
|
32
|
+
<span class="key">^T</span>
|
|
33
|
+
</button>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<main class="content project-page">
|
|
38
|
+
<!-- Project Header -->
|
|
39
|
+
<header class="project-header">
|
|
40
|
+
<div class="project-intro">
|
|
41
|
+
<h1>{{title}}</h1>
|
|
42
|
+
{{#subtitle}}<p class="subtitle">{{subtitle}}</p>{{/subtitle}}
|
|
43
|
+
|
|
44
|
+
<div class="project-meta-grid">
|
|
45
|
+
<div class="meta-item">
|
|
46
|
+
<span class="meta-label">Year</span>
|
|
47
|
+
<span class="meta-value">{{meta.year}}</span>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="meta-item">
|
|
50
|
+
<span class="meta-label">Role</span>
|
|
51
|
+
<span class="meta-value">{{meta.role}}</span>
|
|
52
|
+
</div>
|
|
53
|
+
{{#meta.timeline}}
|
|
54
|
+
<div class="meta-item">
|
|
55
|
+
<span class="meta-label">Timeline</span>
|
|
56
|
+
<span class="meta-value">{{meta.timeline}}</span>
|
|
57
|
+
</div>
|
|
58
|
+
{{/meta.timeline}}
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div class="tech-stack">
|
|
62
|
+
<span class="meta-label">Tech</span>
|
|
63
|
+
<div class="tech-tags">
|
|
64
|
+
{{#meta.tech}}<span class="tag">{{.}}</span>{{/meta.tech}}
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
{{#meta.links}}
|
|
69
|
+
<div class="project-links">
|
|
70
|
+
{{#github}}<a href="{{github}}" target="_blank" class="project-link">GitHub</a>{{/github}}
|
|
71
|
+
{{#demo}}<a href="{{demo}}" target="_blank" class="project-link">Demo</a>{{/demo}}
|
|
72
|
+
{{#live}}<a href="{{live}}" target="_blank" class="project-link">Live Site</a>{{/live}}
|
|
73
|
+
{{#case_study}}<a href="{{case_study}}" target="_blank" class="project-link">Case Study</a>{{/case_study}}
|
|
74
|
+
</div>
|
|
75
|
+
{{/meta.links}}
|
|
76
|
+
</div>
|
|
77
|
+
</header>
|
|
78
|
+
|
|
79
|
+
<!-- Project Content Sections -->
|
|
80
|
+
<div class="project-content">
|
|
81
|
+
{{{sections_html}}}
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<!-- Navigation -->
|
|
85
|
+
<nav class="project-nav">
|
|
86
|
+
<a href="./" class="back-link">← All Projects</a>
|
|
87
|
+
</nav>
|
|
88
|
+
</main>
|
|
89
|
+
|
|
90
|
+
<footer class="srcl-footer">
|
|
91
|
+
<p>Built with <a href="https://devfolio.page" target="_blank">devfolio.page</a> using <a href="https://sacred.computer" target="_blank">SRCL</a></p>
|
|
92
|
+
</footer>
|
|
93
|
+
|
|
94
|
+
<script src="../assets/script.js"></script>
|
|
95
|
+
</body>
|
|
96
|
+
</html>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Projects - {{site_name}}</title>
|
|
7
|
+
<meta name="description" content="Projects by {{site_name}}">
|
|
8
|
+
<link rel="stylesheet" href="../assets/styles.css">
|
|
9
|
+
<script>
|
|
10
|
+
// Load theme preference before render to prevent flash
|
|
11
|
+
(function() {
|
|
12
|
+
try {
|
|
13
|
+
var saved = localStorage.getItem('srcl-theme');
|
|
14
|
+
if (saved) document.documentElement.dataset.theme = saved;
|
|
15
|
+
} catch(e) {}
|
|
16
|
+
})();
|
|
17
|
+
</script>
|
|
18
|
+
</head>
|
|
19
|
+
<body class="srcl-theme" data-theme="{{colorScheme}}">
|
|
20
|
+
|
|
21
|
+
<!-- Action Bar -->
|
|
22
|
+
<div class="srcl-action-bar">
|
|
23
|
+
<nav class="primary">
|
|
24
|
+
<a href="../" class="nav-home">{{site_name}}</a>
|
|
25
|
+
{{#nav_links}}
|
|
26
|
+
<a href="{{href}}"{{#active}} class="active"{{/active}}>{{label}}</a>
|
|
27
|
+
{{/nav_links}}
|
|
28
|
+
</nav>
|
|
29
|
+
<div class="secondary">
|
|
30
|
+
<button class="hotkey" data-hotkey="ctrl+t" title="Toggle theme (Ctrl+T)">
|
|
31
|
+
<span class="key">^T</span>
|
|
32
|
+
</button>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<main class="content">
|
|
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>
|
|
40
|
+
</header>
|
|
41
|
+
|
|
42
|
+
<div class="projects-grid full-width">
|
|
43
|
+
{{#projects}}
|
|
44
|
+
<a href="./{{id}}.html" class="project-card {{#featured}}featured{{/featured}}">
|
|
45
|
+
<div class="project-thumbnail">
|
|
46
|
+
<img src="{{thumbnail}}" alt="{{title}}" loading="lazy">
|
|
47
|
+
</div>
|
|
48
|
+
<div class="project-info">
|
|
49
|
+
<h3>{{title}}</h3>
|
|
50
|
+
{{#subtitle}}<p class="subtitle">{{subtitle}}</p>{{/subtitle}}
|
|
51
|
+
<div class="project-meta">
|
|
52
|
+
<span class="year">{{meta.year}}</span>
|
|
53
|
+
<span class="role">{{meta.role}}</span>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="tech-tags">
|
|
56
|
+
{{#meta.tech}}<span class="tag">{{.}}</span>{{/meta.tech}}
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</a>
|
|
60
|
+
{{/projects}}
|
|
61
|
+
</div>
|
|
62
|
+
</main>
|
|
63
|
+
|
|
64
|
+
<footer class="srcl-footer">
|
|
65
|
+
<p>Built with <a href="https://devfolio.page" target="_blank">devfolio.page</a> using <a href="https://sacred.computer" target="_blank">SRCL</a></p>
|
|
66
|
+
</footer>
|
|
67
|
+
|
|
68
|
+
<script src="../assets/script.js"></script>
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Writing - {{site_name}}</title>
|
|
7
|
+
<meta name="description" content="Articles and writing by {{site_name}}">
|
|
8
|
+
<link rel="stylesheet" href="../assets/styles.css">
|
|
9
|
+
<script>
|
|
10
|
+
// Load theme preference before render to prevent flash
|
|
11
|
+
(function() {
|
|
12
|
+
try {
|
|
13
|
+
var saved = localStorage.getItem('srcl-theme');
|
|
14
|
+
if (saved) document.documentElement.dataset.theme = saved;
|
|
15
|
+
} catch(e) {}
|
|
16
|
+
})();
|
|
17
|
+
</script>
|
|
18
|
+
</head>
|
|
19
|
+
<body class="srcl-theme" data-theme="{{colorScheme}}">
|
|
20
|
+
|
|
21
|
+
<!-- Action Bar -->
|
|
22
|
+
<div class="srcl-action-bar">
|
|
23
|
+
<nav class="primary">
|
|
24
|
+
<a href="../" class="nav-home">{{site_name}}</a>
|
|
25
|
+
{{#nav_links}}
|
|
26
|
+
<a href="{{href}}"{{#active}} class="active"{{/active}}>{{label}}</a>
|
|
27
|
+
{{/nav_links}}
|
|
28
|
+
</nav>
|
|
29
|
+
<div class="secondary">
|
|
30
|
+
<button class="hotkey" data-hotkey="ctrl+t" title="Toggle theme (Ctrl+T)">
|
|
31
|
+
<span class="key">^T</span>
|
|
32
|
+
</button>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
<main class="content">
|
|
37
|
+
<header class="page-header">
|
|
38
|
+
<h1>Writing</h1>
|
|
39
|
+
<p class="page-description">Articles, blog posts, and technical writing.</p>
|
|
40
|
+
</header>
|
|
41
|
+
|
|
42
|
+
<ul class="writing-list full-width">
|
|
43
|
+
{{#writing}}
|
|
44
|
+
<li class="writing-item">
|
|
45
|
+
<a href="{{url}}" target="_blank">
|
|
46
|
+
<span class="writing-title">{{title}}</span>
|
|
47
|
+
{{#publication}}<span class="writing-publication">{{publication}}</span>{{/publication}}
|
|
48
|
+
<span class="writing-date">{{date}}</span>
|
|
49
|
+
</a>
|
|
50
|
+
</li>
|
|
51
|
+
{{/writing}}
|
|
52
|
+
</ul>
|
|
53
|
+
</main>
|
|
54
|
+
|
|
55
|
+
<footer class="srcl-footer">
|
|
56
|
+
<p>Built with <a href="https://devfolio.page" target="_blank">devfolio.page</a> using <a href="https://sacred.computer" target="_blank">SRCL</a></p>
|
|
57
|
+
</footer>
|
|
58
|
+
|
|
59
|
+
<script src="../assets/script.js"></script>
|
|
60
|
+
</body>
|
|
61
|
+
</html>
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "devfolio-page",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Your portfolio as code. Version control it like software.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"devfolio": "./dist/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"src/generator/themes"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc && cp -r src/generator/themes dist/generator/",
|
|
15
|
+
"dev": "tsx watch src/cli/index.ts",
|
|
16
|
+
"start": "node dist/cli/index.js",
|
|
17
|
+
"clean": "rm -rf dist",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"portfolio",
|
|
22
|
+
"cli",
|
|
23
|
+
"yaml",
|
|
24
|
+
"static-site",
|
|
25
|
+
"srcl",
|
|
26
|
+
"resume",
|
|
27
|
+
"cv",
|
|
28
|
+
"developer"
|
|
29
|
+
],
|
|
30
|
+
"author": "Louanne Murphy",
|
|
31
|
+
"homepage": "https://devfolio.page",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "git+https://github.com/devfolio-page/devfolio.git"
|
|
35
|
+
},
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/devfolio-page/devfolio/issues"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"chalk": "^5.6.2",
|
|
44
|
+
"commander": "^14.0.2",
|
|
45
|
+
"js-yaml": "^4.1.1",
|
|
46
|
+
"marked": "^17.0.1",
|
|
47
|
+
"mustache": "^4.2.0",
|
|
48
|
+
"zod": "^4.2.1"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/commander": "^2.12.0",
|
|
52
|
+
"@types/js-yaml": "^4.0.9",
|
|
53
|
+
"@types/mustache": "^4.2.6",
|
|
54
|
+
"@types/node": "^25.0.3",
|
|
55
|
+
"tsx": "^4.21.0",
|
|
56
|
+
"typescript": "^5.9.3"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<section id="education" class="section">
|
|
2
|
+
<h2 class="section-title">Education</h2>
|
|
3
|
+
<div class="education-list">
|
|
4
|
+
{{#educations}}
|
|
5
|
+
<div class="education-item">
|
|
6
|
+
<div class="education-date">{{date.start}} – {{date.end}}</div>
|
|
7
|
+
<div class="education-details">
|
|
8
|
+
<div class="education-institution">{{institution}}</div>
|
|
9
|
+
<div class="education-degree">{{degree}}</div>
|
|
10
|
+
{{#description}}<div class="education-description">{{description}}</div>{{/description}}
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
{{/educations}}
|
|
14
|
+
</div>
|
|
15
|
+
</section>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<section id="experience" class="section">
|
|
2
|
+
<h2 class="section-title">Experience</h2>
|
|
3
|
+
<div class="experience-list">
|
|
4
|
+
{{#experiences}}
|
|
5
|
+
<div class="experience-item">
|
|
6
|
+
<div class="experience-date">{{date.start}} – {{date.end}}</div>
|
|
7
|
+
<div class="experience-details">
|
|
8
|
+
<div class="experience-header">
|
|
9
|
+
<span class="experience-company">{{company}}</span>
|
|
10
|
+
<span class="experience-role"> — {{role}}</span>
|
|
11
|
+
</div>
|
|
12
|
+
{{#highlights.length}}
|
|
13
|
+
<ul class="experience-highlights">
|
|
14
|
+
{{#highlights}}
|
|
15
|
+
<li>{{.}}</li>
|
|
16
|
+
{{/highlights}}
|
|
17
|
+
</ul>
|
|
18
|
+
{{/highlights.length}}
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
{{/experiences}}
|
|
22
|
+
</div>
|
|
23
|
+
</section>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<section class="hero">
|
|
2
|
+
<h1 class="hero-name">{{name}}</h1>
|
|
3
|
+
<p class="hero-title">{{title}}</p>
|
|
4
|
+
<p class="hero-location">{{location}}{{#timezone}} · {{timezone}}{{/timezone}}</p>
|
|
5
|
+
|
|
6
|
+
<div class="hero-links">
|
|
7
|
+
{{#email}}<a href="mailto:{{email}}" class="hero-link">Email</a>{{/email}}
|
|
8
|
+
{{#website}}<a href="{{website}}" target="_blank" class="hero-link">Website</a>{{/website}}
|
|
9
|
+
{{#github}}<a href="https://github.com/{{github}}" target="_blank" class="hero-link">GitHub</a>{{/github}}
|
|
10
|
+
{{#linkedin}}<a href="https://linkedin.com/in/{{linkedin}}" target="_blank" class="hero-link">LinkedIn</a>{{/linkedin}}
|
|
11
|
+
{{#twitter}}<a href="https://twitter.com/{{twitter}}" target="_blank" class="hero-link">Twitter</a>{{/twitter}}
|
|
12
|
+
</div>
|
|
13
|
+
|
|
14
|
+
<p class="hero-bio">{{bio}}</p>
|
|
15
|
+
</section>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<section id="projects" class="section">
|
|
2
|
+
<h2 class="section-title">Projects</h2>
|
|
3
|
+
<div class="projects-list">
|
|
4
|
+
{{#projects}}
|
|
5
|
+
<div class="project-item{{#featured}} featured{{/featured}}">
|
|
6
|
+
<div class="project-header">
|
|
7
|
+
<h3 class="project-name">{{name}}</h3>
|
|
8
|
+
{{#url}}<a href="{{url}}" target="_blank" class="project-link">View →</a>{{/url}}
|
|
9
|
+
</div>
|
|
10
|
+
<p class="project-description">{{description}}</p>
|
|
11
|
+
<div class="project-tags">
|
|
12
|
+
{{#tags}}<span class="project-tag">{{.}}</span>{{/tags}}
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
{{/projects}}
|
|
16
|
+
</div>
|
|
17
|
+
</section>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<section id="writing" class="section">
|
|
2
|
+
<h2 class="section-title">Publications</h2>
|
|
3
|
+
<div class="writing-list">
|
|
4
|
+
{{#articles}}
|
|
5
|
+
<div class="writing-item">
|
|
6
|
+
<div class="writing-date">{{date}}</div>
|
|
7
|
+
<div class="writing-content">
|
|
8
|
+
<a href="{{url}}" target="_blank" class="writing-title">{{title}}</a>
|
|
9
|
+
{{#publication}}<div class="writing-publication">{{publication}}</div>{{/publication}}
|
|
10
|
+
{{#description}}<p class="writing-description">{{description}}</p>{{/description}}
|
|
11
|
+
</div>
|
|
12
|
+
</div>
|
|
13
|
+
{{/articles}}
|
|
14
|
+
</div>
|
|
15
|
+
</section>
|