MoiMoi-01 commited on
Commit
573a48d
·
verified ·
1 Parent(s): c8832f3

Add 2 files

Browse files
Files changed (2) hide show
  1. index.html +194 -76
  2. prompts.txt +2 -1
index.html CHANGED
@@ -7,98 +7,223 @@
7
  <script src="https://cdn.tailwindcss.com"></script>
8
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
  <style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  .project-card {
11
- transition: all 0.3s ease;
12
  transform: translateY(0);
 
 
 
 
13
  }
14
  .project-card:hover {
15
  transform: translateY(-5px);
16
- box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
17
  }
 
 
18
  .tag {
19
  transition: all 0.2s ease;
 
 
 
20
  }
21
  .tag:hover {
22
  transform: scale(1.05);
23
  }
 
 
24
  .status-badge.completed {
25
- background-color: rgba(16, 185, 129, 0.2);
26
- color: rgb(16, 185, 129);
27
  }
28
  .status-badge.in-progress {
29
- background-color: rgba(245, 158, 11, 0.2);
30
- color: rgb(245, 158, 11);
31
  }
32
  .status-badge.planned {
33
- background-color: rgba(59, 130, 246, 0.2);
34
- color: rgb(59, 130, 246);
35
  }
36
  .status-badge.on-hold {
37
- background-color: rgba(239, 68, 68, 0.2);
38
- color: rgb(239, 68, 68);
39
  }
 
 
40
  .fade-in {
41
- animation: fadeIn 0.5s ease-in-out;
42
  }
43
  @keyframes fadeIn {
44
  from { opacity: 0; transform: translateY(10px); }
45
  to { opacity: 1; transform: translateY(0); }
46
  }
 
 
47
  .modal-overlay {
48
  background-color: rgba(0, 0, 0, 0.5);
49
- backdrop-filter: blur(4px);
 
 
 
 
 
 
 
 
 
 
 
 
50
  }
51
  .form-input:focus {
52
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.2);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  }
54
- .card-expand {
55
- transition: all 0.3s ease;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  }
57
- .card-expand:hover {
58
- transform: scale(1.02);
 
 
59
  }
 
 
 
 
 
 
 
60
  .filter-tag {
61
  transition: all 0.2s ease;
 
 
 
62
  }
63
  .filter-tag:hover {
64
  transform: scale(1.05);
65
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
66
  }
67
  .filter-tag.active {
68
- background-color: #6366f1;
69
  color: white;
70
  }
 
 
71
  .slide-in {
72
- animation: slideIn 0.3s ease-out forwards;
73
  }
74
  @keyframes slideIn {
75
  from { transform: translateY(20px); opacity: 0; }
76
  to { transform: translateY(0); opacity: 1; }
77
  }
 
 
 
 
 
 
 
 
 
78
  </style>
79
  </head>
80
- <body class="bg-gray-50 min-h-screen">
81
- <div class="container mx-auto px-4 py-12">
82
- <!-- Header -->
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  <div class="text-center mb-12">
84
- <h1 class="text-4xl font-bold text-gray-800 mb-2">Project Dashboard</h1>
85
- <p class="text-lg text-gray-600 max-w-2xl mx-auto">Track and manage all your projects in one place</p>
 
 
86
 
87
  <!-- Filter Controls -->
88
  <div class="flex flex-wrap justify-center gap-3 mt-6">
89
- <button onclick="filterProjects('all')" class="filter-tag px-4 py-2 bg-indigo-600 text-white rounded-full hover:bg-indigo-700 transition active">
90
  All Projects
91
  </button>
92
- <button onclick="filterProjects('completed')" class="filter-tag px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">
93
  Completed
94
  </button>
95
- <button onclick="filterProjects('in-progress')" class="filter-tag px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">
96
  In Progress
97
  </button>
98
- <button onclick="filterProjects('planned')" class="filter-tag px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">
99
  Planned
100
  </button>
101
- <button onclick="filterProjects('on-hold')" class="filter-tag px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">
102
  On Hold
103
  </button>
104
  </div>
@@ -106,7 +231,7 @@
106
  <!-- Technology Filter -->
107
  <div class="mt-6">
108
  <label for="technologyFilter" class="block text-sm font-medium text-gray-700 mb-2">Filter by Technology:</label>
109
- <select id="technologyFilter" onchange="filterByTechnology()" class="border border-gray-300 rounded-lg py-2 px-3 focus:outline-none focus:border-indigo-500">
110
  <option value="all">All Technologies</option>
111
  <!-- Options will be populated dynamically -->
112
  </select>
@@ -114,7 +239,7 @@
114
  </div>
115
 
116
  <!-- Projects Grid -->
117
- <div id="projectsContainer" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
118
  <!-- Project cards will be inserted here dynamically -->
119
  </div>
120
 
@@ -124,25 +249,18 @@
124
  <i class="fas fa-folder-open text-5xl text-gray-300 mb-4"></i>
125
  <h3 class="text-xl font-medium text-gray-700 mb-2">No projects found</h3>
126
  <p class="text-gray-500 mb-4">Add a new project or adjust your filters</p>
127
- <button id="addProjectBtnEmpty" class="bg-indigo-600 hover:bg-indigo-700 text-white px-6 py-2 rounded-full inline-flex items-center transition">
128
  <i class="fas fa-plus mr-2"></i> Add Project
129
  </button>
130
  </div>
131
  </div>
132
-
133
- <!-- Add Project Button -->
134
- <div class="fixed bottom-8 right-8">
135
- <button id="addProjectBtn" class="bg-indigo-600 hover:bg-indigo-700 text-white w-14 h-14 rounded-full flex items-center justify-center shadow-lg transition transform hover:scale-110">
136
- <i class="fas fa-plus text-xl"></i>
137
- </button>
138
- </div>
139
  </div>
140
 
141
  <!-- Add/Edit Project Modal -->
142
  <div id="projectModal" class="fixed inset-0 z-50 hidden">
143
  <div class="modal-overlay absolute inset-0"></div>
144
- <div class="flex items-center justify-center min-h-screen">
145
- <div class="bg-white rounded-xl shadow-xl w-full max-w-2xl max-h-[90vh] overflow-y-auto m-4 card-expand slide-in">
146
  <div class="p-6">
147
  <div class="flex justify-between items-center mb-4">
148
  <h3 id="modalTitle" class="text-xl font-bold text-gray-800">Add New Project</h3>
@@ -157,12 +275,12 @@
157
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
158
  <div>
159
  <label for="projectName" class="block text-sm font-medium text-gray-700 mb-1">Project Name *</label>
160
- <input type="text" id="projectName" required class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500">
161
  </div>
162
 
163
  <div>
164
  <label for="projectStatus" class="block text-sm font-medium text-gray-700 mb-1">Status *</label>
165
- <select id="projectStatus" required class="w-full border border-gray-300 rounded-lg py-2 px-3 focus:outline-none focus:border-indigo-500">
166
  <option value="planned">Planned</option>
167
  <option value="in-progress">In Progress</option>
168
  <option value="completed">Completed</option>
@@ -173,58 +291,58 @@
173
 
174
  <div>
175
  <label for="projectImage" class="block text-sm font-medium text-gray-700 mb-1">Image URL</label>
176
- <input type="url" id="projectImage" class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500">
177
  </div>
178
 
179
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
180
  <div>
181
  <label for="projectDateRange" class="block text-sm font-medium text-gray-700 mb-1">Date Range</label>
182
- <input type="text" id="projectDateRange" placeholder="e.g. Jan 2023 - Mar 2023" class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500">
183
  </div>
184
 
185
  <div>
186
  <label for="projectTechnologies" class="block text-sm font-medium text-gray-700 mb-1">Technologies (comma separated) *</label>
187
- <input type="text" id="projectTechnologies" required placeholder="e.g. React, Node.js, MongoDB" class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500">
188
  </div>
189
  </div>
190
 
191
  <div>
192
  <label for="projectDescription" class="block text-sm font-medium text-gray-700 mb-1">Description *</label>
193
- <textarea id="projectDescription" rows="3" required class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500"></textarea>
194
  </div>
195
 
196
  <div>
197
  <label for="projectTags" class="block text-sm font-medium text-gray-700 mb-1">Tags (comma separated)</label>
198
- <input type="text" id="projectTags" placeholder="e.g. web, mobile, api" class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500">
199
  </div>
200
 
201
  <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
202
  <div>
203
  <label for="projectGithub" class="block text-sm font-medium text-gray-700 mb-1">GitHub Link</label>
204
- <input type="url" id="projectGithub" class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500">
205
  </div>
206
 
207
  <div>
208
  <label for="projectDemo" class="block text-sm font-medium text-gray-700 mb-1">Demo Link</label>
209
- <input type="url" id="projectDemo" class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500">
210
  </div>
211
 
212
  <div>
213
  <label for="projectReadme" class="block text-sm font-medium text-gray-700 mb-1">README Link</label>
214
- <input type="url" id="projectReadme" class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500">
215
  </div>
216
  </div>
217
 
218
  <div>
219
  <label for="projectNotes" class="block text-sm font-medium text-gray-700 mb-1">Notes</label>
