From 3257a2cf48c842401eea5fd5339076a43a23e3c5 Mon Sep 17 00:00:00 2001 From: Daniel Bedeleanu Date: Sat, 25 Apr 2026 12:04:02 +0300 Subject: [PATCH] Build [v1.14.24] --- PROJECT_ARCHITECTURE.md | 21 +-- dev_docs/SESSION_STATE.md | 36 ++--- frontend/VERSION.json | 6 +- frontend/app/admin/page.tsx | 14 +- frontend/app/globals.css | 83 ++++++----- frontend/app/inventory/page.tsx | 123 ++++++++-------- frontend/app/items/create.tsx | 108 +++++++------- frontend/app/login/page.tsx | 62 ++++---- frontend/app/logs/page.tsx | 26 ++-- frontend/app/page.tsx | 42 +++--- frontend/components/AIOnboarding.tsx | 134 +++++++++--------- frontend/components/AdminOverlay.tsx | 46 +++--- frontend/components/BottomNav.tsx | 12 +- frontend/components/CameraView.tsx | 38 ++--- frontend/components/CategoryCreationModal.tsx | 20 +-- frontend/components/ConfirmationModal.tsx | 32 ++--- frontend/components/CreateUserModal.tsx | 24 ++-- frontend/components/DebugRotationPanel.tsx | 40 +++--- frontend/components/FilterBar.tsx | 2 +- frontend/components/IdentityCheckOverlay.tsx | 41 +++--- frontend/components/ImageAdjustmentModal.tsx | 56 +++----- frontend/components/InventoryTable.tsx | 22 +-- frontend/components/ItemComparisonModal.tsx | 20 ++- frontend/components/ItemDetailModal.tsx | 52 +++---- frontend/components/ItemPhotoUpload.tsx | 8 +- frontend/components/LogsOverlay.tsx | 18 +-- frontend/components/LogsTable.tsx | 68 ++++----- frontend/components/ManualCropUI.tsx | 22 ++- frontend/components/NewItemDialog.tsx | 6 +- frontend/components/PhotoModal.tsx | 12 +- frontend/components/ScannerSection.tsx | 10 +- frontend/components/SearchErrorModal.tsx | 10 +- frontend/components/SearchLoadingModal.tsx | 6 +- frontend/components/StatCard.tsx | 4 +- frontend/components/StockAdjustmentPanel.tsx | 70 ++++----- frontend/components/Toast.tsx | 10 +- frontend/components/admin/AiManager.tsx | 52 +++---- frontend/components/admin/CategoryManager.tsx | 28 ++-- frontend/components/admin/DatabaseManager.tsx | 50 +++---- frontend/components/admin/ExportPanel.tsx | 30 ++-- frontend/components/admin/IdentityManager.tsx | 36 ++--- frontend/components/admin/LdapManager.tsx | 54 +++---- .../inventory/QuantityAdjustmentModal.tsx | 18 +-- .../components/inventory/QuantityDisplay.tsx | 8 +- frontend/components/inventory/SearchModal.tsx | 32 ++--- frontend/tailwind.config.ts | 48 ++++--- .../components/InventoryTable.photo.test.tsx | 2 +- .../tests/components/ItemDetailModal.test.tsx | 12 +- .../tests/components/ItemPhotoUpload.test.tsx | 4 +- frontend/tests/components/PhotoModal.test.tsx | 4 +- 50 files changed, 837 insertions(+), 845 deletions(-) diff --git a/PROJECT_ARCHITECTURE.md b/PROJECT_ARCHITECTURE.md index 858c9156..6a579f19 100644 --- a/PROJECT_ARCHITECTURE.md +++ b/PROJECT_ARCHITECTURE.md @@ -55,18 +55,23 @@ A unified system for inventory management featuring web administration, offline --- -## 4. Design & Mobile Constraints +## 4. Design & Mobile Constraints (Industrial Brutalism) ### 4.1 Spacing & Layout - **Container**: `max-w-7xl` for main pages. -- **Responsive Spacing**: `space-y-3` (mobile) → `space-y-6` (desktop). -- **Padding**: `p-4` (mobile) → `p-8` (desktop). -- **Height**: Avoid `min-h-screen` on mobile to prevent viewport overflow; use `md:min-h-screen`. +- **Responsive Spacing**: `p-4` (mobile) → `p-8` (desktop) with `space-y-4` → `space-y-6`. +- **Shapes**: **Strictly Sharp (0px)** corners globally. No rounded borders. +- **Unified Headers**: Icon box (`p-4 bg-primary/10 border-primary/20`) + Title (`text-3xl font-normal`). -### 4.2 Typography -- **Readability**: Standard camel/Title case. -- **NO UPPERCASE**: Strictly forbidden in UI text. -- **NO BOLD**: Use `font-normal`. Hierarchy via size (`text-sm` vs `text-3xl`) and color (`text-slate-500` vs `text-white`). +### 4.2 Typography & Colors +- **Palette (Obsidian & Amber)**: + - Background: Deep Obsidian (`#0c1322`) + - Primary: Industrial Amber (`#ffc174`) + - Borders: Tactical Charcoal (`#a08e7a`) +- **Fonts**: **Space Grotesk** (Headlines/Data) & **Inter** (Body). +- **NO UPPERCASE**: Strictly forbidden in all UI contexts. +- **NO BOLD**: Strictly forbidden. Use `font-normal` throughout. Hierarchy via size and color only. +- **StatCards**: Numeric values must match label text size (e.g., `text-base md:text-lg`). --- diff --git a/dev_docs/SESSION_STATE.md b/dev_docs/SESSION_STATE.md index 4864901d..64207be7 100644 --- a/dev_docs/SESSION_STATE.md +++ b/dev_docs/SESSION_STATE.md @@ -1,28 +1,28 @@ # CURRENT AI WORKING SESSION — HANDOVER **Active AI:** Gemini CLI -**Last Updated:** 2026-04-23 -**Current Version:** v1.14.22 -**Status**: ✅ MILESTONE 7 VERIFIED | 🟢 READY FOR PHASE 8 +**Last Updated:** 2026-04-25 +**Current Version:** v1.14.23 +**Status**: ✅ DESIGN SYSTEM INTEGRATED | 🟢 READY FOR HARDENING --- -## SESSION 42 EXECUTION SUMMARY — Milestone Audit & Infrastructure Hardening +## SESSION 43 EXECUTION SUMMARY — Design System Integration & UI/UX Overhaul -### 1. Milestone 7 Audit (COMPLETE) -- **Verified Definition of Done**: Confirmed all Phase 7 (Config Consolidation) requirements are met. -- **Integration Check**: Fixed a critical gap where `run_standalone.py` was not updating the frontend's `network.json`. -- **Legacy Cleanup**: Deleted `start_server.sh`, `inventory.env.template`, and shell-based backup/restore scripts. -- **Script Unification**: Converted `backup.sh` and `restore.sh` to modern Python tools (`scripts/restore_prod.py`). +### 1. "Obsidian & Amber" Palette (COMPLETE) +- **Foundation**: Integrated `DESIGN.md` colors into `tailwind.config.ts` and `globals.css`. +- **Refactor**: Replaced legacy `slate`, `indigo`, `blue` classes with system `primary`, `secondary`, `surface`, and `outline` tokens. +- **Aesthetic**: Established "Industrial Brutalism" with Deep Obsidian backgrounds and Industrial Amber highlights. -### 2. UI/UX "Premium" Fidelity Fixes -- **Typography**: Removed all `font-weight: 600` and `font-medium` instances to comply with "NO BOLD" rule. -- **Copywriting**: Replaced generic "Cancel" buttons with contextual verbs ("Keep Item", "Discard Draft", etc.). -- **Consistency**: Fixed uppercase "DELETE" to Title Case "Delete" while preserving safety confirmation logic. +### 2. High-Fidelity Typography (COMPLETE) +- **Fonts**: Switched to **Space Grotesk** for data/headlines and **Inter** for body text. +- **Compliance**: Enforced `font-normal` globally; eliminated all `bold`, `semibold`, and `medium` instances. +- **Strict Rules**: Removed all `uppercase` and `italic` classes from the UI to comply with `AI_RULES.md`. -### 3. Infrastructure Stability -- **LDAP Config**: Refactored `auth.py` to use `ConfigManager` for saving settings directly to `backend.yaml`, eliminating legacy JSON side-files. -- **Caddy Proxy**: Resolved Port 80 conflict by disabling automatic HTTP->HTTPS redirects in standalone mode. +### 3. Structural & Layout Consistency +- **Shapes**: Enforced **strictly sharp (0px)** corners globally via `globals.css`. +- **Headers**: Standardized all page headers to the **Unified Header** pattern: `p-4` Icon box (`bg-primary/10`) + `text-3xl font-normal` Title. +- **Containers**: Verified and enforced `max-w-7xl` containers with responsive `p-4` to `p-8` padding. --- @@ -30,5 +30,5 @@ 1. **Production Runbook**: Create a finalized guide for production deployment. 2. **Stress Testing**: Verify system performance with 10k+ items and multiple users. -3. **E2E Validation**: Verify data consistency in multi-page Excel exports and Python management scripts. -4. **Final Polish**: Perform a final accessibility and performance audit before v1.15.0 stable release. +3. **E2E Validation**: Run full suite of Playwright tests to ensure design changes didn't break accessibility or interaction targets. +4. **Final Polish**: Verify that `StatCard` values match label sizes consistently in all viewports. diff --git a/frontend/VERSION.json b/frontend/VERSION.json index 07339e3e..22ad2fb5 100644 --- a/frontend/VERSION.json +++ b/frontend/VERSION.json @@ -1,6 +1,6 @@ { - "version": "1.14.23", - "last_build": "2026-04-23-1823", + "version": "1.14.24", + "last_build": "2026-04-25-1204", "codename": "ConfigCore", - "commit": "7c4441a9" + "commit": "33c1555d" } \ No newline at end of file diff --git a/frontend/app/admin/page.tsx b/frontend/app/admin/page.tsx index f0d1303c..10bae547 100644 --- a/frontend/app/admin/page.tsx +++ b/frontend/app/admin/page.tsx @@ -18,7 +18,7 @@ export default function AdminPage() { return (
-
+
); @@ -26,18 +26,18 @@ export default function AdminPage() { return ( -
+
-
- +
+
-

Admin Control

-

System Configuration & Security

+

Admin Control

+

System Configuration & Security

@@ -372,7 +372,7 @@ export default function InventoryPage() { {isEditing && ( @@ -383,7 +383,7 @@ export default function InventoryPage() { setIsEditing(false); setAdjustQty(1); }} - className="p-2 hover:bg-slate-800 rounded-full" + className="p-2 hover:bg-surface-container" > @@ -398,7 +398,7 @@ export default function InventoryPage() { type="text" value={editedItem.name || ''} onChange={e => setEditedItem({...editedItem, name: e.target.value})} - className="w-full bg-background border border-slate-800 rounded-xl py-3 px-4 text-sm font-normal outline-none text-secondary placeholder:text-muted" + className="w-full bg-background border border-outline/30 py-3 px-4 text-sm font-normal outline-none text-secondary placeholder:text-secondary" />
@@ -407,7 +407,7 @@ export default function InventoryPage() { type="text" value={editedItem.part_number || ''} onChange={e => setEditedItem({...editedItem, part_number: e.target.value})} - className="w-full bg-background border border-slate-800 rounded-xl py-3 px-4 text-sm font-normal outline-none text-secondary placeholder:text-muted" + className="w-full bg-background border border-outline/30 py-3 px-4 text-sm font-normal outline-none text-secondary placeholder:text-secondary" />
@@ -418,7 +418,7 @@ export default function InventoryPage() { list="existing-categories" value={editedItem.category || ''} onChange={e => setEditedItem({ ...editedItem, category: e.target.value })} - className="w-full bg-background border border-slate-800 rounded-xl py-3 px-4 text-sm font-normal outline-none text-secondary placeholder:text-muted" + className="w-full bg-background border border-outline/30 py-3 px-4 text-sm font-normal outline-none text-secondary placeholder:text-secondary" placeholder="e.g. storage" /> @@ -434,7 +434,7 @@ export default function InventoryPage() { list="existing-types" value={editedItem.type || ''} onChange={e => setEditedItem({...editedItem, type: e.target.value})} - className="w-full bg-background border border-slate-800 rounded-xl py-3 px-4 text-sm font-normal outline-none text-secondary" + className="w-full bg-background border border-outline/30 py-3 px-4 text-sm font-normal outline-none text-secondary" />
@@ -443,7 +443,7 @@ export default function InventoryPage() { type="text" value={editedItem.connector || ''} onChange={e => setEditedItem({...editedItem, connector: e.target.value})} - className="w-full bg-background border border-slate-800 rounded-xl py-3 px-4 text-sm font-normal outline-none text-secondary" + className="w-full bg-background border border-outline/30 py-3 px-4 text-sm font-normal outline-none text-secondary" placeholder="e.g. LC/UPC" />
@@ -453,7 +453,7 @@ export default function InventoryPage() { type="text" value={editedItem.size || ''} onChange={e => setEditedItem({...editedItem, size: e.target.value})} - className="w-full bg-background border border-slate-800 rounded-xl py-3 px-4 text-sm font-normal outline-none text-secondary" + className="w-full bg-background border border-outline/30 py-3 px-4 text-sm font-normal outline-none text-secondary" placeholder="e.g. 1.6TB" />
@@ -463,7 +463,7 @@ export default function InventoryPage() { type="text" value={editedItem.color || ''} onChange={e => setEditedItem({...editedItem, color: e.target.value})} - className="w-full bg-background border border-slate-800 rounded-xl py-3 px-4 text-sm font-normal outline-none text-secondary" + className="w-full bg-background border border-outline/30 py-3 px-4 text-sm font-normal outline-none text-secondary" placeholder="e.g. Blue" />
@@ -475,7 +475,7 @@ export default function InventoryPage() { list="existing-boxes" value={editedItem.box_label || ''} onChange={e => setEditedItem({...editedItem, box_label: e.target.value})} - className="w-full bg-background border border-slate-800 rounded-xl py-3 pl-4 pr-12 text-sm font-normal outline-none text-secondary placeholder:text-muted focus:border-primary transition-colors" + className="w-full bg-background border border-outline/30 py-3 pl-4 pr-12 text-sm font-normal outline-none text-secondary placeholder:text-secondary focus:border-primary transition-colors" placeholder="e.g. Box 5" />