Commit Graph

78 Commits

Author SHA1 Message Date
ba581744ec refactor: improve checkbox styling and remove popup
- Update photo save checkbox to match app design (border-slate-600, htmlFor label)
- Remove success popup overlay - modal closes immediately after save
- Simplify confirmSingleItem to remove setTimeout logic
- Toast notification used for user feedback instead
2026-04-22 09:17:56 +03:00
99a4cae572 fix: show item save confirmation with image before closing
- Add savingIndex state to track saving operation
- Display success overlay with saved image for 1.5 seconds
- Show item name in confirmation message
- Prevents modal from closing immediately after save

Fixes user complaint about image disappearing too quickly without confirmation
2026-04-22 09:07:44 +03:00
64d177e791 fix: complete image pipeline - rotation, URL, preview
- Add rotation_degrees parameter to ImageProcessor.process_photo()
- Pass rotation through _auto_save_photo_from_extraction() to processor
- Allow no-crop fallback when crop_bounds is None
- Add buildPhotoUrl() helper to resolve backend URLs correctly
- Update frontend components to use backend URL for image sources
- Replace Use/Skip Photo buttons with checkbox in AI extraction UI
- Add images/ to .gitignore to prevent accidental commits

Addresses: rotation never applied, image 404s (relative to Next.js not backend), preview blank in edit form
2026-04-22 08:50:25 +03:00
c3f63ade6a feat: add image confirmation step to AI extraction flow
Users now see the extracted photo during item editing and can choose to:
- 'Use Photo': Auto-save the image with the item
- 'Skip Photo': Create item without saving the photo

Changes:
1. frontend/components/AIOnboarding.tsx: Added image preview panel in edit form
   - Shows extracted image to user
   - Buttons to accept/reject photo
   - Visual feedback when photo is skipped

2. frontend/hooks/useAIExtraction.ts: Updated confirmSingleItem and confirmAllItems
   - Respect user's photo decision (_skipPhoto flag)
   - Only pass extractedImageBlob if user approved it
   - Prevents unwanted auto-photo-save

This gives users full control over which extracted photos are auto-saved.
2026-04-21 20:00:55 +03:00
b5fb2a8cdb fix: add photo_path fields to frontend Item interface to display saved photos
The backend returns photo_path, photo_thumbnail_path, and photo_upload_date
from the AI auto-save feature, but the frontend Item interface was missing
these fields, causing images not to display in ItemDetailModal and InventoryTable.

Updated:
- frontend/lib/db.ts: Added missing photo fields to Item interface
- frontend/components/ItemDetailModal.tsx: Use photo_path first, fallback to image_url
- frontend/components/InventoryTable.tsx: Use photo_path first, fallback to image_url

This ensures the UI can now display photos saved by the auto-photo-save feature.
2026-04-21 19:45:19 +03:00
3df15cf68f feat(phase2): add photo display to inventory card with modal viewer
- Create PhotoModal component for full-res photo viewing
- Add photo thumbnail (200px square) to inventory item card
- Implement photo modal trigger on thumbnail click
- Add fallback text when no photo available
- Modal closeable via X button, click outside, or Escape key
- Image scales responsively without stretching
- Add comprehensive test coverage (30+ tests)
- All 427 tests passing, build successful
- TypeScript strict mode compliant
2026-04-21 14:53:27 +03:00
5b4bf81444 fix(phase2): remove uppercase text from ItemDetailModal labels (AI_RULES compliance) 2026-04-21 13:47:40 +03:00
a8d7e5ac09 feat(phase2): add admin photo replacement button with ItemDetailModal
- Add ItemDetailModal component for viewing item details and replacing photos
- Add photo replacement/deletion endpoints to API layer (PUT/DELETE /items/{id}/photo)
- Update InventoryTable to open detail modal on item click
- Show current photo thumbnail with Replace/Delete buttons
- Support uploading new photo with ItemPhotoUpload component
- Delete old photo on backend when replacing (no orphaned files)
- Full test coverage: 18 tests for ItemDetailModal component
- All 393 tests passing, zero TypeScript errors
- Build verified successfully
2026-04-21 13:30:38 +03:00
b2e2daf40d feat(phase2): implement ManualCropUI with drag handles
- useCropHandles.ts: Hook managing crop bounds state, drag operations, and constraints
  - 8 draggable handles (4 corners + 4 edges)
  - Real-time crop bounds calculation during drag
  - Constrained within image bounds (no dragging outside)
  - Minimum crop size enforcement (100x100px)
  - Support for mobile (touch) and desktop (mouse) events
  - Bounds validation on initialization