220
- <textarea id="projectNotes" rows="3" class="w-full border border-gray-300 rounded-lg py-2 px-3 form-input focus:outline-none focus:border-indigo-500"></textarea>
221
  </div>
222
 
223
  <div class="flex justify-end space-x-3 pt-4">
224
- <button type="button" id="cancelModalBtn" class="px-4 py-2 border border-gray-300 rounded-full text-gray-700 hover:bg-gray-50 transition">
225
  Cancel
226
  </button>
227
- <button type="submit" id="saveProjectBtn" class="px-4 py-2 bg-indigo-600 text-white rounded-full hover:bg-indigo-700 transition">
228
  Save Project
229
  </button>
230
  </div>
@@ -237,8 +355,8 @@
237
  <!-- Project Details Modal -->
238
  <div id="detailsModal" class="fixed inset-0 z-50 hidden">
239
  <div class="modal-overlay absolute inset-0"></div>
240
- <div class="flex items-center justify-center min-h-screen">
241
- <div class="bg-white rounded-xl shadow-xl w-full max-w-2xl max-h-[90vh] overflow-y-auto m-4 card-expand slide-in">
242
  <div class="p-6">
243
  <div class="flex justify-between items-center mb-4">
244
  <h3 id="detailsTitle" class="text-xl font-bold text-gray-800">Project Details</h3>
@@ -252,10 +370,10 @@
252
  </div>
253
 
254
  <div class="flex justify-end space-x-3 pt-6">
255
- <button id="deleteDetailsBtn" class="px-4 py-2 bg-red-600 text-white rounded-full hover:bg-red-700 transition">
256
  Delete Project
257
  </button>
258
- <button id="editDetailsBtn" class="px-4 py-2 bg-indigo-600 text-white rounded-full hover:bg-indigo-700 transition">
259
  Edit Project
260
  </button>
261
  </div>
@@ -267,8 +385,8 @@
267
  <!-- Delete Confirmation Modal -->
268
  <div id="deleteModal" class="fixed inset-0 z-50 hidden">
269
  <div class="modal-overlay absolute inset-0"></div>
270
- <div class="flex items-center justify-center min-h-screen">
271
- <div class="bg-white rounded-xl shadow-xl w-full max-w-md m-4 card-expand slide-in">
272
  <div class="p-6">
273
  <div class="flex justify-between items-center mb-4">
274
  <h3 class="text-xl font-bold text-gray-800">Confirm Deletion</h3>
@@ -280,10 +398,10 @@
280
  <p id="deleteMessage" class="text-gray-700 mb-6">Are you sure you want to delete this project?</p>
281
 
282
  <div class="flex justify-end space-x-3">
283
- <button id="cancelDeleteBtn" class="px-4 py-2 border border-gray-300 rounded-full text-gray-700 hover:bg-gray-50 transition">
284
  Cancel
285
  </button>
286
- <button id="confirmDeleteBtn" class="px-4 py-2 bg-red-600 text-white rounded-full hover:bg-red-700 transition">
287
  Delete
288
  </button>
289
  </div>
@@ -469,7 +587,7 @@
469
  // Create a project card element
