winebox 0.1.2__py3-none-any.whl → 0.1.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
winebox/static/index.html CHANGED
@@ -7,6 +7,7 @@
7
7
  <meta name="mobile-web-app-capable" content="yes">
8
8
  <meta name="theme-color" content="#722f37">
9
9
  <title>WineBox - Wine Cellar Management</title>
10
+ <link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
10
11
  <link rel="stylesheet" href="/static/css/style.css">
11
12
  </head>
12
13
  <body>
@@ -21,7 +22,7 @@
21
22
  <a href="#" data-page="search" class="nav-link">Search</a>
22
23
  </nav>
23
24
  <div id="user-info" class="user-info" style="display: none;">
24
- <span id="username-display"></span>
25
+ <a href="#" id="username-display" data-page="settings" class="username-link"></a>
25
26
  <button id="logout-btn" class="btn btn-small btn-secondary">Logout</button>
26
27
  </div>
27
28
  </div>
@@ -40,7 +41,19 @@
40
41
  </div>
41
42
  <div class="form-group">
42
43
  <label for="login-password">Password</label>
43
- <input type="password" id="login-password" name="password" required autocomplete="current-password">
44
+ <div class="password-input-wrapper">
45
+ <input type="password" id="login-password" name="password" required autocomplete="current-password">
46
+ <button type="button" class="password-toggle" aria-label="Show password">
47
+ <svg class="eye-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
48
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
49
+ <circle cx="12" cy="12" r="3"></circle>
50
+ </svg>
51
+ <svg class="eye-off-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="display: none;">
52
+ <path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path>
53
+ <line x1="1" y1="1" x2="23" y2="23"></line>
54
+ </svg>
55
+ </button>
56
+ </div>
44
57
  </div>
45
58
  <div id="login-error" class="login-error" style="display: none;"></div>
46
59
  <button type="submit" class="btn btn-primary btn-full">Sign In</button>
@@ -152,6 +165,25 @@
152
165
  </div>
153
166
  </div>
154
167
 
168
+ <div class="form-section collapsible" id="label-text-section" style="display: none;">
169
+ <div class="collapsible-header" id="label-text-toggle">
170
+ <h3>Raw Label Text</h3>
171
+ <span class="collapse-icon">+</span>
172
+ </div>
173
+ <div class="collapsible-content" id="label-text-content" style="display: none;">
174
+ <div class="ocr-raw-text">
175
+ <div class="ocr-raw-section">
176
+ <label>Front Label OCR:</label>
177
+ <pre id="raw-front-label-text"></pre>
178
+ </div>
179
+ <div class="ocr-raw-section" id="raw-back-label-section" style="display: none;">
180
+ <label>Back Label OCR:</label>
181
+ <pre id="raw-back-label-text"></pre>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ </div>
186
+
155
187
  <div class="form-actions">
156
188
  <button type="submit" class="btn btn-primary">Check In Wine</button>
157
189
  <button type="reset" class="btn btn-secondary">Clear Form</button>
@@ -237,6 +269,122 @@
237
269
  </form>
238
270
  <div id="search-results" class="wine-grid"></div>
239
271
  </section>