- ManualCropUI.tsx: Interactive crop preview component
  - Responsive image display with calculated scaling
  - Semi-transparent overlay outside crop box with visible bounding box
  - 8 draggable handles with visual feedback (highlight/scale on hover)
  - 'Use Full Photo' button to clear crop and show full image
  - Real-time onCropChange callbacks to parent
  - Error handling for failed image loads
  - Touch and mouse event support (desktop + mobile)
  - TypeScript strict mode compliant

- Tests: 26 comprehensive test cases
  - Hook tests (26 passing): initialization, setCrop, resetCrop, drag operations (corners, edges), constraints, endDrag, edge cases
  - Component tests (26 passing): rendering, handles, overlay, callbacks, button, error handling, dimensions, touch/mouse support, responsive behavior, size enforcement, bounds display

All 364 tests passing (13 test files, zero regressions)
Minimum crop size: 100x100px
Handle visual feedback on hover/drag
TypeScript strict mode: ✓
2026-04-21 13:05:37 +03:00
5a64dadc1e fix(phase2): resolve code quality issues in ItemPhotoUpload (act warnings, toast cleanup, dual error handling)
Fixed 3 critical code quality issues:

1. Act() warnings in tests (9 tests):
   - Wrapped all async state updates in act() blocks in usePhotoUpload.test.ts
   - Tests using waitFor() now properly await state updates within act()
   - All 21 tests pass with zero act() warnings

2. Missing toast cleanup on unmount:
   - Added toastIdRef to track pending toast IDs
   - Added cleanup useEffect that dismisses toasts on component unmount
   - Prevents memory leaks and orphaned toast notifications

3. Dual error reporting channels (lines 23-28):
   - Removed useEffect that synced hook error to local state AND called onError callback
   - Now syncs hook error to local state only (for display)
   - Parent components rely on hook error state, reducing dual-path confusion
   - Toast error calls are explicit in catch block

Test Results:
- Frontend: 312/312 tests passing (includes 21 photo upload tests)
- Act() warnings: Eliminated
- No regressions introduced
2026-04-21 12:50:44 +03:00
db9aafd47f feat(phase2): implement ItemPhotoUpload component and hook 2026-04-21 12:31:23 +03:00
5664a904a2 refactor: compact component spacing throughout app
PHASE 3 - COMPONENT SPACING OPTIMIZATION:

components/IdentityCheckOverlay.tsx:
- Modal padding: p-8 sm:p-10 → p-4 md:p-6
- Spacing: space-y-8 → space-y-3 md:space-y-4

components/CameraView.tsx:
- Container gaps: gap-6 → gap-3 md:gap-4

components/AIOnboarding.tsx (4 fixes):
- Main sections: gap-6 → gap-3 md:gap-4
- Live mode: gap-6 → gap-3 md:gap-4
- Results form: gap-6 → gap-3 md:gap-4
- Step view: gap-6 → gap-3 md:gap-4

components/ScannerSection.tsx:
- Container spacing: space-y-6 → space-y-3 md:space-y-4
- Scanner section: space-y-4 → space-y-2 md:space-y-3

components/LogsTable.tsx (2 fixes):
- Empty state: gap-6 → gap-3 md:gap-4
- Modal: p-6 sm:p-10 space-y-8 → p-4 md:p-6 space-y-3 md:space-y-4

