Compare commits

..

7 Commits

15 changed files with 430 additions and 108 deletions

View File

@@ -0,0 +1,136 @@
---
wave: 1
depends_on: ["07-config-consolidation"]
files_modified: [
"frontend/tailwind.config.ts",
"frontend/styles/globals.css",
"frontend/components/ui/StatCard.tsx",
"frontend/components/ui/Button.tsx",
"frontend/components/ui/Input.tsx",
"frontend/app/layout.tsx",
"frontend/app/page.tsx",
"AI_RULES.md"
]
autonomous: true
---
# Phase 7.1: Frontend UI/UX Overhaul (Industrial Precision) - Implementation Plan
**Objective:** Implement the "Industrial Precision" design system from `DESIGN.md` across all frontend pages, ensuring high-contrast signaling, sharp corners (0px radius), and a technical, utilitarian aesthetic while maintaining compliance with mandatory typography rules.
**Success Criteria:**
- Tailwind configuration updated with the new "Industrial Precision" color palette.
- Global styles updated to enforce 0px border radius (sharp corners) for all components.
- Typography updated to use "Space Grotesk" as the primary font.
- Visual hierarchy achieved through size, color, and spacing (preserving the "NO BOLD" and "NO UPPERCASE" rules from AI_RULES.md).
- StatCards, Buttons, and Inputs reflect the new brutalist/industrial aesthetic.
- All pages (Dashboard, Inventory, Admin, Logs) updated to use the new container and margin system.
---
## Task 1: Update Tailwind Configuration [COMPLETED]
**Read First:**
- `DESIGN.md` for color palette and spacing units.
- `frontend/tailwind.config.ts` for current configuration.
**Action:**
1. Update `tailwind.config.ts` with the "Industrial Precision" colors:
- Primary: `#F58618` (Caution Orange)
- Background: `#131313`
- Surfaces: `#0A0A0A`, `#121212`, `#1A1A1A`
2. Add "Space Grotesk" to the fontFamily configuration.
3. Configure the spacing unit (4px) and 12-column grid.
**Acceptance Criteria:**
- `tailwind.config.ts` includes the new color palette.
- `Space Grotesk` is defined as the default sans font.
- Spacing units are aligned with `DESIGN.md`.
---
## Task 2: Implement Global Sharp Edges & Borders
**Read First:**
- `DESIGN.md` (Elevation & Depth, Shapes).
- `frontend/styles/globals.css`.
**Action:**
1. Update `globals.css` to set `border-radius: 0` globally or through Tailwind layer overrides.
2. Implement the "Bold Borders" style: 1px or 2px solid borders for levels 1 and 2.
3. Remove all shadows and blurs, replacing them with tonal layers as per `DESIGN.md`.
**Acceptance Criteria:**
- UI components have sharp 90-degree corners.
- Shadows are removed from the entire application.
- Borders use the specified technical colors (`#222222`, `#F58618`).
---
## Task 3: Component-Level Overhaul (Buttons & Inputs)
**Read First:**
- `DESIGN.md` (Components section).
- `frontend/components/ui/Button.tsx` (if it exists, otherwise standard elements).
- `frontend/components/ui/Input.tsx`.
**Action:**
1. Update Button styles: Solid `#F58618` for primary, transparent with 1px border for secondary.
2. Update Input styles: Darker background (`#000000`), bottom-only or full 1px border.
3. Ensure no rounded corners and no bold text.
**Acceptance Criteria:**
- Buttons and Inputs match the "Industrial Precision" visual style.
- Active/Focus states use the Caution Orange border.
---
## Task 4: StatCard & Data Table Refinement
**Read First:**
- `DESIGN.md` (StatCards, Data Tables).
- `AI_RULES.md` (StatCard Typography Rule).
- `frontend/components/ui/StatCard.tsx`.
**Action:**
1. Refine StatCards to use high-contrast blocks and tight internal padding.
2. Ensure numeric values match label size (as per AI_RULES.md) but use color for emphasis.
3. Update Data Tables: remove zebra-striping, use 1px horizontal dividers, apply technical headers.
**Acceptance Criteria:**
- StatCards provide high "glanceability" without overwhelming font sizes.
- Data Tables reflect the "glass cockpit" philosophy with high information density.
---
## Task 5: Layout & Viewport Adjustments
**Read First:**
- `DESIGN.md` (Layout & Spacing).
- `frontend/app/layout.tsx`.
- `frontend/app/page.tsx` and major route pages.
**Action:**
1. Set the primary viewport margins (24px-32px).
2. Ensure main containers use `max-w-7xl` (consistent with AI_RULES.md).
3. Update page headers to match the unified icon box + title standard.
**Acceptance Criteria:**
- Spacing is compressed internally but framed by generous outer margins.
- All pages feel consistent with the "high-end command center" aesthetic.
---
## Task 6: Final Audit & Rule Alignment
**Read First:**
- `AI_RULES.md` and `GEMINI.md`.
**Action:**
1. Audit the new UI for any accidental BOLD or UPPERCASE text.
2. Re-verify contrast ratios (7:1 target for status-critical text).
3. Ensure "Lucide Icons" are used exclusively.
**Acceptance Criteria:**
- 100% compliance with AI_RULES.md.
- Visual style perfectly aligns with `DESIGN.md` spirit.

