This repository was archived by the owner on Feb 23, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.js
More file actions
100 lines (80 loc) · 3.09 KB
/
script.js
File metadata and controls
100 lines (80 loc) · 3.09 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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
let projects = [
{ id: 1, name: "CodePilot App", lang: "react", path: "~/desktop/projects/codepilot", tags: ["Next.js", "Electron"] },
{ id: 2, name: "Mon Portfolio", lang: "vue", path: "~/web/my-portfolio", tags: ["Design"] },
{ id: 3, name: "API Gateway", lang: "node", path: "~/backend/api-gateway", tags: ["Microservices"] }
];
function renderProjects() {
const grid = document.getElementById('projects-grid');
const searchTerm = document.getElementById('project-search').value.toLowerCase();
grid.innerHTML = '';
const filtered = projects.filter(p => p.name.toLowerCase().includes(searchTerm));
filtered.forEach(p => {
const card = document.createElement('div');
card.className = 'project-card';
card.onclick = () => openProjectModal(p);
card.innerHTML = `
<div class="project-header">
<span class="fw-badge ${p.lang}">${p.lang.charAt(0).toUpperCase() + p.lang.slice(1)}</span>
<div class="card-actions">
<span class="icon">⭐</span>
</div>
</div>
<h3>${p.name}</h3>
<p class="path">${p.path}</p>
<div class="project-footer">
<div class="tags">
${p.tags.map(t => `<span class="tag">${t}</span>`).join('')}
</div>
</div>
`;
grid.appendChild(card);
});
document.getElementById('project-count-badge').innerText = projects.length;
}
// Search interaction
document.getElementById('project-search').addEventListener('input', renderProjects);
// Modal Management
function openProjectModal(project) {
document.getElementById('modal-project-name').innerText = project.name;
document.getElementById('project-modal').classList.remove('hidden');
}
function closeProjectModal() {
document.getElementById('project-modal').classList.add('hidden');
}
function openCreateProjectModal() {
document.getElementById('create-modal').classList.remove('hidden');
}
function closeCreateModal() {
document.getElementById('create-modal').classList.add('hidden');
}
function saveNewProject() {
const name = document.getElementById('new-project-name').value;
const lang = document.getElementById('new-project-lang').value;
if (!name) return alert("Veuillez donner un nom au projet");
const newProject = {
id: Date.now(),
name: name,
lang: lang,
path: `~/web/${name.toLowerCase().replace(/ /g, '-')}`,
tags: ["Nouveau"]
};
projects.push(newProject);
renderProjects();
closeCreateModal();
// Reset fields
document.getElementById('new-project-name').value = '';
}
function showDownloadPrompt() {
document.getElementById('download-modal').classList.remove('hidden');
}
function closeDownloadModal() {
document.getElementById('download-modal').classList.add('hidden');
}
// Close modals when clicking outside
window.onclick = function (event) {
if (event.target.classList.contains('modal')) {
event.target.classList.add('hidden');
}
}
// Initial render
renderProjects();