Results:
- All 291 tests passing
- Zero TypeScript errors
- Mobile-first spacing applied throughout
- Consistent responsive pattern across all components
2026-04-19 19:06:19 +03:00
ceaae5bb8f refactor: optimize spacing on main pages (inventory, admin, logs, scanner)
PHASE 2 - HIGH PRIORITY PAGE OPTIMIZATIONS:

app/inventory/page.tsx (11 fixes):
- Main container: space-y-6 → space-y-3 md:space-y-4
- Header spacing: mb-6 md:mb-10 → mb-4 md:mb-6
- Modal padding: p-8 → p-4 md:p-6
- Category editor: space-y-6 → space-y-3 md:space-y-4
- Box manager: p-8 gaps 6 → p-4 md:p-6 gaps 3 md:gap-4
- Grid gaps: gap-6 → gap-3 md:gap-4 throughout

app/admin/page.tsx (4 fixes):
- Main container: space-y-6 md:space-y-10 → space-y-3 md:space-y-6
- Section spacing: space-y-6 md:space-y-8 → space-y-3 md:space-y-4
- Grid gaps: gap-6 md:gap-8 → gap-3 md:gap-4

app/logs/page.tsx (3 fixes):
- Main container: space-y-6 md:space-y-10 → space-y-3 md:space-y-6
- Header gap: gap-6 → gap-3 md:gap-4
- Filter section: space-y-6 → space-y-3 md:space-y-4

app/page.tsx (Scanner):
- Header gap: gap-4 mb-6 → gap-3 md:gap-4 mb-3 md:mb-4
- Controls padding: px-4 py-2 → px-3 py-2
- Footer: mt-20 mb-8 → mt-12 md:mt-20 mb-4 md:mb-8
- Box modal: p-6 → p-4 md:p-6, gaps optimized

components/AdminOverlay.tsx (4 fixes):
- Header padding: p-6 → p-3 md:p-6
- Content spacing: space-y-8 → space-y-3 md:space-y-4
- Section spacing: space-y-4 → space-y-2 md:space-y-3
- User/category grids: gap-2, p-4 → p-3 md:p-4

Tests: 291/291 passing - No regressions
2026-04-19 19:05:25 +03:00
2cbc036eb2 fix: critical mobile viewport fixes - login, modals, page constraints
- Remove min-h-screen or make responsive (md:min-h-screen for desktop only)
- Login modal: p-8 → p-4 md:p-6, space-y-8 → space-y-3 md:space-y-4
- NewItemDialog: responsive spacing p-4 md:p-6, gaps 3 md:gap-4
- StockAdjustmentPanel: p-6 → p-4 md:p-6, gaps/spacing reduced for mobile
- All container padding and gaps now follow mobile-first pattern
- Fixes viewport overflow on 375px portrait mode
- Tests: 291/291 passing
2026-04-19 19:04:17 +03:00
f05fe4b1b6 refactor: extend admin spacing optimization to all components
Phase 3: Complete admin dashboard spacing standardization

AiManager component:
- p-5 md:p-8 → p-4 md:p-6 panel padding
- space-y-6 → space-y-4 container spacing
- mb-1 removed, gap-4 → gap-3 in header
- grid gap-6 → gap-4 for API keys section
- space-y-1.5 → space-y-1 for form fields
- py-2 → py-1.5 inputs, py-2.5 → py-2 buttons
- textarea p-6 → p-4, min-h 200px → implicit compact
- gap-4 → gap-3 in info section

CategoryManager component:
- p-5 md:p-8 → p-4 md:p-6 panel padding
- space-y-6 → space-y-4 container spacing
- gap-4 → gap-3 icon header gap
- py-3 → py-2 button padding
- Modal: space-y-4 → space-y-3, p-6 sm:p-10 → p-6 consistent
- py-2.5 → py-1.5 inputs
- h-32 textarea → h-24 compact

