-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
38 lines (34 loc) · 1.29 KB
/
Copy pathscript.js
File metadata and controls
38 lines (34 loc) · 1.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const projects = window.PORTFOLIO_PROJECTS || [];
const grid = document.querySelector('#projectGrid');
const count = document.querySelector('#projectCount');
function escapeHtml(value) {
return String(value).replace(/[&<>'"]/g, character => ({
'&': '&',
'<': '<',
'>': '>',
"'": ''',
'"': '"'
}[character]));
}
function renderProjects() {
if (count) count.textContent = projects.length;
if (!grid) return;
grid.innerHTML = projects.map(project => `
<article class="project-card">
<div class="project-top">
<div class="project-icon">${escapeHtml(project.icon || project.title.slice(0, 2))}</div>
<span class="badge">${escapeHtml(project.status || 'In progress')}</span>
</div>
<h3>${escapeHtml(project.title)}</h3>
<p>${escapeHtml(project.description)}</p>
<div class="tags">
${(project.tags || []).map(tag => `<span>${escapeHtml(tag)}</span>`).join('')}
</div>
<div class="project-links">
${project.liveUrl ? `<a href="${escapeHtml(project.liveUrl)}" target="_blank" rel="noreferrer">Live demo</a>` : ''}
${project.repoUrl ? `<a href="${escapeHtml(project.repoUrl)}" target="_blank" rel="noreferrer">Source</a>` : ''}
</div>
</article>
`).join('');
}
renderProjects();