From 89a69a3ec98f4483145fa8c1abdcd58fdd0183c1 Mon Sep 17 00:00:00 2001 From: Daniel Bedeleanu Date: Fri, 17 Apr 2026 10:11:50 +0300 Subject: [PATCH] refactor(frontend): audit fixes - accessibility, colors, and UX Accessibility: - Add focus-visible indicators to all interactive elements (buttons, inputs) - Create accessible CreateUserModal to replace window.prompt() - Add aria-labels to icon buttons for screen readers Colors & Theming: - Move primary color to CSS variable (--primary) - Remove hard-coded #3b82f6 from tailwind config - Clean up color consistency across theme UX: - Replace prompt-based user creation with proper modal form - Implement inline field validation with error messages - Add loading state during form submission - Improve visual hierarchy and spacing Performance: - Remove bootstrap-icons dependency (duplicate with lucide-react) Design: - Reduce backdrop-blur overuse (remove from overlay scrim, StatCard) - Improve AdminOverlay responsive design --- .claude/settings.local.json | 3 +- frontend/app/globals.css | 4 +- frontend/components/AdminOverlay.tsx | 71 +++++----- frontend/components/BottomNav.tsx | 20 +-- frontend/components/CreateUserModal.tsx | 166 ++++++++++++++++++++++++ frontend/components/StatCard.tsx | 2 +- frontend/package.json | 1 - frontend/public/sw.js | 2 +- frontend/tailwind.config.ts | 4 +- 9 files changed, 223 insertions(+), 50 deletions(-) create mode 100644 frontend/components/CreateUserModal.tsx diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 4b68f1e3..eff176ed 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -34,7 +34,8 @@ "Bash(npm run *)", "Bash(npm test *)", "Bash(python3 *)", - "Bash(ls -lh aInventory-PROD-v*.zip)" + "Bash(ls -lh aInventory-PROD-v*.zip)", + "Bash(npm install *)" ] } } diff --git a/frontend/app/globals.css b/frontend/app/globals.css index 4012ce2f..9b604076 100644 --- a/frontend/app/globals.css +++ b/frontend/app/globals.css @@ -2,12 +2,12 @@ @tailwind components; @tailwind utilities; -@import "bootstrap-icons/font/bootstrap-icons.css"; - :root { /* slate-950 forced as default to prevent white flash */ --background: #020617; --foreground: #f1f5f9; + --primary: #3b82f6; + --primary-foreground: #ffffff; } body { diff --git a/frontend/components/AdminOverlay.tsx b/frontend/components/AdminOverlay.tsx index 5683c948..edc23b0a 100644 --- a/frontend/components/AdminOverlay.tsx +++ b/frontend/components/AdminOverlay.tsx @@ -1,8 +1,10 @@ 'use client'; +import { useState } from 'react'; import { X, Shield, UserPlus, User, Trash2, Tag, Plus, AlertTriangle, LogOut, Layers } from 'lucide-react'; import { inventoryApi } from '@/lib/api'; import { toast } from 'react-hot-toast'; +import CreateUserModal from './CreateUserModal'; interface AdminOverlayProps { show: boolean; @@ -13,19 +15,31 @@ interface AdminOverlayProps { onUpdateCategories: (categories: any[]) => void; } -export default function AdminOverlay({ - show, - onClose, - users, - categories, - onUpdateUsers, - onUpdateCategories +export default function AdminOverlay({ + show, + onClose, + users, + categories, + onUpdateUsers, + onUpdateCategories }: AdminOverlayProps) { + const [showCreateUserModal, setShowCreateUserModal] = useState(false); + if (!show) return null; + const handleUserCreated = () => { + inventoryApi.getUsers().then(onUpdateUsers); + }; + return ( -
-
+ <> + setShowCreateUserModal(false)} + onUserCreated={handleUserCreated} + /> +
+
@@ -33,9 +47,10 @@ export default function AdminOverlay({

System Admin

- @@ -45,20 +60,9 @@ export default function AdminOverlay({

User Management

- @@ -78,7 +82,7 @@ export default function AdminOverlay({
{u.username !== 'Admin' && ( - @@ -133,7 +138,7 @@ export default function AdminOverlay({
- @@ -159,18 +165,19 @@ export default function AdminOverlay({

Logout

Exit current session and return to identity check.

-
- + + ); } diff --git a/frontend/components/BottomNav.tsx b/frontend/components/BottomNav.tsx index 2f478163..105124da 100644 --- a/frontend/components/BottomNav.tsx +++ b/frontend/components/BottomNav.tsx @@ -28,27 +28,27 @@ export default function BottomNav({