Tests: 291/291 passing, Build: success
Total admin dashboard savings: ~150px vertical (all 4 components)
2026-04-19 18:59:36 +03:00
1f45e4981b refactor: optimize admin spacing - phase 2 refinements
Medium-impact spacing reductions:

- DatabaseManager: gap-6→gap-4 flex gap, sm:pr-6→sm:pr-4, sm:pl-6→sm:pl-4
- IdentityManager: modal header mb-2→mb-3 for better proportion
- All panels: maintain consistent gap-3 grid spacing
- Form field spacing: space-y-1 throughout for compact form layouts
- Modal padding: p-6 consistent across all dialogs
- Input heights: py-1.5 for compact density

Tests: 291/291 passing, Build: success
Estimated additional ~20-30px vertical savings vs Phase 1
2026-04-19 18:57:16 +03:00
c4c36dc6b6 fix: admin UI spacing - reduce container/padding, increase typography
Phase 1: High-impact spacing reductions

- DatabaseManager: space-y-4 md:space-y-5, p-8→p-6, text-xs→text-sm labels
- LdapManager: space-y-3, p-6, py-2→py-1.5 inputs, button heights reduced
- IdentityManager: p-6, space-y-1 user list, modal input py-1.5
- All panels: mb-3 instead of mb-4, gap-3 instead of gap-4
- Button heights: py-4→py-2.5 (Export), py-3→py-2 (LDAP buttons)
- Input padding: py-2→py-1.5, py-3→py-1.5 for better density

Tests: 291/291 passing, Build: success, zero TypeScript errors
Estimated ~80-100px vertical savings across admin dashboard
2026-04-19 18:55:20 +03:00
7eafd45ab1 refactor: polish spacing details (Phase 3 - Low-Impact) 2026-04-19 18:45:14 +03:00
12b2ef26cf fix: implement Phase 2 medium-impact spacing reductions
Applied systematic spacing optimizations across admin manager components (40px savings):

DatabaseManager.tsx:
- Input field padding: py-3 → py-2 (3 inputs: retention_count, schedule_hour, schedule_freq_days)
- Form field spacing: space-y-2 → space-y-1.5 (Max Backups field group)
- Grid gaps: gap-4 → gap-3 (storage policy fields)
- Item list spacing: space-y-2 → space-y-1.5 (backup list)
- Modal form spacing: space-y-4 → space-y-3 (recovery points section)
- Backup metadata text: text-[11px] → text-xs (created_at + filesize display)

LdapManager.tsx:
- Input field padding: py-2.5 → py-2 (4 inputs: server_uri, base_dn, user_template, groups_dn)
- Form field spacing: space-y-1.5 → space-y-1 (all label+input groups)
- Button padding: py-2.5 → py-2 (test connection), py-3 → py-2.5 (save policy)

IdentityManager.tsx:
- Input field padding: py-3 → py-2 (username, password, role in edit modal)
- Form field spacing: space-y-4 → space-y-3 (edit modal form)
- Form field labels: space-y-1.5 → space-y-1 (all 3 fields)
- User list spacing: space-y-2 → space-y-1.5 (user items)

AiManager.tsx:
- Grid gaps: gap-4 → gap-3 (provider options grid)
- Input field padding: py-3 → py-2 (Gemini/Claude API key inputs)
- Form field spacing: space-y-2 → space-y-1.5 (API key field groups)
- Modal spacing: space-y-6 → space-y-3 (provider access keys section)
- Prompt section spacing: space-y-4 → space-y-3 (system prompt area)

CategoryManager.tsx:
- Grid gaps: gap-3 → gap-2.5 (category items grid)
- Input field padding: py-3.5 → py-2.5, py-4 → py-2.5 (name + description inputs)
- Form field spacing: space-y-6 → space-y-3, space-y-1.5 → space-y-1 (edit modal)