272
+
273
+ <!-- Settings Page -->
274
+ <section id="page-settings" class="page">
275
+ <h2>Settings</h2>
276
+
277
+ <!-- Profile Section -->
278
+ <div class="settings-section">
279
+ <h3>Profile</h3>
280
+ <form id="profile-form">
281
+ <div class="form-group">
282
+ <label for="settings-username">Username</label>
283
+ <input type="text" id="settings-username" disabled>
284
+ </div>
285
+ <div class="form-group">
286
+ <label for="settings-fullname">Full Name</label>
287
+ <input type="text" id="settings-fullname" name="full_name" placeholder="Enter your full name">
288
+ </div>
289
+ <div class="form-actions">
290
+ <button type="submit" class="btn btn-primary">Save Profile</button>
291
+ </div>
292
+ </form>
293
+ </div>
294
+
295
+ <!-- Password Section -->
296
+ <div class="settings-section">
297
+ <h3>Change Password</h3>
298
+ <form id="password-form">
299
+ <div class="form-group">
300
+ <label for="current-password">Current Password</label>
301
+ <div class="password-input-wrapper">
302
+ <input type="password" id="current-password" name="current_password" required autocomplete="current-password">
303
+ <button type="button" class="password-toggle" aria-label="Show password">
304
+ <svg class="eye-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
305
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
306
+ <circle cx="12" cy="12" r="3"></circle>
307
+ </svg>
308
+ <svg class="eye-off-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="display: none;">
309
+ <path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path>
310
+ <line x1="1" y1="1" x2="23" y2="23"></line>
311
+ </svg>
312
+ </button>
313
+ </div>
314
+ </div>
315
+ <div class="form-group">
316
+ <label for="new-password">New Password</label>
317
+ <div class="password-input-wrapper">
318
+ <input type="password" id="new-password" name="new_password" required autocomplete="new-password">
319
+ <button type="button" class="password-toggle" aria-label="Show password">
320
+ <svg class="eye-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
321
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
322
+ <circle cx="12" cy="12" r="3"></circle>
323
+ </svg>
324
+ <svg class="eye-off-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="display: none;">
325
+ <path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path>
326
+ <line x1="1" y1="1" x2="23" y2="23"></line>
327
+ </svg>
328
+ </button>
329
+ </div>
330
+ </div>
331
+ <div class="form-group">
332
+ <label for="confirm-password">Confirm New Password</label>
333
+ <div class="password-input-wrapper">
334
+ <input type="password" id="confirm-password" name="confirm_password" required autocomplete="new-password">
335
+ <button type="button" class="password-toggle" aria-label="Show password">
336
+ <svg class="eye-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
337
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
338
+ <circle cx="12" cy="12" r="3"></circle>
339
+ </svg>
340
+ <svg class="eye-off-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="display: none;">
341
+ <path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path>
342
+ <line x1="1" y1="1" x2="23" y2="23"></line>
343
+ </svg>
344
+ </button>
345
+ </div>
346
+ </div>
347
+ <div class="form-actions">
348
+ <button type="submit" class="btn btn-primary">Change Password</button>
349
+ </div>
350
+ </form>
351
+ </div>
352
+
353
+ <!-- API Key Section -->
354
+ <div class="settings-section">
355
+ <h3>Anthropic API Key</h3>
356
+ <p class="settings-description">
357
+ Add your Anthropic API key for Claude Vision wine label scanning.
358
+ Once saved, the key cannot be viewed again for security reasons.
359
+ </p>
360
+ <div id="api-key-status" class="api-key-status">
361
+ <span class="status-indicator"></span>
362
+ <span class="status-text">Loading...</span>
363
+ </div>
364
+ <form id="api-key-form">
365
+ <div class="form-group">
366
+ <label for="api-key">API Key</label>
367
+ <div class="password-input-wrapper">
368
+ <input type="password" id="api-key" name="api_key" placeholder="sk-ant-..." autocomplete="off">
369
+ <button type="button" class="password-toggle" aria-label="Show API key">
370
+ <svg class="eye-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
371
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path>
372
+ <circle cx="12" cy="12" r="3"></circle>
373
+ </svg>
374
+ <svg class="eye-off-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="display: none;">
375
+ <path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path>
376
+ <line x1="1" y1="1" x2="23" y2="23"></line>
377
+ </svg>
378
+ </button>
379
+ </div>
380
+ </div>
381
+ <div class="form-actions">
382
+ <button type="submit" class="btn btn-primary">Save API Key</button>
383
+ <button type="button" id="delete-api-key-btn" class="btn btn-danger" style="display: none;">Delete API Key</button>
384
+ </div>
385
+ </form>
386
+ </div>
387
+ </section>
240
388
  </main>
241
389
 
242
390
  <!-- Checkout Modal -->
