franz101 commited on
Commit
2fe2aa1
·
verified ·
1 Parent(s): be646c7

Upload folder using huggingface_hub

Browse files
Files changed (3) hide show
  1. assets/css/styles.css +327 -0
  2. assets/js/app.js +44 -0
  3. index.html +95 -19
assets/css/styles.css ADDED
@@ -0,0 +1,327 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Reset & Base Styles */
2
+ * {
3
+ margin: 0;
4
+ padding: 0;
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ :root {
9
+ --primary: #4361ee;
10
+ --primary-dark: #3a56d4;
11
+ --secondary: #7209b7;
12
+ --success: #4cc9f0;
13
+ --warning: #f72585;
14
+ --danger: #e63946;
15
+ --light: #f8f9fa;
16
+ --dark: #212529;
17
+ --gray: #6c757d;
18
+ --light-gray: #e9ecef;
19
+ --border-radius: 12px;
20
+ --shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
21
+ --transition: all 0.3s ease;
22
+ }
23
+
24
+ body {
25
+ font-family: 'Inter', sans-serif;
26
+ background-color: #fafbff;
27
+ color: var(--dark);
28
+ line-height: 1.6;
29
+ }
30
+
31
+ .container {
32
+ width: 100%;
33
+ max-width: 800px;
34
+ margin: 0 auto;
35
+ padding: 0 20px;
36
+ }
37
+
38
+ /* Header */
39
+ .app-header {
40
+ background: white;
41
+ box-shadow: var(--shadow);
42
+ position: sticky;
43
+ top: 0;
44
+ z-index: 100;
45
+ }
46
+
47
+ .app-title {
48
+ font-size: 1.8rem;
49
+ font-weight: 700;
50
+ color: var(--primary);
51
+ padding: 16px 0;
52
+ }
53
+
54
+ .built-by {
55
+ position: absolute;
56
+ right: 20px;
57
+ top: 50%;
58
+ transform: translateY(-50%);
59
+ font-size: 0.85rem;
60
+ color: var(--gray);
61
+ text-decoration: none;
62
+ }
63
+
64
+ .built-by:hover {
65
+ text-decoration: underline;
66
+ }
67
+
68
+ /* Main Layout */
69
+ .app-main {
70
+ padding: 24px 0;
71
+ }
72
+
73
+ .section-title {
74
+ font-size: 1.4rem;
75
+ font-weight: 600;
76
+ margin: 28px 0 16px;
77
+ color: var(--dark);
78
+ }
79
+
80
+ /* Scanner Section */
81
+ .scanner-section {
82
+ text-align: center;
83
+ margin-bottom: 32px;
84
+ }
85
+
86
+ .scanner-placeholder {
87
+ background: white;
88
+ border-radius: var(--border-radius);
89
+ padding: 32px 24px;
90
+ box-shadow: var(--shadow);
91
+ position: relative;
92
+ }
93
+
94
+ .scanner-frame {
95
+ width: 240px;
96
+ height: 240px;
97
+ margin: 0 auto 20px;
98
+ border: 3px dashed var(--primary);
99
+ border-radius: 16px;
100
+ position: relative;
101
+ overflow: hidden;
102
+ }
103
+
104
+ .scanner-frame::before {
105
+ content: "";
106
+ position: absolute;
107
+ top: 0;
108
+ left: 0;
109
+ right: 0;
110
+ height: 40px;
111
+ background: linear-gradient(to bottom, rgba(67, 97, 238, 0.15), transparent);
112
+ animation: scanLine 2s infinite;
113
+ }
114
+
115
+ @keyframes scanLine {
116
+ 0% { top: 0; }
117
+ 100% { top: 200px; }
118
+ }
119
+
120
+ .scanner-instruction {
121
+ color: var(--gray);
122
+ margin-bottom: 20px;
123
+ font-size: 1.1rem;
124
+ }
125
+
126
+ /* Profile Section */
127
+ .profile-section {
128
+ background: white;
129
+ border-radius: var(--border-radius);
130
+ padding: 24px;
131
+ margin-bottom: 28px;
132
+ box-shadow: var(--shadow);
133
+ }
134
+
135
+ .profile-tags {
136
+ display: flex;
137
+ flex-wrap: wrap;
138
+ gap: 10px;
139
+ margin: 16px 0;
140
+ }
141
+
142
+ .tag {
143
+ padding: 6px 14px;
144
+ border-radius: 20px;
145
+ font-size: 0.85rem;
146
+ font-weight: 600;
147
+ }
148
+
149
+ .tag-allergy {
150
+ background-color: rgba(230, 57, 70, 0.15);
151
+ color: var(--danger);
152
+ }
153
+
154
+ .tag-diet {
155
+ background-color: rgba(67, 97, 238, 0.15);
156
+ color: var(--primary);
157
+ }
158
+
159
+ /* Recent Scans */
160
+ .scan-history {
161
+ display: flex;
162
+ flex-direction: column;
163
+ gap: 16px;
164
+ }
165
+
166
+ .scan-item {
167
+ display: flex;
168
+ align-items: flex-start;
169
+ gap: 16px;
170
+ padding: 16px;
171
+ background: white;
172
+ border-radius: var(--border-radius);
173
+ box-shadow: var(--shadow);
174
+ }
175
+
176
+ .scan-icon {
177
+ width: 40px;
178
+ height: 40px;
179
+ border-radius: 50%;
180
+ display: flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ flex-shrink: 0;
184
+ }
185
+
186
+ .scan-icon.safe {
187
+ background-color: rgba(76, 201, 240, 0.15);
188
+ color: var(--success);
189
+ }
190
+
191
+ .scan-icon.warning {
192
+ background-color: rgba(247, 37, 133, 0.15);
193
+ color: var(--warning);
194
+ }
195
+
196
+ .scan-icon.unsafe {
197
+ background-color: rgba(230, 57, 70, 0.15);
198
+ color: var(--danger);
199
+ }
200
+
201
+ .scan-icon::before {
202
+ font-size: 1.2rem;
203
+ font-weight: bold;
204
+ }
205
+
206
+ .scan-info h3 {
207
+ font-size: 1.1rem;
208
+ margin-bottom: 4px;
209
+ }
210
+
211
+ .scan-status {
212
+ font-size: 0.9rem;
213
+ }
214
+
215
+ /* Quick Actions */
216
+ .quick-actions {
217
+ margin-top: 20px;
218
+ }
219
+
220
+ .action-buttons {
221
+ display: grid;
222
+ grid-template-columns: repeat(3, 1fr);
223
+ gap: 12px;
224
+ }
225
+
226
+ /* Buttons */
227
+ .btn {
228
+ font-family: 'Inter', sans-serif;
229
+ font-weight: 600;
230
+ border: none;
231
+ border-radius: var(--border-radius);
232
+ padding: 14px 20px;
233
+ cursor: pointer;
234
+ transition: var(--transition);
235
+ display: inline-flex;
236
+ align-items: center;
237
+ justify-content: center;
238
+ text-decoration: none;
239
+ width: 100%;
240
+ }
241
+
242
+ .btn-primary {
243
+ background-color: var(--primary);
244
+ color: white;
245
+ }
246
+
247
+ .btn-primary:hover {
248
+ background-color: var(--primary-dark);
249
+ transform: translateY(-2px);
250
+ }
251
+
252
+ .btn-secondary {
253
+ background-color: var(--light-gray);
254
+ color: var(--dark);
255
+ }
256
+
257
+ .btn-secondary:hover {
258
+ background-color: #dfe3e6;
259
+ }
260
+
261
+ .btn-outline {
262
+ background-color: transparent;
263
+ border: 2px solid var(--primary);
264
+ color: var(--primary);
265
+ }
266
+
267
+ .btn-outline:hover {
268
+ background-color: rgba(67, 97, 238, 0.08);
269
+ }
270
+
271
+ /* Footer */
272
+ .app-footer {
273
+ background: white;
274
+ padding: 20px 0;
275
+ border-top: 1px solid var(--light-gray);
276
+ margin-top: 40px;
277
+ }
278
+
279
+ .app-footer p {
280
+ text-align: center;
281
+ color: var(--gray);
282
+ font-size: 0.9rem;
283
+ }
284
+
285
+ /* Responsive Design */
286
+ @media (max-width: 600px) {
287
+ .container {
288
+ padding: 0 16px;
289
+ }
290
+
291
+ .app-title {
292
+ font-size: 1.5rem;
293
+ }
294
+
295
+ .built-by {
296
+ position: static;
297
+ transform: none;
298
+ display: block;
299
+ margin-top: 8px;
300
+ text-align: center;
301
+ }
302
+
303
+ .scanner-frame {
304
+ width: 200px;
305
+ height: 200px;
306
+ }
307
+
308
+ .action-buttons {
309
+ grid-template-columns: 1fr;
310
+ }
311
+ }
312
+
313
+ /* Accessibility */
314
+ @media (prefers-reduced-motion: reduce) {
315
+ * {
316
+ animation-duration: 0.01ms !important;
317
+ animation-iteration-count: 1 !important;
318
+ transition-duration: 0.01ms !important;
319
+ }
320
+ }
321
+
322
+ /* Focus states for accessibility */
323
+ .btn:focus,
324
+ .btn:active {
325
+ outline: 2px solid var(--primary);
326
+ outline-offset: 2px;
327
+ }
assets/js/app.js ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Food Scanner App UI - Vanilla JavaScript for interactivity
2
+ document.addEventListener('DOMContentLoaded', function() {
3
+ // Button interactions (visual feedback only - no API)
4
+ const scanButton = document.querySelector('.btn-scan');
5
+ const editProfileButton = document.querySelector('.btn-edit-profile');
6
+
7
+ if (scanButton) {
8
+ scanButton.addEventListener('click', function() {
9
+ // Visual feedback: button press effect
10
+ this.classList.add('active');
11
+ setTimeout(() => this.classList.remove('active'), 300);
12
+
13
+ // In a real app, this would open camera
14
+ console.log('Camera would open here');
15
+ });
16
+ }
17
+
18
+ if (editProfileButton) {
19
+ editProfileButton.addEventListener('click', function() {
20
+ this.classList.add('active');
21
+ setTimeout(() => this.classList.remove('active'), 300);
22
+ console.log('Edit profile would open here');
23
+ });
24
+ }
25
+
26
+ // Quick action buttons
27
+ const actionButtons = document.querySelectorAll('.btn-outline');
28
+ actionButtons.forEach(button => {
29
+ button.addEventListener('click', function() {
30
+ this.classList.add('active');
31
+ setTimeout(() => this.classList.remove('active'), 300);
32
+ console.log(`${this.textContent} action triggered`);
33
+ });
34
+ });
35
+
36
+ // Simulate scan history interaction
37
+ const scanItems = document.querySelectorAll('.scan-item');
38
+ scanItems.forEach(item => {
39
+ item.addEventListener('click', function() {
40
+ this.classList.toggle('expanded');
41
+ console.log('Viewing scan details');
42
+ });
43
+ });
44
+ });
index.html CHANGED
@@ -1,19 +1,95 @@
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
+ <meta name="description" content="Food Scanner App for Allergy & Diet Management - Scan food labels to check for allergens and dietary compliance." />
7
+ <title>AllerScan - Food Allergy & Diet Scanner</title>
8
+ <link rel="stylesheet" href="assets/css/styles.css" />
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
12
+ </head>
13
+ <body>
14
+ <!-- Header with branding and navigation -->
15
+ <header class="app-header">
16
+ <div class="container">
17
+ <h1 class="app-title">AllerScan</h1>
18
+ <a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="built-by">Built with anycoder</a>
19
+ </div>
20
+ </header>
21
+
22
+ <!-- Main App Content -->
23
+ <main class="app-main">
24
+ <div class="container">
25
+ <!-- Scanner Placeholder -->
26
+ <section class="scanner-section">
27
+ <div class="scanner-placeholder">
28
+ <div class="scanner-frame"></div>
29
+ <p class="scanner-instruction">Point your camera at a food label</p>
30
+ <button class="btn btn-primary btn-scan">Use Camera</button>
31
+ </div>
32
+ </section>
33
+
34
+ <!-- Allergy & Diet Profile -->
35
+ <section class="profile-section">
36
+ <h2 class="section-title">Your Safety Profile</h2>
37
+ <div class="profile-tags">
38
+ <span class="tag tag-allergy">Peanuts</span>
39
+ <span class="tag tag-allergy">Shellfish</span>
40
+ <span class="tag tag-diet">Vegan</span>
41
+ <span class="tag tag-diet">Gluten-Free</span>
42
+ </div>
43
+ <button class="btn btn-secondary btn-edit-profile">Edit Profile</button>
44
+ </section>
45
+
46
+ <!-- Recent Scans -->
47
+ <section class="recent-scans">
48
+ <h2 class="section-title">Recent Scans</h2>
49
+ <div class="scan-history">
50
+ <div class="scan-item safe">
51
+ <div class="scan-icon safe"></div>
52
+ <div class="scan-info">
53
+ <h3>Organic Almond Milk</h3>
54
+ <p class="scan-status">✅ Safe for your profile</p>
55
+ </div>
56
+ </div>
57
+ <div class="scan-item warning">
58
+ <div class="scan-icon warning"></div>
59
+ <div class="scan-info">
60
+ <h3>Chocolate Chip Cookies</h3>
61
+ <p class="scan-status">⚠️ Contains: Peanuts</p>
62
+ </div>
63
+ </div>
64
+ <div class="scan-item unsafe">
65
+ <div class="scan-icon unsafe"></div>
66
+ <div class="scan-info">
67
+ <h3>Caesar Salad Dressing</h3>
68
+ <p class="scan-status">❌ Contains: Dairy, Egg</p>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </section>
73
+
74
+ <!-- Quick Actions -->
75
+ <section class="quick-actions">
76
+ <h2 class="section-title">Quick Actions</h2>
77
+ <div class="action-buttons">
78
+ <button class="btn btn-outline">Scan Barcode</button>
79
+ <button class="btn btn-outline">Manual Entry</button>
80
+ <button class="btn btn-outline">Emergency Info</button>
81
+ </div>
82
+ </section>
83
+ </div>
84
+ </main>
85
+
86
+ <!-- Footer -->
87
+ <footer class="app-footer">
88
+ <div class="container">
89
+ <p>&copy; 2023 AllerScan. For informational purposes only. Always verify with product labels.</p>
90
+ </div>
91
+ </footer>
92
+
93
+ <script src="assets/js/app.js"></script>
94
+ </body>
95
+ </html>