Test Results:
- Frontend (Vitest): 291/291 tests passing ✓
- Backend (Pytest): 41/41 tests passing ✓
- Total: 332 tests validated, zero regressions

All changes maintain visual hierarchy and premium density standards without sacrificing usability.
2026-04-19 18:36:44 +03:00
08c1eb5074 refactor: optimize spacing and typography (Phase 1 - High-Impact)
DatabaseManager:
- Reduce container spacing: space-y-6 md:space-y-8 → space-y-4 md:space-y-5
- Reduce panel padding: p-5 md:p-8 → p-4 md:p-6
- Reduce inner section spacing: space-y-6 → space-y-4, space-y-8 → space-y-5
- Reduce grid gap: gap-6 → gap-4
- Reduce button heights: Export/Import py-4 → py-3, Force Backup py-3 → py-2.5

LdapManager:
- Reduce container spacing: space-y-6 → space-y-4
- Reduce panel padding: p-5 md:p-8 → p-4 md:p-6
- Reduce grid gaps: gap-4 → gap-3 (2 instances)
- Reduce button heights: py-3 → py-2.5 (Test Connection, Save LDAP Policy)

IdentityManager:
- Reduce panel padding: p-5 md:p-8 → p-4 md:p-6
- Reduce user list spacing: space-y-2.5 → space-y-2
- Reduce modal padding: p-8 → p-6
- Reduce modal header gap: mb-6 → mb-4

Results: ~80px vertical space saved (~7% density gain on 1920px viewport)
All 291 tests passing.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-19 18:34:11 +03:00
c0232bb2f1 refactor: remove all bold font weights from UI/UX (291 replacements)
Replace font-bold, font-black, and font-semibold with font-normal throughout:
- 26 component files
- 1 CSS utility file (globals.css)
- 291 total occurrences

Text hierarchy now maintained through font-size differences only.
All tests passing (291/291).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-19 18:28:23 +03:00
b0a1582aa0 fix: increase subtitle font sizes for better readability on desktop
- DatabaseManager: 'Retention & Maintenance' text-xs (12px) → text-sm (14px)
- globals.css: .card-subtitle text-[10px] → text-xs (12px)

