From 34a5363ec5eb82ce8bc311c45eb6af73bb9aef1e Mon Sep 17 00:00:00 2001 From: Anthony Phan <131195703+antphan12@users.noreply.github.com> Date: Tue, 14 Apr 2026 14:46:55 -0500 Subject: [PATCH 1/2] Dynamic Dashboard and Small UI Changes Implemented new Dashboard, and fixed colors and margins of pages to be consistent. Pages now all follow the same layout. --- CulinaryCommandApp/Components/App.razor | 7 +- .../Custom/PrepTasksPanel.razor.css | 4 +- .../Components/Layout/Welcome.razor.css | 84 +++---- .../Components/Pages/AdminView.razor | 39 ---- .../Components/Pages/Dashboard.razor | 27 ++- .../Components/Pages/Home.Tworazor.css | 16 +- .../Components/Pages/Users/Index.razor | 2 - .../Components/Pages/Users/UserList.razor | 36 ++- .../Components/Pages/Users/UserList.razor.css | 2 + .../Pages/Inventory/InventoryCatalog.razor | 40 +++- .../Inventory/InventoryCatalog.razor.css | 206 +++++++++--------- .../Inventory/InventoryManagement.razor.css | 158 +++++++------- .../Pages/PurchaseOrderList.razor | 33 ++- .../Recipe/Pages/RecipeList.razor | 40 +++- .../Recipe/Pages/RecipeList.razor.css | 141 ++++++------ .../Recipe/Pages/RecipeView.razor.css | 70 +++--- CulinaryCommandApp/wwwroot/css/app.css | 46 ++++ 17 files changed, 508 insertions(+), 443 deletions(-) diff --git a/CulinaryCommandApp/Components/App.razor b/CulinaryCommandApp/Components/App.razor index 427815d..9885008 100644 --- a/CulinaryCommandApp/Components/App.razor +++ b/CulinaryCommandApp/Components/App.razor @@ -11,8 +11,6 @@ - - @@ -29,12 +27,9 @@ - + - diff --git a/CulinaryCommandApp/Components/Custom/PrepTasksPanel.razor.css b/CulinaryCommandApp/Components/Custom/PrepTasksPanel.razor.css index 67b2292..2156b14 100644 --- a/CulinaryCommandApp/Components/Custom/PrepTasksPanel.razor.css +++ b/CulinaryCommandApp/Components/Custom/PrepTasksPanel.razor.css @@ -65,8 +65,8 @@ } .cc-check-circle.checked { - background: #22c55e; - border-color: #22c55e; + background: #009A3B; + border-color: #009A3B; box-shadow: inset 0 0 0 2px #ffffff; } diff --git a/CulinaryCommandApp/Components/Layout/Welcome.razor.css b/CulinaryCommandApp/Components/Layout/Welcome.razor.css index e031548..5a8a11e 100644 --- a/CulinaryCommandApp/Components/Layout/Welcome.razor.css +++ b/CulinaryCommandApp/Components/Layout/Welcome.razor.css @@ -20,7 +20,7 @@ .nav-brand { font-weight: 700; - color: #16a34a; + color: #009A3B; padding-left: 8px; } @@ -29,7 +29,7 @@ gap: 8px; padding: 6px 8px; border-radius: 999px; - background: linear-gradient(135deg, #22c55e, #10b981); + background: linear-gradient(135deg, #009A3B, #009A3B); } .nav-pill a { @@ -49,7 +49,7 @@ } .hero-banner { - background: linear-gradient(135deg, #f0fdf4 0%, #ecfdf5 50%, #f0fdf4 100%); + background: linear-gradient(135deg, #e6f7ed 0%, #e6f7ed 50%, #e6f7ed 100%); border-radius: 20px; padding: 80px 60px; margin-bottom: 40px; @@ -76,7 +76,7 @@ gap: 8px; padding: 8px 16px; border-radius: 999px; - background: #10b981; + background: #009A3B; color: #ffffff; font-size: 0.75rem; font-weight: 600; @@ -113,7 +113,7 @@ } .hero-title-accent { - color: #10b981; + color: #009A3B; font-style: italic; font-weight: 800; } @@ -133,7 +133,7 @@ } .btn-primary { - background: #10b981; + background: #009A3B; color: #ffffff; padding: 16px 32px; border-radius: 12px; @@ -150,7 +150,7 @@ } .btn-primary:hover { - background: #059669; + background: #007a2f; transform: translateY(-2px); box-shadow: 0 14px 30px rgba(16, 185, 129, 0.40); } @@ -172,9 +172,9 @@ } .btn-secondary:hover { - border-color: #10b981; - background: #f0fdf4; - color: #10b981; + border-color: #009A3B; + background: #e6f7ed; + color: #009A3B; } .btn-secondary i { @@ -224,8 +224,8 @@ .overlay-stat i { font-size: 1.8rem; - color: #10b981; - background: #f0fdf4; + color: #009A3B; + background: #e6f7ed; padding: 12px; border-radius: 10px; } @@ -245,7 +245,7 @@ } .btn-cta { - background: #10b981; + background: #009A3B; color: #ffffff; padding: 10px 20px; border-radius: 999px; @@ -258,13 +258,13 @@ } .btn-cta:hover { - background: #059669; + background: #007a2f; transform: translateY(-1px); } .btn-ghost { color: #1f2937; - border: 2px solid #10b981; + border: 2px solid #009A3B; background: #ffffff; padding: 10px 20px; border-radius: 999px; @@ -277,8 +277,8 @@ } .btn-ghost:hover { - background: #f0fdf4; - border-color: #059669; + background: #e6f7ed; + border-color: #007a2f; } .welcome-section { @@ -315,7 +315,7 @@ text-transform: uppercase; letter-spacing: 0.2em; font-size: 0.75rem; - color: #16a34a; + color: #009A3B; } .section-header h2 { @@ -351,7 +351,7 @@ width: 64px; height: 64px; border-radius: 16px; - background: #ecfdf5; + background: #e6f7ed; display: flex; align-items: center; justify-content: center; @@ -360,7 +360,7 @@ .feature-icon i { font-size: 28px; - color: #10b981; + color: #009A3B; } .feature-title { @@ -381,7 +381,7 @@ .feature-progress { width: 50px; height: 4px; - background: #10b981; + background: #009A3B; border-radius: 2px; margin-top: auto; } @@ -421,7 +421,7 @@ width: 40px; height: 40px; border-radius: 50%; - background: linear-gradient(135deg, #10b981, #059669); + background: linear-gradient(135deg, #009A3B, #007a2f); color: #ffffff; display: flex; align-items: center; @@ -434,7 +434,7 @@ width: 80px; height: 80px; border-radius: 20px; - background: linear-gradient(135deg, #ecfdf5, #d1fae5); + background: linear-gradient(135deg, #e6f7ed, #b3e6c8); display: flex; align-items: center; justify-content: center; @@ -443,7 +443,7 @@ .step-icon i { font-size: 36px; - color: #10b981; + color: #009A3B; } .step-title { @@ -490,7 +490,7 @@ .pricing-card:hover { transform: translateY(-5px); box-shadow: 0 12px 35px rgba(0, 0, 0, 0.1); - border-color: #10b981; + border-color: #009A3B; } .pricing-header { @@ -510,7 +510,7 @@ .price { font-size: 3rem; font-weight: 800; - color: #10b981; + color: #009A3B; margin: 0; line-height: 1; } @@ -539,13 +539,13 @@ } .pricing-features i { - color: #10b981; + color: #009A3B; font-size: 1.125rem; flex-shrink: 0; } .pricing-card.featured { - border-color: #10b981; + border-color: #009A3B; box-shadow: 0 20px 50px rgba(16, 185, 129, 0.25); transform: scale(1.05); } @@ -562,7 +562,7 @@ display: inline-flex; padding: 6px 16px; border-radius: 999px; - background: linear-gradient(135deg, #10b981, #059669); + background: linear-gradient(135deg, #009A3B, #007a2f); color: #ffffff; font-size: 0.75rem; font-weight: 700; @@ -595,14 +595,14 @@ .faq-card:hover { transform: translateY(-5px); box-shadow: 0 12px 35px rgba(0, 0, 0, 0.1); - border-color: #10b981; + border-color: #009A3B; } .faq-icon { width: 56px; height: 56px; border-radius: 14px; - background: #ecfdf5; + background: #e6f7ed; display: flex; align-items: center; justify-content: center; @@ -611,7 +611,7 @@ .faq-icon i { font-size: 24px; - color: #10b981; + color: #009A3B; } .faq-title { @@ -634,8 +634,8 @@ margin: 80px 60px 0 60px; padding: 80px 60px; border-radius: 24px; - background: linear-gradient(135deg, #10b981 0%, #059669 100%) !important; - border: 4px solid #059669 !important; + background: linear-gradient(135deg, #009A3B 0%, #007a2f 100%) !important; + border: 4px solid #007a2f !important; display: flex; flex-direction: column; align-items: center; @@ -709,7 +709,7 @@ } .btn-link-green:hover { - color: #f0fdf4; + color: #e6f7ed; } .cta-notice { @@ -754,7 +754,7 @@ .footer-logo i { font-size: 1.5rem; - color: #10b981; + color: #009A3B; } .footer-tagline { @@ -785,7 +785,7 @@ } .footer-social a:hover { - background: #10b981; + background: #009A3B; color: #ffffff; } @@ -821,7 +821,7 @@ } .footer-column a:hover { - color: #10b981; + color: #009A3B; } .footer-column.newsletter p { @@ -847,14 +847,14 @@ } .newsletter-form input:focus { - border-color: #10b981; + border-color: #009A3B; } .newsletter-form button { width: 44px; height: 44px; border-radius: 8px; - background: #10b981; + background: #009A3B; color: #ffffff; border: none; display: flex; @@ -865,7 +865,7 @@ } .newsletter-form button:hover { - background: #059669; + background: #007a2f; } .footer-bottom { @@ -899,7 +899,7 @@ } .footer-legal a:hover { - color: #10b981; + color: #009A3B; } @media (max-width: 900px) { diff --git a/CulinaryCommandApp/Components/Pages/AdminView.razor b/CulinaryCommandApp/Components/Pages/AdminView.razor index f32f9d0..0f9e401 100644 --- a/CulinaryCommandApp/Components/Pages/AdminView.razor +++ b/CulinaryCommandApp/Components/Pages/AdminView.razor @@ -2,43 +2,4 @@
Dashboard -
-
-
- - - -
-
- - - -
-
- -
-
-
-

Recent Activity

-
- - - -
- -
-
-
-
-
- diff --git a/CulinaryCommandApp/Components/Pages/Dashboard.razor b/CulinaryCommandApp/Components/Pages/Dashboard.razor index 9e8e0f0..2ceb20f 100644 --- a/CulinaryCommandApp/Components/Pages/Dashboard.razor +++ b/CulinaryCommandApp/Components/Pages/Dashboard.razor @@ -34,7 +34,32 @@ else if (!_isSignedIn) } else { -
+
+
+
+
Kitchen Operations
+

Dashboard

+

Overview of your kitchen operations, tasks, and inventory at a glance.

+
+
+
+
Location
+
@(LocationState.CurrentLocation?.Name ?? "—")
+
+
+
+
+
Low Stock
+
@_lowStockItems.Count
+
+
+
Open Tasks
+
@_taskData.Count(t => !string.Equals(t.Status, "Completed", StringComparison.OrdinalIgnoreCase))
+
+
+
+
+ @if (_role == "Admin") { diff --git a/CulinaryCommandApp/Components/Pages/Home.Tworazor.css b/CulinaryCommandApp/Components/Pages/Home.Tworazor.css index dda652e..d898040 100644 --- a/CulinaryCommandApp/Components/Pages/Home.Tworazor.css +++ b/CulinaryCommandApp/Components/Pages/Home.Tworazor.css @@ -29,7 +29,7 @@ width: 12px; height: 12px; border-radius: 999px; - background: linear-gradient(135deg, #22c55e, #10b981); + background: linear-gradient(135deg, #009A3B, #009A3B); box-shadow: 0 0 12px rgba(34, 197, 94, 0.6); } @@ -51,7 +51,7 @@ } .nav-cta { - background: #22c55e; + background: #009A3B; color: #0d1210; padding: 10px 18px; border-radius: 999px; @@ -105,7 +105,7 @@ display: block; font-family: "Source Sans 3", sans-serif; font-size: clamp(2.2rem, 4.3vw, 3.8rem); - color: #22c55e; + color: #009A3B; } .hero-card p { @@ -122,7 +122,7 @@ } .btn-primary { - background: #22c55e; + background: #009A3B; color: #0d1210; padding: 12px 20px; border-radius: 999px; @@ -151,7 +151,7 @@ } .btn-ghost:hover { - color: #22c55e; + color: #009A3B; border-color: rgba(34, 197, 94, 0.8); } @@ -294,7 +294,7 @@ .feature-card i { font-size: 1.6rem; - color: #22c55e; + color: #009A3B; margin-bottom: 10px; display: inline-block; } @@ -302,7 +302,7 @@ .step-number { font-size: 0.9rem; font-weight: 700; - color: #22c55e; + color: #009A3B; letter-spacing: 0.1em; } @@ -343,7 +343,7 @@ padding: 4px 10px; border-radius: 999px; background: rgba(34, 197, 94, 0.2); - color: #22c55e; + color: #009A3B; font-size: 0.75rem; margin-bottom: 8px; } diff --git a/CulinaryCommandApp/Components/Pages/Users/Index.razor b/CulinaryCommandApp/Components/Pages/Users/Index.razor index ba7179a..2eb1cc5 100644 --- a/CulinaryCommandApp/Components/Pages/Users/Index.razor +++ b/CulinaryCommandApp/Components/Pages/Users/Index.razor @@ -2,6 +2,4 @@ @using CulinaryCommand.Data.Entities @rendermode InteractiveServer -

Manage Users

- \ No newline at end of file diff --git a/CulinaryCommandApp/Components/Pages/Users/UserList.razor b/CulinaryCommandApp/Components/Pages/Users/UserList.razor index 6122815..ef21ce9 100644 --- a/CulinaryCommandApp/Components/Pages/Users/UserList.razor +++ b/CulinaryCommandApp/Components/Pages/Users/UserList.razor @@ -10,17 +10,35 @@ @inject LocationState LocationState @inject NavigationManager Nav -
+
-
Invite teammates and manage access per location.
+
Kitchen Operations
+

Manage Users

+

Invite teammates and manage access per location.

+
+
+
+
Location
+
@(LocationState.CurrentLocation?.Name ?? "—")
+
+
+
+
+
Total Users
+
@(_users?.Count ?? 0)
+
+
+
Active
+
@(_users?.Count(u => u.IsActive) ?? 0)
+
+
+ @if (priv) + { + + }
- - @if (priv) - { - - }
@if (_users == null) diff --git a/CulinaryCommandApp/Components/Pages/Users/UserList.razor.css b/CulinaryCommandApp/Components/Pages/Users/UserList.razor.css index aa19686..6f38829 100644 --- a/CulinaryCommandApp/Components/Pages/Users/UserList.razor.css +++ b/CulinaryCommandApp/Components/Pages/Users/UserList.razor.css @@ -1,3 +1,5 @@ +h1 { margin: 0 0 4px; } + .users-acc { padding: 4px; } .users-acc-item{ border-radius: 14px; diff --git a/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryCatalog.razor b/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryCatalog.razor index 6e02cab..be33910 100644 --- a/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryCatalog.razor +++ b/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryCatalog.razor @@ -29,10 +29,28 @@ } else { -
-
-

Inventory Catalog

-

@(LocationState.CurrentLocation is not null ? $"{LocationState.CurrentLocation.Name} — ingredient catalog" : "Manage your ingredient catalog")

+
+
+
Inventory Management
+

Inventory Catalog

+

Manage your ingredient catalog, costs, and stock levels in one place.

+
+
+
+
Location
+
@(LocationState.CurrentLocation?.Name ?? "—")
+
+
+
+
+
Total Items
+
@itemCatalog.Count
+
+
+
Low Stock
+
@itemCatalog.Count(i => i.IsLowStock)
+
+
@@ -399,12 +417,14 @@ private string GetCategoryClass(string? category) => category switch { - "Grains & Pasta" => "category-grains", - "Dairy" => "category-dairy", - "Oils & Sauces" => "category-oils", - "Vegetables" => "category-vegetables", - "Meat & Poultry" => "category-meat", - _ => "category-default" + "Produce" => "category-produce", + "Dairy" => "category-dairy", + "Meat" => "category-meat", + "Dry Goods" => "category-dry-goods", + "Beverages" => "category-beverages", + "Condiments" => "category-condiments", + "Spices" => "category-spices", + _ => "category-default" }; private bool IsPageSelected => pagedItems.Count > 0 && pagedItems.All(i => selectedIds.Contains(i.Id)); diff --git a/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryCatalog.razor.css b/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryCatalog.razor.css index 88288a0..988580a 100644 --- a/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryCatalog.razor.css +++ b/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryCatalog.razor.css @@ -1,23 +1,9 @@ -:root { - --ink: #1f2a37; - --muted: #6b7280; - --border: #e5e7eb; - --bg: #f6f7f9; - --card: #ffffff; - --green: #0a8f3c; - --green-dark: #087136; - --pill: #f0f2f5; - --shadow: 0 10px 30px rgba(31, 42, 55, 0.08); -} - .inventory-container { - max-width: 1280px; - margin: 0 auto; - padding: 24px 24px 40px; - background: var(--bg); + padding: 24px 0 40px; + background: var(--cc-bg); min-height: 100vh; font-family: "Source Sans 3", "Segoe UI", sans-serif; - color: var(--ink); + color: var(--cc-ink); } .inventory-container button, @@ -27,38 +13,21 @@ transition: all 0.2s ease; } -.inventory-header { - background: var(--card); - border-radius: 16px; - padding: 22px 26px; - box-shadow: var(--shadow); - border: 1px solid var(--border); - margin-bottom: 18px; -} - -.header-text h1 { - font-family: "Space Grotesk", "Source Sans 3", sans-serif; - font-size: 1.6rem; +.inventory-container h1 { margin: 0 0 4px; } -.header-text p { - margin: 0; - color: var(--muted); - font-size: 0.95rem; -} - .inventory-toolbar { display: flex; gap: 16px; align-items: center; justify-content: space-between; flex-wrap: wrap; - background: var(--card); + background: var(--cc-card); border-radius: 16px; padding: 16px 18px; - border: 1px solid var(--border); - box-shadow: var(--shadow); + border: 1px solid var(--cc-border); + box-shadow: var(--cc-shadow); margin-bottom: 14px; } @@ -68,14 +37,14 @@ gap: 10px; flex: 2 1 520px; background: #f9fafb; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); border-radius: 12px; padding: 10px 14px; min-width: 360px; } .search-bar i { - color: var(--muted); + color: var(--cc-muted); } .search-bar input { @@ -97,20 +66,20 @@ width: 36px; height: 36px; border-radius: 10px; - border: 1px solid var(--green); - background: var(--green); + border: 1px solid var(--cc-green); + background: var(--cc-green); display: inline-flex; align-items: center; justify-content: center; - color: var(--ink); + color: #ffffff; transition: all 0.2s ease; font-weight: 600; } .icon-btn:hover { - color: var(--ink); - border-color: var(--green-dark); - background: var(--green-dark); + color: #ffffff; + border-color: var(--cc-green-dark); + background: var(--cc-green-dark); box-shadow: 0 6px 12px rgba(10, 143, 60, 0.25); } @@ -120,15 +89,15 @@ .select-wrap .form-select { border-radius: 10px; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); padding: 8px 30px 8px 12px; font-size: 0.9rem; background-color: #ffffff; } .btn-add { - background: var(--green); - color: var(--ink); + background: var(--cc-green); + color: #ffffff; border: none; padding: 9px 14px; border-radius: 10px; @@ -141,7 +110,8 @@ } .btn-add:hover { - background: var(--green-dark); + background: var(--cc-green-dark); + color: #ffffff; transform: translateY(-1px); } @@ -153,35 +123,35 @@ } .tab-btn { - border: 1px solid var(--green); + border: 1px solid var(--cc-green); background: #ffffff; padding: 8px 14px; border-radius: 999px; font-weight: 600; font-size: 0.9rem; - color: var(--ink); + color: var(--cc-ink); transition: all 0.2s ease; } .tab-btn:hover { - background: var(--green); + background: var(--cc-green); color: #ffffff; - border-color: var(--green); + border-color: var(--cc-green); box-shadow: 0 4px 12px rgba(10, 143, 60, 0.2); } .tab-btn.active { - background: var(--green); - color: var(--ink); - border-color: var(--green); + background: var(--cc-green); + color: #ffffff; + border-color: var(--cc-green); box-shadow: 0 4px 12px rgba(10, 143, 60, 0.25); } .inventory-table-container { - background: var(--card); + background: var(--cc-card); border-radius: 16px; - border: 1px solid var(--border); - box-shadow: var(--shadow); + border: 1px solid var(--cc-border); + box-shadow: var(--cc-shadow); overflow: hidden; } @@ -192,8 +162,8 @@ } .inventory-table thead { - background: var(--green); - color: var(--ink); + background: var(--cc-green); + color: #ffffff; } .inventory-table thead th { @@ -212,7 +182,7 @@ } .inventory-table tbody tr { - border-bottom: 1px solid var(--border); + border-bottom: 1px solid var(--cc-border); background: #ffffff; } @@ -236,12 +206,12 @@ .name-cell .item-name { font-weight: 600; - color: var(--ink); + color: var(--cc-ink); } .name-cell .item-sku { font-size: 0.78rem; - color: var(--muted); + color: var(--cc-muted); margin-top: 2px; } @@ -252,35 +222,53 @@ border-radius: 999px; font-size: 0.75rem; font-weight: 700; - background: var(--pill); + background: var(--cc-pill); color: #1f2a37; } -.category-grains { - background: #fbbf24; - color: #78350f; +/* Produce — green */ +.category-produce { + background: #009A3B; + color: #ffffff; } +/* Dairy — soft purple */ .category-dairy { - background: #a855f7; - color: #fafafa; + background: #7c3aed; + color: #ffffff; } -.category-oils { - background: #eab308; - color: #713f12; +/* Meat — red */ +.category-meat { + background: #dc2626; + color: #ffffff; } -.category-vegetables { - background: #22c55e; - color: #fafafa; +/* Dry Goods — warm amber */ +.category-dry-goods { + background: #d97706; + color: #ffffff; } -.category-meat { - background: #ef4444; - color: #fafafa; +/* Beverages — teal/cyan */ +.category-beverages { + background: #0891b2; + color: #ffffff; } +/* Condiments — orange */ +.category-condiments { + background: #ea580c; + color: #ffffff; +} + +/* Spices — warm brown-red */ +.category-spices { + background: #b45309; + color: #ffffff; +} + +/* Fallback */ .category-default { background: #6b7280; color: #ffffff; @@ -300,13 +288,13 @@ display: inline-flex; align-items: center; justify-content: center; - color: var(--ink); + color: var(--cc-ink); transition: all 0.2s ease; font-weight: 600; } .btn-action:hover { - color: var(--ink); + color: var(--cc-ink); border-color: #9ca3af; background: #e5e7eb; transform: translateY(-1px); @@ -316,11 +304,11 @@ .btn-action.delete { background: #ef4444; border-color: #ef4444; - color: var(--ink); + color: #ffffff; } .btn-action.delete:hover { - color: var(--ink); + color: #ffffff; border-color: #dc2626; background: #dc2626; box-shadow: 0 6px 12px rgba(239, 68, 68, 0.3); @@ -335,7 +323,7 @@ } .footer-count { - color: var(--muted); + color: var(--cc-muted); font-size: 0.85rem; } @@ -350,12 +338,12 @@ width: 32px; height: 32px; border-radius: 8px; - border: 1px solid #d1fae5; + border: 1px solid #b3e6c8; background: #ffffff; display: inline-flex; align-items: center; justify-content: center; - color: var(--green); + color: var(--cc-green); font-size: 0.85rem; font-weight: 600; transition: all 0.2s ease; @@ -363,22 +351,22 @@ .page-btn:hover, .page-nav:hover { - background: var(--green); + background: var(--cc-green); color: #ffffff; - border-color: var(--green); + border-color: var(--cc-green); box-shadow: 0 6px 12px rgba(10, 143, 60, 0.25); } .page-btn.active { - background: var(--green); - border-color: var(--green); + background: var(--cc-green); + border-color: var(--cc-green); color: #ffffff; box-shadow: 0 6px 12px rgba(10, 143, 60, 0.25); } .page-ellipsis { padding: 0 6px; - color: var(--muted); + color: var(--cc-muted); } /* Modal */ @@ -406,15 +394,15 @@ .modal-content-custom { background: #ffffff; border-radius: 18px; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); overflow: hidden; - box-shadow: var(--shadow); + box-shadow: var(--cc-shadow); } .modal-header-custom { padding: 18px 22px; - background: var(--green); - color: var(--ink); + background: var(--cc-green); + color: var(--cc-ink); display: flex; justify-content: space-between; align-items: center; @@ -428,7 +416,7 @@ .btn-close-custom { border: none; background: rgba(31, 42, 55, 0.1); - color: var(--ink); + color: var(--cc-ink); width: 32px; height: 32px; border-radius: 10px; @@ -444,7 +432,7 @@ .modal-body-custom label { display: block; font-weight: 700; - color: var(--ink); + color: var(--cc-ink); margin-bottom: 8px; font-size: 0.95rem; } @@ -455,13 +443,13 @@ border-radius: 8px; padding: 10px 12px; font-size: 0.95rem; - color: var(--ink); + color: var(--cc-ink); background-color: #ffffff; } .modal-body-custom .form-control:focus, .modal-body-custom .form-select:focus { - border-color: var(--green); + border-color: var(--cc-green); box-shadow: 0 0 0 3px rgba(10, 143, 60, 0.1); outline: none; } @@ -472,7 +460,7 @@ display: flex; justify-content: flex-end; gap: 10px; - border-top: 1px solid var(--border); + border-top: 1px solid var(--cc-border); } .modal-footer-custom .btn { @@ -484,7 +472,7 @@ .modal-footer-custom .btn-secondary { background: #e5e7eb; border-color: #e5e7eb; - color: var(--ink); + color: var(--cc-ink); } .modal-footer-custom .btn-secondary:hover { @@ -493,15 +481,15 @@ } .modal-footer-custom .btn-success { - background: var(--green); - border-color: var(--green); - color: var(--ink); + background: var(--cc-green); + border-color: var(--cc-green); + color: #ffffff; } .modal-footer-custom .btn-success:hover { - background: var(--green-dark); - border-color: var(--green-dark); - color: var(--ink); + background: var(--cc-green-dark); + border-color: var(--cc-green-dark); + color: #ffffff; } /* Loading Spinner */ @@ -509,7 +497,7 @@ width: 3rem; height: 3rem; border-width: 0.3rem; - border-color: var(--green); + border-color: var(--cc-green); border-right-color: transparent; animation: spin 0.8s linear infinite; } diff --git a/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryManagement.razor.css b/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryManagement.razor.css index c7ed0cf..b791440 100644 --- a/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryManagement.razor.css +++ b/CulinaryCommandApp/Inventory/Pages/Inventory/InventoryManagement.razor.css @@ -1,23 +1,11 @@ -:root { - --ink: #1f2a37; - --muted: #6b7280; - --border: #e5e7eb; - --bg: #f6f7f9; - --card: #ffffff; - --green: #0a8f3c; - --green-dark: #087136; - --pill: #f0f2f5; - --shadow: 0 10px 30px rgba(31, 42, 55, 0.08); -} - .inventory-container { max-width: 1280px; margin: 0 auto; padding: 24px 24px 40px; - background: var(--bg); + background: var(--cc-bg); min-height: 100vh; font-family: "Source Sans 3", "Segoe UI", sans-serif; - color: var(--ink); + color: var(--cc-ink); } .inventory-container button, @@ -28,11 +16,11 @@ } .inventory-header { - background: var(--card); + background: var(--cc-card); border-radius: 16px; padding: 22px 26px; - box-shadow: var(--shadow); - border: 1px solid var(--border); + box-shadow: var(--cc-shadow); + border: 1px solid var(--cc-border); margin-bottom: 18px; } @@ -44,7 +32,7 @@ .header-text p { margin: 0; - color: var(--muted); + color: var(--cc-muted); font-size: 0.95rem; } @@ -54,11 +42,11 @@ align-items: center; justify-content: space-between; flex-wrap: wrap; - background: var(--card); + background: var(--cc-card); border-radius: 16px; padding: 16px 18px; - border: 1px solid var(--border); - box-shadow: var(--shadow); + border: 1px solid var(--cc-border); + box-shadow: var(--cc-shadow); margin-bottom: 14px; } @@ -68,14 +56,14 @@ gap: 10px; flex: 2 1 520px; background: #f9fafb; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); border-radius: 12px; padding: 10px 14px; min-width: 360px; } .search-bar i { - color: var(--muted); + color: var(--cc-muted); } .search-bar input { @@ -97,27 +85,27 @@ width: 36px; height: 36px; border-radius: 10px; - border: 1px solid var(--green); - background: var(--green); + border: 1px solid var(--cc-green); + background: var(--cc-green); display: inline-flex; align-items: center; justify-content: center; - color: var(--ink); + color: var(--cc-ink); transition: all 0.2s ease; font-weight: 600; } .icon-btn:hover { - color: var(--ink); - border-color: var(--green-dark); - background: var(--green-dark); + color: var(--cc-ink); + border-color: var(--cc-green-dark); + background: var(--cc-green-dark); box-shadow: 0 6px 12px rgba(10, 143, 60, 0.25); } .icon-btn.selected, .icon-btn.active { - background: var(--green); - border-color: var(--green); + background: var(--cc-green); + border-color: var(--cc-green); box-shadow: 0 6px 12px rgba(10, 143, 60, 0.3); } @@ -127,15 +115,15 @@ .select-wrap .form-select { border-radius: 10px; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); padding: 8px 30px 8px 12px; font-size: 0.9rem; background-color: #ffffff; } .btn-add { - background: var(--green); - color: var(--ink); + background: var(--cc-green); + color: var(--cc-ink); border: none; padding: 9px 14px; border-radius: 10px; @@ -148,7 +136,7 @@ } .btn-add:hover { - background: var(--green-dark); + background: var(--cc-green-dark); transform: translateY(-1px); } @@ -160,36 +148,36 @@ } .tab-btn { - border: 1px solid var(--green); + border: 1px solid var(--cc-green); background: #ffffff; padding: 8px 14px; border-radius: 999px; font-weight: 600; font-size: 0.9rem; - color: var(--ink); + color: var(--cc-ink); transition: all 0.2s ease; } .tab-btn:hover { - background: var(--green); + background: var(--cc-green); color: #ffffff; - border-color: var(--green); + border-color: var(--cc-green); box-shadow: 0 4px 12px rgba(10, 143, 60, 0.2); } .tab-btn.active, .tab-btn.selected { - background: var(--green); - color: var(--ink); - border-color: var(--green); + background: var(--cc-green); + color: var(--cc-ink); + border-color: var(--cc-green); box-shadow: 0 4px 12px rgba(10, 143, 60, 0.25); } .inventory-table-container { - background: var(--card); + background: var(--cc-card); border-radius: 16px; - border: 1px solid var(--border); - box-shadow: var(--shadow); + border: 1px solid var(--cc-border); + box-shadow: var(--cc-shadow); overflow: hidden; } @@ -200,8 +188,8 @@ } .inventory-table thead { - background: var(--green); - color: var(--ink); + background: var(--cc-green); + color: var(--cc-ink); } .inventory-table thead th { @@ -220,7 +208,7 @@ } .inventory-table tbody tr { - border-bottom: 1px solid var(--border); + border-bottom: 1px solid var(--cc-border); background: #ffffff; } @@ -244,12 +232,12 @@ .name-cell .item-name { font-weight: 600; - color: var(--ink); + color: var(--cc-ink); } .name-cell .item-sku { font-size: 0.78rem; - color: var(--muted); + color: var(--cc-muted); margin-top: 2px; } @@ -260,7 +248,7 @@ border-radius: 999px; font-size: 0.75rem; font-weight: 700; - background: var(--pill); + background: var(--cc-pill); color: #1f2a37; } @@ -280,7 +268,7 @@ } .category-vegetables { - background: #22c55e; + background: #009A3B; color: #fafafa; } @@ -330,13 +318,13 @@ display: inline-flex; align-items: center; justify-content: center; - color: var(--ink); + color: var(--cc-ink); transition: all 0.2s ease; font-weight: 600; } .btn-action:hover { - color: var(--ink); + color: var(--cc-ink); border-color: #9ca3af; background: #e5e7eb; transform: translateY(-1px); @@ -346,11 +334,11 @@ .btn-action.delete { background: #ef4444; border-color: #ef4444; - color: var(--ink); + color: var(--cc-ink); } .btn-action.delete:hover { - color: var(--ink); + color: var(--cc-ink); border-color: #dc2626; background: #dc2626; box-shadow: 0 6px 12px rgba(239, 68, 68, 0.3); @@ -358,9 +346,9 @@ .btn-action.selected, .btn-action.active { - background: var(--green); - border-color: var(--green); - color: var(--ink); + background: var(--cc-green); + border-color: var(--cc-green); + color: var(--cc-ink); box-shadow: 0 6px 12px rgba(10, 143, 60, 0.3); } @@ -368,7 +356,7 @@ .btn-action.delete.active { background: #dc2626; border-color: #dc2626; - color: var(--ink); + color: var(--cc-ink); box-shadow: 0 6px 12px rgba(239, 68, 68, 0.3); } @@ -381,7 +369,7 @@ } .footer-count { - color: var(--muted); + color: var(--cc-muted); font-size: 0.85rem; } @@ -396,12 +384,12 @@ width: 32px; height: 32px; border-radius: 8px; - border: 1px solid #d1fae5; + border: 1px solid #b3e6c8; background: #ffffff; display: inline-flex; align-items: center; justify-content: center; - color: var(--green); + color: var(--cc-green); font-size: 0.85rem; font-weight: 600; transition: all 0.2s ease; @@ -409,23 +397,23 @@ .page-btn:hover, .page-nav:hover { - background: var(--green); + background: var(--cc-green); color: #ffffff; - border-color: var(--green); + border-color: var(--cc-green); box-shadow: 0 6px 12px rgba(10, 143, 60, 0.25); } .page-btn.active, .page-btn.selected { - background: var(--green); - border-color: var(--green); + background: var(--cc-green); + border-color: var(--cc-green); color: #ffffff; box-shadow: 0 6px 12px rgba(10, 143, 60, 0.25); } .page-ellipsis { padding: 0 6px; - color: var(--muted); + color: var(--cc-muted); } /* Modal */ @@ -453,15 +441,15 @@ .modal-content-custom { background: #ffffff; border-radius: 18px; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); overflow: hidden; - box-shadow: var(--shadow); + box-shadow: var(--cc-shadow); } .modal-header-custom { padding: 18px 22px; - background: var(--green); - color: var(--ink); + background: var(--cc-green); + color: var(--cc-ink); display: flex; justify-content: space-between; align-items: center; @@ -475,7 +463,7 @@ .btn-close-custom { border: none; background: rgba(31, 42, 55, 0.1); - color: var(--ink); + color: var(--cc-ink); width: 32px; height: 32px; border-radius: 10px; @@ -491,7 +479,7 @@ .modal-body-custom label { display: block; font-weight: 700; - color: var(--ink); + color: var(--cc-ink); margin-bottom: 8px; font-size: 0.95rem; } @@ -502,13 +490,13 @@ border-radius: 8px; padding: 10px 12px; font-size: 0.95rem; - color: var(--ink); + color: var(--cc-ink); background-color: #ffffff; } .modal-body-custom .form-control:focus, .modal-body-custom .form-select:focus { - border-color: var(--green); + border-color: var(--cc-green); box-shadow: 0 0 0 3px rgba(10, 143, 60, 0.1); outline: none; } @@ -519,7 +507,7 @@ display: flex; justify-content: flex-end; gap: 10px; - border-top: 1px solid var(--border); + border-top: 1px solid var(--cc-border); } .modal-footer-custom .btn { @@ -531,7 +519,7 @@ .modal-footer-custom .btn-secondary { background: #e5e7eb; border-color: #e5e7eb; - color: var(--ink); + color: var(--cc-ink); } .modal-footer-custom .btn-secondary:hover { @@ -540,15 +528,15 @@ } .modal-footer-custom .btn-success { - background: var(--green); - border-color: var(--green); - color: var(--ink); + background: var(--cc-green); + border-color: var(--cc-green); + color: var(--cc-ink); } .modal-footer-custom .btn-success:hover { - background: var(--green-dark); - border-color: var(--green-dark); - color: var(--ink); + background: var(--cc-green-dark); + border-color: var(--cc-green-dark); + color: var(--cc-ink); } /* Loading Spinner */ @@ -556,7 +544,7 @@ width: 3rem; height: 3rem; border-width: 0.3rem; - border-color: var(--green); + border-color: var(--cc-green); border-right-color: transparent; animation: spin 0.8s linear infinite; } diff --git a/CulinaryCommandApp/PurchaseOrder/Pages/PurchaseOrderList.razor b/CulinaryCommandApp/PurchaseOrder/Pages/PurchaseOrderList.razor index a07856a..caff213 100644 --- a/CulinaryCommandApp/PurchaseOrder/Pages/PurchaseOrderList.razor +++ b/CulinaryCommandApp/PurchaseOrder/Pages/PurchaseOrderList.razor @@ -1,14 +1,37 @@ @inject NavigationManager Nav @inject IJSRuntime Js @inject CulinaryCommand.Data.AppDbContext Db +@inject LocationState LocationState @using Microsoft.EntityFrameworkCore @rendermode InteractiveServer -

Purchase Orders

- - +
+
+
Kitchen Operations
+

Purchase Orders

+

Create and track purchase orders for your location's suppliers.

+
+
+
+
Location
+
@(LocationState.CurrentLocation?.Name ?? "—")
+
+
+
+
+
Total
+
@(items?.Count ?? 0)
+
+
+
Pending
+
@(items?.Count(o => o.Status == "Pending") ?? 0)
+
+
+ +
+
@if (items == null) { diff --git a/CulinaryCommandApp/Recipe/Pages/RecipeList.razor b/CulinaryCommandApp/Recipe/Pages/RecipeList.razor index 0ca866d..2df8b31 100644 --- a/CulinaryCommandApp/Recipe/Pages/RecipeList.razor +++ b/CulinaryCommandApp/Recipe/Pages/RecipeList.razor @@ -26,10 +26,28 @@ else
@* ── Header ── *@ -
-
-

Recipes

-

Manage your location's recipes and prep items

+
+
+
Kitchen Operations
+

Recipes

+

Manage your location's recipes and prep items.

+
+
+
+
Location
+
@(LocationState.CurrentLocation?.Name ?? "—")
+
+
+
+
+
Total
+
@_allRecipes.Count
+
+
+
Sub-Recipes
+
@_allRecipes.Count(r => r.IsSubRecipe)
+
+
@@ -140,7 +158,7 @@ else @if (!string.IsNullOrWhiteSpace(recipe.Category)) { - @recipe.Category + @recipe.Category } else { @@ -418,6 +436,18 @@ else return _sortAsc ? "bi-chevron-up" : "bi-chevron-down"; } + private string GetCategoryClass(string? category) => category switch + { + "Produce" => "category-produce", + "Dairy" => "category-dairy", + "Meat" => "category-meat", + "Dry Goods" => "category-dry-goods", + "Beverages" => "category-beverages", + "Condiments" => "category-condiments", + "Spices" => "category-spices", + _ => "category-default" + }; + private void GoToPage(int page) { if (page < 1 || page > _totalPages) return; diff --git a/CulinaryCommandApp/Recipe/Pages/RecipeList.razor.css b/CulinaryCommandApp/Recipe/Pages/RecipeList.razor.css index a9d2787..9d79a8d 100644 --- a/CulinaryCommandApp/Recipe/Pages/RecipeList.razor.css +++ b/CulinaryCommandApp/Recipe/Pages/RecipeList.razor.css @@ -1,25 +1,11 @@ -:root { - --ink: #1f2a37; - --muted: #6b7280; - --border: #e5e7eb; - --bg: #f6f7f9; - --card: #ffffff; - --green: #0a8f3c; - --green-dark: #087136; - --pill: #f0f2f5; - --shadow: 0 10px 30px rgba(31, 42, 55, 0.08); -} - /* ── Layout ──────────────────────────────────────────────────────────────── */ .recipes-container { - max-width: 1280px; - margin: 0 auto; - padding: 24px 24px 40px; - background: var(--bg); + padding: 24px 0 40px; + background: var(--cc-bg); min-height: 100vh; font-family: "Source Sans 3", "Segoe UI", sans-serif; - color: var(--ink); + color: var(--cc-ink); } .recipes-container button, @@ -31,27 +17,10 @@ /* ── Header ──────────────────────────────────────────────────────────────── */ -.recipes-header { - background: var(--card); - border-radius: 16px; - padding: 22px 26px; - box-shadow: var(--shadow); - border: 1px solid var(--border); - margin-bottom: 18px; -} - -.header-text h1 { - font-family: "Space Grotesk", "Source Sans 3", sans-serif; - font-size: 1.6rem; +.recipes-container h1 { margin: 0 0 4px; } -.header-text p { - margin: 0; - color: var(--muted); - font-size: 0.95rem; -} - /* ── Toolbar ─────────────────────────────────────────────────────────────── */ .recipes-toolbar { @@ -60,11 +29,11 @@ align-items: center; justify-content: space-between; flex-wrap: wrap; - background: var(--card); + background: var(--cc-card); border-radius: 16px; padding: 16px 18px; - border: 1px solid var(--border); - box-shadow: var(--shadow); + border: 1px solid var(--cc-border); + box-shadow: var(--cc-shadow); margin-bottom: 14px; } @@ -74,14 +43,14 @@ gap: 10px; flex: 2 1 400px; background: #f9fafb; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); border-radius: 12px; padding: 10px 14px; min-width: 280px; } .search-bar i { - color: var(--muted); + color: var(--cc-muted); } .search-bar input { @@ -103,33 +72,33 @@ width: 36px; height: 36px; border-radius: 10px; - border: 1px solid var(--green); - background: var(--green); + border: 1px solid var(--cc-green); + background: var(--cc-green); display: inline-flex; align-items: center; justify-content: center; - color: var(--ink); + color: #ffffff; transition: all 0.2s ease; font-weight: 600; } .icon-btn:hover { - background: var(--green-dark); - border-color: var(--green-dark); + background: var(--cc-green-dark); + border-color: var(--cc-green-dark); box-shadow: 0 6px 12px rgba(10, 143, 60, 0.25); } .select-wrap .form-select { border-radius: 10px; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); padding: 8px 30px 8px 12px; font-size: 0.9rem; background-color: #ffffff; } .btn-add { - background: var(--green); - color: var(--ink); + background: var(--cc-green); + color: #ffffff; border: none; padding: 9px 14px; border-radius: 10px; @@ -142,7 +111,8 @@ } .btn-add:hover { - background: var(--green-dark); + background: var(--cc-green-dark); + color: #ffffff; transform: translateY(-1px); } @@ -156,37 +126,37 @@ } .tab-btn { - border: 1px solid var(--green); + border: 1px solid var(--cc-green); background: #ffffff; padding: 8px 14px; border-radius: 999px; font-weight: 600; font-size: 0.9rem; - color: var(--ink); + color: var(--cc-ink); transition: all 0.2s ease; } .tab-btn:hover { - background: var(--green); + background: var(--cc-green); color: #ffffff; - border-color: var(--green); + border-color: var(--cc-green); box-shadow: 0 4px 12px rgba(10, 143, 60, 0.2); } .tab-btn.active { - background: var(--green); - color: var(--ink); - border-color: var(--green); + background: var(--cc-green); + color: #ffffff; + border-color: var(--cc-green); box-shadow: 0 4px 12px rgba(10, 143, 60, 0.25); } /* ── Table ───────────────────────────────────────────────────────────────── */ .recipes-table-container { - background: var(--card); + background: var(--cc-card); border-radius: 16px; - border: 1px solid var(--border); - box-shadow: var(--shadow); + border: 1px solid var(--cc-border); + box-shadow: var(--cc-shadow); overflow: hidden; } @@ -197,8 +167,8 @@ } .recipes-table thead { - background: var(--green); - color: var(--ink); + background: var(--cc-green); + color: #ffffff; } .recipes-table thead th { @@ -218,7 +188,7 @@ } .recipes-table tbody tr { - border-bottom: 1px solid var(--border); + border-bottom: 1px solid var(--cc-border); background: #ffffff; } @@ -239,7 +209,7 @@ .name-cell .item-name { font-weight: 600; - color: var(--ink); + color: var(--cc-ink); } .category-pill { @@ -249,8 +219,8 @@ border-radius: 999px; font-size: 0.75rem; font-weight: 700; - background: var(--pill); - color: var(--ink); + background: var(--cc-pill); + color: var(--cc-ink); } .cost-badge { @@ -260,7 +230,7 @@ border-radius: 8px; font-size: 0.82rem; font-weight: 700; - background: #dcfce7; + background: #c8efd9; color: #166534; } @@ -287,19 +257,19 @@ width: 30px; height: 30px; border-radius: 8px; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); background: #ffffff; display: inline-flex; align-items: center; justify-content: center; - color: var(--muted); + color: var(--cc-muted); font-size: 0.85rem; transition: all 0.15s ease; } .btn-action:hover { background: #f3f4f6; - color: var(--ink); + color: var(--cc-ink); border-color: #d1d5db; } @@ -318,13 +288,13 @@ .empty-icon { font-size: 2.5rem; - color: var(--muted); + color: var(--cc-muted); display: block; margin-bottom: 12px; } .empty-state p { - color: var(--muted); + color: var(--cc-muted); margin-bottom: 16px; } @@ -335,14 +305,14 @@ align-items: center; justify-content: space-between; padding: 14px 18px; - border-top: 1px solid var(--border); + border-top: 1px solid var(--cc-border); flex-wrap: wrap; gap: 10px; } .footer-count { font-size: 0.88rem; - color: var(--muted); + color: var(--cc-muted); } .pagination { @@ -356,26 +326,26 @@ width: 32px; height: 32px; border-radius: 8px; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); background: #ffffff; display: inline-flex; align-items: center; justify-content: center; font-size: 0.85rem; - color: var(--ink); + color: var(--cc-ink); transition: all 0.15s ease; } .page-nav:hover, .page-btn:hover { - background: var(--green); - border-color: var(--green); + background: var(--cc-green); + border-color: var(--cc-green); color: #ffffff; } .page-btn.active { - background: var(--green); - border-color: var(--green); + background: var(--cc-green); + border-color: var(--cc-green); color: #ffffff; font-weight: 700; } @@ -386,6 +356,17 @@ } .page-ellipsis { - color: var(--muted); + color: var(--cc-muted); font-size: 0.85rem; } + +/* ── Category pill colors ────────────────────────────────────────────────── */ + +.category-produce { background: #009A3B; color: #ffffff; } +.category-dairy { background: #7c3aed; color: #ffffff; } +.category-meat { background: #dc2626; color: #ffffff; } +.category-dry-goods { background: #d97706; color: #ffffff; } +.category-beverages { background: #0891b2; color: #ffffff; } +.category-condiments { background: #ea580c; color: #ffffff; } +.category-spices { background: #b45309; color: #ffffff; } +.category-default { background: #6b7280; color: #ffffff; } diff --git a/CulinaryCommandApp/Recipe/Pages/RecipeView.razor.css b/CulinaryCommandApp/Recipe/Pages/RecipeView.razor.css index 0291ff2..6837e9b 100644 --- a/CulinaryCommandApp/Recipe/Pages/RecipeView.razor.css +++ b/CulinaryCommandApp/Recipe/Pages/RecipeView.razor.css @@ -1,13 +1,3 @@ -:root { - --ink: #1f2a37; - --muted: #6b7280; - --border: #e5e7eb; - --bg: #f6f7f9; - --card: #ffffff; - --green: #0a8f3c; - --shadow: 0 10px 30px rgba(31, 42, 55, 0.08); -} - /* ── Layout ─────────────────────────────────────────────────────────────── */ .rv-container { @@ -15,18 +5,18 @@ margin: 0 auto; padding: 24px 24px 48px; font-family: "Source Sans 3", "Segoe UI", sans-serif; - color: var(--ink); - background: var(--bg); + color: var(--cc-ink); + background: var(--cc-bg); min-height: 100vh; } /* ── Header card ─────────────────────────────────────────────────────────── */ .rv-header-card { - background: var(--card); + background: var(--cc-card); border-radius: 16px; - border: 1px solid var(--border); - box-shadow: var(--shadow); + border: 1px solid var(--cc-border); + box-shadow: var(--cc-shadow); padding: 24px 28px; margin-bottom: 20px; display: flex; @@ -55,7 +45,7 @@ font-size: 1.75rem; font-weight: 700; margin: 0; - color: var(--ink); + color: var(--cc-ink); } .rv-sub-badge { @@ -86,17 +76,17 @@ font-size: 0.78rem; font-weight: 700; background: #f0f2f5; - color: var(--ink); + color: var(--cc-ink); } .rv-pill-type { - background: #f0fdf4; + background: #e6f7ed; color: #166534; } .rv-meta-text { font-size: 0.85rem; - color: var(--muted); + color: var(--cc-muted); } /* ── Stats ───────────────────────────────────────────────────────────────── */ @@ -118,19 +108,19 @@ font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; - color: var(--muted); + color: var(--cc-muted); } .rv-stat-value { font-size: 1.15rem; font-weight: 700; - color: var(--ink); + color: var(--cc-ink); } .rv-stat-unit { font-size: 0.9rem; font-weight: 500; - color: var(--muted); + color: var(--cc-muted); } .rv-cost { @@ -156,10 +146,10 @@ /* ── Shared card ─────────────────────────────────────────────────────────── */ .rv-card { - background: var(--card); + background: var(--cc-card); border-radius: 16px; - border: 1px solid var(--border); - box-shadow: var(--shadow); + border: 1px solid var(--cc-border); + box-shadow: var(--cc-shadow); overflow: hidden; } @@ -171,9 +161,9 @@ font-size: 0.95rem; text-transform: uppercase; letter-spacing: 0.04em; - background: var(--green); - color: var(--ink); - border-bottom: 1px solid var(--border); + background: var(--cc-green); + color: var(--cc-ink); + border-bottom: 1px solid var(--cc-border); } .rv-count-badge { @@ -187,7 +177,7 @@ .rv-empty { padding: 24px 20px; - color: var(--muted); + color: var(--cc-muted); font-style: italic; margin: 0; } @@ -202,7 +192,7 @@ .rv-table thead tr { background: #f9fafb; - border-bottom: 1px solid var(--border); + border-bottom: 1px solid var(--cc-border); } .rv-table thead th { @@ -211,11 +201,11 @@ font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.02em; - color: var(--muted); + color: var(--cc-muted); } .rv-table tbody tr { - border-bottom: 1px solid var(--border); + border-bottom: 1px solid var(--cc-border); } .rv-table tbody tr:last-child { @@ -228,7 +218,7 @@ } .rv-sort-num { - color: var(--muted); + color: var(--cc-muted); font-size: 0.82rem; width: 36px; text-align: center; @@ -246,7 +236,7 @@ } .rv-prepnote { - color: var(--muted); + color: var(--cc-muted); font-style: italic; font-size: 0.88rem; } @@ -264,7 +254,7 @@ display: flex; gap: 16px; padding: 18px 20px; - border-bottom: 1px solid var(--border); + border-bottom: 1px solid var(--cc-border); counter-increment: step-counter; } @@ -280,8 +270,8 @@ min-width: 32px; height: 32px; border-radius: 999px; - background: var(--green); - color: var(--ink); + background: var(--cc-green); + color: var(--cc-ink); font-weight: 700; font-size: 0.88rem; flex-shrink: 0; @@ -296,7 +286,7 @@ margin: 0 0 10px; font-size: 0.95rem; line-height: 1.6; - color: var(--ink); + color: var(--cc-ink); } .rv-step-instructions:only-child { @@ -315,7 +305,7 @@ padding: 3px 10px; border-radius: 8px; background: #f3f4f6; - border: 1px solid var(--border); + border: 1px solid var(--cc-border); font-size: 0.8rem; - color: var(--muted); + color: var(--cc-muted); } diff --git a/CulinaryCommandApp/wwwroot/css/app.css b/CulinaryCommandApp/wwwroot/css/app.css index 6fd4d76..614f5df 100644 --- a/CulinaryCommandApp/wwwroot/css/app.css +++ b/CulinaryCommandApp/wwwroot/css/app.css @@ -1,3 +1,16 @@ +/* Brand CSS variables — global so they work across all scoped component stylesheets */ +:root { + --cc-ink: #1f2a37; + --cc-muted: #6b7280; + --cc-border: #e5e7eb; + --cc-bg: #f6f7f9; + --cc-card: #ffffff; + --cc-green: #009A3B; + --cc-green-dark: #007a2f; + --cc-pill: #f0f2f5; + --cc-shadow: 0 10px 30px rgba(31, 42, 55, 0.08); +} + /* Feedback Button Styles */ .feedback-fixed { position: fixed; @@ -133,6 +146,39 @@ a, border-color: #1861ac; } +/* Brand green overrides for Bootstrap success utilities */ +.btn-success, +.btn-success:focus { + background-color: #009A3B; + border-color: #009A3B; + color: #fff; +} +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.show > .btn-success.dropdown-toggle { + background-color: #007a2f; + border-color: #007a2f; + color: #fff; +} +.btn-outline-success { + color: #009A3B; + border-color: #009A3B; +} +.btn-outline-success:hover { + background-color: #009A3B; + border-color: #009A3B; + color: #fff; +} +.bg-success { background-color: #009A3B !important; } +.text-success { color: #009A3B !important; } +.border-success { border-color: #009A3B !important; } +.badge.text-bg-success, +.text-bg-success { background-color: #009A3B !important; color: #fff !important; } +.bg-success-subtle { background-color: #e6f7ed !important; } +.border-success-subtle { border-color: #b3e6c8 !important; } +.text-success-emphasis { color: #007a2f !important; } + .btn:focus, .btn:active:focus, .btn-link.nav-link:focus, From 3a6c5e3c427aa5118d6430caf5dbae718d1f854a Mon Sep 17 00:00:00 2001 From: Anthony Phan <131195703+antphan12@users.noreply.github.com> Date: Tue, 14 Apr 2026 19:07:14 -0500 Subject: [PATCH 2/2] Fixed missing objects and errors --- CulinaryCommandApp/Components/Pages/Dashboard.razor | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CulinaryCommandApp/Components/Pages/Dashboard.razor b/CulinaryCommandApp/Components/Pages/Dashboard.razor index ebda77b..b251589 100644 --- a/CulinaryCommandApp/Components/Pages/Dashboard.razor +++ b/CulinaryCommandApp/Components/Pages/Dashboard.razor @@ -6,8 +6,11 @@ @using CulinaryCommandApp.AIDashboard.Services.Reporting @using CulinaryCommandApp.AIDashboard.Services.DTOs @using CulinaryCommand.Services +@using CulinaryCommandApp.Inventory.DTOs +@using CulinaryCommandApp.Data.Models @inject Microsoft.AspNetCore.Hosting.IWebHostEnvironment Env @inject NavigationManager Nav +@inject LocationState LocationState @inject AIReportingService ReportingService @inject IUserContextService UserCtx @@ -169,6 +172,9 @@ else private bool _isSignedIn; private string? _role; + private List _lowStockItems = new(); + private List _taskData = new(); + private bool _aiLoading; private string? _aiAnalysis; private AIAnalysisResultDTO? _aiAnalysisObj;