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,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modern Theme Interactive Features
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
(function() {
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
// Theme Toggle
|
|
9
|
+
function toggleTheme() {
|
|
10
|
+
const current = document.body.dataset.theme || document.documentElement.dataset.theme || 'light';
|
|
11
|
+
const newTheme = current === 'light' ? 'dark' : 'light';
|
|
12
|
+
|
|
13
|
+
// Set on both html and body for CSS compatibility
|
|
14
|
+
document.documentElement.dataset.theme = newTheme;
|
|
15
|
+
document.body.dataset.theme = newTheme;
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
localStorage.setItem('modern-theme', newTheme);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
// localStorage not available
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function loadThemePreference() {
|
|
25
|
+
try {
|
|
26
|
+
const saved = localStorage.getItem('modern-theme');
|
|
27
|
+
if (saved) {
|
|
28
|
+
// Set on both html and body for CSS compatibility
|
|
29
|
+
document.documentElement.dataset.theme = saved;
|
|
30
|
+
document.body.dataset.theme = saved;
|
|
31
|
+
}
|
|
32
|
+
} catch (e) {
|
|
33
|
+
// localStorage not available
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Smooth scroll for anchor links
|
|
38
|
+
function initSmoothScroll() {
|
|
39
|
+
document.querySelectorAll('a[href^="#"]').forEach(link => {
|
|
40
|
+
link.addEventListener('click', (e) => {
|
|
41
|
+
const href = link.getAttribute('href');
|
|
42
|
+
if (href === '#') return;
|
|
43
|
+
|
|
44
|
+
const target = document.querySelector(href);
|
|
45
|
+
if (target) {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
const headerHeight = document.querySelector('.site-header')?.offsetHeight || 64;
|
|
48
|
+
const targetPosition = target.getBoundingClientRect().top + window.scrollY - headerHeight - 24;
|
|
49
|
+
|
|
50
|
+
window.scrollTo({
|
|
51
|
+
top: targetPosition,
|
|
52
|
+
behavior: 'smooth'
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
history.pushState(null, '', href);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Keyboard shortcuts
|
|
62
|
+
function initKeyboardShortcuts() {
|
|
63
|
+
document.addEventListener('keydown', (e) => {
|
|
64
|
+
if (e.target.matches('input, textarea, select')) return;
|
|
65
|
+
|
|
66
|
+
// Ctrl+T or Cmd+T: Toggle theme
|
|
67
|
+
if ((e.ctrlKey || e.metaKey) && e.key === 't') {
|
|
68
|
+
e.preventDefault();
|
|
69
|
+
toggleTheme();
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Theme toggle button click
|
|
74
|
+
document.querySelectorAll('.theme-toggle, [data-hotkey="ctrl+t"]').forEach(button => {
|
|
75
|
+
button.addEventListener('click', toggleTheme);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Active nav highlight on scroll
|
|
80
|
+
function initScrollSpy() {
|
|
81
|
+
const sections = document.querySelectorAll('.section[id]');
|
|
82
|
+
const navLinks = document.querySelectorAll('.nav a[href^="#"]');
|
|
83
|
+
|
|
84
|
+
if (sections.length === 0 || navLinks.length === 0) return;
|
|
85
|
+
|
|
86
|
+
let ticking = false;
|
|
87
|
+
|
|
88
|
+
function updateActiveSection() {
|
|
89
|
+
const scrollPos = window.scrollY + 100;
|
|
90
|
+
let currentSection = '';
|
|
91
|
+
|
|
92
|
+
sections.forEach(section => {
|
|
93
|
+
const sectionTop = section.offsetTop;
|
|
94
|
+
const sectionHeight = section.offsetHeight;
|
|
95
|
+
|
|
96
|
+
if (scrollPos >= sectionTop && scrollPos < sectionTop + sectionHeight) {
|
|
97
|
+
currentSection = section.getAttribute('id');
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
navLinks.forEach(link => {
|
|
102
|
+
const href = link.getAttribute('href').substring(1);
|
|
103
|
+
if (href === currentSection) {
|
|
104
|
+
link.style.color = 'var(--text-primary)';
|
|
105
|
+
} else {
|
|
106
|
+
link.style.color = '';
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
ticking = false;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
window.addEventListener('scroll', () => {
|
|
114
|
+
if (!ticking) {
|
|
115
|
+
requestAnimationFrame(updateActiveSection);
|
|
116
|
+
ticking = true;
|
|
117
|
+
}
|
|
118
|
+
}, { passive: true });
|
|
119
|
+
|
|
120
|
+
updateActiveSection();
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Initialize
|
|
124
|
+
function init() {
|
|
125
|
+
loadThemePreference();
|
|
126
|
+
initSmoothScroll();
|
|
127
|
+
initKeyboardShortcuts();
|
|
128
|
+
initScrollSpy();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (document.readyState === 'loading') {
|
|
132
|
+
document.addEventListener('DOMContentLoaded', init);
|
|
133
|
+
} else {
|
|
134
|
+
init();
|
|
135
|
+
}
|
|
136
|
+
})();
|