Improves readability of secondary headings across admin panels.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-04-19 18:26:25 +03:00
2c7115518d debug: add zoom capability detection logging to Scanner.tsx 2026-04-19 17:39:06 +03:00
bec4b714e3 refactor: extract LogsTable component from logs/page.tsx 2026-04-19 14:58:33 +03:00
47528ea4a2 refactor: extract FilterBar component 2026-04-19 14:57:00 +03:00
1797a617ab refactor: extract InventoryTable component 2026-04-19 14:55:53 +03:00
cf0a886b78 refactor: extract CameraView component from Scanner.tsx 2026-04-19 14:54:07 +03:00
ed5bbbfca0 refactor: extract ScannerSection component
- Created frontend/components/ScannerSection.tsx (76 lines)
- Moved mode switcher and scanner UI from page.tsx
- Props: mode, onModeChange, showScanner, onShowScanner, onScanSuccess, onOCRMatch, onAddItemClick
- Removed unused ArrowDownCircle, ArrowUpCircle imports from page.tsx
- All 291 tests passing, build successful
2026-04-19 14:47:15 +03:00
6eeaa89d9b refactor: extract NewItemDialog component
- Created frontend/components/NewItemDialog.tsx (37 lines)
- Moved scanner prompt and add item UI from page.tsx
- Props: onScannerClick, onAddItemClick callbacks
- Removed unused Smartphone and Sparkles imports from page.tsx
- All 291 tests passing, build successful
2026-04-19 14:47:12 +03:00
3302bae766 refactor: extract StockAdjustmentPanel component
- Extracted from page.tsx (lines 450-710)
- Pure presentational component with all state passed as props
- Props: selectedItem, isEditing, editedItem, adjustQty, adjustType, trashReason, categories, fieldScanning
- Callbacks: onCancel, onEdit, onEditChange, onQuantityChange, onTypeChange, onReasonChange, onShowScanner, onAdjustStock, onUpdateItem, onDeleteItem
- Includes edit mode and adjustment mode with quantity controls
- 291 tests passing, build successful
2026-04-19 14:47:08 +03:00
a520b1ba2b refactor: extract useAIExtraction hook from AIOnboarding.tsx 2026-04-19 12:31:21 +03:00
d7fa470bcb style: step 11 - uniform text tokens in remaining components 2026-04-19 12:09:22 +03:00
1850fea170 style: step 10 - uniform text tokens in modals 2026-04-19 12:07:15 +03:00
922d9e431e style: step 9 - uniform text tokens in admin sub-components 2026-04-19 12:04:41 +03:00
acf9155ce2 style: step 8 - uniform text tokens in Scanner and AIOnboarding 2026-04-19 12:02:35 +03:00
7d4e60699d style: step 7 - uniform text tokens in IdentityCheckOverlay 2026-04-19 12:00:11 +03:00
6b5e7adde2 test: add data-testid to mode buttons, admin button, and quantity controls 2026-04-19 09:37:29 +03:00
802b97f36d test: add data-testid attributes to AIOnboarding component 2026-04-19 09:28:40 +03:00
1846bb3cb3 test: add data-testid attributes to admin sub-components and modals 2026-04-19 09:28:27 +03:00
cbfe6a22be test: add data-testid attributes to Scanner component 2026-04-19 09:26:51 +03:00
c2edc4a704 test: add data-testid attributes to IdentityCheckOverlay and AdminOverlay 2026-04-19 09:26:05 +03:00
96ffc71ca1 refactor: make scanner viewport responsive with fluid sizing
- Replace fixed w-[85%] h-[85%] with responsive padding (p-4 sm:p-6)
- Use absolute inset (inset-4 sm:inset-6) for adaptive spacing
- Inner scanning frame now w-full h-full to adapt to viewport
- Works seamlessly across 320px mobile to 1024px+ desktop
2026-04-18 14:13:49 +00:00
61fd5313a2 refactor: remove decorative gradients per distill principles
- Scanner: Replace gradient scan line with solid primary color (keeps animation, removes glow)
- AIOnboarding: Replace gradient overlay with solid semi-transparent black
- IdentityCheckOverlay: Remove purely decorative 'accent light' gradient

Aligns with design principle: no decoration without function. Industrial aesthetic demands honest materials and intentional visual treatments.
2026-04-18 14:11:56 +00:00
9611b991b6 refactor(design): implement improved OLED dark palette and typography system
- Upgraded color palette with enhanced contrast (5.2:1 to 15:1 ratios)
- Replaced all text-slate-* utilities with semantic color tokens
- Added Fira Code + Fira Sans typography stack
- Converted CSS variables from SCSS to direct hex values
- Updated 26 components with improved color semantics
- Added cursor-pointer and focus states (accessibility phase 1)
- Added aria-labels to 35+ icon-only buttons
- Added prefers-reduced-motion support in globals.css

WCAG AA compliance verified across all text color combinations.
Fixes invisible text issues (slate-500 4.2:1 → muted 5.2:1).
2026-04-17 13:14:09 +03:00
efd8efb6ec docs(design): add design system documentation and missing alt text - Phase 2
Add comprehensive design system documentation:
- Z-index scale (z-10 through z-[100])
- Spacing scale based on 4pt baseline
- Opacity guidelines for glass/translucent effects
- Transition timing standards (150-300ms)
- Focus state requirements
- Cursor affordance rules
- WCAG AA contrast requirements
- Button state implementation patterns
- Form element best practices
- Modal hierarchy guidance
- Migration checklist

Accessibility improvements:
- Add alt text to OCR preview image in Scanner
- Verify all images have descriptive alt text
- Establish transition consistency guidelines