@@ -263,6 +411,89 @@
263
411
  </div>
264
412
  </div>
265
413
 
414
+ <!-- Checkin Confirmation Modal -->
415
+ <div id="checkin-confirm-modal" class="modal">
416
+ <div class="modal-content modal-large">
417
+ <span class="modal-close">&times;</span>
418
+ <div class="checkin-confirm">
419
+ <div class="checkin-confirm-header">
420
+ <h3>Confirm Wine Details</h3>
421
+ <p class="checkin-confirm-subtitle">Review and edit the details before saving</p>
422
+ </div>
423
+ <div class="checkin-confirm-content">
424
+ <div class="checkin-confirm-image" id="checkin-confirm-image"></div>
425
+ <div class="checkin-confirm-form">
426
+ <div class="form-grid">
427
+ <div class="form-group">
428
+ <label for="confirm-wine-name">Wine Name</label>
429
+ <input type="text" id="confirm-wine-name" required>
430
+ </div>
431
+ <div class="form-group">
432
+ <label for="confirm-winery">Winery</label>
433
+ <input type="text" id="confirm-winery">
434
+ </div>
435
+ <div class="form-group">
436
+ <label for="confirm-vintage">Vintage</label>
437
+ <input type="number" id="confirm-vintage" min="1900" max="2100">
438
+ </div>
439
+ <div class="form-group">
440
+ <label for="confirm-grape-variety">Grape Variety</label>
441
+ <input type="text" id="confirm-grape-variety">
442
+ </div>
443
+ <div class="form-group">
444
+ <label for="confirm-region">Region</label>
445
+ <input type="text" id="confirm-region">
446
+ </div>
447
+ <div class="form-group">
448
+ <label for="confirm-country">Country</label>
449
+ <input type="text" id="confirm-country">
450
+ </div>
451
+ <div class="form-group">
452
+ <label for="confirm-alcohol">Alcohol %</label>
453
+ <input type="number" id="confirm-alcohol" min="0" max="100" step="0.1">
454
+ </div>
455
+ <div class="form-group">
456
+ <label for="confirm-quantity">Quantity</label>
457
+ <input type="number" id="confirm-quantity" min="1" value="1" required>
458
+ </div>
459
+ </div>
460
+ <div class="form-group full-width">
461
+ <label for="confirm-notes">Notes</label>
462
+ <textarea id="confirm-notes" rows="2"></textarea>
463
+ </div>
464
+ </div>
465
+ </div>
466
+ <div class="checkin-confirm-ocr collapsible" id="confirm-ocr-section" style="display: none;">
467
+ <div class="collapsible-header" id="confirm-ocr-toggle">
468
+ <span class="label">Show Raw Label Text</span>
469
+ <span class="collapse-icon">+</span>
470
+ </div>
471
+ <div class="collapsible-content" id="confirm-ocr-content" style="display: none;">
472
+ <div class="ocr-text-container">
473
+ <div class="ocr-section">
474
+ <strong>Front Label:</strong>
475
+ <pre id="checkin-confirm-front-ocr"></pre>
476
+ </div>
477
+ <div class="ocr-section" id="checkin-confirm-back-ocr-section" style="display: none;">
478
+ <strong>Back Label:</strong>
479
+ <pre id="checkin-confirm-back-ocr"></pre>
480
+ </div>
481
+ </div>
482
+ </div>
483
+ </div>
484
+ <div class="form-actions">
485
+ <button type="button" class="btn btn-primary" id="checkin-confirm-btn">Confirm</button>
486
+ <button type="button" class="btn btn-secondary" id="checkin-cancel-btn">Cancel</button>
487
+ </div>
488
+ </div>
489
+ </div>
490
+ </div>
491
+
492
+ <!-- Footer -->
493
+ <footer id="app-footer">
494
+ <span id="app-info">WineBox</span>
495
+ </footer>
496
+
266
497
  <!-- Toast Notifications -->
267
498
  <div id="toast-container"></div>
268
499