View File

@@ -1,3 +1,2 @@
5813 21336
5814 21347
5831

View File

@@ -15,7 +15,7 @@ This is the **Single Source of Truth** for ALL AI agents. Refer to [PROJECT_ARCH
## 2. ENGINEERING & OPERATIONAL LAWS ## 2. ENGINEERING & OPERATIONAL LAWS
- **ENGLISH ONLY**: Interfaces, code, variables, and docs MUST be in English. Translate any Romanian text found in code immediately. - **ENGLISH ONLY**: Interfaces, code, variables, and docs MUST be in English. Translate any Romanian text found in code immediately.
- **GIT PROTOCOL**: Use system `git`. Never push or use `--force` unless explicitly asked. - **GIT PROTOCOL**: Use system `git`. Never push or use `--force` unless explicitly asked. Never push to master unless user say so. The maik work is done in "dev" git branch, and in other branches only user say so explicitly.
- **VERSIONING**: Update `VERSION.json` on every commit using `scripts/save_version.py`. - **VERSIONING**: Update `VERSION.json` on every commit using `scripts/save_version.py`.
- **SSOT INTEGRITY**: Every feature change MUST update: `README.md`, `USER_GUIDE.md`, `PROJECT_ARCHITECTURE.md`, `DEPLOYMENT.md`, and `dev_docs/PLAN.md`. - **SSOT INTEGRITY**: Every feature change MUST update: `README.md`, `USER_GUIDE.md`, `PROJECT_ARCHITECTURE.md`, `DEPLOYMENT.md`, and `dev_docs/PLAN.md`.
- **CODE QUALITY**: Files under 300 lines, complexity < 10, strict Single Responsibility Principle. - **CODE QUALITY**: Files under 300 lines, complexity < 10, strict Single Responsibility Principle.
@@ -26,6 +26,7 @@ This is the **Single Source of Truth** for ALL AI agents. Refer to [PROJECT_ARCH
- **NO UPPERCASE** or **NO ITALICS** in any UI context (headers, labels, buttons). - **NO UPPERCASE** or **NO ITALICS** in any UI context (headers, labels, buttons).
- **NO BOLD FONTS**: Use `font-normal` throughout. Hierarchy via size and color only. - **NO BOLD FONTS**: Use `font-normal` throughout. Hierarchy via size and color only.
- **NO `tracking-widest`**. - **NO `tracking-widest`**.
- **StatCard Typography**: Numeric values in StatCards MUST match the exact text size of their corresponding labels (e.g., `text-base md:text-lg`) to avoid overwhelming the density of the component.
- **Layout**: Main pages MUST use `max-w-7xl`. - **Layout**: Main pages MUST use `max-w-7xl`.
- **Unified Headers**: Icon box (`p-4 bg-primary/10 border-primary/20`) + Title (`text-3xl font-normal`). - **Unified Headers**: Icon box (`p-4 bg-primary/10 border-primary/20`) + Title (`text-3xl font-normal`).
- **Iconography**: Use **Lucide Icons** exclusively. - **Iconography**: Use **Lucide Icons** exclusively.

149
DESIGN.md Normal file
View File

@@ -0,0 +1,149 @@
---
name: Industrial Precision
colors:
surface: '#131313'
surface-dim: '#131313'
surface-bright: '#3a3939'
surface-container-lowest: '#0e0e0e'
surface-container-low: '#1c1b1b'
surface-container: '#201f1f'
surface-container-high: '#2a2a2a'
surface-container-highest: '#353534'
on-surface: '#e5e2e1'
on-surface-variant: '#ddc1af'
inverse-surface: '#e5e2e1'
inverse-on-surface: '#313030'
outline: '#a48c7c'
outline-variant: '#564335'
surface-tint: '#ffb781'
primary: '#ffb781'
on-primary: '#4e2600'
primary-container: '#f58618'
on-primary-container: '#5b2d00'
inverse-primary: '#924c00'
secondary: '#c8c6c5'
on-secondary: '#303030'
secondary-container: '#474746'
on-secondary-container: '#b7b5b4'
tertiary: '#00e639'
on-tertiary: '#003907'
tertiary-container: '#00bd2d'
on-tertiary-container: '#00440a'
error: '#ffb4ab'
on-error: '#690005'
error-container: '#93000a'
on-error-container: '#ffdad6'
primary-fixed: '#ffdcc4'
primary-fixed-dim: '#ffb781'
on-primary-fixed: '#2f1400'
on-primary-fixed-variant: '#6f3800'
secondary-fixed: '#e5e2e1'
secondary-fixed-dim: '#c8c6c5'
on-secondary-fixed: '#1b1c1c'
on-secondary-fixed-variant: '#474746'
tertiary-fixed: '#72ff70'
tertiary-fixed-dim: '#00e639'
on-tertiary-fixed: '#002203'
on-tertiary-fixed-variant: '#00530e'
background: '#131313'
on-background: '#e5e2e1'
surface-variant: '#353534'
typography:
headline-lg:
fontFamily: Space Grotesk
fontSize: 48px
fontWeight: '700'
lineHeight: '1.1'
letterSpacing: -0.02em
headline-md:
fontFamily: Space Grotesk
fontSize: 32px
fontWeight: '600'
lineHeight: '1.2'
letterSpacing: -0.01em
headline-sm:
fontFamily: Space Grotesk
fontSize: 24px
fontWeight: '600'
lineHeight: '1.2'
body-lg:
fontFamily: Space Grotesk
fontSize: 18px
fontWeight: '400'
lineHeight: '1.5'
body-md:
fontFamily: Space Grotesk
fontSize: 16px
fontWeight: '400'
lineHeight: '1.5'
label-md:
fontFamily: Space Grotesk
fontSize: 14px
fontWeight: '500'
lineHeight: '1'
letterSpacing: 0.05em
mono-data:
fontFamily: Space Grotesk
fontSize: 14px
fontWeight: '700'
lineHeight: '1'
letterSpacing: 0.02em
spacing:
unit: 4px
gutter: 16px
margin: 32px
container-gap: 24px
stack-sm: 8px
stack-md: 16px
---
## Brand & Style
This design system is engineered for the high-stakes environment of a datacenter, where speed of comprehension and operational uptime are paramount. The brand personality is technical, authoritative, and unapologetically utilitarian. It draws heavily from **Minimalist Industrialism** and **Brutalism**, stripping away decorative flourishes in favor of structural clarity and high-contrast signaling.
The emotional response is one of controlled intensity—evoking the feeling of a high-end command center. It prioritizes "glanceability," ensuring that critical status changes are immediately perceptible against a void-like backdrop. The aesthetic mimics physical hardware interfaces: rack-mounted servers, heavy-duty machinery, and tactical displays.
## Colors
The palette is anchored by a deep charcoal and true black foundation to minimize eye strain in low-light environments and maximize contrast.
- **Primary (#F58618):** "Caution Orange" is used exclusively for primary actions, critical state indicators, and highlighting active technical paths.
- **Surface Palette:** Backgrounds utilize a tiered black system: `#0A0A0A` for the base, `#121212` for containers, and `#1A1A1A` for hover states.
- **Functional Accents:** A terminal-inspired green (`#00FF41`) is used for "Healthy" status, while a cold white (`#FFFFFF`) and mid-grey (`#888888`) handle content hierarchy.
- **Contrast:** Maintain a minimum 7:1 contrast ratio for all status-critical text against the dark backgrounds.
## Typography
The typography utilizes **Space Grotesk** across all levels to maintain a technical, geometric rigour. Its idiosyncratic letterforms provide a futuristic "code-like" feel while remaining highly legible at small sizes.
- **Headlines:** Use tight tracking and heavy weights to create a sense of structural density.
- **Labels:** Small caps or all-caps are preferred for metadata and technical specs to differentiate them from prose.
- **Numeric Data:** Ensure tabular figures are used for metrics, alignment of IP addresses, and throughput values to facilitate easy vertical scanning of logs and tables.
## Layout & Spacing
This design system employs a **fixed grid** model for primary dashboards to ensure telemetry data remains in a predictable location. A 12-column system is used for high-level layouts, but interior modules utilize a strict 4px baseline grid.
Spacing is compressed to increase information density, reflecting the "glass cockpit" philosophy where more data is preferable to excessive whitespace. Use heavy 24px-32px margins for the primary viewport to frame the content, but keep internal component padding tight (8px-12px) to maximize screen real estate for logs and graphs.
## Elevation & Depth
Depth is conveyed through **Bold Borders** and **Tonal Layers** rather than shadows. In a datacenter environment, shadows can muddy the interface; instead, we use high-contrast outlines to define hierarchy.
- **Level 0 (Base):** `#0A0A0A`
- **Level 1 (Cards/Panels):** `#121212` with a 1px solid border of `#222222`.
- **Level 2 (Modals/Popovers):** `#1A1A1A` with a 2px solid border of the Primary Orange or a high-visibility grey.
- **Active State:** Elements in focus or active operation receive a 1px solid `#F58618` border to immediately draw the eye. No blurs or gradients are permitted.
## Shapes
The shape language is strictly **Sharp (0px)**. 90-degree angles reinforce the industrial, hardware-centric aesthetic. This lack of rounding suggests precision and eliminates the "friendly" softness typical of consumer SaaS. Every button, input, and container must maintain a hard edge to align with the rigid grid of a server rack.
## Components
- **Buttons:** Rectangular with no radius. Primary buttons are solid `#F58618` with black text. Secondary buttons are transparent with a 1px white or grey border.
- **Input Fields:** Darker than the container background (`#000000`). Use a bottom-only border or a full 1px border that changes to the primary orange on focus.
- **Status Chips:** High-contrast blocks. "Success" is a solid green block with black text; "Alert" is a solid orange block. No rounded corners.
- **Data Tables:** Zebra-striping is prohibited. Use 1px horizontal dividers only. Header cells must be all-caps Space Grotesk with a subtle background tint.
- **Telemetry Charts:** Lines should be 2px thick with no smoothing (stair-step/linear interpolation only) to represent raw data accuracy.
- **Log Viewers:** Use the `mono-data` type style. Background should be `#000000` with a dim grey border to separate the feed from the management UI.

View File

@@ -20,7 +20,7 @@ A unified system for inventory management featuring web administration, offline
### 2.2 Frontend (Web & PWA) ### 2.2 Frontend (Web & PWA)
- **Architecture**: Next.js 15+ (App Router, TypeScript Strict) - **Architecture**: Next.js 15+ (App Router, TypeScript Strict)
- **Styling**: Tailwind CSS v3.4 (Standard typography, normal weight only) - **Styling**: Tailwind CSS v3.4 (Industrial Precision, Space Grotesk, normal weight only)
- **Icons**: Lucide Icons (exclusive) - **Icons**: Lucide Icons (exclusive)
- **Offline Persistence**: Dexie.js (IndexedDB) - **Offline Persistence**: Dexie.js (IndexedDB)
- **Scanner**: `html5-qrcode` (Client-side, offline) - **Scanner**: `html5-qrcode` (Client-side, offline)

View File

@@ -56,5 +56,5 @@ To generate a clean production package:
--- ---
**Last Updated**: 2026-05-15 **Last Updated**: 2026-04-25
**Version**: 1.15.0 (Phase 7) **Version**: 1.14.25 (Phase 7.1)

View File

@@ -100,6 +100,7 @@ def extract_label_info(image_bytes: bytes, mode: str = "item"):
"Size": "size", "Size": "size",
"Color": "color", "Color": "color",
"PartNr": "part_number", "PartNr": "part_number",
"Specs": "specs",
"OCR": "ocr_text" "OCR": "ocr_text"
} }

View File

@@ -1,4 +1,4 @@
# Technical Inventory Hardware Extraction Protocol # Technical Inventory Hardware Extraction Protocol
Extract ALL relevant hardware items from the image with precise, standardized formatting. Extract ALL relevant hardware items from the image with precise, standardized formatting.
@@ -8,7 +8,7 @@
- **Multi-item labels**: Treat each SKU/variant as a separate item (e.g., "5m cable" and "7m cable" = 2 items) - **Multi-item labels**: Treat each SKU/variant as a separate item (e.g., "5m cable" and "7m cable" = 2 items)
## Item Field Format (CRITICAL) ## Item Field Format (CRITICAL)
[] Format: `<size_or_length> <type> <vendor> <connector> <part_number>`
**Component Rules:** **Component Rules:**
- `<size_or_length>`: - `<size_or_length>`:
@@ -17,8 +17,16 @@
- Rule: If ≥1000GB, use TB. If ≥1000MB, use GB. Otherwise use MB. - Rule: If ≥1000GB, use TB. If ≥1000MB, use GB. Otherwise use MB.
- **CABLE/WIRE LENGTH**: Meters only. Examples: "5m", "10m", "50m" - **CABLE/WIRE LENGTH**: Meters only. Examples: "5m", "10m", "50m"
- **RAM DIMM**: Capacity in GB. Examples: "128GB", "32GB", "8GB" - **RAM DIMM**: Capacity in GB. Examples: "128GB", "32GB", "8GB"
- **SFP/TRANSCEIVER SPEED**: Speed in G/Mbps. Examples: "10G", "1G", "40G", "100G"
- `<type>`: Asset class.
- **CABLES**:
- Use "Fiber" for all optical fiber cables.
- Use "Patchcord" for all copper UTP/RJ45 cables.
- Others: SATA, SAS, Power, USB, etc.
- **COMPONENTS**: DDR3/DDR4/DDR5, NVMe, SSD, HDD, SFP/Transceiver, DIMM, etc.
- **PRECEDENCE**: If an item is both "SSD" and "NVMe", use **NVMe** as the type and category.
- `<type>`: Asset class. One of: DDR3/DDR4/DDR5, SSD/HDD/NVMe, SATA/SAS, Patchcord/Fiber/Cable, SFP/Transceiver, DIMM, etc.
- `<vendor>`: Manufacturer (HP, HPE, Dell, Samsung, Cisco, Hynix, Intel, Broadcom) - `<vendor>`: Manufacturer (HP, HPE, Dell, Samsung, Cisco, Hynix, Intel, Broadcom)
- `<connector>`: Physical interface (RJ45, LC-LC, MPO, U.3, SATA, SAS, ST, SC). Omit if N/A. - `<connector>`: Physical interface (RJ45, LC-LC, MPO, U.3, SATA, SAS, ST, SC). Omit if N/A.
- `<part_number>`: Part number ONLY if visible. **Omit serial numbers.** - `<part_number>`: Part number ONLY if visible. **Omit serial numbers.**
@@ -26,9 +34,10 @@
**Item Examples (WITH HUMAN-READABLE SIZES):** **Item Examples (WITH HUMAN-READABLE SIZES):**
- `1.6TB NVMe HPE U.3 P66093-002` (not 1600GB) - `1.6TB NVMe HPE U.3 P66093-002` (not 1600GB)
- `256GB SSD Dell SATA SK-8765` (already human-readable) - `256GB SSD Dell SATA SK-8765` (already human-readable)
- `5m Patchcord LC-LC` - `5m Fiber LC-LC` (optical cable)
- `2m Patchcord RJ45` (copper cable)
- `128GB DDR4 Hynix` - `128GB DDR4 Hynix`
- `512MB Cache Samsung SATA` (stays MB if under 1GB) - `10G SFP+ Cisco LC 10-2415-03`
**Size Conversion Examples:** **Size Conversion Examples:**
- 1600GB → 1.6TB - 1600GB → 1.6TB
@@ -47,72 +56,74 @@
## Other Fields ## Other Fields
- **Type**: Repeat the asset class (DDR4, SSD, NVMe, Patchcord, etc.) - **Type**: Repeat the asset class (DDR4, SSD, NVMe, Patchcord, etc.)
- **Description**: Technical summary, max 5 words. Examples: "High-speed fiber optic", "Enterprise Gen4 storage" - **Description**: Technical summary, max 5 words. Examples: "High-speed fiber optic", "Enterprise Gen4 storage"
- **Category**: Memory, Storage, Network, Cabling, Compute, Optical, Transceiver - **Category**:
- For Spare Parts (see below): Use `spare parts - <type>` where `<type>` is the lowercase component name (e.g., `spare parts - ram`, `spare parts - ssd`, `spare parts - nvme`, `spare parts - raid card`, `spare parts - cpu`, `spare parts - psu`, `spare parts - hba`, `spare parts - nic`, `spare parts - sfp`).
- For Others: Use `Network`, `Cabling`, `Compute`, `Optical`, `Consumable`.
- **Connector**: Interface type from Item field. Examples: "LC-LC", "RJ45", "U.3" - **Connector**: Interface type from Item field. Examples: "LC-LC", "RJ45", "U.3"
- **Size**: **HUMAN-READABLE capacity or length.** Examples: "1.6TB", "256GB", "5m" (NOT "1600GB") - **Size**: **HUMAN-READABLE capacity, length, or speed.** Examples: "1.6TB", "256GB", "5m", "10G" (NOT "1600GB")
- **Color**: Physical color if distinguishing - **Color**: Physical color if distinguishing
- **PartNr**: Part number only (no serial numbers) - **PartNr**: Part number only. **CRITICAL: NEVER include Serial Numbers (S/N, SN, Serial).**
- **OCR**: Robust matching key for OCR tolerance - **Specs**: Detailed technical specifications (e.g., "1.2V, CL22", "850W 80+ Gold", "Gen4 x4", "Single-mode").
- **OCR**: Robust matching key for OCR tolerance. Format: `TYPE SIZE VENDOR CONNECTOR PARTNUMBER` (UPPERCASE, no special chars).
## OCR Field Rules (CRITICAL) ## OCR Field Rules (CRITICAL)
Generate a SHORT, clean matching key: Generate a SHORT, clean matching key for database lookup:
- Format: **UPPERCASE space-separated, NO special chars, NO duplicates** - Format: **UPPERCASE space-separated, NO special chars, NO duplicates**
- Include ONLY: Type + Size + Primary Vendor + Connector + Part Number - Include ONLY: Type + Size + Primary Vendor + Connector + Part Number
- **EXCLUDE**: Serial numbers, secondary vendors, duplicate tokens, EMC/SK labels - **STRICT EXCLUSIONS**:
- **USE HUMAN-READABLE SIZE**: Use TB/GB from Item field, not original notation - NO serial numbers (S/N, SN, Serial)
- NO secondary vendor names
- NO extraneous labels
- **CONSTRAINTS**:
- Each token appears ONE time only (no duplicates)
- Remove hyphens/special chars for fuzzy matching (e.g., `SK-8765` -> `SK8765`)
- **USE HUMAN-READABLE SIZE**: Use TB/GB/M/G from Item field.
**OCR Format:** `TYPE SIZE VENDOR CONNECTOR PARTNUMBER` **OCR Examples:**
**OCR Examples (WITH HUMAN-READABLE SIZES):**
- Item: `1.6TB NVMe HPE U.3 P66093-002` → OCR: `NVME 1.6TB HPE U3 P66093002` - Item: `1.6TB NVMe HPE U.3 P66093-002` → OCR: `NVME 1.6TB HPE U3 P66093002`
- Item: `5m Patchcord LC-LC` → OCR: `PATCHCORD 5M LC LC` - Item: `5m Fiber LC-LC` → OCR: `FIBER 5M LC LC`
- Item: `2m Patchcord RJ45` → OCR: `PATCHCORD 2M RJ45`
- Item: `256GB SSD Samsung SAS SK-8765` → OCR: `SSD 256GB SAMSUNG SAS SK8765` - Item: `256GB SSD Samsung SAS SK-8765` → OCR: `SSD 256GB SAMSUNG SAS SK8765`
- Item: `128GB DDR4 Hynix` → OCR: `DDR4 128GB HYNIX` - Item: `128GB DDR4 Hynix` → OCR: `DDR4 128GB HYNIX`
- Item: `10G SFP+ Cisco LC 10-2415-03` → OCR: `SFP+ 10G CISCO LC 10241503`
**OCR Constraints:**
- NO duplicate part numbers
- NO secondary vendor names
- NO extraneous labels
- Each token appears ONE time only
- Remove hyphens/special chars for fuzzy matching
- Use HUMAN-READABLE sizes (1.6TB not 1600GB)
## Spare-Parts vs Consumables Classification ## Spare-Parts vs Consumables Classification
CLASSIFICATION GUIDE - SPARE PARTS vs CONSUMABLES: CLASSIFICATION GUIDE - SPARE PARTS vs CONSUMABLES:
Spare Parts (replaceable components that plug into or interface with devices): Spare Parts (replaceable components that plug into or interface with devices):
- RAM, DDR memory modules (DDR3, DDR4, DDR5, SODIMM, DIMM) - **RAM**: DDR3, DDR4, DDR5, SODIMM, DIMM → Category: `spare parts - ram`
- SSDs, NVMe drives, M.2 modules, SATA drives, hard drives - **Storage**: NVMe, SSD, M.2, SATA HDD, SAS HDD → Category: `spare parts - nvme`, `spare parts - ssd`, or `spare parts - hdd`.
- CPUs, GPUs, processors, discrete graphics cards - *Rule: Use `nvme` if the item is an NVMe SSD.*
- Power supply units (PSU), power modules (NOT generic power cords) - **CPU**: Processors, Intel Xeon, AMD EPYC → Category: `spare parts - cpu`
- Expansion cards (PCIe, PCI, RAID controllers, network cards/NIC) - **Power**: PSU, Power Supply Modules → Category: `spare parts - psu`
- Cooling solutions (heatsinks, CPU coolers, thermal solutions) - **Controllers**: RAID Controllers, HBA, NIC, Network Cards → Category: `spare parts - raid card` or `spare parts - hba` or `spare parts - nic`
- Motherboards, chipsets, BIOS modules - **Cooling**: Heatsinks, Fans (specific to models) → Category: `spare parts - cooling`
- **Mainboard**: Motherboards, Riser Cards → Category: `spare parts - motherboard` or `spare parts - riser`
- **Optical**: SFPs, Transceivers → Category: `spare parts - sfp`
NOT Spare Parts (consumables, generic items): NOT Spare Parts (consumables, generic items):
- Cables (power, SATA, USB, Ethernet, proprietary cords) - Cables: Power cables, SATA cables, USB, Ethernet, Fiber Patchcords → Category: `Cabling` or `Consumable`
- Fasteners (screws, washers, bolts, standoffs) - Fasteners: Screws, brackets, rails → Category: `Consumable`
- Thermal paste, thermal pads, adhesive tapes - Materials: Thermal paste, pads, tapes → Category: `Consumable`
- Connectors, plugs, sockets, generic adapters
- Generic cords and utility items
Decision Tree: Decision Tree:
1. Does the item have a replaceable function in a larger system? 1. Does the item have a manufacturer part number (P/N)?
2. Does it have a manufacturer part number and technical specifications? 2. Is it a modular component of a larger system (Server, PC, Switch)?
3. Is it described with model/revision information? 3. Does it have technical specs (Speed, Capacity, Voltage)?
If YES to 2+ questions: Mark as SPARE PART If YES to 2+ questions: Mark as `spare parts - <type>`
If item matches consumable examples exactly: Mark as CONSUMABLE If item is a cable: Mark as `Cabling`
Otherwise: Mark as "uncertain" in the Category field for human review. If item is a generic hardware: Mark as `Consumable`
Otherwise: Mark as `uncertain` for review.
Examples: Examples:
✓ "Kingston Fury 16GB DDR4-3200" → Spare Part (RAM module) ✓ "Kingston Fury 16GB DDR4-3200" → Category: `spare parts - ram`
✓ "Samsung 970 EVO 1TB NVMe" → Spare Part (SSD) ✓ "Samsung 970 EVO 1TB NVMe" → Category: `spare parts - nvme`
✓ "Intel Core i7-12700K" → Spare Part (CPU) ✓ "Intel Core i7-12700K" → Category: `spare parts - cpu`
✓ "Corsair RM850x 850W Power Supply" → Spare Part (PSU) ✓ "LSI MegaRAID 9361-8i" → Category: `spare parts - raid card`
✗ "6ft SATA Cable" → Consumable (cable) ✗ "6ft SATA Cable" → Category: `Cabling`
✗ "CPU Mounting Hardware Kit" → Consumable (fasteners) ✗ "M3 Mounting Screws" → Category: `Consumable`
✗ "Thermal Paste Tube" → Consumable (adhesive material)
## Output Format ## Output Format
```json ```json
@@ -127,7 +138,8 @@
"Size": "human_readable_size", "Size": "human_readable_size",
"Color": "color", "Color": "color",
"PartNr": "part_number", "PartNr": "part_number",
"OCR": "TYPE SIZE VENDOR CONNECTOR PARTNUMBER" "Specs": "detailed technical specifications",
"OCR": "SIZE TYPE VENDOR CONNECTOR PARTNUMBER"
} }
] ]
} }

