LukasBe commited on
Commit
affaaa6
·
verified ·
1 Parent(s): 6100c68

Add 3 files

Browse files
Files changed (3) hide show
  1. README.md +7 -5
  2. index.html +1026 -19
  3. prompts.txt +1 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Vibe Coding Backlog Driven
3
- emoji: 📈
4
- colorFrom: purple
5
- colorTo: yellow
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: vibe-coding-backlog-driven
3
+ emoji: 🐳
4
+ colorFrom: green
5
+ colorTo: blue
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,1026 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Vibe Coding | HTML5 User Environment</title>
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
+ .kanban-column {
11
+ min-height: 500px;
12
+ background-color: rgba(243, 244, 246, 0.5);
13
+ }
14
+ .card {
15
+ transition: all 0.2s ease;
16
+ }
17
+ .card:hover {
18
+ transform: translateY(-2px);
19
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
20
+ }
21
+ .annotation-marker {
22
+ position: absolute;
23
+ width: 16px;
24
+ height: 16px;
25
+ background-color: #3B82F6;
26
+ border-radius: 50%;
27
+ border: 2px solid white;
28
+ cursor: pointer;
29
+ transform: translate(-50%, -50%);
30
+ }
31
+ .annotation-marker:hover {
32
+ background-color: #2563EB;
33
+ }
34
+ .annotation-tooltip {
35
+ position: absolute;
36
+ background-color: white;
37
+ padding: 8px;
38
+ border-radius: 4px;
39
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
40
+ z-index: 10;
41
+ max-width: 200px;
42
+ }
43
+ .feedback-canvas {
44
+ position: relative;
45
+ border: 1px dashed #ccc;
46
+ margin: 0 auto;
47
+ }
48
+ .priority-indicator {
49
+ width: 12px;
50
+ height: 12px;
51
+ border-radius: 50%;
52
+ display: inline-block;
53
+ margin-right: 4px;
54
+ }
55
+ .priority-high {
56
+ background-color: #EF4444;
57
+ }
58
+ .priority-medium {
59
+ background-color: #F59E0B;
60
+ }
61
+ .priority-low {
62
+ background-color: #10B981;
63
+ }
64
+ .skeleton-loader {
65
+ animation: pulse 2s infinite;
66
+ }
67
+ @keyframes pulse {
68
+ 0%, 100% {
69
+ opacity: 0.6;
70
+ }
71
+ 50% {
72
+ opacity: 0.3;
73
+ }
74
+ }
75
+ </style>
76
+ </head>
77
+ <body class="bg-gray-50 font-sans">
78
+ <!-- Header -->
79
+ <header class="bg-indigo-700 text-white shadow-md">
80
+ <div class="container mx-auto px-4 py-3 flex justify-between items-center">
81
+ <div class="flex items-center space-x-2">
82
+ <i class="fas fa-code text-2xl"></i>
83
+ <h1 class="text-xl font-bold">Vibe Coding</h1>
84
+ <span class="text-sm bg-indigo-600 px-2 py-1 rounded ml-2">v1.0</span>
85
+ </div>
86
+ <div class="flex items-center space-x-4">
87
+ <div class="relative">
88
+ <button id="user-menu-btn" class="flex items-center space-x-2 focus:outline-none">
89
+ <span class="font-medium">John Doe</span>
90
+ <i class="fas fa-chevron-down text-xs"></i>
91
+ </button>
92
+ <div id="user-menu" class="hidden absolute right-0 mt-2 w-48 bg-white rounded-md shadow-lg py-1 z-10">
93
+ <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">Profile</a>
94
+ <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">Settings</a>
95
+ <a href="#" class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100">Sign out</a>
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </header>
101
+
102
+ <!-- Main Content -->
103
+ <main class="container mx-auto px-4 py-6">
104
+ <!-- App Title and Controls -->
105
+ <div class="flex justify-between items-center mb-6">
106
+ <div>
107
+ <h2 class="text-2xl font-bold text-gray-800">Product Backlog</h2>
108
+ <p class="text-gray-600">Last updated: <span id="last-updated">Just now</span></p>
109
+ </div>
110
+ <div class="flex space-x-3">
111
+ <button id="refresh-btn" class="flex items-center px-4 py-2 bg-white border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50">
112
+ <i class="fas fa-sync-alt mr-2"></i> Refresh
113
+ </button>
114
+ <button id="new-feedback-btn" class="flex items-center px-4 py-2 bg-indigo-600 border border-transparent rounded-md shadow-sm text-sm font-medium text-white hover:bg-indigo-700">
115
+ <i class="fas fa-plus mr-2"></i> New Feedback
116
+ </button>
117
+ </div>
118
+ </div>
119
+
120
+ <!-- Filter/Search Bar -->
121
+ <div class="bg-white p-4 rounded-lg shadow-sm mb-6">
122
+ <div class="flex flex-col md:flex-row md:items-center md:space-x-4 space-y-3 md:space-y-0">
123
+ <div class="flex-1">
124
+ <label for="search" class="sr-only">Search</label>
125
+ <div class="relative">
126
+ <div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
127
+ <i class="fas fa-search text-gray-400"></i>
128
+ </div>
129
+ <input id="search" name="search" type="text" class="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" placeholder="Search backlog items...">
130
+ </div>
131
+ </div>
132
+ <div class="flex space-x-3">
133
+ <div>
134
+ <label for="status-filter" class="sr-only">Status</label>
135
+ <select id="status-filter" name="status-filter" class="block w-full pl-3 pr-10 py-2 text-base border border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md">
136
+ <option value="all">All Statuses</option>
137
+ <option value="todo">To Do</option>
138
+ <option value="in-progress">In Progress</option>
139
+ <option value="done">Done</option>
140
+ </select>
141
+ </div>
142
+ <div>
143
+ <label for="priority-filter" class="sr-only">Priority</label>
144
+ <select id="priority-filter" name="priority-filter" class="block w-full pl-3 pr-10 py-2 text-base border border-gray-300 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm rounded-md">
145
+ <option value="all">All Priorities</option>
146
+ <option value="high">High</option>
147
+ <option value="medium">Medium</option>
148
+ <option value="low">Low</option>
149
+ </select>
150
+ </div>
151
+ </div>
152
+ </div>
153
+ </div>
154
+
155
+ <!-- Kanban Board -->
156
+ <div id="kanban-board" class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
157
+ <!-- To Do Column -->
158
+ <div class="kanban-column rounded-lg p-4 shadow-sm">
159
+ <div class="flex justify-between items-center mb-4">
160
+ <h3 class="font-semibold text-lg text-gray-800">To Do</h3>
161
+ <span class="bg-gray-200 text-gray-700 text-xs font-semibold px-2 py-1 rounded-full">24 items</span>
162
+ </div>
163
+ <div id="todo-cards" class="space-y-3">
164
+ <!-- Card 1 -->
165
+ <div class="card bg-white p-4 rounded-lg shadow cursor-pointer hover:shadow-md transition" onclick="showCardDetails('card-1')">
166
+ <div class="flex justify-between items-start mb-2">
167
+ <h4 class="font-medium text-gray-800">Implement user authentication</h4>
168
+ <span class="priority-indicator priority-high"></span>
169
+ </div>
170
+ <p class="text-sm text-gray-600 mb-3">Add secure login and registration functionality with JWT tokens</p>
171
+ <div class="flex justify-between items-center text-xs">
172
+ <span class="bg-blue-100 text-blue-800 px-2 py-1 rounded">US-101</span>
173
+ <div class="flex items-center space-x-2">
174
+ <span class="text-gray-500"><i class="fas fa-comment mr-1"></i> 5</span>
175
+ <span class="text-gray-500"><i class="fas fa-code-branch mr-1"></i> 3</span>
176
+ </div>
177
+ </div>
178
+ </div>
179
+
180
+ <!-- Card 2 -->
181
+ <div class="card bg-white p-4 rounded-lg shadow cursor-pointer hover:shadow-md transition" onclick="showCardDetails('card-2')">
182
+ <div class="flex justify-between items-start mb-2">
183
+ <h4 class="font-medium text-gray-800">Create dashboard layout</h4>
184
+ <span class="priority-indicator priority-medium"></span>
185
+ </div>
186
+ <p class="text-sm text-gray-600 mb-3">Design and implement the main dashboard UI components</p>
187
+ <div class="flex justify-between items-center text-xs">
188
+ <span class="bg-blue-100 text-blue-800 px-2 py-1 rounded">US-102</span>
189
+ <div class="flex items-center space-x-2">
190
+ <span class="text-gray-500"><i class="fas fa-comment mr-1"></i> 2</span>
191
+ <span class="text-gray-500"><i class="fas fa-code-branch mr-1"></i> 1</span>
192
+ </div>
193
+ </div>
194
+ </div>
195
+
196
+ <!-- Card 3 (Skeleton Loader) -->
197
+ <div class="card bg-gray-100 p-4 rounded-lg shadow">
198
+ <div class="animate-pulse">
199
+ <div class="h-5 bg-gray-200 rounded w-3/4 mb-3"></div>
200
+ <div class="h-3 bg-gray-200 rounded w-full mb-4"></div>
201
+ <div class="flex justify-between">
202
+ <div class="h-6 bg-gray-200 rounded w-16"></div>
203
+ <div class="flex space-x-2">
204
+ <div class="h-6 bg-gray-200 rounded w-6"></div>
205
+ <div class="h-6 bg-gray-200 rounded w-6"></div>
206
+ </div>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </div>
212
+
213
+ <!-- In Progress Column -->
214
+ <div class="kanban-column rounded-lg p-4 shadow-sm">
215
+ <div class="flex justify-between items-center mb-4">
216
+ <h3 class="font-semibold text-lg text-gray-800">In Progress</h3>
217
+ <span class="bg-blue-100 text-blue-800 text-xs font-semibold px-2 py-1 rounded-full">8 items</span>
218
+ </div>
219
+ <div id="in-progress-cards" class="space-y-3">
220
+ <!-- Card 4 -->
221
+ <div class="card bg-white p-4 rounded-lg shadow cursor-pointer hover:shadow-md transition" onclick="showCardDetails('card-4')">
222
+ <div class="flex justify-between items-start mb-2">
223
+ <h4 class="font-medium text-gray-800">API endpoint for user data</h4>
224
+ <span class="priority-indicator priority-high"></span>
225
+ </div>
226
+ <p class="text-sm text-gray-600 mb-3">Create RESTful endpoints for user profile management</p>
227
+ <div class="flex justify-between items-center text-xs">
228
+ <span class="bg-blue-100 text-blue-800 px-2 py-1 rounded">US-103</span>
229
+ <div class="flex items-center space-x-2">
230
+ <span class="text-gray-500"><i class="fas fa-comment mr-1"></i> 3</span>
231
+ <span class="text-gray-500"><i class="fas fa-code-branch mr-1"></i> 2</span>
232
+ </div>
233
+ </div>
234
+ </div>
235
+
236
+ <!-- Card 5 -->
237
+ <div class="card bg-white p-4 rounded-lg shadow cursor-pointer hover:shadow-md transition" onclick="showCardDetails('card-5')">
238
+ <div class="flex justify-between items-start mb-2">
239
+ <h4 class="font-medium text-gray-800">Mobile responsive design</h4>
240
+ <span class="priority-indicator priority-medium"></span>
241
+ </div>
242
+ <p class="text-sm text-gray-600 mb-3">Ensure all components adapt to different screen sizes</p>
243
+ <div class="flex justify-between items-center text-xs">
244
+ <span class="bg-blue-100 text-blue-800 px-2 py-1 rounded">US-104</span>
245
+ <div class="flex items-center space-x-2">
246
+ <span class="text-gray-500"><i class="fas fa-comment mr-1"></i> 7</span>
247
+ <span class="text-gray-500"><i class="fas fa-code-branch mr-1"></i> 4</span>
248
+ </div>
249
+ </div>
250
+ </div>
251
+ </div>
252
+ </div>
253
+
254
+ <!-- Done Column -->
255
+ <div class="kanban-column rounded-lg p-4 shadow-sm">
256
+ <div class="flex justify-between items-center mb-4">
257
+ <h3 class="font-semibold text-lg text-gray-800">Done</h3>
258
+ <span class="bg-green-100 text-green-800 text-xs font-semibold px-2 py-1 rounded-full">12 items</span>
259
+ </div>
260
+ <div id="done-cards" class="space-y-3">
261
+ <!-- Card 6 -->
262
+ <div class="card bg-white p-4 rounded-lg shadow cursor-pointer hover:shadow-md transition" onclick="showCardDetails('card-6')">
263
+ <div class="flex justify-between items-start mb-2">
264
+ <h4 class="font-medium text-gray-800">Project setup and config</h4>
265
+ <span class="priority-indicator priority-low"></span>
266
+ </div>
267
+ <p class="text-sm text-gray-600 mb-3">Initialize project with required dependencies and tooling</p>
268
+ <div class="flex justify-between items-center text-xs">
269
+ <span class="bg-blue-100 text-blue-800 px-2 py-1 rounded">US-105</span>
270
+ <div class="flex items-center space-x-2">
271
+ <span class="text-gray-500"><i class="fas fa-comment mr-1"></i> 0</span>
272
+ <span class="text-gray-500"><i class="fas fa-code-branch mr-1"></i> 1</span>
273
+ </div>
274
+ </div>
275
+ </div>
276
+
277
+ <!-- Card 7 -->
278
+ <div class="card bg-white p-4 rounded-lg shadow cursor-pointer hover:shadow-md transition" onclick="showCardDetails('card-7')">
279
+ <div class="flex justify-between items-start mb-2">
280
+ <h4 class="font-medium text-gray-800">Database schema design</h4>
281
+ <span class="priority-indicator priority-medium"></span>
282
+ </div>
283
+ <p class="text-sm text-gray-600 mb-3">Create initial database models and relationships</p>
284
+ <div class="flex justify-between items-center text-xs">
285
+ <span class="bg-blue-100 text-blue-800 px-2 py-1 rounded">US-106</span>
286
+ <div class="flex items-center space-x-2">
287
+ <span class="text-gray-500"><i class="fas fa-comment mr-1"></i> 4</span>
288
+ <span class="text-gray-500"><i class="fas fa-code-branch mr-1"></i> 2</span>
289
+ </div>
290
+ </div>
291
+ </div>
292
+ </div>
293
+ </div>
294
+ </div>
295
+
296
+ <!-- Card Details Modal -->
297
+ <div id="card-modal" class="hidden fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-50">
298
+ <div class="relative top-20 mx-auto p-5 border w-11/12 md:w-3/4 lg:w-2/3 shadow-lg rounded-md bg-white">
299
+ <div class="flex justify-between items-start mb-4">
300
+ <div>
301
+ <h3 id="card-title" class="text-xl font-bold text-gray-800">Card Title</h3>
302
+ <div class="flex items-center mt-1 space-x-3">
303
+ <span id="card-id" class="bg-blue-100 text-blue-800 px-2 py-1 rounded text-xs">US-000</span>
304
+ <span id="card-priority" class="text-xs font-medium flex items-center">
305
+ <span class="priority-indicator priority-high mr-1"></span>
306
+ <span>High Priority</span>
307
+ </span>
308
+ <span id="card-status" class="bg-blue-100 text-blue-800 px-2 py-1 rounded text-xs">To Do</span>
309
+ </div>
310
+ </div>
311
+ <button onclick="closeCardDetails()" class="text-gray-400 hover:text-gray-500">
312
+ <i class="fas fa-times"></i>
313
+ </button>
314
+ </div>
315
+
316
+ <div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
317
+ <div class="lg:col-span-2">
318
+ <div class="mb-6">
319
+ <h4 class="font-semibold text-gray-700 mb-2">Description</h4>
320
+ <p id="card-description" class="text-gray-600">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
321
+ </div>
322
+
323
+ <div class="mb-6">
324
+ <h4 class="font-semibold text-gray-700 mb-2">Acceptance Criteria</h4>
325
+ <ul id="card-criteria" class="list-disc pl-5 space-y-1 text-gray-600">
326
+ <li>First acceptance criterion</li>
327
+ <li>Second acceptance criterion</li>
328
+ <li>Third acceptance criterion</li>
329
+ </ul>
330
+ </div>
331
+
332
+ <div class="mb-6">
333
+ <h4 class="font-semibold text-gray-700 mb-2">Dependencies</h4>
334
+ <div id="card-dependencies" class="flex flex-wrap gap-2">
335
+ <span class="bg-gray-100 text-gray-800 px-2 py-1 rounded text-xs">US-105</span>
336
+ <span class="bg-gray-100 text-gray-800 px-2 py-1 rounded text-xs">US-107</span>
337
+ </div>
338
+ </div>
339
+ </div>
340
+
341
+ <div>
342
+ <div class="mb-6">
343
+ <div class="flex justify-between items-center mb-2">
344
+ <h4 class="font-semibold text-gray-700">Feedback (3)</h4>
345
+ <button onclick="startFeedbackSession()" class="text-sm text-indigo-600 hover:text-indigo-800 flex items-center">
346
+ <i class="fas fa-plus mr-1"></i> Add Feedback
347
+ </button>
348
+ </div>
349
+ <div id="card-feedback" class="space-y-3">
350
+ <div class="bg-gray-50 p-3 rounded">
351
+ <div class="flex justify-between items-start mb-1">
352
+ <span class="text-sm font-medium">Jane Smith</span>
353
+ <span class="text-xs text-gray-500">2 days ago</span>
354
+ </div>
355
+ <p class="text-sm text-gray-600">The login button color doesn't match our brand guidelines. Please use #3B82F6 instead.</p>
356
+ </div>
357
+ <div class="bg-gray-50 p-3 rounded">
358
+ <div class="flex justify-between items-start mb-1">
359
+ <span class="text-sm font-medium">Mike Johnson</span>
360
+ <span class="text-xs text-gray-500">1 week ago</span>
361
+ </div>
362
+ <p class="text-sm text-gray-600">We should add a "Forgot Password" link below the login form.</p>
363
+ </div>
364
+ </div>
365
+ </div>
366
+
367
+ <div>
368
+ <h4 class="font-semibold text-gray-700 mb-2">Development Links</h4>
369
+ <div id="card-dev-links" class="space-y-2">
370
+ <a href="#" class="flex items-center text-sm text-indigo-600 hover:text-indigo-800">
371
+ <i class="fas fa-file-code mr-2"></i> user-auth.controller.js
372
+ </a>
373
+ <a href="#" class="flex items-center text-sm text-indigo-600 hover:text-indigo-800">
374
+ <i class="fas fa-folder mr-2"></i> /src/routes/auth
375
+ </a>
376
+ <a href="#" class="flex items-center text-sm text-indigo-600 hover:text-indigo-800">
377
+ <i class="fas fa-database mr-2"></i> users table schema
378
+ </a>
379
+ </div>
380
+ </div>
381
+ </div>
382
+ </div>
383
+ </div>
384
+ </div>
385
+
386
+ <!-- Feedback Modal -->
387
+ <div id="feedback-modal" class="hidden fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-50">
388
+ <div class="relative top-10 mx-auto p-5 border w-11/12 md:w-4/5 lg:w-3/4 shadow-lg rounded-md bg-white">
389
+ <div class="flex justify-between items-start mb-4">
390
+ <div>
391
+ <h3 class="text-xl font-bold text-gray-800">Add Feedback</h3>
392
+ <p class="text-sm text-gray-600">Attach visual feedback to: <span id="feedback-card-title" class="font-medium">Implement user authentication</span></p>
393
+ </div>
394
+ <button onclick="closeFeedbackModal()" class="text-gray-400 hover:text-gray-500">
395
+ <i class="fas fa-times"></i>
396
+ </button>
397
+ </div>
398
+
399
+ <div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
400
+ <div class="lg:col-span-2">
401
+ <div class="mb-4">
402
+ <label class="block text-sm font-medium text-gray-700 mb-1">Feedback Context</label>
403
+ <div class="flex space-x-3">
404
+ <button id="upload-image-btn" class="flex-1 flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50">
405
+ <i class="fas fa-image mr-2"></i> Upload Image
406
+ </button>
407
+ <button id="paste-url-btn" class="flex-1 flex items-center justify-center px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50">
408
+ <i class="fas fa-link mr-2"></i> Paste URL
409
+ </button>
410
+ </div>
411
+ </div>
412
+
413
+ <div id="feedback-upload-area" class="hidden">
414
+ <div class="border-2 border-dashed border-gray-300 rounded-md p-4 text-center">
415
+ <i class="fas fa-cloud-upload-alt text-4xl text-gray-400 mb-2"></i>
416
+ <p class="text-sm text-gray-600 mb-2">Drag and drop an image file here, or click to select</p>
417
+ <input type="file" id="image-upload" class="hidden" accept="image/*">
418
+ <button onclick="document.getElementById('image-upload').click()" class="px-4 py-2 bg-indigo-600 text-white text-sm font-medium rounded-md hover:bg-indigo-700">
419
+ Select Image
420
+ </button>
421
+ </div>
422
+ </div>
423
+
424
+ <div id="feedback-url-area" class="hidden">
425
+ <div class="mb-4">
426
+ <label for="url-input" class="block text-sm font-medium text-gray-700 mb-1">URL to Prototype/Screenshot</label>
427
+ <input type="url" id="url-input" class="block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" placeholder="https://example.com/prototype">
428
+ </div>
429
+ <button id="load-url-btn" class="px-4 py-2 bg-indigo-600 text-white text-sm font-medium rounded-md hover:bg-indigo-700">
430
+ Load URL
431
+ </button>
432
+ </div>
433
+
434
+ <div id="feedback-canvas-container" class="hidden mt-4">
435
+ <div class="flex justify-between items-center mb-2">
436
+ <h4 class="font-medium text-gray-700">Click on the image to add annotations</h4>
437
+ <button id="clear-annotations-btn" class="text-sm text-red-600 hover:text-red-800">
438
+ <i class="fas fa-trash-alt mr-1"></i> Clear All
439
+ </button>
440
+ </div>
441
+ <div id="feedback-canvas" class="feedback-canvas bg-gray-100 relative">
442
+ <!-- Image will be loaded here -->
443
+ <img id="feedback-image" src="" alt="Feedback context" class="max-w-full h-auto">
444
+ <!-- Annotation markers will be added here -->
445
+ </div>
446
+ </div>
447
+ </div>
448
+
449
+ <div>
450
+ <div id="annotation-form" class="hidden">
451
+ <div class="mb-4">
452
+ <label for="annotation-comment" class="block text-sm font-medium text-gray-700 mb-1">Your Comment</label>
453
+ <textarea id="annotation-comment" rows="4" class="block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" placeholder="Add details about this specific area..."></textarea>
454
+ </div>
455
+ <div class="flex justify-end space-x-3">
456
+ <button id="cancel-annotation-btn" class="px-4 py-2 border border-gray-300 rounded-md shadow-sm text-sm font-medium text-gray-700 hover:bg-gray-50">
457
+ Cancel
458
+ </button>
459
+ <button id="submit-annotation-btn" class="px-4 py-2 bg-indigo-600 text-white text-sm font-medium rounded-md hover:bg-indigo-700">
460
+ Submit Annotation
461
+ </button>
462
+ </div>
463
+ </div>
464
+
465
+ <div id="existing-annotations" class="hidden">
466
+ <h4 class="font-medium text-gray-700 mb-2">Existing Annotations</h4>
467
+ <div id="annotations-list" class="space-y-3">
468
+ <!-- Annotations will be listed here -->
469
+ </div>
470
+ </div>
471
+
472
+ <div id="feedback-instructions" class="bg-blue-50 p-4 rounded-md">
473
+ <h4 class="font-medium text-blue-800 mb-2">How to provide feedback</h4>
474
+ <ol class="list-decimal pl-5 space-y-1 text-sm text-blue-700">
475
+ <li>Upload an image or paste a URL to load the visual context</li>
476
+ <li>Click on specific areas to add annotation markers</li>
477
+ <li>Add detailed comments for each annotation</li>
478
+ <li>Submit your feedback to attach it to this backlog item</li>
479
+ </ol>
480
+ </div>
481
+ </div>
482
+ </div>
483
+ </div>
484
+ </div>
485
+ </main>
486
+
487
+ <script>
488
+ // Sample data for the demo
489
+ const cards = {
490
+ 'card-1': {
491
+ id: 'US-101',
492
+ title: 'Implement user authentication',
493
+ priority: 'high',
494
+ status: 'todo',
495
+ description: 'Add secure login and registration functionality with JWT tokens. This includes creating the necessary API endpoints, frontend components, and validation logic.',
496
+ criteria: [
497
+ 'User can register with email and password',
498
+ 'User can login with valid credentials',
499
+ 'Invalid login attempts are handled securely',
500
+ 'JWT tokens are issued and validated properly'
501
+ ],
502
+ dependencies: ['US-105', 'US-107'],
503
+ feedback: [
504
+ { author: 'Jane Smith', date: '2 days ago', comment: 'The login button color doesn\'t match our brand guidelines. Please use #3B82F6 instead.' },
505
+ { author: 'Mike Johnson', date: '1 week ago', comment: 'We should add a "Forgot Password" link below the login form.' }
506
+ ],
507
+ devLinks: [
508
+ { type: 'file', name: 'user-auth.controller.js' },
509
+ { type: 'folder', name: '/src/routes/auth' },
510
+ { type: 'db', name: 'users table schema' }
511
+ ]
512
+ },
513
+ 'card-2': {
514
+ id: 'US-102',
515
+ title: 'Create dashboard layout',
516
+ priority: 'medium',
517
+ status: 'todo',
518
+ description: 'Design and implement the main dashboard UI components including navigation, summary cards, and the main content area.',
519
+ criteria: [
520
+ 'Dashboard adapts to different screen sizes',
521
+ 'Navigation is accessible and intuitive',
522
+ 'Summary cards display key metrics',
523
+ 'Main content area is flexible for different widgets'
524
+ ],
525
+ dependencies: ['US-105'],
526
+ feedback: [
527
+ { author: 'Sarah Williams', date: '3 days ago', comment: 'The navigation should be collapsible on smaller screens.' }
528
+ ],
529
+ devLinks: [
530
+ { type: 'file', name: 'Dashboard.jsx' },
531
+ { type: 'folder', name: '/src/components/layout' }
532
+ ]
533
+ },
534
+ 'card-4': {
535
+ id: 'US-103',
536
+ title: 'API endpoint for user data',
537
+ priority: 'high',
538
+ status: 'in-progress',
539
+ description: 'Create RESTful endpoints for user profile management including CRUD operations and data validation.',
540
+ criteria: [
541
+ 'GET /api/users returns user list',
542
+ 'GET /api/users/:id returns specific user',
543
+ 'PUT /api/users/:id updates user data',
544
+ 'DELETE /api/users/:id deactivates user'
545
+ ],
546
+ dependencies: ['US-101', 'US-106'],
547
+ feedback: [],
548
+ devLinks: [
549
+ { type: 'file', name: 'users.routes.js' },
550
+ { type: 'folder', name: '/src/controllers' }
551
+ ]
552
+ },
553
+ 'card-5': {
554
+ id: 'US-104',
555
+ title: 'Mobile responsive design',
556
+ priority: 'medium',
557
+ status: 'in-progress',
558
+ description: 'Ensure all components adapt to different screen sizes with appropriate breakpoints and responsive behavior.',
559
+ criteria: [
560
+ 'Layout adjusts at 768px and 480px breakpoints',
561
+ 'Navigation converts to hamburger menu on mobile',
562
+ 'Forms remain usable on small screens',
563
+ 'Images scale appropriately'
564
+ ],
565
+ dependencies: ['US-102'],
566
+ feedback: [
567
+ { author: 'Alex Chen', date: '5 days ago', comment: 'The form fields need more padding on mobile devices.' },
568
+ { author: 'Taylor Swift', date: '1 week ago', comment: 'Consider adding swipe gestures for the image carousel on mobile.' }
569
+ ],
570
+ devLinks: [
571
+ { type: 'file', name: 'responsive.scss' },
572
+ { type: 'folder', name: '/src/styles' }
573
+ ]
574
+ },
575
+ 'card-6': {
576
+ id: 'US-105',
577
+ title: 'Project setup and config',
578
+ priority: 'low',
579
+ status: 'done',
580
+ description: 'Initialize project with required dependencies and tooling including linters, testing frameworks, and CI/CD pipeline.',
581
+ criteria: [
582
+ 'Project can be installed with npm install',
583
+ 'ESLint and Prettier configured',
584
+ 'Jest testing framework installed',
585
+ 'GitHub Actions workflow for CI'
586
+ ],
587
+ dependencies: [],
588
+ feedback: [],
589
+ devLinks: [
590
+ { type: 'file', name: 'package.json' },
591
+ { type: 'folder', name: '/.github/workflows' }
592
+ ]
593
+ },
594
+ 'card-7': {
595
+ id: 'US-106',
596
+ title: 'Database schema design',
597
+ priority: 'medium',
598
+ status: 'done',
599
+ description: 'Create initial database models and relationships including users, products, and orders tables with appropriate indexes.',
600
+ criteria: [
601
+ 'Users table with required fields',
602
+ 'Products table with categories',
603
+ 'Orders table with relationships',
604
+ 'Appropriate indexes for common queries'
605
+ ],
606
+ dependencies: ['US-105'],
607
+ feedback: [
608
+ { author: 'David Miller', date: '2 weeks ago', comment: 'Consider adding a created_at timestamp to all tables.' }
609
+ ],
610
+ devLinks: [
611
+ { type: 'file', name: 'schema.sql' },
612
+ { type: 'folder', name: '/database/migrations' }
613
+ ]
614
+ }
615
+ };
616
+
617
+ // DOM elements
618
+ const userMenuBtn = document.getElementById('user-menu-btn');
619
+ const userMenu = document.getElementById('user-menu');
620
+ const refreshBtn = document.getElementById('refresh-btn');
621
+ const newFeedbackBtn = document.getElementById('new-feedback-btn');
622
+ const searchInput = document.getElementById('search');
623
+ const statusFilter = document.getElementById('status-filter');
624
+ const priorityFilter = document.getElementById('priority-filter');
625
+ const cardModal = document.getElementById('card-modal');
626
+ const feedbackModal = document.getElementById('feedback-modal');
627
+ const uploadImageBtn = document.getElementById('upload-image-btn');
628
+ const pasteUrlBtn = document.getElementById('paste-url-btn');
629
+ const feedbackUploadArea = document.getElementById('feedback-upload-area');
630
+ const feedbackUrlArea = document.getElementById('feedback-url-area');
631
+ const feedbackCanvasContainer = document.getElementById('feedback-canvas-container');
632
+ const annotationForm = document.getElementById('annotation-form');
633
+ const existingAnnotations = document.getElementById('existing-annotations');
634
+ const feedbackInstructions = document.getElementById('feedback-instructions');
635
+ const feedbackImage = document.getElementById('feedback-image');
636
+ const feedbackCanvas = document.getElementById('feedback-canvas');
637
+ const clearAnnotationsBtn = document.getElementById('clear-annotations-btn');
638
+ const cancelAnnotationBtn = document.getElementById('cancel-annotation-btn');
639
+ const submitAnnotationBtn = document.getElementById('submit-annotation-btn');
640
+ const annotationComment = document.getElementById('annotation-comment');
641
+ const annotationsList = document.getElementById('annotations-list');
642
+
643
+ // State variables
644
+ let currentCardId = null;
645
+ let annotations = [];
646
+ let currentAnnotation = null;
647
+
648
+ // Event listeners
649
+ userMenuBtn.addEventListener('click', toggleUserMenu);
650
+ refreshBtn.addEventListener('click', refreshBacklog);
651
+ newFeedbackBtn.addEventListener('click', startFeedbackSession);
652
+ searchInput.addEventListener('input', filterCards);
653
+ statusFilter.addEventListener('change', filterCards);
654
+ priorityFilter.addEventListener('change', filterCards);
655
+ uploadImageBtn.addEventListener('click', showUploadArea);
656
+ pasteUrlBtn.addEventListener('click', showUrlArea);
657
+ clearAnnotationsBtn.addEventListener('click', clearAnnotations);
658
+ cancelAnnotationBtn.addEventListener('click', cancelAnnotation);
659
+ submitAnnotationBtn.addEventListener('click', submitAnnotation);
660
+ document.getElementById('image-upload').addEventListener('change', handleImageUpload);
661
+ document.getElementById('load-url-btn').addEventListener('click', loadUrl);
662
+
663
+ // Initialize the app
664
+ function init() {
665
+ // Simulate loading data
666
+ setTimeout(() => {
667
+ document.querySelectorAll('.skeleton-loader').forEach(el => {
668
+ el.classList.remove('animate-pulse');
669
+ el.innerHTML = `
670
+ <div class="flex justify-between items-start mb-2">
671
+ <h4 class="font-medium text-gray-800">Data validation middleware</h4>
672
+ <span class="priority-indicator priority-medium"></span>
673
+ </div>
674
+ <p class="text-sm text-gray-600 mb-3">Create reusable validation middleware for API requests</p>
675
+ <div class="flex justify-between items-center text-xs">
676
+ <span class="bg-blue-100 text-blue-800 px-2 py-1 rounded">US-108</span>
677
+ <div class="flex items-center space-x-2">
678
+ <span class="text-gray-500"><i class="fas fa-comment mr-1"></i> 0</span>
679
+ <span class="text-gray-500"><i class="fas fa-code-branch mr-1"></i> 0</span>
680
+ </div>
681
+ </div>
682
+ `;
683
+ });
684
+ }, 1500);
685
+ }
686
+
687
+ // Toggle user menu
688
+ function toggleUserMenu() {
689
+ userMenu.classList.toggle('hidden');
690
+ }
691
+
692
+ // Close user menu when clicking outside
693
+ document.addEventListener('click', (e) => {
694
+ if (!userMenu.contains(e.target) && e.target !== userMenuBtn) {
695
+ userMenu.classList.add('hidden');
696
+ }
697
+ });
698
+
699
+ // Refresh backlog data
700
+ function refreshBacklog() {
701
+ refreshBtn.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i> Refreshing';
702
+ setTimeout(() => {
703
+ refreshBtn.innerHTML = '<i class="fas fa-sync-alt mr-2"></i> Refresh';
704
+ document.getElementById('last-updated').textContent = new Date().toLocaleString();
705
+ // In a real app, this would fetch new data from the API
706
+ }, 1000);
707
+ }
708
+
709
+ // Show card details modal
710
+ function showCardDetails(cardId) {
711
+ currentCardId = cardId;
712
+ const card = cards[cardId];
713
+
714
+ // Update modal content
715
+ document.getElementById('card-title').textContent = card.title;
716
+ document.getElementById('card-id').textContent = card.id;
717
+ document.getElementById('card-description').textContent = card.description;
718
+ document.getElementById('card-status').textContent = card.status === 'todo' ? 'To Do' :
719
+ card.status === 'in-progress' ? 'In Progress' : 'Done';
720
+
721
+ // Update priority
722
+ const priorityIndicator = document.getElementById('card-priority');
723
+ priorityIndicator.querySelector('.priority-indicator').className = `priority-indicator priority-${card.priority}`;
724
+ priorityIndicator.querySelector('span:last-child').textContent = `${card.priority.charAt(0).toUpperCase() + card.priority.slice(1)} Priority`;
725
+
726
+ // Update criteria
727
+ const criteriaList = document.getElementById('card-criteria');
728
+ criteriaList.innerHTML = '';
729
+ card.criteria.forEach(criterion => {
730
+ const li = document.createElement('li');
731
+ li.textContent = criterion;
732
+ criteriaList.appendChild(li);
733
+ });
734
+
735
+ // Update dependencies
736
+ const dependenciesContainer = document.getElementById('card-dependencies');
737
+ dependenciesContainer.innerHTML = '';
738
+ card.dependencies.forEach(dep => {
739
+ const span = document.createElement('span');
740
+ span.className = 'bg-gray-100 text-gray-800 px-2 py-1 rounded text-xs';
741
+ span.textContent = dep;
742
+ dependenciesContainer.appendChild(span);
743
+ });
744
+
745
+ // Update feedback
746
+ const feedbackContainer = document.getElementById('card-feedback');
747
+ feedbackContainer.innerHTML = '';
748
+ card.feedback.forEach(fb => {
749
+ const div = document.createElement('div');
750
+ div.className = 'bg-gray-50 p-3 rounded';
751
+ div.innerHTML = `
752
+ <div class="flex justify-between items-start mb-1">
753
+ <span class="text-sm font-medium">${fb.author}</span>
754
+ <span class="text-xs text-gray-500">${fb.date}</span>
755
+ </div>
756
+ <p class="text-sm text-gray-600">${fb.comment}</p>
757
+ `;
758
+ feedbackContainer.appendChild(div);
759
+ });
760
+
761
+ // Update dev links
762
+ const devLinksContainer = document.getElementById('card-dev-links');
763
+ devLinksContainer.innerHTML = '';
764
+ card.devLinks.forEach(link => {
765
+ const a = document.createElement('a');
766
+ a.href = '#';
767
+ a.className = 'flex items-center text-sm text-indigo-600 hover:text-indigo-800';
768
+ a.innerHTML = `
769
+ <i class="fas ${link.type === 'file' ? 'fa-file-code' : link.type === 'folder' ? 'fa-folder' : 'fa-database'} mr-2"></i>
770
+ ${link.name}
771
+ `;
772
+ devLinksContainer.appendChild(a);
773
+ });
774
+
775
+ // Show modal
776
+ document.getElementById('feedback-card-title').textContent = card.title;
777
+ cardModal.classList.remove('hidden');
778
+ }
779
+
780
+ // Close card details modal
781
+ function closeCardDetails() {
782
+ cardModal.classList.add('hidden');
783
+ }
784
+
785
+ // Start feedback session
786
+ function startFeedbackSession() {
787
+ if (!currentCardId) return;
788
+
789
+ // Reset feedback modal
790
+ feedbackUploadArea.classList.add('hidden');
791
+ feedbackUrlArea.classList.add('hidden');
792
+ feedbackCanvasContainer.classList.add('hidden');
793
+ annotationForm.classList.add('hidden');
794
+ existingAnnotations.classList.add('hidden');
795
+ feedbackInstructions.classList.remove('hidden');
796
+
797
+ // Show modal
798
+ feedbackModal.classList.remove('hidden');
799
+ }
800
+
801
+ // Close feedback modal
802
+ function closeFeedbackModal() {
803
+ feedbackModal.classList.add('hidden');
804
+ }
805
+
806
+ // Show upload area
807
+ function showUploadArea() {
808
+ feedbackUploadArea.classList.remove('hidden');
809
+ feedbackUrlArea.classList.add('hidden');
810
+ feedbackInstructions.classList.add('hidden');
811
+ }
812
+
813
+ // Show URL area
814
+ function showUrlArea() {
815
+ feedbackUrlArea.classList.remove('hidden');
816
+ feedbackUploadArea.classList.add('hidden');
817
+ feedbackInstructions.classList.add('hidden');
818
+ }
819
+
820
+ // Handle image upload
821
+ function handleImageUpload(e) {
822
+ const file = e.target.files[0];
823
+ if (!file) return;
824
+
825
+ const reader = new FileReader();
826
+ reader.onload = function(event) {
827
+ feedbackImage.src = event.target.result;
828
+ feedbackCanvasContainer.classList.remove('hidden');
829
+ feedbackUploadArea.classList.add('hidden');
830
+
831
+ // Set up canvas for annotations
832
+ setupAnnotationCanvas();
833
+ };
834
+ reader.readAsDataURL(file);
835
+ }
836
+
837
+ // Load URL
838
+ function loadUrl() {
839
+ const url = document.getElementById('url-input').value;
840
+ if (!url) return;
841
+
842
+ // In a real app, we would load the URL content here
843
+ // For demo purposes, we'll just show a placeholder
844
+ feedbackImage.src = 'https://via.placeholder.com/800x500?text=Prototype+Preview';
845
+ feedbackCanvasContainer.classList.remove('hidden');
846
+ feedbackUrlArea.classList.add('hidden');
847
+
848
+ // Set up canvas for annotations
849
+ setupAnnotationCanvas();
850
+ }
851
+
852
+ // Set up annotation canvas
853
+ function setupAnnotationCanvas() {
854
+ // Clear any existing annotations
855
+ clearAnnotations();
856
+
857
+ // Add click handler for the canvas
858
+ feedbackCanvas.addEventListener('click', handleCanvasClick);
859
+ }
860
+
861
+ // Handle canvas click to add annotation
862
+ function handleCanvasClick(e) {
863
+ // Get position relative to the image
864
+ const rect = feedbackCanvas.getBoundingClientRect();
865
+ const x = e.clientX - rect.left;
866
+ const y = e.clientY - rect.top;
867
+
868
+ // Create a new annotation marker
869
+ currentAnnotation = { x, y, comment: '' };
870
+
871
+ // Show the annotation form
872
+ annotationForm.classList.remove('hidden');
873
+ existingAnnotations.classList.add('hidden');
874
+
875
+ // Position the form near the click
876
+ annotationForm.style.top = `${y + 20}px`;
877
+ annotationForm.style.left = `${x + 20}px`;
878
+ }
879
+
880
+ // Clear all annotations
881
+ function clearAnnotations() {
882
+ annotations = [];
883
+ currentAnnotation = null;
884
+ renderAnnotations();
885
+ }
886
+
887
+ // Cancel current annotation
888
+ function cancelAnnotation() {
889
+ currentAnnotation = null;
890
+ annotationForm.classList.add('hidden');
891
+ }
892
+
893
+ // Submit annotation
894
+ function submitAnnotation() {
895
+ if (!currentAnnotation) return;
896
+
897
+ const comment = annotationComment.value.trim();
898
+ if (!comment) return;
899
+
900
+ currentAnnotation.comment = comment;
901
+ currentAnnotation.date = new Date().toLocaleDateString();
902
+ currentAnnotation.author = 'You';
903
+
904
+ annotations.push(currentAnnotation);
905
+ currentAnnotation = null;
906
+ annotationComment.value = '';
907
+ annotationForm.classList.add('hidden');
908
+
909
+ renderAnnotations();
910
+ }
911
+
912
+ // Render annotations
913
+ function renderAnnotations() {
914
+ // Clear existing markers
915
+ document.querySelectorAll('.annotation-marker').forEach(marker => marker.remove());
916
+ document.querySelectorAll('.annotation-tooltip').forEach(tooltip => tooltip.remove());
917
+
918
+ // Add markers for all annotations
919
+ annotations.forEach((annotation, index) => {
920
+ // Create marker
921
+ const marker = document.createElement('div');
922
+ marker.className = 'annotation-marker';
923
+ marker.style.top = `${annotation.y}px`;
924
+ marker.style.left = `${annotation.x}px`;
925
+ marker.dataset.index = index;
926
+
927
+ // Add click handler to show tooltip
928
+ marker.addEventListener('click', (e) => {
929
+ e.stopPropagation();
930
+ showAnnotationTooltip(annotation, marker);
931
+ });
932
+
933
+ feedbackCanvas.appendChild(marker);
934
+ });
935
+
936
+ // Update annotations list
937
+ annotationsList.innerHTML = '';
938
+ annotations.forEach((annotation, index) => {
939
+ const div = document.createElement('div');
940
+ div.className = 'bg-gray-50 p-3 rounded cursor-pointer hover:bg-gray-100';
941
+ div.innerHTML = `
942
+ <div class="flex justify-between items-start mb-1">
943
+ <span class="text-sm font-medium">${annotation.author}</span>
944
+ <span class="text-xs text-gray-500">${annotation.date}</span>
945
+ </div>
946
+ <p class="text-sm text-gray-600">${annotation.comment}</p>
947
+ `;
948
+ div.addEventListener('click', () => {
949
+ const marker = feedbackCanvas.querySelector(`.annotation-marker[data-index="${index}"]`);
950
+ if (marker) {
951
+ showAnnotationTooltip(annotation, marker);
952
+ }
953
+ });
954
+ annotationsList.appendChild(div);
955
+ });
956
+
957
+ // Show annotations list if there are any
958
+ if (annotations.length > 0) {
959
+ existingAnnotations.classList.remove('hidden');
960
+ } else {
961
+ existingAnnotations.classList.add('hidden');
962
+ }
963
+ }
964
+
965
+ // Show annotation tooltip
966
+ function showAnnotationTooltip(annotation, marker) {
967
+ // Remove any existing tooltip
968
+ document.querySelectorAll('.annotation-tooltip').forEach(tooltip => tooltip.remove());
969
+
970
+ // Create new tooltip
971
+ const tooltip = document.createElement('div');
972
+ tooltip.className = 'annotation-tooltip';
973
+ tooltip.style.top = `${parseInt(marker.style.top) - 10}px`;
974
+ tooltip.style.left = `${parseInt(marker.style.left) + 20}px`;
975
+ tooltip.innerHTML = `
976
+ <div class="text-sm font-medium">${annotation.author}</div>
977
+ <div class="text-xs text-gray-500 mb-1">${annotation.date}</div>
978
+ <div class="text-sm">${annotation.comment}</div>
979
+ `;
980
+
981
+ feedbackCanvas.appendChild(tooltip);
982
+
983
+ // Close tooltip when clicking outside
984
+ setTimeout(() => {
985
+ const closeTooltip = (e) => {
986
+ if (!tooltip.contains(e.target) && e.target !== marker) {
987
+ tooltip.remove();
988
+ document.removeEventListener('click', closeTooltip);
989
+ }
990
+ };
991
+ document.addEventListener('click', closeTooltip);
992
+ }, 10);
993
+ }
994
+
995
+ // Filter cards based on search and filters
996
+ function filterCards() {
997
+ const searchTerm = searchInput.value.toLowerCase();
998
+ const statusValue = statusFilter.value;
999
+ const priorityValue = priorityFilter.value;
1000
+
1001
+ document.querySelectorAll('.card').forEach(card => {
1002
+ const title = card.querySelector('h4').textContent.toLowerCase();
1003
+ const status = card.closest('.kanban-column').querySelector('h3').textContent.toLowerCase();
1004
+ const priority = card.querySelector('.priority-indicator').className.includes('high') ? 'high' :
1005
+ card.querySelector('.priority-indicator').className.includes('medium') ? 'medium' : 'low';
1006
+
1007
+ const matchesSearch = title.includes(searchTerm);
1008
+ const matchesStatus = statusValue === 'all' ||
1009
+ (statusValue === 'todo' && status.includes('to do')) ||
1010
+ (statusValue === 'in-progress' && status.includes('in progress')) ||
1011
+ (statusValue === 'done' && status.includes('done'));
1012
+ const matchesPriority = priorityValue === 'all' || priority === priorityValue;
1013
+
1014
+ if (matchesSearch && matchesStatus && matchesPriority) {
1015
+ card.style.display = 'block';
1016
+ } else {
1017
+ card.style.display = 'none';
1018
+ }
1019
+ });
1020
+ }
1021
+
1022
+ // Initialize the app
1023
+ init();
1024
+ </script>
1025
+ <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=LukasBe/vibe-coding-backlog-driven" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
1026
+ </html>
prompts.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ Vibe Coding HTML5 User Environment App Version: 1.0 Date: 2023-10-27 1. Introduction & Overview 1.1 Purpose: This document specifies the functional requirements for the Vibe Coding HTML5 User Environment App. This web-based application serves as an integrated front-end for development teams, Product Owners, and stakeholders operating within a Scrum framework. It aims to provide a streamlined interface for visualizing prioritized backlogs, facilitating contextual feedback, and connecting work items to development artifacts. 1.2 Goals: Provide a clear, real-time view of the product backlog generated and prioritized via associated automation tools (Ref: Epic - Backlog Automation & Prioritization). Enable efficient, visually-anchored feedback collection on UI elements, mockups, or prototypes (Ref: Feature C - WYSIWYG Feedback Annotator). Offer context linking backlog items to relevant code structures or development tasks (Ref: Feature B - Iteration Code Engine). Support Agile principles of transparency, collaboration, and rapid feedback loops. 1.3 Target Audience: Development Team members Product Owner Stakeholders involved in review/feedback cycles 1.4 Scope: This specification covers the user-facing features of the HTML5 application. It assumes the existence of backend services responsible for backlog generation/prioritization (Feature A) and code skeleton generation (Feature B). This application primarily consumes data from those services and provides the interface for Feature C. 2. Guiding Principles (Derived from Initial Prompt) 2.1 Negotiated Scope Support: The application must clearly display the current, prioritized backlog, making scope visible and facilitating informed negotiation between the Development Team and Product Owner. Changes in the underlying backlog data (managed externally) should be reflected dynamically or upon refresh. 2.2 Simplicity (Maximize Work Not Done): The application interface should be intuitive and focus on core tasks: viewing the backlog, providing feedback, and accessing development context. Avoid unnecessary complexity or features not directly supporting these core workflows. 3. Functional Requirements 3.1 Backlog Visualization (Connects to Feature A Output) F.3.1.1 Display Backlog Board: The system shall display the product backlog items (e.g., Epics, Features, Stories, Tasks - represented as 'Cards') in a visual format, such as a Kanban-style board (e.g., columns for To Do, In Progress, Done) or a prioritized list. F.3.1.2 Display Card Details: Each card on the board/list shall display key information pulled from the backlog source, minimally including: Title/Name Unique Identifier User Value Score (or other prioritization metric) Current Status (aligned with board columns if applicable) F.3.1.3 View Extended Card Details: Users shall be able to select a card to view extended details, potentially including: Full Description Acceptance Criteria Dependencies (links or identifiers of related cards) Associated Feedback count/link (See F.3.2) Links to Code/Development Artifacts (See F.3.3) F.3.1.4 Reflect Prioritization: The primary view (list or board columns) shall visually represent the prioritization determined by the external process (Feature A), typically via vertical order within a list/column. F.3.1.5 Filtering and Searching: Users shall be able to filter or search the backlog view based on criteria like title, status, or potentially keywords. 3.2 WYSIWYG Feedback Annotation (Implements Feature C) F.3.2.1 Initiate Feedback Session: Users shall be able to initiate a feedback session associated with a specific backlog card. This may involve: Uploading an image (mockup, screenshot). Pasting a URL to a live prototype or staging environment (to be rendered within an iframe or similar). F.3.2.2 Load Visual Context: The system shall display the uploaded image or render the provided URL within a dedicated feedback view. F.3.2.3 Place Annotation Hotspots: Users shall be able to click directly on specific points or areas within the displayed visual context (image/rendered page). F.3.2.4 Add Anchored Comments: Clicking a point (F.3.2.3) shall open an input field allowing the user to type and submit a textual comment anchored to that specific location. F.3.2.5 View Existing Annotations: The system shall display previously submitted annotation hotspots and their associated comments on the visual context. Hovering or clicking a hotspot should reveal the comment. F.3.2.6 Link Feedback to Backlog: All annotations and comments created within a feedback session (F.3.2.1) shall be automatically associated with the corresponding backlog card. The card view (F.3.1.3) should indicate the presence of feedback. F.3.2.7 Feedback Synchronization: Feedback submitted via the annotator must be persisted and linked such that it can be retrieved later and potentially synced/pushed to the underlying backlog management system if required by the implementation of Feature A/C integration. 3.3 Development Context Linking (Connects to Feature B Output) F.3.3.1 Display Code Skeleton Links: When viewing extended card details (F.3.1.3), the system shall display links or references to code skeletons, directories, or specific files generated by the Iteration Code Engine (Feature B) relevant to that backlog item. F.3.3.2 Indicate Generation Status (Optional): The system may optionally display the status of code generation for a given item (e.g., "Not Generated," "Generated," "Generation Failed"). Note: Triggering generation itself is likely outside the scope of this UI app. 3.4 User Interface & Experience F.3.4.1 Web-Based Access: The application shall be accessible via standard modern web browsers (HTML5 compatible). F.3.4.2 Responsive Design: The layout should adapt reasonably well to different screen sizes (desktop, tablet). F.3.4.3 Intuitive Navigation: Users should be able to easily navigate between the backlog view, card details, and the feedback annotation interface. 4. Non-Functional Requirements (High-Level) NF.4.1 Performance: The application should load backlog data and render feedback interfaces in a timely manner, providing a responsive user experience. NF.4.2 Usability: The interface should be intuitive and require minimal training for target users. NF.4.3 Availability: The application should be reliably available during standard working hours. 5. Integration Points IP.5.1 Backlog Data Source API: The application will need to consume data (read-only) from the system responsible for storing and managing the backlog generated by Feature A (e.g., Trello API, a custom database API). IP.5.2 Feedback Storage API: The application will need an API endpoint to save and retrieve feedback annotations (hotspot coordinates, comments, associated card ID, visual context reference). This might be the same or a different system than the backlog source. IP.5.3 Code Context Data Source (Optional): The application may need to query a source (e.g., API, database) to retrieve links/status information related to code generated by Feature B. 6. Assumptions A backend system exists or will be developed to handle backlog generation, prioritization, storage (Feature A). A backend system or process exists or will be developed for code skeleton generation (Feature B). Mechanisms for user authentication and authorization are handled externally or will be specified separately. The specific format and API for accessing backlog data, storing feedback, and accessing code context links will be defined. 7. Out of Scope The implementation logic of the Backlog Generator (Feature A). The implementation logic of the Iteration Code Engine (Feature B). User management (registration, roles, permissions). Direct modification of the backlog structure or priority within this application (it primarily visualizes and collects feedback). Real-time collaborative editing features (beyond viewing shared feedback).