This ensures design consistency and accessibility across the application.
2026-04-17 13:00:41 +03:00
c45685dd4d refactor(a11y): add cursor-pointer and focus states to all interactive elements - Phase 1
- Add cursor-pointer to all clickable buttons and interactive elements
- Add focus:ring-2 focus:ring-primary/blue focus:outline-none to all buttons
- Add aria-label to icon-only buttons and actions
- Update focus states from focus-visible to focus for consistency
- Add disabled:cursor-not-allowed for disabled button states
- Improve keyboard navigation with proper focus indicators

Components updated:
- BottomNav: navigation buttons with aria-labels
- Scanner: try again, zoom, word selection, cancel buttons
- ItemComparisonModal: skip and update action buttons
- ConfirmationModal: close, cancel, delete buttons with input focus
- AIOnboarding: all mode toggles, camera, upload, capture, edit, delete buttons
- Plus interactive cards and list items

This ensures WCAG AA compliance for keyboard navigation and visual feedback.
2026-04-17 12:59:56 +03:00
da83c91a5b feat: add side-by-side item comparison for duplicate Part Numbers
New Component: ItemComparisonModal.tsx
- Shows existing vs new item side-by-side
- Highlights fields that are different (in yellow)
- Options to Update item or Skip (local-only save)
- Shows existing item ID and comparison details

Backend Changes:
- Updated error message to say 'Part Number' not 'barcode'
- 409 response includes existing item data for comparison
- Clear, user-friendly conflict messaging

Frontend Changes:
- New state for comparison modal (newItem, existingItem, existingId)
- handleOnboardingComplete() shows modal on 409 conflict
- handleComparisonUpdate() calls updateItem() API
- handleComparisonSkip() saves locally without syncing
- Better error handling distinguishes 409 from other failures

Workflow:
1. User imports item with Part Number that already exists
2. System shows comparison modal
3. User can:
   - Update (merges new data into existing)
   - Skip (saves locally, doesn't sync to cloud)
2026-04-17 12:35:42 +03:00
1ea7a48912 fix: increase OCR timeout and configure Next.js dev origins
- Increased tesseract.js worker creation timeout from 8s → 20s (accounts for lazy loading and language model download on first run)
- Added allowedDevOrigins to next.config.mjs to permit localhost and .local hostnames
- Resolves OCR timeout on slow connections and first-time initialization
2026-04-17 11:45:36 +03:00
91e986b32c refactor(ux): simplify jargon and improve feature discoverability
Addressed P3 design opportunities from critique:

1. Technical Jargon Simplification
   - "Optical Assist" → "Smart Scan" (clearer scanning intent)
   - "Protocol Detected" → "Text Found" (plain language)
   - "OCR Matching Key" → "Item ID or Code" (concrete terminology)
   - "Select identity from label matrix" → "Tap any text to use it"
   - Removed cryptic "Cycle" terminology, added countdown seconds

2. Feature Discoverability
   - Added helpful descriptions to Admin manager sections
   - Scanner status message now hints at zoom and tap features
   - Concrete examples in input placeholders

3. Help & Documentation
   - User Management: "Create accounts and control access"
   - Category Groups: "Organize items by type or location"
   - Sign Out: clearer procedure description

Build: passes with zero errors
2026-04-17 11:10:10 +03:00
92ae329f88 refactor: final polish pass - complete accessibility and focus indicators
ACCESSIBILITY COMPLETENESS:
- Add aria-label to edit dialog close button in IdentityManager
- Add focus-visible to edit dialog form inputs (username, password, role)
- Add focus-visible to Apply Changes button in edit form
- Complete keyboard focus coverage for user editing workflow

FORM POLISH:
- All form inputs now have visible focus indicators
- Better visual feedback for keyboard navigation in edit dialogs

STATUS: Production-ready with comprehensive keyboard accessibility
- 20/20 audit score maintained
- WCAG AA fully compliant
- All interactive elements have keyboard focus indicators or are display-only
2026-04-17 11:03:17 +03:00