View File

@@ -21,6 +21,13 @@ A unified inventory management system that eliminates manual data entry through
## 3. Active Roadmap ## 3. Active Roadmap
### Phase 7.1: Frontend UI/UX Overhaul (Industrial Precision) [ACTIVE]
- **Design System Integration**: Apply the "Industrial Precision" system from `DESIGN.md`.
- **Component Refactoring**: Update all UI components to use sharp corners (0px) and bold borders.
- **Color Palette Update**: Implement the high-contrast Caution Orange and tiered black surface system.
- **Typography Alignment**: Apply Space Grotesk while strictly adhering to the "NO BOLD" and "NO UPPERCASE" rules from AI_RULES.md.
- **Glanceability Optimization**: Increase information density in StatCards and Data Tables.
### Phase 8: Hardening & Release (PLANNED) ### Phase 8: Hardening & Release (PLANNED)
- **Production Runbook**: Finalized guide for production deployment. - **Production Runbook**: Finalized guide for production deployment.
- **Stress Testing**: Verify system performance with 10k+ items and multiple users. - **Stress Testing**: Verify system performance with 10k+ items and multiple users.
@@ -42,8 +49,23 @@ A unified inventory management system that eliminates manual data entry through
## 5. Design & Operational Constraints ## 5. Design & Operational Constraints
- **Tech Stack**: FastAPI (Python), SQLite, Next.js (TypeScript), Tailwind CSS. - **Tech Stack**: FastAPI (Python), SQLite, Next.js (TypeScript), Tailwind CSS.
<<<<<<< HEAD
- **UI Fidelity**: Premium density, Lucide icons, **NO UPPERCASE**, **NO BOLD FONTS**. - **UI Fidelity**: Premium density, Lucide icons, **NO UPPERCASE**, **NO BOLD FONTS**.
- **Security**: Mandatory auth, immutable audit logs. - **Security**: Mandatory auth, immutable audit logs.
=======
- **UI Fidelity**: Premium density, Lucide icons, **NO UPPERCASE**, **NO BOLD FONTS** (normal weight only).
- **StatCard Rule**: Numeric values MUST match label text size for balanced density.
- **Database**: Single-instance SQLite (WAL mode). Multi-instance is v3+.
- **Security**: Mandatory auth, no bypasses, immutable audit logs.
- **AI**: Multi-provider resilience (Gemini primary, Claude fallback).
---
## 5. Decision Log Summary
- **Reset Planning (2026-04-22)**: Refocused on v2 stable release, deferred complex analytics to v3.
- **Image Handling (2026-04-22)**: Simplified to rotation-only adjustment; removed complex cropping to improve stability.
- **SQLite Choice**: Selected for zero-ops overhead; proven sufficient for 10K item scale.
>>>>>>> dev
--- ---

