diff --git a/.standalone.pid b/.standalone.pid index 4d8b4b4d..86d8b588 100644 --- a/.standalone.pid +++ b/.standalone.pid @@ -1,2 +1,2 @@ -21336 -21347 +26221 +26233 diff --git a/AI_RULES.md b/AI_RULES.md index 90a63f69..89b97b28 100644 --- a/AI_RULES.md +++ b/AI_RULES.md @@ -31,6 +31,9 @@ This is the **Single Source of Truth** for ALL AI agents. Refer to [PROJECT_ARCH - **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`). - **Iconography**: Use **Lucide Icons** exclusively. +- **Design**: Convert design from `DESIGN.md` file system into a tailwind.config.js file. Create global CSS variables from rules from `DESIGN.md` file. + + ## 4. REFACTORING & TESTING STRATEGY (MANDATORY) - **TEST-FIRST**: All tests must be written and passing BEFORE refactoring any code. diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 00000000..16c92daa --- /dev/null +++ b/PLAN.md @@ -0,0 +1,322 @@ +# DESIGN.md Compliance Audit & Fix Plan + +**Status**: PLAN READY FOR REVIEW (No code changes made yet) +**Date**: 2026-04-25 +**Objective**: Audit why DESIGN.md is not fully respected in UI/UX and plan comprehensive fixes + +--- + +## EXECUTIVE SUMMARY + +The design system has **partial implementation**. While basic structure exists (sharp corners, no shadows, dark theme), critical issues prevent full DESIGN.md compliance: + +1. **Color system is incomplete** — tailwind.config.ts missing 50%+ of DESIGN.md colors +2. **Hardcoded tailwind classes** bypass the design system (bg-slate-*, focus:ring-blue-*) +3. **Global CSS variables** only cover 5 colors instead of full palette +4. **Spacing tokens missing** (stack-sm, stack-md, container-gap) +5. **Typography spacing** incomplete (letter-spacing, line-height rules) + +--- + +## ROOT CAUSE ANALYSIS + +### Why DESIGN.md Is Not Being Respected + +#### 1. **Incomplete Color Mapping** (PRIMARY ISSUE) + +**DESIGN.md Specifies:** +- Primary: `#ffb781` (warm orange) +- Secondary: `#c8c6c5` (light gray for contrast) +- Tertiary: `#00e639` (terminal green for "healthy" status) +- Error: `#ffb4ab` + container `#93000a` +- On-surface: `#e5e2e1` (text on dark surfaces) +- On-primary: `#4e2600` +- On-secondary: `#303030` +- Outline: `#a48c7c`, Outline-variant: `#564335` +- Surface variants: 5 tiers (#0e0e0e to #353534) + +**Current tailwind.config.ts Has:** +``` +primary: #F58618 ❌ WRONG (should be #ffb781) +secondary: #888888 ❌ WRONG (should be #c8c6c5) +success: #00FF41 ❌ WRONG (should be #00e639) +tertiary: MISSING ENTIRELY ❌ +error: #FF3131 ❌ WRONG (should be #ffb4ab) +on-surface: MISSING ❌ +on-primary: MISSING ❌ +outline: MISSING ❌ +``` + +**Impact**: Components using `text-secondary` get `#888888` instead of `#c8c6c5`. Buttons and status indicators use wrong colors. + +--- + +#### 2. **Hardcoded Tailwind Classes Bypass Design System** + +**Found in Components:** +- `bg-slate-400`, `bg-slate-600`, `hover:bg-slate-600` — No such colors in design +- `bg-gray-400`, `text-gray-300`, `text-gray-400` — Undefined colors +- `focus:ring-blue-500` — Should use primary color system +- `hover:bg-[#222222]` — Hardcoded hex instead of tonal layer name + +**Examples from audit:** +```tsx +// ItemPhotoUpload.tsx +className="hover:bg-slate-600" // ❌ Undefined in design + +// ItemComparisonModal.tsx +focus:ring-2 focus:ring-blue-500 // ❌ Should be focus:ring-primary + +// DebugRotationPanel.tsx +hover:bg-slate-600 // ❌ Multiple instances +``` + +**Impact**: Colors change without design system knowledge. No way to enforce consistency. + +--- + +#### 3. **Global CSS Variables Only Partially Implemented** + +**Currently Defined:** +```css +--background: #0A0A0A +--foreground: #FFFFFF +--primary: #F58618 +--border: #222222 +--muted: #888888 +``` + +**Missing 30+ Design System Variables:** +- All on-surface, on-primary, on-secondary variants +- All surface container levels (surface-container-lowest, surface-container-high, etc.) +- Outline and outline-variant +- Tertiary color suite +- Error container colors +- All inverse color variants +- Semantic spacing tokens + +**Impact**: Can't reference design colors via CSS variables. Forces hardcoded hex values. + +--- + +#### 4. **Spacing Tokens Missing from Config** + +**DESIGN.md Specifies:** +```yaml +spacing: + unit: 4px + gutter: 16px + margin: 32px + container-gap: 24px + stack-sm: 8px + stack-md: 16px +``` + +**Current tailwind.config.ts**: Uses default Tailwind spacing (no custom tokens) + +**Impact**: Margins and padding inconsistent across pages. No semantic spacing vocabulary. + +--- + +#### 5. **Typography Rules Partially Implemented** + +**DESIGN.md Specifies Letter-Spacing:** +- headline-lg: `-0.02em` +- headline-md: `-0.01em` +- body-md/lg: default (0) +- label-md: `+0.05em` + +**Current globals.css:** +```css +h1, h2, h3, h4, h5, h6 { @apply tracking-tighter; } +``` + +Only `tracking-tighter` applied to all headings. No distinction between sizes. + +**Impact**: Typography doesn't match spec. Density and legibility inconsistent. + +--- + +## WHERE CHANGES ARE NEEDED + +### 1. **frontend/tailwind.config.ts** (CRITICAL - 80+ lines) + +**Changes Required:** +- Replace `colors.primary` with exact DESIGN.md hex values +- Add complete DESIGN.md color palette (50+ colors) +- Add missing typography scale entries +- Add spacing tokens (`unit`, `gutter`, `margin`, `stack-*`, `container-gap`) +- Add all color variants (`on-surface`, `on-primary`, etc.) + +**Files to Edit:** `frontend/tailwind.config.ts` + +--- + +### 2. **frontend/app/globals.css** (HIGH PRIORITY - 50+ lines) + +**Changes Required:** +- Add CSS variables for ALL DESIGN.md colors (from :root) +- Add CSS variables for spacing tokens +- Update typography layer rules (different tracking per size) +- Add semantic classes for DESIGN.md color naming (`.on-surface`, `.on-primary`, etc.) +- Override default Tailwind focus ring color + +**Files to Edit:** `frontend/app/globals.css` + +--- + +### 3. **Component Files** (HIGH VOLUME - 30+ files) + +**Search and Replace Pattern:** +``` +bg-slate-* → bg-surface-bright or specific design color +bg-gray-* → bg-muted or specific design color +focus:ring-blue-500 → focus:ring-primary +hover:bg-slate-600 → hover:bg-surface-bright or level-2 +text-gray-* → text-secondary or text-muted +bg-[#222222] → bg-border (when for borders) +``` + +**Files to Review:** +- `frontend/components/ItemPhotoUpload.tsx` +- `frontend/components/DebugRotationPanel.tsx` +- `frontend/components/ImageAdjustmentModal.tsx` +- `frontend/components/ManualCropUI.tsx` +- `frontend/components/ItemComparisonModal.tsx` +- `frontend/components/CategoryCreationModal.tsx` +- `frontend/components/CreateUserModal.tsx` +- All other components with hardcoded colors + +--- + +## DETAILED FIX PLAN + +### Phase 1: Color System Foundation + +**Step 1.1 - Update tailwind.config.ts** +- Add complete DESIGN.md color palette as semantic color names +- Map all 40+ colors from DESIGN.md +- Ensure primary, secondary, tertiary, error, and all "on-" variants exist +- Add surface container levels + +**Step 1.2 - Update globals.css** +- Add CSS variable definitions for all colors +- Create semantic class names for typography (`.headline-lg`, `.body-md`, etc.) +- Add proper tracking/letter-spacing rules per DESIGN.md spec +- Override Tailwind focus ring defaults to use primary color + +**Step 1.3 - Verify Color Consistency** +- All hex values match DESIGN.md exactly +- No hardcoded colors remain in globals.css +- All semantic names follow Material Design naming convention + +--- + +### Phase 2: Spacing System + +**Step 2.1 - Add Spacing Tokens** +- Add `unit: 4px` as base spacing +- Add `gutter: 16px`, `margin: 32px`, `container-gap: 24px` +- Add `stack-sm: 8px`, `stack-md: 16px` +- Update tailwind spacing scale to reference these + +**Step 2.2 - Component Spacing Audit** +- Verify all page margins use `m-[32px]` or semantic class +- Verify internal padding respects 4px grid +- Verify gaps between items use stack tokens + +--- + +### Phase 3: Typography System + +**Step 3.1 - Implement Typography Scale** +- Add custom Tailwind class for each typography level +- Implement correct letter-spacing per DESIGN.md (headline-lg: `-0.02em`, etc.) +- Add line-height rules (1.1 for headlines, 1.5 for body) + +**Step 3.2 - Font Weight Enforcement** +- Ensure no font-weight values other than 400 in CSS +- Verify global `font-weight: 400 !important` is enforced +- Check that hierarchy comes ONLY from size + color + +--- + +### Phase 4: Component Compliance + +**Step 4.1 - Search and Replace** +Replace all hardcoded Tailwind colors: + +| Current | Replace With | Reason | +|---------|--------------|--------| +| `bg-slate-*` | `bg-surface-bright` or design color | Undefined in system | +| `bg-gray-*` | `bg-muted` or `bg-secondary` | Undefined in system | +| `focus:ring-blue-500` | `focus:ring-primary` | Wrong color system | +| `hover:bg-slate-600` | `hover:bg-surface-bright` or level-2 | Undefined in system | +| `text-gray-*` | `text-secondary` or `text-muted` | Undefined in system | +| `bg-[#222222]` (for hover) | `hover:bg-border` or `hover:bg-surface-bright` | Use design token | + +**Step 4.2 - Focus State Audit** +- All `:focus` and `:focus-visible` should use primary color +- Verify ring width (2px) matches design spec +- Remove any blue-500 references + +**Step 4.3 - Border Audit** +- All borders should use `border-border` or `border-primary` +- No hardcoded `#222222` in border definitions +- Verify 1px vs 2px matches DESIGN.md spec + +--- + +## FILES REQUIRING CHANGES + +### Critical (Must Fix) +1. **frontend/tailwind.config.ts** — Add 50+ colors + spacing +2. **frontend/app/globals.css** — Add 50+ CSS variables + typography rules + +### High Priority (30+ files with hardcoded colors) +3. `frontend/components/ItemPhotoUpload.tsx` +4. `frontend/components/DebugRotationPanel.tsx` +5. `frontend/components/ImageAdjustmentModal.tsx` +6. `frontend/components/ManualCropUI.tsx` +7. `frontend/components/ItemComparisonModal.tsx` +8. `frontend/components/CategoryCreationModal.tsx` +9. `frontend/components/CreateUserModal.tsx` +10. All other `/components/*.tsx` files with `bg-slate-`, `bg-gray-`, `focus:ring-blue-` + +### Medium Priority +- `frontend/app/items/create.tsx` (has `bg-slate-400`) +- `frontend/app/inventory/page.tsx` +- `frontend/app/admin/page.tsx` + +--- + +## EXPECTED OUTCOMES + +After implementation: + +✅ All DESIGN.md colors mapped 1:1 to tailwind.config.ts +✅ All 40+ CSS variables available in globals.css +✅ Zero hardcoded Tailwind colors (bg-slate-*, bg-gray-*, focus:ring-blue-*) +✅ All components use semantic color names (primary, secondary, surface-bright, etc.) +✅ Spacing tokens enable consistent, grid-aligned layout +✅ Typography follows DESIGN.md letter-spacing rules exactly +✅ Focus states use primary color consistently +✅ 100% compliance with DESIGN.md specification + +--- + +## VERIFICATION CHECKLIST + +- [ ] tailwind.config.ts has all 40+ DESIGN.md colors +- [ ] globals.css has CSS variables for all colors +- [ ] No `bg-slate-*` or `bg-gray-*` in any component +- [ ] No `focus:ring-blue-*` anywhere in codebase +- [ ] All typography uses proper letter-spacing per DESIGN.md +- [ ] Spacing tokens defined and used in config +- [ ] Primary color changed from `#F58618` to `#ffb781` (if this is correct) +- [ ] All component audits passed +- [ ] Visual inspection: colors match DESIGN.md visual palette + +--- + +**NEXT STEP**: User reviews this plan and approves before code changes begin. diff --git a/frontend/app/globals.css b/frontend/app/globals.css index c8aebda9..add92354 100644 --- a/frontend/app/globals.css +++ b/frontend/app/globals.css @@ -6,11 +6,74 @@ @layer base { :root { + /* Base colors from DESIGN.md */ --background: #131313; - --foreground: #FFFFFF; - --primary: #F58618; - --border: #222222; - --muted: #888888; + --on-background: #e5e2e1; + --foreground: #e5e2e1; + + /* Surface tones from DESIGN.md */ + --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; + --surface-variant: #353534; + + /* Primary colors from DESIGN.md */ + --primary: #ffb781; + --on-primary: #4e2600; + --primary-container: #f58618; + --on-primary-container: #5b2d00; + --primary-fixed: #ffdcc4; + --primary-fixed-dim: #ffb781; + --on-primary-fixed: #2f1400; + --on-primary-fixed-variant: #6f3800; + --inverse-primary: #924c00; + + /* Secondary colors from DESIGN.md */ + --secondary: #c8c6c5; + --on-secondary: #303030; + --secondary-container: #474746; + --on-secondary-container: #b7b5b4; + --secondary-fixed: #e5e2e1; + --secondary-fixed-dim: #c8c6c5; + --on-secondary-fixed: #1b1c1c; + --on-secondary-fixed-variant: #474746; + + /* Tertiary colors from DESIGN.md */ + --tertiary: #00e639; + --on-tertiary: #003907; + --tertiary-container: #00bd2d; + --on-tertiary-container: #00440a; + --tertiary-fixed: #72ff70; + --tertiary-fixed-dim: #00e639; + --on-tertiary-fixed: #002203; + --on-tertiary-fixed-variant: #00530e; + + /* Error colors from DESIGN.md */ + --error: #ffb4ab; + --on-error: #690005; + --error-container: #93000a; + --on-error-container: #ffdad6; + + /* Outline colors from DESIGN.md */ + --outline: #a48c7c; + --outline-variant: #564335; + + /* Inverse colors from DESIGN.md */ + --inverse-surface: #e5e2e1; + --inverse-on-surface: #313030; + + /* Semantic spacing tokens */ + --spacing-unit: 4px; + --spacing-gutter: 16px; + --spacing-margin: 32px; + --spacing-container-gap: 24px; + --spacing-stack-sm: 8px; + --spacing-stack-md: 16px; } * { @@ -25,79 +88,151 @@ letter-spacing: -0.01em; } - /* Strict "NO BOLD" enforcement from AI_RULES.md */ + /* Strict "NO BOLD" enforcement from AI_RULES.md - Hierarchy via size and color only */ *, *::before, *::after { font-weight: 400 !important; } - /* No uppercase/italics as per AI_RULES.md */ + /* No uppercase/italics as per AI_RULES.md and GEMINI.md */ *, *::before, *::after { text-transform: none !important; font-style: normal !important; } - h1, h2, h3, h4, h5, h6 { - @apply tracking-tighter; + /* Typography scale with proper letter-spacing per DESIGN.md */ + h1 { + @apply text-5xl tracking-tighter; + letter-spacing: -0.02em; } + h2 { + @apply text-4xl tracking-tight; + letter-spacing: -0.01em; + } + + h3, h4, h5, h6 { + @apply tracking-tight; + } + + /* Input Fields: Darker than the container background per DESIGN.md */ input, textarea, select { - @apply bg-black border border-[#222222] text-white px-3 py-2 focus:border-primary focus:outline-none transition-colors; + @apply bg-surface-container-lowest border border-outline text-foreground px-3 py-2 focus:border-primary focus:outline-none transition-colors; border-radius: 0 !important; } } @layer components { - /* Button Styles */ + /* Button Styles: Rectangular with no radius */ .btn-primary { - @apply bg-primary text-black px-4 py-2 hover:bg-[#d47214] transition-colors inline-flex items-center justify-center gap-2; + @apply bg-primary text-on-primary px-4 py-2 hover:opacity-90 transition-opacity inline-flex items-center justify-center gap-2; } .btn-secondary { - @apply bg-transparent border border-[#888888] text-[#888888] px-4 py-2 hover:border-white hover:text-white transition-colors inline-flex items-center justify-center gap-2; + @apply bg-transparent border border-secondary text-secondary px-4 py-2 hover:border-foreground hover:text-foreground transition-colors inline-flex items-center justify-center gap-2; } - /* Level 1 (Cards/Panels): #121212 with a 1px solid border of #222222 */ + .level-0 { + @apply bg-surface; + } + + /* Level 1 (Cards/Panels): surface-container with 1px border of outline-variant */ .level-1 { - @apply bg-[#121212] border border-[#222222]; + @apply bg-surface-container border border-outline-variant; } - /* Level 2 (Modals/Popovers): #1A1A1A with a 2px solid border of the Primary Orange */ + /* Level 2 (Modals/Popovers): surface-container-high with 2px border of primary */ .level-2 { - @apply bg-[#1A1A1A] border-2 border-primary; + @apply bg-surface-container-high border-2 border-primary; } - - /* Active State */ + + .input-field { + @apply bg-surface-container-lowest border border-outline text-foreground px-3 py-2 focus:border-primary focus:outline-none transition-colors; + } + + /* Active State: 1px solid primary */ .active-border { @apply border border-primary; } - /* High-contrast status blocks */ + /* High-contrast status blocks: No rounded corners */ .status-success { - @apply bg-[#00FF41] text-black px-2 py-0.5; + @apply bg-success text-on-tertiary px-2 py-0.5; } .status-alert { - @apply bg-[#F58618] text-black px-2 py-0.5; + @apply bg-primary text-on-primary px-2 py-0.5; + } + + /* Data Tables: Header cells with a subtle background tint */ + .table-header { + @apply bg-surface-container-high border-b border-outline py-2 px-4 text-secondary text-sm font-normal; + } + + /* Log Viewers: Background surface-container-lowest with outline border */ + .log-viewer { + @apply bg-surface-container-lowest border border-outline p-4 font-mono mono-data overflow-y-auto; + } + + /* Typography utilities for DESIGN.md semantic sizing */ + .headline-lg { + @apply text-5xl font-normal; + letter-spacing: -0.02em; + line-height: 1.1; + } + + .headline-md { + @apply text-4xl font-normal; + letter-spacing: -0.01em; + line-height: 1.2; + } + + .headline-sm { + @apply text-2xl font-normal; + line-height: 1.2; + } + + .body-lg { + @apply text-lg font-normal; + line-height: 1.5; + } + + .body-md { + @apply text-base font-normal; + line-height: 1.5; + } + + .label-md { + @apply text-sm font-normal; + letter-spacing: 0.05em; + line-height: 1; + } + + .mono-data { + @apply text-sm font-normal; + font-family: 'Space Grotesk', monospace; + letter-spacing: 0.02em; + line-height: 1; + font-variant-numeric: tabular-nums; } } -/* Custom Industrial Scrollbar Styling */ +/* Custom Industrial Scrollbar Styling per DESIGN.md */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { - background: #0A0A0A; + background: var(--surface); } ::-webkit-scrollbar-thumb { - background: #222222; + background: var(--outline-variant); border-radius: 0; } ::-webkit-scrollbar-thumb:hover { - background: #F58618; + background: var(--primary); } @layer utilities { diff --git a/frontend/app/inventory/page.tsx b/frontend/app/inventory/page.tsx index 0f1aa168..86dc3e74 100644 --- a/frontend/app/inventory/page.tsx +++ b/frontend/app/inventory/page.tsx @@ -14,14 +14,8 @@ import { useInventoryFilter } from '@/hooks/useInventoryFilter'; import { toast } from 'react-hot-toast'; import { Package, - BarChart3, Layers, - Plus, - Minus, - Trash2, X, - AlertTriangle, - Tag, Edit2, Camera, Layout, @@ -31,12 +25,8 @@ import { Search } from 'lucide-react'; import { generateBarcode128, getQRCodeURL } from '@/lib/labels'; -import { clsx, type ClassValue } from 'clsx'; -import { twMerge } from 'tailwind-merge'; - -function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); -} +import { cn } from '@/lib/utils'; +import versionData from '../VERSION.json'; export default function InventoryPage() { const [mounted, setMounted] = useState(false); @@ -99,22 +89,18 @@ export default function InventoryPage() { }, []); const loadData = async () => { - // Load local items const cached = await db.items.toArray(); setInventory(cached); try { - // Load backend stats const s = await inventoryApi.getStats(); setStats(s); const cats = await inventoryApi.getCategories(); setCategoriesList(cats); - // Load fresh items const res = await inventoryApi.getItems(); setInventory(res); - // Sync local DB await db.items.clear(); await db.items.bulkPut(res); } catch (err: any) { @@ -131,7 +117,6 @@ export default function InventoryPage() { const finalAdjustQty = adjustQty; const newQty = selectedItem.quantity + (adjustType === 'ADD' ? adjustQty : -adjustQty); - // Local Update await db.items.update(selectedItem.id!, { quantity: newQty }); setInventory(prev => prev.map(i => i.id === selectedItem.id ? { ...i, quantity: newQty } : i)); @@ -190,24 +175,6 @@ export default function InventoryPage() { } }; - const handleDeleteItem = async () => { - if (!selectedItem || !selectedItem.id) return; - if (!window.confirm(`Are you sure you want to delete "${selectedItem.name}"?`)) return; - - try { - await db.items.delete(selectedItem.id); - if (navigator.onLine) { - await inventoryApi.deleteItem(selectedItem.id); - } - toast.success("Item deleted"); - setSelectedItem(null); - await loadData(); - } catch (err: any) { - console.error(err); - toast.error("Failed to delete item"); - } - }; - const handleUpdateCategory = async () => { if (!editingCategory) return; try { @@ -238,7 +205,6 @@ export default function InventoryPage() { }, [fieldScanning]); const onScanSuccess = useCallback((barcode: string) => { - // Inventory page doesn't do check-in via scanner, it just finds the item const item = inventory.find(i => i.barcode === barcode); if (item) { setSelectedItem(item); @@ -258,7 +224,6 @@ export default function InventoryPage() { setSelectedSearchItem(null); }; - // Extract unique item types and box labels for suggestions const existingTypes = Array.from(new Set(inventory.map(i => i.type).filter(Boolean))).sort() as string[]; const existingBoxes = Array.from(new Set(inventory.map(i => i.box_label).filter(Boolean))).sort() as string[]; @@ -266,7 +231,7 @@ export default function InventoryPage() { return ( -
+
{existingTypes.map(t => @@ -274,7 +239,7 @@ export default function InventoryPage() { {existingBoxes.map(b =>
-
- {/* Stats Dashboard */} -
+
+
- {/* Search */} - {/* Inventory Table */}
- {/* Stock Adjustment / Edit Item Overlay */} {selectedItem && ( -
-
-
-

+
+
+
+

{isEditing ? "Edit Item" : selectedItem.name} {!isEditing && ( - + In Stock: {selectedItem.quantity} )} @@ -364,26 +325,18 @@ export default function InventoryPage() { setEditedItem(selectedItem); setIsEditing(true); }} - className="p-2 hover:bg-black border border-transparent hover:border-[#222222] text-[#888888] rounded-none" + className="p-2 bg-surface-bright hover:text-primary transition-colors border border-border" > )} - {isEditing && ( - - )} @@ -391,196 +344,104 @@ export default function InventoryPage() {

{isEditing ? ( -
+
- + setEditedItem({...editedItem, name: e.target.value})} - className="w-full bg-black border border-[#222222] focus:border-primary px-3 py-2 rounded-none" + className="input-field w-full" />
- + setEditedItem({...editedItem, part_number: e.target.value})} - className="w-full bg-black border border-[#222222] focus:border-primary px-3 py-2 rounded-none" + className="input-field w-full" />
-
+
- + setEditedItem({ ...editedItem, category: e.target.value })} - className="w-full bg-black border border-[#222222] focus:border-primary px-3 py-2 rounded-none" + className="input-field w-full" placeholder="e.g. Storage" /> - - {categoriesList.map(c => ( -
- + setEditedItem({...editedItem, type: e.target.value})} - className="w-full bg-black border border-[#222222] focus:border-primary px-3 py-2 rounded-none" + className="input-field w-full" />
-
- - setEditedItem({...editedItem, connector: e.target.value})} - className="w-full bg-black border border-[#222222] focus:border-primary px-3 py-2 rounded-none" - placeholder="e.g. LC/UPC" - /> -
-
- - setEditedItem({...editedItem, size: e.target.value})} - className="w-full bg-black border border-[#222222] focus:border-primary px-3 py-2 rounded-none" - placeholder="e.g. 1.6TB" - /> -
-
- - setEditedItem({...editedItem, color: e.target.value})} - className="w-full bg-black border border-[#222222] focus:border-primary px-3 py-2 rounded-none" - placeholder="e.g. Blue" - /> -
-
- -
- setEditedItem({...editedItem, box_label: e.target.value})} - className="w-full pr-12 bg-black border border-[#222222] focus:border-primary px-3 py-2 rounded-none" - placeholder="e.g. Box 5" - /> - -
-
- +