From 6bdabb0e60bee41195e5e3fb13699d1a2bba6949 Mon Sep 17 00:00:00 2001 From: fullsizemalt <106900403+fullsizemalt@users.noreply.github.com> Date: Thu, 1 Jan 2026 18:49:56 -0800 Subject: [PATCH] feat(ui): apply visual polish phase 4 --- .../components/layout-editor/LayoutEditor.tsx | 38 ++++----- .../components/layout-editor/TypeLibrary.tsx | 77 +++++++++---------- frontend/src/index.css | 54 ++++++------- frontend/tailwind.config.js | 32 ++++---- 4 files changed, 101 insertions(+), 100 deletions(-) diff --git a/frontend/src/components/layout-editor/LayoutEditor.tsx b/frontend/src/components/layout-editor/LayoutEditor.tsx index 208acb6..0708b9e 100644 --- a/frontend/src/components/layout-editor/LayoutEditor.tsx +++ b/frontend/src/components/layout-editor/LayoutEditor.tsx @@ -141,40 +141,42 @@ export function LayoutEditor({ floorId, className }: LayoutEditorProps) { } return ( -
+
{/* Plant Type Sidebar */} {/* Main Canvas */} -
+
{/* Header */} -
-

+
+

{floorData?.floor.property} — {floorData?.floor.building}

-

- {floorData?.floor.name} • {floorData?.stats.occupiedPositions}/{floorData?.stats.totalPositions} positions filled +

+ {floorData?.floor.name} • {floorData?.stats.occupiedPositions}/{floorData?.stats.totalPositions} positions filled

{/* Rooms */} {floorData?.rooms.map(room => ( -
-

+
+

{room.name} - ({room.code}) + + {room.code} +

{/* Racks Grid */} -
+
{racks .filter(r => room.sections.some(s => s.id === r.id)) .map(rack => ( @@ -192,8 +194,8 @@ export function LayoutEditor({ floorId, className }: LayoutEditorProps) { {/* Empty state */} {(!floorData?.rooms || floorData.rooms.length === 0) && ( -
- +
+

No rooms configured

@@ -204,9 +206,9 @@ export function LayoutEditor({ floorId, className }: LayoutEditorProps) { {/* Selected Slot Panel */} {selectedSlot && ( -
-
-

Slot Details

+
+
+

Slot Details

)}
- setSearch(e.target.value)} - className="w-full px-3 py-1.5 text-sm bg-slate-800 border border-slate-600 rounded text-white placeholder-slate-400 focus:outline-none focus:border-emerald-500" - /> +
+ setSearch(e.target.value)} + className="w-full px-3 py-2 text-sm bg-secondary/50 border border-border rounded-lg text-foreground placeholder-muted-foreground focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary/20 transition-all" + /> +
{/* Categories */} -
+
{CATEGORY_ORDER.map(category => { const types = groupedTypes[category] || []; if (types.length === 0 && search) return null; const isExpanded = expandedCategories.has(category); - const categoryData = CATEGORY_LABELS[category]; return ( -
+
{isExpanded && ( -
+
{types.map(pt => ( ))} {types.length === 0 && ( -

No types in this category

+

No types available

)}
)} @@ -124,9 +123,9 @@ export function TypeLibrary({ plantTypes, onDragStart, onCreateType, className }
{/* Footer hint */} -
-

- Drag types onto sections to place +

+

+ Drag to place

@@ -149,29 +148,29 @@ function PlantTypeCard({ plantType, onDragStart }: PlantTypeCardProps) {
-
+
{/* Color indicator */}
-

{plantType.name}

+

{plantType.name}

{plantType.strain && ( -

{plantType.strain}

+

{plantType.strain}

)}
{/* Drag handle hint */} - +
{/* Quick stats */} {(plantType.growthDays || plantType.yieldGrams) && ( -
+
{plantType.growthDays && {plantType.growthDays}d} {plantType.yieldGrams && {plantType.yieldGrams}g}
diff --git a/frontend/src/index.css b/frontend/src/index.css index ddb114e..5e947e9 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -107,41 +107,41 @@ --radius: 16px; } - /* ===== DARK MODE (Primary Theme) ===== */ + /* ===== DARK MODE (Fediversion Theme) ===== */ .dark { - /* Backgrounds - Deep blue-charcoal */ - --color-bg-primary: #0B1020; - --color-bg-secondary: #11182A; - --color-bg-tertiary: #151C30; - --color-bg-elevated: #11182A; + /* Backgrounds - Zinc scale */ + --color-bg-primary: #09090b; /* zinc-950 */ + --color-bg-secondary: #18181b; /* zinc-900 */ + --color-bg-tertiary: #27272a; /* zinc-800 */ + --color-bg-elevated: #18181b; /* Text - improved contrast */ - --color-text-primary: #F8FAFC; - --color-text-secondary: #CBD5E1; - --color-text-tertiary: #94A3B8; - --color-text-quaternary: #64748B; - --color-text-inverse: #0F172A; + --color-text-primary: #FAFAFA; + --color-text-secondary: #A1A1AA; + --color-text-tertiary: #71717A; + --color-text-quaternary: #52525B; + --color-text-inverse: #09090b; - /* Borders - more visible */ - --color-border-default: #334155; - --color-border-subtle: #1E293B; - --color-border-strong: #475569; + /* Borders - cleaner zinc */ + --color-border-default: #27272a; + --color-border-subtle: #18181b; + --color-border-strong: #3f3f46; - /* Primary (Olive Green - Smart Farm) */ - --color-primary: #B8D449; - --color-primary-hover: #9BBF2A; - --color-primary-soft: #2A3518; + /* Primary (Electric Blue) */ + --color-primary: #2563eb; + --color-primary-hover: #3b82f6; + --color-primary-soft: rgba(37, 99, 235, 0.15); - /* Accent (Orange) */ - --color-accent: #FF8042; - --color-accent-hover: #E66B2E; - --color-accent-soft: #3D2515; + /* Accent (Cyan Glow) */ + --color-accent: #06b6d4; + --color-accent-hover: #0891b2; + --color-accent-soft: rgba(6, 182, 212, 0.15); /* Status Colors */ - --color-success: #B8D449; - --color-warning: #FACC15; - --color-error: #F97373; - --color-info: #38BDF8; + --color-success: #22c55e; + --color-warning: #eab308; + --color-error: #ef4444; + --color-info: #3b82f6; /* Chart colors */ --color-chart-gridline: #1E293B; diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js index e4ff6b0..9e3d67b 100644 --- a/frontend/tailwind.config.js +++ b/frontend/tailwind.config.js @@ -68,31 +68,31 @@ export default { muted: 'rgba(239, 68, 68, 0.15)', foreground: '#FFFFFF', }, - // Legacy support (mapped to neutral) - border: "hsl(var(--border))", - input: "hsl(var(--input))", - ring: "hsl(var(--ring))", - background: "hsl(var(--background))", - foreground: "hsl(var(--foreground))", + // Legacy support (mapped to variables) + border: "var(--color-border-default)", + input: "var(--color-border-default)", + ring: "var(--color-primary)", + background: "var(--color-bg-primary)", + foreground: "var(--color-text-primary)", primary: { - DEFAULT: "#5E6AD2", // Now accent color - foreground: "#FFFFFF", + DEFAULT: "var(--color-primary)", + foreground: "var(--color-text-inverse)", }, secondary: { - DEFAULT: "hsl(var(--secondary))", - foreground: "hsl(var(--secondary-foreground))", + DEFAULT: "var(--color-bg-tertiary)", + foreground: "var(--color-text-secondary)", }, muted: { - DEFAULT: "hsl(var(--muted))", - foreground: "hsl(var(--muted-foreground))", + DEFAULT: "var(--color-bg-secondary)", + foreground: "var(--color-text-tertiary)", }, popover: { - DEFAULT: "hsl(var(--popover))", - foreground: "hsl(var(--popover-foreground))", + DEFAULT: "var(--color-bg-elevated)", + foreground: "var(--color-text-primary)", }, card: { - DEFAULT: "hsl(var(--card))", - foreground: "hsl(var(--card-foreground))", + DEFAULT: "var(--color-bg-elevated)", + foreground: "var(--color-text-primary)", }, }, borderRadius: {