View File

@@ -1,34 +1,29 @@
# CURRENT AI WORKING SESSION — HANDOVER # CURRENT AI WORKING SESSION — HANDOVER
**Active AI:** Gemini CLI **Active AI:** Gemini Executor
**Last Updated:** 2026-04-23 **Last Updated:** 2026-04-25
**Current Version:** v1.14.22 **Current Version:** v1.14.25
**Status**: ✅ MILESTONE 7 VERIFIED | 🟢 READY FOR PHASE 8 **Status**: 🟢 PHASE 7.1 TASK 1 COMPLETE
--- ---
## SESSION 42 EXECUTION SUMMARY — Milestone Audit & Infrastructure Hardening ## SESSION EXECUTION SUMMARY — Task 1: Tailwind Update
### 1. Milestone 7 Audit (COMPLETE) ### 1. Tailwind Config (COMPLETE)
- **Verified Definition of Done**: Confirmed all Phase 7 (Config Consolidation) requirements are met. - Updated `frontend/tailwind.config.ts` with "Industrial Precision" palette.
- **Integration Check**: Fixed a critical gap where `run_standalone.py` was not updating the frontend's `network.json`. - Added `Space Grotesk` font family.
- **Legacy Cleanup**: Deleted `start_server.sh`, `inventory.env.template`, and shell-based backup/restore scripts. - Aligned font sizes with `DESIGN.md` (14px, 16px, 18px, 24px, 32px, 48px).
- **Script Unification**: Converted `backup.sh` and `restore.sh` to modern Python tools (`scripts/restore_prod.py`). - Defined tiered surface system: `#0A0A0A`, `#121212`, `#1A1A1A`.
### 2. UI/UX "Premium" Fidelity Fixes ### 2. Documentation Update
- **Typography**: Removed all `font-weight: 600` and `font-medium` instances to comply with "NO BOLD" rule. - Updated `PROJECT_ARCHITECTURE.md` with new styling specs.
- **Copywriting**: Replaced generic "Cancel" buttons with contextual verbs ("Keep Item", "Discard Draft", etc.). - Updated `README.md` version and date.
- **Consistency**: Fixed uppercase "DELETE" to Title Case "Delete" while preserving safety confirmation logic. - Marked Task 1 as completed in `.planning/phases/07.1-frontend-overhaul/PLAN.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.
--- ---
## NEXT STEPS (Phase 8: Hardening & Release) ## NEXT STEPS (Phase 7.1: Frontend UI/UX Overhaul)
1. **Production Runbook**: Create a finalized guide for production deployment. 1. **Task 2: Implement Global Sharp Edges & Borders**: Update `globals.css` for 0px radius and 1px/2px borders.
2. **Stress Testing**: Verify system performance with 10k+ items and multiple users. 2. **Task 3: Component-Level Overhaul**: Update Buttons and Inputs.
3. **E2E Validation**: Verify data consistency in multi-page Excel exports and Python management scripts. 3. **Task 4: StatCard & Data Table Refinement**.
4. **Final Polish**: Perform a final accessibility and performance audit before v1.15.0 stable release.

View File

@@ -1,6 +1,6 @@
{ {
"version": "1.14.22", "version": "1.14.25",
"last_build": "2026-04-23-1616", "last_build": "2026-04-25-1221",
"codename": "ConfigCore", "codename": "ConfigCore",
"commit": "e5bb14d9" "commit": "b74d1172"
} }

View File

@@ -448,7 +448,7 @@ export default function InventoryPage() {
/> />
</div> </div>
<div> <div>
<label className="text-sm font-normal text-secondary ml-1 tracking-tight">Size / Length</label> <label className="text-sm font-normal text-secondary ml-1 tracking-tight">Size / Length / Speed</label>
<input <input
type="text" type="text"
value={editedItem.size || ''} value={editedItem.size || ''}

View File

@@ -17,7 +17,7 @@ export default function StatCard({ label, value, icon: Icon }: StatCardProps) {
</span> </span>
</div> </div>
<span className="text-2xl md:text-3xl font-normal text-white whitespace-nowrap tabular-nums"> <span className="text-base md:text-lg font-normal text-white whitespace-nowrap tabular-nums">
{value} {value}
</span> </span>
</div> </div>

View File

@@ -4,4 +4,4 @@
"BACKEND_SSL_PORT": 8918, "BACKEND_SSL_PORT": 8918,
"FRONTEND_PORT": 8917, "FRONTEND_PORT": 8917,
"FRONTEND_SSL_PORT": 8919 "FRONTEND_SSL_PORT": 8919
} }

View File

@@ -4,40 +4,47 @@ const config: Config = {
content: [ content: [
"./app/**/*.{js,ts,jsx,tsx,mdx}", "./app/**/*.{js,ts,jsx,tsx,mdx}",
"./components/**/*.{js,ts,jsx,tsx,mdx}", "./components/**/*.{js,ts,jsx,tsx,mdx}",
"./lib/**/*.{js,ts,jsx,tsx,mdx}",
], ],
theme: { theme: {
fontSize: { fontSize: {
'xs': '13px', // increased from 12px 'xs': '12px',
'sm': '15px', // increased from 14px 'sm': '14px', // Design: label-md, mono-data
'base': '18px', // increased from 16px 'base': '16px', // Design: body-md
'lg': '20px', // increased from 18px 'lg': '18px', // Design: body-lg
'xl': '22px', // increased from 20px 'xl': '20px',
'2xl': '26px', // increased from 24px '2xl': '24px', // Design: headline-sm
'3xl': '32px', // increased from 30px '3xl': '30px',
'4xl': '36px', '4xl': '32px', // Design: headline-md
'5xl': '48px', '5xl': '48px', // Design: headline-lg
'6xl': '64px',
}, },
extend: { extend: {
fontFamily: {
sans: ["'Space Grotesk'", "sans-serif"],
},
colors: { colors: {
background: "#0A0E27", background: "#131313",
foreground: "#F0F4F8", foreground: "#FFFFFF",
surface: "#1A1F3A", surface: "#0A0A0A",
"surface-container": "#121212",
"surface-bright": "#1A1A1A",
primary: { primary: {
DEFAULT: "#3B82F6", DEFAULT: "#F58618",
foreground: "#FFFFFF", foreground: "#000000",
}, },
secondary: { secondary: {
DEFAULT: "#C7D2E0", DEFAULT: "#888888",
foreground: "#0A0E27", foreground: "#FFFFFF",
}, },
muted: { muted: {
DEFAULT: "#8B95AD", DEFAULT: "#444444",
foreground: "#F0F4F8", foreground: "#888888",
}, },
border: "#2D3561", border: "#222222",
success: "#10B981", success: "#00FF41",
error: "#EF4444", error: "#FF3131",
warning: "#F59E0B", warning: "#F58618",
}, },
keyframes: { keyframes: {
scan: { scan: {