470
  function createProjectCard(project) {
471
  const card = document.createElement('div');
472
- card.className = 'project-card bg-white rounded-xl overflow-hidden shadow-md hover:shadow-lg fade-in';
473
  card.dataset.id = project.id;
474
  card.dataset.status = project.status;
475
  card.dataset.technologies = project.technologies ? project.technologies.join(',') : '';
@@ -500,8 +618,8 @@
500
  <div class="h-48 overflow-hidden">
501
  ${project.image_link ?
502
  `<img src="${project.image_link}" alt="${project.name}" class="w-full h-full object-cover">` :
503
- `<div class="w-full h-full bg-gray-200 flex items-center justify-center">
504
- <i class="fas fa-image text-4xl text-gray-400"></i>
505
  </div>`
506
  }
507
  </div>
@@ -517,7 +635,7 @@
517
  ${project.technologies && project.technologies.length > 0 ?
518
  `<div class="flex flex-wrap gap-2 mb-2">
519
  ${project.technologies.map(tech => `
520
- <span class="tag text-xs bg-purple-100 text-purple-800 px-2 py-1 rounded-full">
521
  ${tech}
522
  </span>
523
  `).join('')}
@@ -527,7 +645,7 @@
527
  ${project.tags && project.tags.length > 0 ?
528
  `<div class="flex flex-wrap gap-2 mb-4">
529
  ${project.tags.map(tag => `
530
- <span class="tag text-xs bg-gray-100 text-gray-800 px-2 py-1 rounded-full">
531
  ${tag}
532
  </span>
533
  `).join('')}
@@ -538,19 +656,19 @@
538
  <span>${project.date_range || 'No date specified'}</span>
539
  <div class="flex space-x-2">
540
  ${project.github_link ? `
541
- <a href="${project.github_link}" target="_blank" class="text-gray-700 hover:text-gray-900 transition" title="GitHub">
542
  <i class="fab fa-github"></i>
543
  </a>
544
  ` : ''}
545
 
546
  ${project.demo_link ? `
547
- <a href="${project.demo_link}" target="_blank" class="text-gray-700 hover:text-gray-900 transition" title="Live Demo">
548
  <i class="fas fa-external-link-alt"></i>
549
  </a>
550
  ` : ''}
551
 
552
  ${project.readme_link ? `
553
- <a href="${project.readme_link}" target="_blank" class="text-gray-700 hover:text-gray-900 transition" title="README">
554
  <i class="fas fa-book"></i>
555
  </a>
556
  ` : ''}
@@ -577,10 +695,10 @@
577
 
578
  // Update active filter button
579
  document.querySelectorAll('.filter-tag').forEach(btn => {
580
- btn.classList.remove('active', 'bg-indigo-600', 'text-white');
581
  if ((status === 'all' && btn.textContent.trim() === 'All Projects') ||
582
  (status !== 'all' && btn.textContent.trim() === status.charAt(0).toUpperCase() + status.slice(1))) {
583
- btn.classList.add('active', 'bg-indigo-600', 'text-white');
584
  }
585
  });
586
 
@@ -741,7 +859,7 @@
741
  <h4 class="font-medium text-gray-800 mb-1">Technologies</h4>
742
  <div class="flex flex-wrap gap-2">
743
  ${project.technologies.map(tech => `
744
- <span class="text-xs bg-purple-100 text-purple-800 px-2 py-1 rounded-full">${tech}</span>
745
  `).join('')}
746
  </div>
747
  </div>
@@ -752,7 +870,7 @@
752
  <h4 class="font-medium text-gray-800 mb-1">Tags</h4>
753
  <div class="flex flex-wrap gap-2">
754
  ${project.tags.map(tag => `
755
- <span class="text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded-full">${tag}</span>
756
  `).join('')}
757
  </div>
758
  </div>
@@ -853,7 +971,7 @@
853
  tags: projectTags.value ? projectTags.value.split(',').map(tag => tag.trim()).filter(tag => tag) : [],
854
  github_link: projectGithub.value.trim(),
855
  demo_link: projectDemo.value.trim(),
856
- readme_link: projectReadme.value.trim(),
857
  status: projectStatus.value,
858
  technologies: projectTechnologies.value ? projectTechnologies.value.split(',').map(tech => tech.trim()).filter(tech => tech) : [],
859
  notes: projectNotes.value.trim(),
 
7
  <script src="https://cdn.tailwindcss.com"></script>
8
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
  <style>
10
+ /* Apple-style gradient background */
11
+ body {
12
+ background: linear-gradient(135deg, #f5f7fa 0%, #e4e8eb 100%);
13
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
14
+ }
15
+
16
+ /* Apple-style navbar */
17
+ .apple-navbar {
18
+ backdrop-filter: saturate(180%) blur(20px);
19
+ background-color: rgba(255, 255, 255, 0.8);
20
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
21
+ }
22
+
23
+ /* Apple-style cards */
24
  .project-card {
25
+ transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
26
  transform: translateY(0);
27
+ border-radius: 18px;
28
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
29
+ border: 1px solid rgba(0, 0, 0, 0.05);
30
+ overflow: hidden;
31
  }
32
  .project-card:hover {
33
  transform: translateY(-5px);
34
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
35
  }
36
+
37
+ /* Apple-style tags */
38
  .tag {
39
  transition: all 0.2s ease;
40
+ border-radius: 12px;
41
+ font-size: 12px;
42
+ font-weight: 500;
43
  }
44
  .tag:hover {
45
  transform: scale(1.05);
46
  }
47
+
48
+ /* Status badges */
49
  .status-badge.completed {
50
+ background-color: rgba(52, 199, 89, 0.2);
51
+ color: rgb(52, 199, 89);
52
  }
53
  .status-badge.in-progress {
54
+ background-color: rgba(255, 149, 0, 0.2);
55
+ color: rgb(255, 149, 0);
56
  }
57
  .status-badge.planned {
58
+ background-color: rgba(0, 122, 255, 0.2);
59
+ color: rgb(0, 122, 255);
60
  }
61
  .status-badge.on-hold {
62
+ background-color: rgba(255, 59, 48, 0.2);
63
+ color: rgb(255, 59, 48);
64
  }
65
+
66
+ /* Animations */
67
  .fade-in {
68
+ animation: fadeIn 0.5s cubic-bezier(0.25, 0.8, 0.25, 1);
69
  }
70
  @keyframes fadeIn {
71
  from { opacity: 0; transform: translateY(10px); }
72
  to { opacity: 1; transform: translateY(0); }
73
  }
74
+
75
+ /* Apple-style modal */
76
  .modal-overlay {
77
  background-color: rgba(0, 0, 0, 0.5);
78
+ backdrop-filter: blur(10px);
79
+ }
80
+ .modal-content {
81
+ border-radius: 20px;
82
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);
83
+ border: 1px solid rgba(255, 255, 255, 0.1);
84
+ }
85
+
86
+ /* Apple-style inputs */
87
+ .form-input {
88
+ border-radius: 12px;
89
+ border: 1px solid rgba(0, 0, 0, 0.1);
90
+ transition: all 0.2s ease;
91
  }
92
  .form-input:focus {
93
+ box-shadow: 0 0 0 3px rgba(0, 122, 255, 0.2);
94
+ border-color: rgba(0, 122, 255, 0.5);
95
+ }
96
+
97
+ /* Apple-style buttons */
98
+ .apple-btn {
99
+ border-radius: 12px;
100
+ font-weight: 500;
101
+ transition: all 0.2s ease;
102
+ }
103
+ .apple-btn-primary {
104
+ background-color: #007AFF;
105
+ color: white;
106
+ }
107
+ .apple-btn-primary:hover {
108
+ background-color: #0066CC;
109
+ }
110
+ .apple-btn-secondary {
111
+ background-color: rgba(0, 0, 0, 0.05);
112
+ color: #007AFF;
113
+ }
114
+ .apple-btn-secondary:hover {
115
+ background-color: rgba(0, 0, 0, 0.1);
116
  }
117
+ .apple-btn-destructive {
118
+ background-color: #FF3B30;
119
+ color: white;
120
+ }
121
+ .apple-btn-destructive:hover {
122
+ background-color: #E60000;
123
+ }
124
+
125
+ /* Typewriter effect */
126
+ .typewriter {
127
+ overflow: hidden;
128
+ border-right: 2px solid #007AFF;
129
+ white-space: nowrap;
130
+ margin: 0 auto;
131
+ letter-spacing: 0.05em;
132
+ animation:
133
+ typing 1.5s steps(30, end),
134
+ blink-caret 0.75s step-end infinite;
135
  }
136
+
137
+ @keyframes typing {
138
+ from { width: 0 }
139
+ to { width: 100% }
140
  }
141
+
142
+ @keyframes blink-caret {
143
+ from, to { border-color: transparent }
144
+ 50% { border-color: #007AFF }
145
+ }
146
+
147
+ /* Apple-style filter tags */
148
  .filter-tag {
149
  transition: all 0.2s ease;
150
+ border-radius: 12px;
151
+ font-weight: 500;
152
+ font-size: 14px;
153
  }
154
  .filter-tag:hover {
155
  transform: scale(1.05);
156
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
157
  }
158
  .filter-tag.active {
159
+ background-color: #007AFF;
160
  color: white;
161
  }
162
+
163
+ /* Apple-style slide in animation */
164
  .slide-in {
165
+ animation: slideIn 0.3s cubic-bezier(0.25, 0.8, 0.25, 1) forwards;
166
  }
167
  @keyframes slideIn {
168
  from { transform: translateY(20px); opacity: 0; }
169
  to { transform: translateY(0); opacity: 1; }
170
  }
171
+
172
+ /* Apple-style select */
173
+ select {
174
+ appearance: none;
175
+ background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");
176
+ background-repeat: no-repeat;
177
+ background-position: right 0.75rem center;
178
+ background-size: 1em;
179
+ }
180
  </style>
181
  </head>
182
+ <body class="min-h-screen">
183
+ <!-- Apple-style navbar -->
184
+ <nav class="apple-navbar fixed top-0 left-0 right-0 z-50 py-3 px-6">
185
+ <div class="container mx-auto flex justify-between items-center">
186
+ <div class="flex items-center space-x-6">
187
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="text-gray-800">
188
+ <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
189
+ <polyline points="14 2 14 8 20 8"></polyline>
190
+ <line x1="16" y1="13" x2="8" y2="13"></line>
191
+ <line x1="16" y1="17" x2="8" y2="17"></line>
192
+ <polyline points="10 9 9 9 8 9"></polyline>
193
+ </svg>
194
+ <span class="text-gray-800 font-medium">Project Dashboard</span>
195
+ </div>
196
+ <div>
197
+ <button id="addProjectBtn" class="apple-btn apple-btn-primary px-4 py-2 flex items-center">
198
+ <i class="fas fa-plus mr-2"></i> New Project
199
+ </button>
200
+ </div>
201
+ </div>
202
+ </nav>
203
+
204
+ <div class="container mx-auto px-4 pt-24 pb-12">
205
+ <!-- Header with typewriter effect -->
206
  <div class="text-center mb-12">
207
+ <h1 class="text-4xl font-bold text-gray-900 mb-2">
208
+ <span class="typewriter">Manage Your Projects</span>
209
+ </h1>
210
+ <p class="text-lg text-gray-600 max-w-2xl mx-auto">Track and organize all your development projects in one place</p>
211
 
212
  <!-- Filter Controls -->
213
  <div class="flex flex-wrap justify-center gap-3 mt-6">
214
+ <button onclick="filterProjects('all')" class="filter-tag px-4 py-2 apple-btn-primary active">
215
  All Projects
216
  </button>
217
+ <button onclick="filterProjects('completed')" class="filter-tag px-4 py-2 apple-btn-secondary">
218
  Completed
219
  </button>
220
+ <button onclick="filterProjects('in-progress')" class="filter-tag px-4 py-2 apple-btn-secondary">
221
  In Progress
222
  </button>
223
+ <button onclick="filterProjects('planned')" class="filter-tag px-4 py-2 apple-btn-secondary">
224
  Planned
225
  </button>
226
+ <button onclick="filterProjects('on-hold')" class="filter-tag px-4 py-2 apple-btn-secondary">
227
  On Hold
228
  </button>
229
  </div>
 
231
  <!-- Technology Filter -->
232
  <div class="mt-6">
233
  <label for="technologyFilter" class="block text-sm font-medium text-gray-700 mb-2">Filter by Technology:</label>
234
+ <select id="technologyFilter" onchange="filterByTechnology()" class="border border-gray-200 rounded-lg py-2 px-3 focus:outline-none focus:border-blue-500 bg-white w-64">
235
  <option value="all">All Technologies</option>
236
  <!-- Options will be populated dynamically -->
237
  </select>
 
239
  </div>
240
 
241
  <!-- Projects Grid -->
242
+ <div id="projectsContainer" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
243
  <!-- Project cards will be inserted here dynamically -->
244
  </div>
245
 
 
249
  <i class="fas fa-folder-open text-5xl text-gray-300 mb-4"></i>
250
  <h3 class="text-xl font-medium text-gray-700 mb-2">No projects found</h3>
251
  <p class="text-gray-500 mb-4">Add a new project or adjust your filters</p>
252
+ <button id="addProjectBtnEmpty" class="apple-btn apple-btn-primary px-6 py-2 inline-flex items-center">
253
  <i class="fas fa-plus mr-2"></i> Add Project
254
  </button>
255
  </div>
256
  </div>
 
 
 
 
 
 
 
257
  </div>
258
 
259
  <!-- Add/Edit Project Modal -->
260
  <div id="projectModal" class="fixed inset-0 z-50 hidden">
261
  <div class="modal-overlay absolute inset-0"></div>
262
+ <div class="flex items-center justify-center min-h-screen p-4">
263
+ <div class="modal-content bg-white rounded-xl w-full max-w-2xl max-h-[90vh] overflow-y-auto m-4 slide-in">
264
  <div class="p-6">
265
  <div class="flex justify-between items-center mb-4">
266
  <h3 id="modalTitle" class="text-xl font-bold text-gray-800">Add New Project</h3>
 
275
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
276
  <div>
277
  <label for="projectName" class="block text-sm font-medium text-gray-700 mb-1">Project Name *</label>
278
+ <input type="text" id="projectName" required class="w-full form-input py-2 px-3">
279
  </div>
280
 
281
  <div>
282
  <label for="projectStatus" class="block text-sm font-medium text-gray-700 mb-1">Status *</label>
283
+ <select id="projectStatus" required class="w-full form-input py-2 px-3">
284
  <option value="planned">Planned</option>
285
  <option value="in-progress">In Progress</option>
286
  <option value="completed">Completed</option>
 
291
 
292
  <div>
293
  <label for="projectImage" class="block text-sm font-medium text-gray-700 mb-1">Image URL</label>
294
+ <input type="url" id="projectImage" class="w-full form-input py-2 px-3">
295
  </div>
296
 
297
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
298
  <div>
299
  <label for="projectDateRange" class="block text-sm font-medium text-gray-700 mb-1">Date Range</label>
300
+ <input type="text" id="projectDateRange" placeholder="e.g. Jan 2023 - Mar 2023" class="w-full form-input py-2 px-3">
301
  </div>
302
 
303
  <div>
304
  <label for="projectTechnologies" class="block text-sm font-medium text-gray-700 mb-1">Technologies (comma separated) *</label>
305
+ <input type="text" id="projectTechnologies" required placeholder="e.g. React, Node.js, MongoDB" class="w-full form-input py-2 px-3">
306
  </div>
307
  </div>
308
 
309
  <div>
310
  <label for="projectDescription" class="block text-sm font-medium text-gray-700 mb-1">Description *</label>
311
+ <textarea id="projectDescription" rows="3" required class="w-full form-input py-2 px-3"></textarea>
312
  </div>
313
 
314
  <div>
315
  <label for="projectTags" class="block text-sm font-medium text-gray-700 mb-1">Tags (comma separated)</label>
316
+ <input type="text" id="projectTags" placeholder="e.g. web, mobile, api" class="w-full form-input py-2 px-3">
317
  </div>
318
 
319
  <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
320
  <div>
321
  <label for="projectGithub" class="block text-sm font-medium text-gray-700 mb-1">GitHub Link</label>
322
+ <input type="url" id="projectGithub" class="w-full form-input py-2 px-3">
323
  </div>
324
 
325
  <div>
326
  <label for="projectDemo" class="block text-sm font-medium text-gray-700 mb-1">Demo Link</label>
327
+ <input type="url" id="projectDemo" class="w-full form-input py-2 px-3">
328
  </div>
329
 
330
  <div>
331
  <label for="projectReadme" class="block text-sm font-medium text-gray-700 mb-1">README Link</label>
332
+ <input type="url" id="projectReadme" class="w-full form-input py-2 px-3">
333
  </div>
334
  </div>
335
 
336
  <div>
337
  <label for="projectNotes" class="block text-sm font-medium text-gray-700 mb-1">Notes</label>
338
+ <textarea id="projectNotes" rows="3" class="w-full form-input py-2 px-3"></textarea>
339
  </div>
340
 
341
  <div class="flex justify-end space-x-3 pt-4">
342
+ <button type="button" id="cancelModalBtn" class="apple-btn apple-btn-secondary px-4 py-2">
343
  Cancel
344
  </button>
345
+ <button type="submit" id="saveProjectBtn" class="apple-btn apple-btn-primary px-4 py-2">
346
  Save Project
347
  </button>
348
  </div>
 
355
  <!-- Project Details Modal -->
356
  <div id="detailsModal" class="fixed inset-0 z-50 hidden">
357
  <div class="modal-overlay absolute inset-0"></div>
358
+ <div class="flex items-center justify-center min-h-screen p-4">
359
+ <div class="modal-content bg-white rounded-xl w-full max-w-2xl max-h-[90vh] overflow-y-auto m-4 slide-in">
360
  <div class="p-6">
361
  <div class="flex justify-between items-center mb-4">
362
  <h3 id="detailsTitle" class="text-xl font-bold text-gray-800">Project Details</h3>
 
370
  </div>
371
 
372
  <div class="flex justify-end space-x-3 pt-6">
373
+ <button id="deleteDetailsBtn" class="apple-btn apple-btn-destructive px-4 py-2">
374
  Delete Project
375
  </button>
376
+ <button id="editDetailsBtn" class="apple-btn apple-btn-primary px-4 py-2">
377
  Edit Project
378
  </button>
379
  </div>
 
385
  <!-- Delete Confirmation Modal -->
386
  <div id="deleteModal" class="fixed inset-0 z-50 hidden">
387
  <div class="modal-overlay absolute inset-0"></div>
388
+ <div class="flex items-center justify-center min-h-screen p-4">
389
+ <div class="modal-content bg-white rounded-xl w-full max-w-md m-4 slide-in">
390
  <div class="p-6">
391
  <div class="flex justify-between items-center mb-4">
392
  <h3 class="text-xl font-bold text-gray-800">Confirm Deletion</h3>
 
398
  <p id="deleteMessage" class="text-gray-700 mb-6">Are you sure you want to delete this project?</p>
399
 
400
  <div class="flex justify-end space-x-3">
401
+ <button id="cancelDeleteBtn" class="apple-btn apple-btn-secondary px-4 py-2">
402
  Cancel
403
  </button>
404
+ <button id="confirmDeleteBtn" class="apple-btn apple-btn-destructive px-4 py-2">
405
  Delete
406
  </button>
407
  </div>
 
587
  // Create a project card element
588
  function createProjectCard(project) {
589
  const card = document.createElement('div');
590
+ card.className = 'project-card bg-white fade-in';
591
  card.dataset.id = project.id;
592
  card.dataset.status = project.status;
593
  card.dataset.technologies = project.technologies ? project.technologies.join(',') : '';
 
618
  <div class="h-48 overflow-hidden">
619
  ${project.image_link ?
620
  `<img src="${project.image_link}" alt="${project.name}" class="w-full h-full object-cover">` :
621
+ `<div class="w-full h-full bg-gray-100 flex items-center justify-center">
622
+ <i class="fas fa-image text-4xl text-gray-300"></i>
623
  </div>`
624
  }
625
  </div>
 
635
  ${project.technologies && project.technologies.length > 0 ?
636
  `<div class="flex flex-wrap gap-2 mb-2">
637
  ${project.technologies.map(tech => `
638
+ <span class="tag text-xs bg-blue-100 text-blue-800 px-2 py-1">
639
  ${tech}
640
  </span>
641
  `).join('')}
 
645
  ${project.tags && project.tags.length > 0 ?
646
  `<div class="flex flex-wrap gap-2 mb-4">
647
  ${project.tags.map(tag => `
648
+ <span class="tag text-xs bg-gray-100 text-gray-800 px-2 py-1">
649
  ${tag}
650
  </span>
651
  `).join('')}
 
656
  <span>${project.date_range || 'No date specified'}</span>
657
  <div class="flex space-x-2">
658
  ${project.github_link ? `
659
+ <a href="${project.github_link}" target="_blank" class="text-gray-700 hover:text-blue-600 transition" title="GitHub">
660
  <i class="fab fa-github"></i>
661
  </a>
662
  ` : ''}
663
 
664
  ${project.demo_link ? `
665
+ <a href="${project.demo_link}" target="_blank" class="text-gray-700 hover:text-blue-600 transition" title="Live Demo">
666
  <i class="fas fa-external-link-alt"></i>
667
  </a>
668
  ` : ''}
669
 
670
  ${project.readme_link ? `
671
+ <a href="${project.readme_link}" target="_blank" class="text-gray-700 hover:text-blue-600 transition" title="README">
672
  <i class="fas fa-book"></i>
673
  </a>
674
  ` : ''}
 
695
 
696
  // Update active filter button
697
  document.querySelectorAll('.filter-tag').forEach(btn => {
698
+ btn.classList.remove('active', 'bg-blue-600', 'text-white');
699
  if ((status === 'all' && btn.textContent.trim() === 'All Projects') ||
700
  (status !== 'all' && btn.textContent.trim() === status.charAt(0).toUpperCase() + status.slice(1))) {
701
+ btn.classList.add('active', 'bg-blue-600', 'text-white');
702
  }
703
  });
704
 
 
859
  <h4 class="font-medium text-gray-800 mb-1">Technologies</h4>
860
  <div class="flex flex-wrap gap-2">
861
  ${project.technologies.map(tech => `
862
+ <span class="text-xs bg-blue-100 text-blue-800 px-2 py-1 rounded">${tech}</span>
863
  `).join('')}
864
  </div>
865
  </div>
 
870
  <h4 class="font-medium text-gray-800 mb-1">Tags</h4>
871
  <div class="flex flex-wrap gap-2">
872
  ${project.tags.map(tag => `
873
+ <span class="text-xs bg-gray-100 text-gray-800 px-2 py-1 rounded">${tag}</span>
874
  `).join('')}
875
  </div>
876
  </div>
 
971
  tags: projectTags.value ? projectTags.value.split(',').map(tag => tag.trim()).filter(tag => tag) : [],
972
  github_link: projectGithub.value.trim(),
973
  demo_link: projectDemo.value.trim(),
974
+ readme_link = projectReadme.value.trim(),
975
  status: projectStatus.value,
976
  technologies: projectTechnologies.value ? projectTechnologies.value.split(',').map(tech => tech.trim()).filter(tech => tech) : [],
977
  notes: projectNotes.value.trim(),
prompts.txt CHANGED
@@ -1,2 +1,3 @@
1
  Make it look like this visually and add animations : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Project Dashboard</title> <script src="https://cdn.tailwindcss.com"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <style> .project-card { transition: all 0.3s ease; transform: translateY(0); } .project-card:hover { transform: translateY(-5px); box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } .tag { transition: all 0.2s ease; } .tag:hover { transform: scale(1.05); } .status-badge.completed { background-color: #10b98120; color: #10b981; } .status-badge.in-progress { background-color: #f59e0b20; color: #f59e0b; } .status-badge.planned { background-color: #3b82f620; color: #3b82f6; } </style> </head> <body class="bg-gray-50 min-h-screen"> <div class="container mx-auto px-4 py-12"> <!-- Header --> <div class="text-center mb-12"> <h1 class="text-4xl font-bold text-gray-800 mb-2">My Projects</h1> <p class="text-lg text-gray-600 max-w-2xl mx-auto">A collection of my recent work, experiments, and contributions</p> <!-- Filter Controls --> <div class="flex flex-wrap justify-center gap-3 mt-6"> <button onclick="filterProjects('all')" class="px-4 py-2 bg-indigo-600 text-white rounded-full hover:bg-indigo-700 transition">All Projects</button> <button onclick="filterProjects('completed')" class="px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">Completed</button> <button onclick="filterProjects('in-progress')" class="px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">In Progress</button> <button onclick="filterProjects('planned')" class="px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">Planned</button> </div> </div> <!-- Projects Grid --> <div id="projects-container" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"> <!-- Projects will be dynamically inserted here --> </div> </div> <script> // Sample project data const projects = [ { id: 1, title: "E-commerce Platform", description: "A full-stack e-commerce solution with payment integration, inventory management, and analytics dashboard.", image: "https://images.unsplash.com/photo-1555529669-e69e7aa0ba9a?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "completed", tags: ["React", "Node.js", "MongoDB", "Stripe"], github: "https://github.com", demo: "https://example.com", date: "Jun 2023" }, { id: 2, title: "Task Management App", description: "Collaborative task management application with real-time updates, team assignments, and progress tracking.", image: "https://images.unsplash.com/photo-1541462608143-67571c6738dd?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "in-progress", tags: ["Vue.js", "Firebase", "Tailwind CSS"], github: "https://github.com", demo: null, date: "Aug 2023 - Present" }, { id: 3, title: "Health & Fitness Tracker", description: "Mobile application for tracking workouts, nutrition, and health metrics with personalized recommendations.", image: "https://images.unsplash.com/photo-1571019613454-1cb2f99b2d8b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "planned", tags: ["React Native", "GraphQL", "PostgreSQL"], github: null, demo: null, date: "Coming Soon" }, { id: 4, title: "Portfolio Website", description: "Personal portfolio website showcasing projects, skills, and contact information with a clean, modern design.", image: "https://images.unsplash.com/photo-1633356122544-f134324a6cee?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "completed", tags: ["HTML", "CSS", "JavaScript"], github: "https://github.com", demo: "https://example.com", date: "Apr 2023" }, { id: 5, title: "Weather Dashboard", description: "Interactive weather application showing current conditions, forecasts, and historical data visualization.", image: "https://images.unsplash.com/photo-1601134467661-3d775b999c8b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "in-progress", tags: ["React", "OpenWeather API", "Chart.js"], github: "https://github.com", demo: "https://example.com", date: "Jul 2023 - Present" }, { id: 6, title: "Recipe Finder", description: "Discover recipes based on ingredients you have, with nutritional information and step-by-step instructions.", image: "https://images.unsplash.com/photo-1546069901-ba9599a7e63c?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "planned", tags: ["Angular", "Spoonacular API", "Bootstrap"], github: null, demo: null, date: "Coming Soon" } ]; // Render all projects initially document.addEventListener('DOMContentLoaded', () => { renderProjects(projects); }); // Function to render projects function renderProjects(projectsToRender) { const container = document.getElementById('projects-container'); container.innerHTML = ''; projectsToRender.forEach(project => { const projectCard = document.createElement('div'); projectCard.className = 'project-card bg-white rounded-xl overflow-hidden shadow-md hover:shadow-lg'; // Determine status text and styling let statusText, statusClass; switch(project.status) { case 'completed': statusText = 'Completed'; statusClass = 'completed'; break; case 'in-progress': statusText = 'In Progress'; statusClass = 'in-progress'; break; case 'planned': statusText = 'Planned'; statusClass = 'planned'; break; } projectCard.innerHTML = ` <div class="h-48 overflow-hidden"> <img src="${project.image}" alt="${project.title}" class="w-full h-full object-cover"> </div> <div class="p-6"> <div class="flex justify-between items-start mb-2"> <h3 class="text-xl font-semibold text-gray-800">${project.title}</h3> <span class="status-badge ${statusClass} text-xs font-medium px-2.5 py-0.5 rounded-full"> ${statusText} </span> </div> <p class="text-gray-600 text-sm mb-4">${project.description}</p> <div class="flex flex-wrap gap-2 mb-4"> ${project.tags.map(tag => ` <span class="tag text-xs bg-gray-100 text-gray-800 px-3 py-1 rounded-full"> ${tag} </span> `).join('')} </div> <div class="flex justify-between items-center text-sm text-gray-500"> <span>${project.date}</span> <div class="flex space-x-2"> ${project.github ? ` <a href="${project.github}" target="_blank" class="text-gray-700 hover:text-gray-900 transition"> <i class="fab fa-github"></i> </a> ` : ''} ${project.demo ? ` <a href="${project.demo}" target="_blank" class="text-gray-700 hover:text-gray-900 transition"> <i class="fas fa-external-link-alt"></i> </a> ` : ''} </div> </div> </div> `; container.appendChild(projectCard); }); } // Filter projects by status function filterProjects(status) { if (status === 'all') { renderProjects(projects); } else { const filteredProjects = projects.filter(project => project.status === status); renderProjects(filteredProjects); } } </script> <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=JamesToth/project-manager-app" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> </html>
2
- check and add these features : Okay, I will update the PRD to reflect the exact list of project information fields you specified for the JSON structure, plus include the additional relevant fields from our previous iteration. Here is the revised PRD: --- ## Product Requirements Document: Simple Project Manager App (Card View) **Version:** 1.2 **Date:** May 19, 2025 **Prepared By:** [Your Name/Team Name] --- ### 1. Introduction #### 1.1 Purpose The purpose of this document is to define the requirements for a simple Project Manager App that visualizes projects as interactive cards. The application will utilize HTML, CSS (specifically Tailwind CSS for styling), and JavaScript to provide core functionalities to add, view, edit, and delete project entries. Project data will be stored and managed in a JSON format, capturing specific details including project ID, name, image link, date range, description, tags, GitHub link, demo link, README link, and other relevant metadata. #### 1.2 Goals * Provide a visually appealing dashboard displaying projects as distinct cards, populated with data from a JSON source. * Enable users to easily record and view a specific set of key details for each project on its card or in a detail view. * Allow users to update project information using an editing mechanism that modifies the JSON data. * Provide the ability to remove project entries from the JSON data structure. * Leverage modern web technologies (HTML, Tailwind CSS, JavaScript) for a responsive and dynamic user interface. * Manage project data using a structured JSON format with defined fields. #### 1.3 Target Audience Individuals or small teams who need a simple, personal, web-based tool to track multiple projects, preferring a visual card-based overview and a lightweight technical implementation using standard web technologies and a defined JSON data structure. ### 2. Features #### 2.1 Core Features ##### 2.1.1 Data Structure & Storage (JSON) * **Description:** The application will manage all project data using a consistent JSON structure, where each project is an object with specific keys (fields). * **Functionality:** The application will define and adhere to the following JSON structure for each project object: * `id`: Unique identifier (string or number) * `name`: Project name (string) * `image_link`: URL to a project image/thumbnail (string) * `date_range`: String representing the duration of the project (e.g., "Jan 2023 - Mar 2023", "2 Weeks") (string) * `description`: Short project description (string) * `tags`: Array of strings representing keywords or technologies (array of strings) * `github_link`: URL to the GitHub repository (string) * `demo_link`: URL to a live demo or deployment (string) * `readme_link`: URL to the project's README file (string) * `status`: Current status (e.g., "Not Started", "In Progress", "Completed", "On Hold") (string) * `technologies`: Array of strings representing the technology stack used (array of strings) * `notes`: Additional notes or details (string) * `created_at`: Timestamp of when the project was added (string/timestamp format) * `updated_at`: Timestamp of when the project was last updated (string/timestamp format) * **Data Source:** Project data shall be loaded from a designated JSON source (e.g., a local file served statically, or a simple API endpoint) upon application load. ##### 2.1.2 View Projects as Cards (Dynamic Rendering) * **Description:** Projects fetched from the JSON data will be dynamically rendered as visually distinct cards on a dashboard based on their fields. * **Functionality:** * JavaScript will read the project data from the loaded JSON array of objects. * For each project object, JavaScript will generate the necessary HTML structure for a project card, populating elements with data from the corresponding JSON fields. * These generated project cards will be injected into a container element in the HTML. * **Card Design:** Each card shall display the following details pulled from the JSON data: * Project Image (using `image_link`) * Project Title (`name`) * Status Badge (`status` - color-coded, e.g., Green for Completed, Yellow for In Progress) * Short Description (`description` - potentially truncated) * List of Tags (`tags` - styled as pills/badges) * Links (Icons/Buttons) for GitHub (`github_link`), Live Demo (`demo_link`), and README (`readme_link`), if available. * **Layout:** Cards will be arranged in a responsive grid using Tailwind CSS classes: * 1 column on small screens (mobile) * 2 columns on medium screens (tablets) * 3 or more columns on large screens (desktops) ##### 2.1.3 Add Project * **Description:** Users shall be able to add a new project entry which will be appended to the JSON data structure. * **Functionality:** * A user interface (e.g., a form or modal) will be provided to input details for a new project, covering all fields defined in the JSON structure (though some may be optional). * Upon submission, JavaScript will create a new project object based on the input, automatically generating a unique `id` and setting `created_at` and `updated_at` timestamps. * The new project object will be added to the in-memory project data array. * The UI will refresh to display the newly added project card. * A mechanism is required to save the updated JSON data back to the source (see Scope). ##### 2.1.4 Edit Project * **Description:** Users shall be able to modify the details of an existing project, updating the corresponding object in the JSON data structure. * **Functionality:** * Each project card will have an option (e.g., an edit button or clicking the card) to open an editing interface (form or modal). * The editing interface will be pre-populated with the current details of the selected project, pulled from its JSON object. * Users can modify any of the editable project fields. * Upon saving, JavaScript will update the specific project object in the in-memory data array based on its unique `id`, and update the `updated_at` timestamp. * The specific project card or the entire UI will refresh to show the updated details. * A mechanism is required to save the updated JSON data back to the source (see Scope). ##### 2.1.5 Delete Project * **Description:** Users shall be able to remove a project entry, deleting the corresponding object from the JSON data structure. * **Functionality:** * Each project card will have an option (e.g., a delete button). * Clicking delete will prompt a confirmation dialog (`FR12`). * Upon confirmation, JavaScript will remove the specific project object (identified by its `id`) from the in-memory data array. * The specific project card will be removed from the UI. * A mechanism is required to save the updated JSON data back to the source (see Scope). #### 2.2 Optional Interactivity Features * **Filtering:** Add controls (buttons, dropdowns) to filter the displayed cards based on criteria like `tags`, `technologies`, or `status`. * **Detail View:** Clicking a card could open a modal or navigate to a separate view to display full details, potentially including fields not shown on the collapsed card view and offering the Edit/Delete options there. ### 3. User Stories * As a user, I want to see all my projects displayed as clear, visual cards populated with specific details like name, image, description, and status, so I can quickly get an overview. * As a user, I want the project cards to show relevant links like GitHub, Demo, and README directly so I can access them easily. * As a user, I want to add a new project by filling out a form that includes fields for name, image link, date range, description, tags, and all the links (GitHub, demo, readme), so it's stored with all its details. * As a user, I want to update any detail of an existing project, such as changing the status, description, or links, using an edit function on the card. * As a user, I want to delete a project card and its associated data from my list when it's no longer needed, after confirming my action. * As a user, I want the project cards to arrange themselves in a responsive grid layout that looks good on my phone, tablet, and desktop. * As a user, I want the project status to be clearly visible and potentially color-coded on the card. * (Optional) As a user, I want to be able to filter the projects displayed based on the tags or technologies used. * (Optional) As a user, when I click a card, I want to see all the project details, including notes and dates, in a popup or separate screen. ### 4. Requirements #### 4.1 Functional Requirements * FR1: The application shall load project data from a JSON source following the specified structure upon initialization. * FR2: The application shall store project data in a JavaScript array containing objects that conform to the specified JSON structure. * FR3: The application shall dynamically generate and display HTML project cards based on the data in the JavaScript array using the specified JSON fields. * FR4: Each project card shall display the `name`, `image_link`, `status` (visually indicated), `description` (potentially truncated), `tags`, `github_link` (if available), `demo_link` (if available), and `readme_link` (if available). * FR5: The application shall provide an interface (form/modal) to input details for a new project, including fields: `name`, `image_link`, `date_range`, `description`, `tags`, `github_link`, `demo_link`, `readme_link`, `status`, `technologies`, `notes`. * FR6: Adding a new project shall create a new object in the in-memory JavaScript array conforming to the specified structure. * FR7: A unique `id` shall be automatically generated for each new project. * FR8: `created_at` and `updated_at` timestamps shall be automatically recorded upon project creation. * FR9: The application shall provide an interface (form/modal) to edit the details of an existing project, pre-populating fields from the selected project object. * FR10: Editing a project shall update the corresponding object in the in-memory JavaScript array based on its `id`. * FR11: The `updated_at` timestamp shall be updated when a project is edited. * FR12: Deleting a project shall remove the corresponding object from the in-memory JavaScript array based on its `id`. * FR13: The application shall update the UI (add/edit/remove cards) to reflect changes in the in-memory data array without a full page reload. * FR14: The application shall prompt the user for confirmation before deleting a project. * FR15: The `id` and `name` fields shall be considered mandatory upon project creation via the Add interface. * FR16: (Optional) The application shall provide controls to filter the displayed project cards based on specified criteria (`tags`, `status`, `technologies`). * FR17: (Optional) Clicking a project card shall display additional details (`date_range`, `technologies`, `notes`, `created_at`, `updated_at`) in a modal or separate view, and potentially include the edit/delete options there. #### 4.2 Non-Functional Requirements * NFR1: **Usability:** The card-based dashboard and editing/adding interfaces should be intuitive and easy for users to understand and operate. * NFR2: **Performance:** The application should load and render project cards efficiently, ideally showing a quick initial load and smooth updates for a moderate number of projects. * NFR3: **Responsiveness:** The application layout, particularly the project card grid, shall adapt gracefully to different screen sizes (mobile, tablet, desktop) using Tailwind CSS. * NFR4: **Maintainability:** The code structure (HTML, CSS, JavaScript) should be organized and well-commented to allow for easy maintenance and future enhancements. Tailwind CSS class usage should be consistent. * NFR5: **Data Integrity:** While the persistence mechanism is scoped separately, the in-memory management of the JSON array must ensure data is correctly added, updated, and deleted within the application session according to the defined structure. * NFR6: **Aesthetics:** The visual design, leveraging Tailwind CSS, should be clean, modern, and visually appealing, including consistent spacing, typography, shadows, and hover effects on cards. Status badges should be clearly distinguishable. * NFR7: **Data Structure Adherence:** The application's logic for reading, writing, and manipulating data must strictly adhere to the defined JSON field names and expected data types. ### 5. Scope #### 5.1 In Scope * Defining and using the specified JSON structure for project data (`id`, `name`, `image_link`, `date_range`, `description`, `tags`, `github_link`, `demo_link`, `readme_link`, `status`, `technologies`, `notes`, `created_at`, `updated_at`). * Loading project data from a JSON source at application startup into a JavaScript array. * Dynamically rendering project data as responsive cards using HTML, Tailwind CSS, and JavaScript, displaying the relevant fields on the cards. * Implementing the responsive grid layout for project cards using Tailwind CSS. * Functionality to Add, Edit, and Delete project objects within the *in-memory* JavaScript data array, updating the specified fields. * Generating unique `id` and timestamps (`created_at`, `updated_at`) for new projects and updating `updated_at` on edits. * Basic validation for mandatory fields (`id`, `name`). * (Optional) Implementation of filtering controls based on specified criteria and/or a detailed view modal displaying all fields. * Utilizing Tailwind CSS for all styling requirements. #### 5.2 Out of Scope * **Persistence Mechanism:** The specific implementation of *saving* the modified JSON data from the in-memory array back to a persistent source (e.g., writing to a local file, integrating with a backend API). This PRD defines the *in-memory* manipulation and the data structure, but the saving/loading process outside of the initial load needs to be designed and implemented separately based on the deployment environment. * User authentication or multi-user support. * Advanced querying, sorting (beyond basic display order from JSON), or reporting features. * Real-time collaboration or data synchronization across multiple users/devices. * Integrated task management within projects. * Complex data validation or robust error handling (e.g., handling network errors on fetch, malformed JSON). * Unit or integration testing. ### 6. Success Metrics * **JSON Structure Compliance:** The application successfully loads and processes JSON data conforming to the specified structure. * **Dynamic Rendering Accuracy:** Project cards are correctly generated and populated with data from the JSON fields. * **Responsiveness:** The grid layout correctly adapts across target device screen sizes. * **Core Feature Functionality:** Add, Edit, and Delete operations successfully manipulate the project objects in the in-memory JSON array and update the UI accordingly. * **Data Field Adherence:** All specified JSON fields are correctly handled during data loading, display, adding, and editing. * (If Persistence Added): Successful saving and loading of changes to/from the persistent JSON source across application sessions. ### 7. Future Considerations (Potential Future Features) * Implementation of a persistence layer (e.g., using Local Storage for simple local apps, or integrating with a backend API) to save changes permanently. * Advanced filtering, sorting, and search functionality across all specified fields. * Expanding the detail view or modal to allow inline editing. * Options for different visual layouts (e.g., list view). * Implementing pagination or infinite scrolling for large project lists. * Basic data export (e.g., download modified JSON). * More robust input validation and user feedback during Add/Edit operations. ---
 
 
1
  Make it look like this visually and add animations : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Project Dashboard</title> <script src="https://cdn.tailwindcss.com"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <style> .project-card { transition: all 0.3s ease; transform: translateY(0); } .project-card:hover { transform: translateY(-5px); box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } .tag { transition: all 0.2s ease; } .tag:hover { transform: scale(1.05); } .status-badge.completed { background-color: #10b98120; color: #10b981; } .status-badge.in-progress { background-color: #f59e0b20; color: #f59e0b; } .status-badge.planned { background-color: #3b82f620; color: #3b82f6; } </style> </head> <body class="bg-gray-50 min-h-screen"> <div class="container mx-auto px-4 py-12"> <!-- Header --> <div class="text-center mb-12"> <h1 class="text-4xl font-bold text-gray-800 mb-2">My Projects</h1> <p class="text-lg text-gray-600 max-w-2xl mx-auto">A collection of my recent work, experiments, and contributions</p> <!-- Filter Controls --> <div class="flex flex-wrap justify-center gap-3 mt-6"> <button onclick="filterProjects('all')" class="px-4 py-2 bg-indigo-600 text-white rounded-full hover:bg-indigo-700 transition">All Projects</button> <button onclick="filterProjects('completed')" class="px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">Completed</button> <button onclick="filterProjects('in-progress')" class="px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">In Progress</button> <button onclick="filterProjects('planned')" class="px-4 py-2 border border-gray-300 rounded-full hover:bg-gray-100 transition">Planned</button> </div> </div> <!-- Projects Grid --> <div id="projects-container" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"> <!-- Projects will be dynamically inserted here --> </div> </div> <script> // Sample project data const projects = [ { id: 1, title: "E-commerce Platform", description: "A full-stack e-commerce solution with payment integration, inventory management, and analytics dashboard.", image: "https://images.unsplash.com/photo-1555529669-e69e7aa0ba9a?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "completed", tags: ["React", "Node.js", "MongoDB", "Stripe"], github: "https://github.com", demo: "https://example.com", date: "Jun 2023" }, { id: 2, title: "Task Management App", description: "Collaborative task management application with real-time updates, team assignments, and progress tracking.", image: "https://images.unsplash.com/photo-1541462608143-67571c6738dd?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "in-progress", tags: ["Vue.js", "Firebase", "Tailwind CSS"], github: "https://github.com", demo: null, date: "Aug 2023 - Present" }, { id: 3, title: "Health & Fitness Tracker", description: "Mobile application for tracking workouts, nutrition, and health metrics with personalized recommendations.", image: "https://images.unsplash.com/photo-1571019613454-1cb2f99b2d8b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "planned", tags: ["React Native", "GraphQL", "PostgreSQL"], github: null, demo: null, date: "Coming Soon" }, { id: 4, title: "Portfolio Website", description: "Personal portfolio website showcasing projects, skills, and contact information with a clean, modern design.", image: "https://images.unsplash.com/photo-1633356122544-f134324a6cee?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "completed", tags: ["HTML", "CSS", "JavaScript"], github: "https://github.com", demo: "https://example.com", date: "Apr 2023" }, { id: 5, title: "Weather Dashboard", description: "Interactive weather application showing current conditions, forecasts, and historical data visualization.", image: "https://images.unsplash.com/photo-1601134467661-3d775b999c8b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "in-progress", tags: ["React", "OpenWeather API", "Chart.js"], github: "https://github.com", demo: "https://example.com", date: "Jul 2023 - Present" }, { id: 6, title: "Recipe Finder", description: "Discover recipes based on ingredients you have, with nutritional information and step-by-step instructions.", image: "https://images.unsplash.com/photo-1546069901-ba9599a7e63c?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=800&q=80", status: "planned", tags: ["Angular", "Spoonacular API", "Bootstrap"], github: null, demo: null, date: "Coming Soon" } ]; // Render all projects initially document.addEventListener('DOMContentLoaded', () => { renderProjects(projects); }); // Function to render projects function renderProjects(projectsToRender) { const container = document.getElementById('projects-container'); container.innerHTML = ''; projectsToRender.forEach(project => { const projectCard = document.createElement('div'); projectCard.className = 'project-card bg-white rounded-xl overflow-hidden shadow-md hover:shadow-lg'; // Determine status text and styling let statusText, statusClass; switch(project.status) { case 'completed': statusText = 'Completed'; statusClass = 'completed'; break; case 'in-progress': statusText = 'In Progress'; statusClass = 'in-progress'; break; case 'planned': statusText = 'Planned'; statusClass = 'planned'; break; } projectCard.innerHTML = ` <div class="h-48 overflow-hidden"> <img src="${project.image}" alt="${project.title}" class="w-full h-full object-cover"> </div> <div class="p-6"> <div class="flex justify-between items-start mb-2"> <h3 class="text-xl font-semibold text-gray-800">${project.title}</h3> <span class="status-badge ${statusClass} text-xs font-medium px-2.5 py-0.5 rounded-full"> ${statusText} </span> </div> <p class="text-gray-600 text-sm mb-4">${project.description}</p> <div class="flex flex-wrap gap-2 mb-4"> ${project.tags.map(tag => ` <span class="tag text-xs bg-gray-100 text-gray-800 px-3 py-1 rounded-full"> ${tag} </span> `).join('')} </div> <div class="flex justify-between items-center text-sm text-gray-500"> <span>${project.date}</span> <div class="flex space-x-2"> ${project.github ? ` <a href="${project.github}" target="_blank" class="text-gray-700 hover:text-gray-900 transition"> <i class="fab fa-github"></i> </a> ` : ''} ${project.demo ? ` <a href="${project.demo}" target="_blank" class="text-gray-700 hover:text-gray-900 transition"> <i class="fas fa-external-link-alt"></i> </a> ` : ''} </div> </div> </div> `; container.appendChild(projectCard); }); } // Filter projects by status function filterProjects(status) { if (status === 'all') { renderProjects(projects); } else { const filteredProjects = projects.filter(project => project.status === status); renderProjects(filteredProjects); } } </script> <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=JamesToth/project-manager-app" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> </html>
2
+ check and add these features : Okay, I will update the PRD to reflect the exact list of project information fields you specified for the JSON structure, plus include the additional relevant fields from our previous iteration. Here is the revised PRD: --- ## Product Requirements Document: Simple Project Manager App (Card View) **Version:** 1.2 **Date:** May 19, 2025 **Prepared By:** [Your Name/Team Name] --- ### 1. Introduction #### 1.1 Purpose The purpose of this document is to define the requirements for a simple Project Manager App that visualizes projects as interactive cards. The application will utilize HTML, CSS (specifically Tailwind CSS for styling), and JavaScript to provide core functionalities to add, view, edit, and delete project entries. Project data will be stored and managed in a JSON format, capturing specific details including project ID, name, image link, date range, description, tags, GitHub link, demo link, README link, and other relevant metadata. #### 1.2 Goals * Provide a visually appealing dashboard displaying projects as distinct cards, populated with data from a JSON source. * Enable users to easily record and view a specific set of key details for each project on its card or in a detail view. * Allow users to update project information using an editing mechanism that modifies the JSON data. * Provide the ability to remove project entries from the JSON data structure. * Leverage modern web technologies (HTML, Tailwind CSS, JavaScript) for a responsive and dynamic user interface. * Manage project data using a structured JSON format with defined fields. #### 1.3 Target Audience Individuals or small teams who need a simple, personal, web-based tool to track multiple projects, preferring a visual card-based overview and a lightweight technical implementation using standard web technologies and a defined JSON data structure. ### 2. Features #### 2.1 Core Features ##### 2.1.1 Data Structure & Storage (JSON) * **Description:** The application will manage all project data using a consistent JSON structure, where each project is an object with specific keys (fields). * **Functionality:** The application will define and adhere to the following JSON structure for each project object: * `id`: Unique identifier (string or number) * `name`: Project name (string) * `image_link`: URL to a project image/thumbnail (string) * `date_range`: String representing the duration of the project (e.g., "Jan 2023 - Mar 2023", "2 Weeks") (string) * `description`: Short project description (string) * `tags`: Array of strings representing keywords or technologies (array of strings) * `github_link`: URL to the GitHub repository (string) * `demo_link`: URL to a live demo or deployment (string) * `readme_link`: URL to the project's README file (string) * `status`: Current status (e.g., "Not Started", "In Progress", "Completed", "On Hold") (string) * `technologies`: Array of strings representing the technology stack used (array of strings) * `notes`: Additional notes or details (string) * `created_at`: Timestamp of when the project was added (string/timestamp format) * `updated_at`: Timestamp of when the project was last updated (string/timestamp format) * **Data Source:** Project data shall be loaded from a designated JSON source (e.g., a local file served statically, or a simple API endpoint) upon application load. ##### 2.1.2 View Projects as Cards (Dynamic Rendering) * **Description:** Projects fetched from the JSON data will be dynamically rendered as visually distinct cards on a dashboard based on their fields. * **Functionality:** * JavaScript will read the project data from the loaded JSON array of objects. * For each project object, JavaScript will generate the necessary HTML structure for a project card, populating elements with data from the corresponding JSON fields. * These generated project cards will be injected into a container element in the HTML. * **Card Design:** Each card shall display the following details pulled from the JSON data: * Project Image (using `image_link`) * Project Title (`name`) * Status Badge (`status` - color-coded, e.g., Green for Completed, Yellow for In Progress) * Short Description (`description` - potentially truncated) * List of Tags (`tags` - styled as pills/badges) * Links (Icons/Buttons) for GitHub (`github_link`), Live Demo (`demo_link`), and README (`readme_link`), if available. * **Layout:** Cards will be arranged in a responsive grid using Tailwind CSS classes: * 1 column on small screens (mobile) * 2 columns on medium screens (tablets) * 3 or more columns on large screens (desktops) ##### 2.1.3 Add Project * **Description:** Users shall be able to add a new project entry which will be appended to the JSON data structure. * **Functionality:** * A user interface (e.g., a form or modal) will be provided to input details for a new project, covering all fields defined in the JSON structure (though some may be optional). * Upon submission, JavaScript will create a new project object based on the input, automatically generating a unique `id` and setting `created_at` and `updated_at` timestamps. * The new project object will be added to the in-memory project data array. * The UI will refresh to display the newly added project card. * A mechanism is required to save the updated JSON data back to the source (see Scope). ##### 2.1.4 Edit Project * **Description:** Users shall be able to modify the details of an existing project, updating the corresponding object in the JSON data structure. * **Functionality:** * Each project card will have an option (e.g., an edit button or clicking the card) to open an editing interface (form or modal). * The editing interface will be pre-populated with the current details of the selected project, pulled from its JSON object. * Users can modify any of the editable project fields. * Upon saving, JavaScript will update the specific project object in the in-memory data array based on its unique `id`, and update the `updated_at` timestamp. * The specific project card or the entire UI will refresh to show the updated details. * A mechanism is required to save the updated JSON data back to the source (see Scope). ##### 2.1.5 Delete Project * **Description:** Users shall be able to remove a project entry, deleting the corresponding object from the JSON data structure. * **Functionality:** * Each project card will have an option (e.g., a delete button). * Clicking delete will prompt a confirmation dialog (`FR12`). * Upon confirmation, JavaScript will remove the specific project object (identified by its `id`) from the in-memory data array. * The specific project card will be removed from the UI. * A mechanism is required to save the updated JSON data back to the source (see Scope). #### 2.2 Optional Interactivity Features * **Filtering:** Add controls (buttons, dropdowns) to filter the displayed cards based on criteria like `tags`, `technologies`, or `status`. * **Detail View:** Clicking a card could open a modal or navigate to a separate view to display full details, potentially including fields not shown on the collapsed card view and offering the Edit/Delete options there. ### 3. User Stories * As a user, I want to see all my projects displayed as clear, visual cards populated with specific details like name, image, description, and status, so I can quickly get an overview. * As a user, I want the project cards to show relevant links like GitHub, Demo, and README directly so I can access them easily. * As a user, I want to add a new project by filling out a form that includes fields for name, image link, date range, description, tags, and all the links (GitHub, demo, readme), so it's stored with all its details. * As a user, I want to update any detail of an existing project, such as changing the status, description, or links, using an edit function on the card. * As a user, I want to delete a project card and its associated data from my list when it's no longer needed, after confirming my action. * As a user, I want the project cards to arrange themselves in a responsive grid layout that looks good on my phone, tablet, and desktop. * As a user, I want the project status to be clearly visible and potentially color-coded on the card. * (Optional) As a user, I want to be able to filter the projects displayed based on the tags or technologies used. * (Optional) As a user, when I click a card, I want to see all the project details, including notes and dates, in a popup or separate screen. ### 4. Requirements #### 4.1 Functional Requirements * FR1: The application shall load project data from a JSON source following the specified structure upon initialization. * FR2: The application shall store project data in a JavaScript array containing objects that conform to the specified JSON structure. * FR3: The application shall dynamically generate and display HTML project cards based on the data in the JavaScript array using the specified JSON fields. * FR4: Each project card shall display the `name`, `image_link`, `status` (visually indicated), `description` (potentially truncated), `tags`, `github_link` (if available), `demo_link` (if available), and `readme_link` (if available). * FR5: The application shall provide an interface (form/modal) to input details for a new project, including fields: `name`, `image_link`, `date_range`, `description`, `tags`, `github_link`, `demo_link`, `readme_link`, `status`, `technologies`, `notes`. * FR6: Adding a new project shall create a new object in the in-memory JavaScript array conforming to the specified structure. * FR7: A unique `id` shall be automatically generated for each new project. * FR8: `created_at` and `updated_at` timestamps shall be automatically recorded upon project creation. * FR9: The application shall provide an interface (form/modal) to edit the details of an existing project, pre-populating fields from the selected project object. * FR10: Editing a project shall update the corresponding object in the in-memory JavaScript array based on its `id`. * FR11: The `updated_at` timestamp shall be updated when a project is edited. * FR12: Deleting a project shall remove the corresponding object from the in-memory JavaScript array based on its `id`. * FR13: The application shall update the UI (add/edit/remove cards) to reflect changes in the in-memory data array without a full page reload. * FR14: The application shall prompt the user for confirmation before deleting a project. * FR15: The `id` and `name` fields shall be considered mandatory upon project creation via the Add interface. * FR16: (Optional) The application shall provide controls to filter the displayed project cards based on specified criteria (`tags`, `status`, `technologies`). * FR17: (Optional) Clicking a project card shall display additional details (`date_range`, `technologies`, `notes`, `created_at`, `updated_at`) in a modal or separate view, and potentially include the edit/delete options there. #### 4.2 Non-Functional Requirements * NFR1: **Usability:** The card-based dashboard and editing/adding interfaces should be intuitive and easy for users to understand and operate. * NFR2: **Performance:** The application should load and render project cards efficiently, ideally showing a quick initial load and smooth updates for a moderate number of projects. * NFR3: **Responsiveness:** The application layout, particularly the project card grid, shall adapt gracefully to different screen sizes (mobile, tablet, desktop) using Tailwind CSS. * NFR4: **Maintainability:** The code structure (HTML, CSS, JavaScript) should be organized and well-commented to allow for easy maintenance and future enhancements. Tailwind CSS class usage should be consistent. * NFR5: **Data Integrity:** While the persistence mechanism is scoped separately, the in-memory management of the JSON array must ensure data is correctly added, updated, and deleted within the application session according to the defined structure. * NFR6: **Aesthetics:** The visual design, leveraging Tailwind CSS, should be clean, modern, and visually appealing, including consistent spacing, typography, shadows, and hover effects on cards. Status badges should be clearly distinguishable. * NFR7: **Data Structure Adherence:** The application's logic for reading, writing, and manipulating data must strictly adhere to the defined JSON field names and expected data types. ### 5. Scope #### 5.1 In Scope * Defining and using the specified JSON structure for project data (`id`, `name`, `image_link`, `date_range`, `description`, `tags`, `github_link`, `demo_link`, `readme_link`, `status`, `technologies`, `notes`, `created_at`, `updated_at`). * Loading project data from a JSON source at application startup into a JavaScript array. * Dynamically rendering project data as responsive cards using HTML, Tailwind CSS, and JavaScript, displaying the relevant fields on the cards. * Implementing the responsive grid layout for project cards using Tailwind CSS. * Functionality to Add, Edit, and Delete project objects within the *in-memory* JavaScript data array, updating the specified fields. * Generating unique `id` and timestamps (`created_at`, `updated_at`) for new projects and updating `updated_at` on edits. * Basic validation for mandatory fields (`id`, `name`). * (Optional) Implementation of filtering controls based on specified criteria and/or a detailed view modal displaying all fields. * Utilizing Tailwind CSS for all styling requirements. #### 5.2 Out of Scope * **Persistence Mechanism:** The specific implementation of *saving* the modified JSON data from the in-memory array back to a persistent source (e.g., writing to a local file, integrating with a backend API). This PRD defines the *in-memory* manipulation and the data structure, but the saving/loading process outside of the initial load needs to be designed and implemented separately based on the deployment environment. * User authentication or multi-user support. * Advanced querying, sorting (beyond basic display order from JSON), or reporting features. * Real-time collaboration or data synchronization across multiple users/devices. * Integrated task management within projects. * Complex data validation or robust error handling (e.g., handling network errors on fetch, malformed JSON). * Unit or integration testing. ### 6. Success Metrics * **JSON Structure Compliance:** The application successfully loads and processes JSON data conforming to the specified structure. * **Dynamic Rendering Accuracy:** Project cards are correctly generated and populated with data from the JSON fields. * **Responsiveness:** The grid layout correctly adapts across target device screen sizes. * **Core Feature Functionality:** Add, Edit, and Delete operations successfully manipulate the project objects in the in-memory JSON array and update the UI accordingly. * **Data Field Adherence:** All specified JSON fields are correctly handled during data loading, display, adding, and editing. * (If Persistence Added): Successful saving and loading of changes to/from the persistent JSON source across application sessions. ### 7. Future Considerations (Potential Future Features) * Implementation of a persistence layer (e.g., using Local Storage for simple local apps, or integrating with a backend API) to save changes permanently. * Advanced filtering, sorting, and search functionality across all specified fields. * Expanding the detail view or modal to allow inline editing. * Options for different visual layouts (e.g., list view). * Implementing pagination or infinite scrolling for large project lists. * Basic data export (e.g., download modified JSON). * More robust input validation and user feedback during Add/Edit operations. ---
3
+ good now make it apple style website and also add typewriter effect