- {users.map((user) => (
-
- ))}
+
+
+
Admin Panel
+
+ {users.map((user) => (
+
+ ))}
+
)
diff --git a/frontend/src/pages/GroceryList.jsx b/frontend/src/pages/GroceryList.jsx
index 7b4dd0e..a1430d6 100644
--- a/frontend/src/pages/GroceryList.jsx
+++ b/frontend/src/pages/GroceryList.jsx
@@ -20,18 +20,20 @@ import SimilarItemModal from "../components/modals/SimilarItemModal";
import { ZONE_FLOW } from "../constants/classifications";
import { ROLES } from "../constants/roles";
import { AuthContext } from "../context/AuthContext";
+import { SettingsContext } from "../context/SettingsContext";
import "../styles/pages/GroceryList.css";
import { findSimilarItems } from "../utils/stringSimilarity";
export default function GroceryList() {
const { role } = useContext(AuthContext);
+ const { settings } = useContext(SettingsContext);
// === State === //
const [items, setItems] = useState([]);
const [recentlyBoughtItems, setRecentlyBoughtItems] = useState([]);
- const [recentlyBoughtDisplayCount, setRecentlyBoughtDisplayCount] = useState(10);
- const [sortMode, setSortMode] = useState("zone");
+ const [recentlyBoughtDisplayCount, setRecentlyBoughtDisplayCount] = useState(settings.recentlyBoughtCount);
+ const [sortMode, setSortMode] = useState(settings.defaultSortMode);
const [suggestions, setSuggestions] = useState([]);
const [showAddForm, setShowAddForm] = useState(true);
const [loading, setLoading] = useState(true);
@@ -42,6 +44,7 @@ export default function GroceryList() {
const [similarItemSuggestion, setSimilarItemSuggestion] = useState(null);
const [showEditModal, setShowEditModal] = useState(false);
const [editingItem, setEditingItem] = useState(null);
+ const [recentlyBoughtCollapsed, setRecentlyBoughtCollapsed] = useState(settings.recentlyBoughtCollapsed);
// === Data Loading ===
@@ -459,34 +462,47 @@ export default function GroceryList() {
)}
- {recentlyBoughtItems.length > 0 && (
+ {recentlyBoughtItems.length > 0 && settings.showRecentlyBought && (
<>
-
Recently Bought (24HR)
-
- {recentlyBoughtItems.slice(0, recentlyBoughtDisplayCount).map((item) => (
-
- ))}
-
- {recentlyBoughtDisplayCount < recentlyBoughtItems.length && (
-
-
-
+
+
Recently Bought (24HR)
+
+
+
+ {!recentlyBoughtCollapsed && (
+ <>
+
+ {recentlyBoughtItems.slice(0, recentlyBoughtDisplayCount).map((item) => (
+
+ ))}
+
+ {recentlyBoughtDisplayCount < recentlyBoughtItems.length && (
+
+
+
+ )}
+ >
)}
>
)}
diff --git a/frontend/src/pages/Settings.jsx b/frontend/src/pages/Settings.jsx
new file mode 100644
index 0000000..c05c482
--- /dev/null
+++ b/frontend/src/pages/Settings.jsx
@@ -0,0 +1,250 @@
+import { useContext, useState } from "react";
+import { SettingsContext } from "../context/SettingsContext";
+import "../styles/pages/Settings.css";
+
+
+export default function Settings() {
+ const { settings, updateSettings, resetSettings } = useContext(SettingsContext);
+ const [activeTab, setActiveTab] = useState("appearance");
+
+
+ const handleThemeChange = (theme) => {
+ updateSettings({ theme });
+ };
+
+
+ const handleToggle = (key) => {
+ updateSettings({ [key]: !settings[key] });
+ };
+
+
+ const handleNumberChange = (key, value) => {
+ updateSettings({ [key]: parseInt(value, 10) });
+ };
+
+
+ const handleSelectChange = (key, value) => {
+ updateSettings({ [key]: value });
+ };
+
+
+ const handleReset = () => {
+ if (window.confirm("Reset all settings to defaults?")) {
+ resetSettings();
+ }
+ };
+
+
+ return (
+
+
+
Settings
+
+
+
+
+
+
+
+
+ {/* Appearance Tab */}
+ {activeTab === "appearance" && (
+
+
Appearance
+
+
+
+
+
+
+
+
+
+ Auto mode follows your system preferences
+
+
+
+
+
+
+ Show more items on screen with reduced spacing
+
+
+
+ )}
+
+ {/* List Display Tab */}
+ {activeTab === "list" && (
+
+
List Display
+
+
+
+
+
+ Your preferred sorting method when opening the list
+
+
+
+
+
+
+ Display items bought in the last 24 hours
+
+
+
+ {settings.showRecentlyBought && (
+ <>
+
+
+
handleNumberChange("recentlyBoughtCount", e.target.value)}
+ className="settings-range"
+ />
+
+ Number of items to show initially (5-50)
+
+
+
+
+
+
+ Start with the section collapsed
+
+
+ >
+ )}
+
+ )}
+
+ {/* Behavior Tab */}
+ {activeTab === "behavior" && (
+
+
Behavior
+
+
+
+
+ Show confirmation modal when marking items as bought
+
+
+
+
+
+
handleNumberChange("autoReloadInterval", e.target.value)}
+ className="settings-range"
+ />
+
+ Automatically refresh the list every X minutes (0 = disabled)
+
+
+
+
+
+
+ Vibrate on long-press and other interactions
+
+
+
+ )}
+
+
+
+
+
+
+
+ );
+}
diff --git a/frontend/src/styles/AddImageModal.css b/frontend/src/styles/AddImageModal.css
index 4a34dc5..49ea8e0 100644
--- a/frontend/src/styles/AddImageModal.css
+++ b/frontend/src/styles/AddImageModal.css
@@ -4,40 +4,40 @@
left: 0;
width: 100%;
height: 100%;
- background: rgba(0, 0, 0, 0.6);
+ background: var(--modal-backdrop-bg);
display: flex;
justify-content: center;
align-items: center;
- z-index: 1000;
+ z-index: var(--z-modal);
animation: fadeIn 0.2s ease-out;
}
.add-image-modal {
- background: white;
- padding: 2em;
- border-radius: 12px;
+ background: var(--modal-bg);
+ padding: var(--spacing-xl);
+ border-radius: var(--border-radius-xl);
max-width: 500px;
width: 90%;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
+ box-shadow: var(--shadow-xl);
animation: slideUp 0.3s ease-out;
}
.add-image-modal h2 {
- margin: 0 0 0.5em 0;
- font-size: 1.5em;
- color: #333;
+ margin: 0 0 var(--spacing-sm) 0;
+ font-size: var(--font-size-2xl);
+ color: var(--color-text-primary);
text-align: center;
}
.add-image-subtitle {
- margin: 0 0 1.5em 0;
- color: #666;
+ margin: 0 0 var(--spacing-xl) 0;
+ color: var(--color-text-secondary);
font-size: 0.95em;
text-align: center;
}
.add-image-subtitle strong {
- color: #007bff;
+ color: var(--color-primary);
}
.add-image-options {
@@ -48,32 +48,33 @@
}
.add-image-option-btn {
- padding: 1.2em;
- border: 2px solid #ddd;
- border-radius: 8px;
- background: white;
- font-size: 1.1em;
+ padding: var(--spacing-lg);
+ border: var(--border-width-medium) solid var(--color-border-light);
+ border-radius: var(--border-radius-lg);
+ background: var(--color-bg-surface);
+ font-size: var(--font-size-lg);
cursor: pointer;
- transition: all 0.2s;
+ transition: var(--transition-base);
display: flex;
align-items: center;
justify-content: center;
- gap: 0.5em;
+ gap: var(--spacing-sm);
+ color: var(--color-text-primary);
}
.add-image-option-btn:hover {
- border-color: #007bff;
- background: #f8f9fa;
+ border-color: var(--color-primary);
+ background: var(--color-bg-hover);
transform: translateY(-2px);
- box-shadow: 0 2px 8px rgba(0, 123, 255, 0.2);
+ box-shadow: var(--shadow-md);
}
.add-image-option-btn.camera {
- color: #007bff;
+ color: var(--color-primary);
}
.add-image-option-btn.gallery {
- color: #28a745;
+ color: var(--color-success);
}
.add-image-preview-container {
@@ -86,9 +87,10 @@
position: relative;
width: 250px;
height: 250px;
- border: 2px solid #ddd;
- border-radius: 8px;
+ border: var(--border-width-medium) solid var(--color-border-light);
+ border-radius: var(--border-radius-lg);
overflow: hidden;
+ background: var(--color-gray-100);
}
.add-image-preview img {
diff --git a/frontend/src/styles/ConfirmBuyModal.css b/frontend/src/styles/ConfirmBuyModal.css
index ab1dcd4..7db66ea 100644
--- a/frontend/src/styles/ConfirmBuyModal.css
+++ b/frontend/src/styles/ConfirmBuyModal.css
@@ -4,21 +4,21 @@
left: 0;
width: 100%;
height: 100%;
- background: rgba(0, 0, 0, 0.6);
+ background: var(--modal-backdrop-bg);
display: flex;
justify-content: center;
align-items: center;
- z-index: 1000;
+ z-index: var(--z-modal);
animation: fadeIn 0.2s ease-out;
}
.confirm-buy-modal {
- background: white;
- padding: 1em;
- border-radius: 12px;
+ background: var(--modal-bg);
+ padding: var(--spacing-md);
+ border-radius: var(--border-radius-xl);
max-width: 450px;
width: 90%;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
+ box-shadow: var(--shadow-xl);
animation: slideUp 0.3s ease-out;
}
@@ -29,7 +29,7 @@
.confirm-buy-zone {
font-size: 0.85em;
- color: #666;
+ color: var(--color-text-secondary);
font-weight: 500;
margin-bottom: 0.2em;
text-transform: uppercase;
@@ -39,7 +39,7 @@
.confirm-buy-item-name {
margin: 0;
font-size: 1.2em;
- color: #007bff;
+ color: var(--color-primary);
font-weight: 600;
}
@@ -54,14 +54,14 @@
.confirm-buy-nav-btn {
width: 35px;
height: 35px;
- border: 2px solid #007bff;
- border-radius: 50%;
- background: white;
- color: #007bff;
+ border: var(--border-width-medium) solid var(--color-primary);
+ border-radius: var(--border-radius-full);
+ background: var(--color-bg-surface);
+ color: var(--color-primary);
font-size: 1.8em;
font-weight: bold;
cursor: pointer;
- transition: all 0.2s;
+ transition: var(--transition-base);
display: flex;
align-items: center;
justify-content: center;
@@ -71,13 +71,13 @@
}
.confirm-buy-nav-btn:hover:not(:disabled) {
- background: #007bff;
- color: white;
+ background: var(--color-primary);
+ color: var(--color-text-inverse);
}
.confirm-buy-nav-btn:disabled {
- border-color: #ccc;
- color: #ccc;
+ border-color: var(--color-border-medium);
+ color: var(--color-text-disabled);
cursor: not-allowed;
}
@@ -87,10 +87,10 @@
display: flex;
align-items: center;
justify-content: center;
- border: 2px solid #ddd;
- border-radius: 8px;
+ border: var(--border-width-medium) solid var(--color-border-light);
+ border-radius: var(--border-radius-lg);
overflow: hidden;
- background: #f8f9fa;
+ background: var(--color-gray-100);
}
.confirm-buy-image {
@@ -101,7 +101,7 @@
.confirm-buy-image-placeholder {
font-size: 4em;
- color: #ccc;
+ color: var(--color-border-medium);
}
.confirm-buy-quantity-section {
@@ -118,14 +118,14 @@
.confirm-buy-counter-btn {
width: 45px;
height: 45px;
- border: 2px solid #007bff;
- border-radius: 8px;
- background: white;
- color: #007bff;
+ border: var(--border-width-medium) solid var(--color-primary);
+ border-radius: var(--border-radius-lg);
+ background: var(--color-bg-surface);
+ color: var(--color-primary);
font-size: 1.6em;
font-weight: bold;
cursor: pointer;
- transition: all 0.2s;
+ transition: var(--transition-base);
display: flex;
align-items: center;
justify-content: center;
@@ -134,31 +134,31 @@
}
.confirm-buy-counter-btn:hover:not(:disabled) {
- background: #007bff;
- color: white;
+ background: var(--color-primary);
+ color: var(--color-text-inverse);
}
.confirm-buy-counter-btn:disabled {
- border-color: #ccc;
- color: #ccc;
+ border-color: var(--color-border-medium);
+ color: var(--color-text-disabled);
cursor: not-allowed;
}
.confirm-buy-counter-display {
width: 70px;
height: 45px;
- border: 2px solid #ddd;
- border-radius: 8px;
+ border: var(--border-width-medium) solid var(--color-border-light);
+ border-radius: var(--border-radius-lg);
text-align: center;
font-size: 1.4em;
font-weight: bold;
- color: #333;
- background: #f8f9fa;
+ color: var(--color-text-primary);
+ background: var(--color-gray-100);
}
.confirm-buy-counter-display:focus {
outline: none;
- border-color: #007bff;
+ border-color: var(--color-primary);
}
.confirm-buy-actions {
@@ -172,30 +172,30 @@
flex: 1;
padding: 0.75em 0.5em;
border: none;
- border-radius: 8px;
+ border-radius: var(--border-radius-lg);
font-size: 0.95em;
font-weight: 600;
cursor: pointer;
- transition: all 0.2s;
+ transition: var(--transition-base);
white-space: nowrap;
}
.confirm-buy-cancel {
- background: #f0f0f0;
- color: #333;
+ background: var(--color-gray-200);
+ color: var(--color-text-primary);
}
.confirm-buy-cancel:hover {
- background: #e0e0e0;
+ background: var(--color-gray-300);
}
.confirm-buy-confirm {
- background: #28a745;
- color: white;
+ background: var(--color-success);
+ color: var(--color-text-inverse);
}
.confirm-buy-confirm:hover {
- background: #218838;
+ background: var(--color-success-hover);
}
@keyframes fadeIn {
diff --git a/frontend/src/styles/SimilarItemModal.css b/frontend/src/styles/SimilarItemModal.css
index e3930fd..73c2599 100644
--- a/frontend/src/styles/SimilarItemModal.css
+++ b/frontend/src/styles/SimilarItemModal.css
@@ -4,46 +4,46 @@
left: 0;
width: 100%;
height: 100%;
- background: rgba(0, 0, 0, 0.6);
+ background: var(--modal-backdrop-bg);
display: flex;
justify-content: center;
align-items: center;
- z-index: 1000;
+ z-index: var(--z-modal);
animation: fadeIn 0.2s ease-out;
}
.similar-item-modal {
- background: white;
- padding: 2em;
- border-radius: 12px;
+ background: var(--modal-bg);
+ padding: var(--spacing-xl);
+ border-radius: var(--border-radius-xl);
max-width: 500px;
width: 90%;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
+ box-shadow: var(--shadow-xl);
animation: slideUp 0.3s ease-out;
}
.similar-item-modal h2 {
- margin: 0 0 1em 0;
- font-size: 1.5em;
- color: #333;
+ margin: 0 0 var(--spacing-md) 0;
+ font-size: var(--font-size-2xl);
+ color: var(--color-text-primary);
text-align: center;
}
.similar-item-question {
- margin: 0 0 0.5em 0;
- font-size: 1.1em;
- color: #333;
+ margin: 0 0 var(--spacing-sm) 0;
+ font-size: var(--font-size-lg);
+ color: var(--color-text-primary);
text-align: center;
}
.similar-item-question strong {
- color: #007bff;
+ color: var(--color-primary);
}
.similar-item-clarification {
- margin: 0 0 2em 0;
- font-size: 0.9em;
- color: #666;
+ margin: 0 0 var(--spacing-xl) 0;
+ font-size: var(--font-size-sm);
+ color: var(--color-text-secondary);
text-align: center;
font-style: italic;
}
@@ -58,40 +58,40 @@
.similar-item-no,
.similar-item-yes {
flex: 1;
- padding: 0.8em;
+ padding: var(--button-padding-y) var(--button-padding-x);
border: none;
- border-radius: 6px;
- font-size: 1em;
+ border-radius: var(--button-border-radius);
+ font-size: var(--font-size-base);
cursor: pointer;
- transition: all 0.2s;
- font-weight: 500;
+ transition: var(--transition-base);
+ font-weight: var(--button-font-weight);
}
.similar-item-cancel {
- background: #f0f0f0;
- color: #333;
+ background: var(--color-gray-200);
+ color: var(--color-text-primary);
}
.similar-item-cancel:hover {
- background: #e0e0e0;
+ background: var(--color-gray-300);
}
.similar-item-no {
- background: #6c757d;
- color: white;
+ background: var(--color-secondary);
+ color: var(--color-text-inverse);
}
.similar-item-no:hover {
- background: #5a6268;
+ background: var(--color-secondary-hover);
}
.similar-item-yes {
- background: #28a745;
- color: white;
+ background: var(--color-success);
+ color: var(--color-text-inverse);
}
.similar-item-yes:hover {
- background: #218838;
+ background: var(--color-success-hover);
}
@keyframes fadeIn {
diff --git a/frontend/src/styles/UserRoleCard.css b/frontend/src/styles/UserRoleCard.css
index eaee92a..b391637 100644
--- a/frontend/src/styles/UserRoleCard.css
+++ b/frontend/src/styles/UserRoleCard.css
@@ -2,39 +2,52 @@
display: flex;
justify-content: space-between;
align-items: center;
- padding: 1rem;
- margin: 0.5rem 0;
- background: #f5f5f5;
- border-radius: 8px;
- border: 1px solid #ddd;
+ padding: var(--spacing-md);
+ margin: var(--spacing-sm) 0;
+ background: var(--color-bg-surface);
+ border-radius: var(--border-radius-lg);
+ border: var(--border-width-thin) solid var(--color-border-light);
+ box-shadow: var(--shadow-sm);
+ transition: var(--transition-base);
+}
+
+.user-card:hover {
+ box-shadow: var(--shadow-md);
}
.user-info {
display: flex;
flex-direction: column;
- gap: 0.25rem;
+ gap: var(--spacing-xs);
}
.user-username {
- color: #666;
- font-size: 0.9rem;
+ color: var(--color-text-secondary);
+ font-size: var(--font-size-sm);
+}
+
+.user-info h3 {
+ color: var(--color-text-primary);
+ margin: 0;
}
.role-select {
- padding: 0.5rem;
- border-radius: 4px;
- border: 1px solid #ccc;
- background: white;
+ padding: var(--spacing-sm);
+ border-radius: var(--border-radius-sm);
+ border: var(--border-width-thin) solid var(--input-border-color);
+ background: var(--color-bg-surface);
+ color: var(--color-text-primary);
cursor: pointer;
- font-size: 0.9rem;
+ font-size: var(--font-size-sm);
+ transition: var(--transition-base);
}
.role-select:hover {
- border-color: #007bff;
+ border-color: var(--color-primary);
}
.role-select:focus {
outline: none;
- border-color: #007bff;
- box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1);
+ border-color: var(--input-focus-border-color);
+ box-shadow: var(--input-focus-shadow);
}
diff --git a/frontend/src/styles/components/AddItemForm.css b/frontend/src/styles/components/AddItemForm.css
index 0511311..acb5491 100644
--- a/frontend/src/styles/components/AddItemForm.css
+++ b/frontend/src/styles/components/AddItemForm.css
@@ -29,6 +29,12 @@
font-family: var(--font-family-base);
transition: var(--transition-base);
width: 100%;
+ background: var(--color-bg-surface);
+ color: var(--color-text-primary);
+}
+
+.add-item-form-input::placeholder {
+ color: var(--color-text-muted);
}
.add-item-form-input:focus {
@@ -107,6 +113,8 @@
font-family: var(--font-family-base);
text-align: center;
transition: var(--transition-base);
+ background: var(--color-bg-surface);
+ color: var(--color-text-primary);
-moz-appearance: textfield; /* Remove spinner in Firefox */
}
@@ -133,7 +141,8 @@
border-radius: var(--button-border-radius);
font-size: var(--font-size-base);
font-weight: var(--button-font-weight);
- cursor: pointer;
+ flex: 1;
+ min-width: 120px
transition: var(--transition-base);
margin-top: var(--spacing-sm);
}
@@ -150,12 +159,13 @@
.add-item-form-submit.disabled,
.add-item-form-submit:disabled {
- background: var(--color-bg-disabled);
- color: var(--color-text-disabled);
+ background: var(--color-gray-400);
+ color: var(--color-gray-600);
cursor: not-allowed;
- opacity: 0.6;
+ opacity: 1;
box-shadow: none;
transform: none;
+ border: var(--border-width-thin) solid var(--color-gray-500);
}
/* Responsive */
diff --git a/frontend/src/styles/components/AddItemWithDetailsModal.css b/frontend/src/styles/components/AddItemWithDetailsModal.css
index f503dec..da8e9eb 100644
--- a/frontend/src/styles/components/AddItemWithDetailsModal.css
+++ b/frontend/src/styles/components/AddItemWithDetailsModal.css
@@ -4,43 +4,43 @@
left: 0;
right: 0;
bottom: 0;
- background: rgba(0, 0, 0, 0.6);
+ background: var(--modal-backdrop-bg);
display: flex;
align-items: center;
justify-content: center;
- z-index: 1000;
- padding: 1em;
+ z-index: var(--z-modal);
+ padding: var(--spacing-md);
}
.add-item-details-modal {
- background: white;
- border-radius: 12px;
- padding: 1.5em;
+ background: var(--modal-bg);
+ border-radius: var(--border-radius-xl);
+ padding: var(--spacing-xl);
max-width: 500px;
width: 100%;
max-height: 90vh;
overflow-y: auto;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
+ box-shadow: var(--shadow-xl);
}
.add-item-details-title {
- font-size: 1.4em;
- margin: 0 0 0.3em 0;
+ font-size: var(--font-size-xl);
+ margin: 0 0 var(--spacing-xs) 0;
text-align: center;
- color: #333;
+ color: var(--color-text-primary);
}
.add-item-details-subtitle {
text-align: center;
- color: #666;
- margin: 0 0 1.5em 0;
- font-size: 0.9em;
+ color: var(--color-text-secondary);
+ margin: 0 0 var(--spacing-xl) 0;
+ font-size: var(--font-size-sm);
}
.add-item-details-section {
- margin-bottom: 1.5em;
- padding-bottom: 1.5em;
- border-bottom: 1px solid #e0e0e0;
+ margin-bottom: var(--spacing-xl);
+ padding-bottom: var(--spacing-xl);
+ border-bottom: var(--border-width-thin) solid var(--color-border-light);
}
.add-item-details-section:last-of-type {
@@ -48,9 +48,9 @@
}
.add-item-details-section-title {
- font-size: 1.1em;
- margin: 0 0 1em 0;
- color: #555;
+ font-size: var(--font-size-lg);
+ margin: 0 0 var(--spacing-md) 0;
+ color: var(--color-text-secondary);
font-weight: 600;
}
@@ -68,27 +68,27 @@
.add-item-details-image-btn {
flex: 1;
min-width: 140px;
- padding: 0.8em;
+ padding: var(--button-padding-y) var(--button-padding-x);
font-size: 0.95em;
- border: 2px solid #007bff;
- background: white;
- color: #007bff;
- border-radius: 8px;
+ border: var(--border-width-medium) solid var(--color-primary);
+ background: var(--color-bg-surface);
+ color: var(--color-primary);
+ border-radius: var(--border-radius-lg);
cursor: pointer;
- font-weight: 600;
- transition: all 0.2s;
+ font-weight: var(--button-font-weight);
+ transition: var(--transition-base);
}
.add-item-details-image-btn:hover {
- background: #007bff;
- color: white;
+ background: var(--color-primary);
+ color: var(--color-text-inverse);
}
.add-item-details-image-preview {
position: relative;
- border-radius: 8px;
+ border-radius: var(--border-radius-lg);
overflow: hidden;
- border: 2px solid #e0e0e0;
+ border: var(--border-width-medium) solid var(--color-border-light);
}
.add-item-details-image-preview img {
diff --git a/frontend/src/styles/components/ClassificationSection.css b/frontend/src/styles/components/ClassificationSection.css
index 1b06669..77692cc 100644
--- a/frontend/src/styles/components/ClassificationSection.css
+++ b/frontend/src/styles/components/ClassificationSection.css
@@ -1,44 +1,45 @@
/* Classification Section */
.classification-section {
- margin-bottom: 1.5rem;
+ margin-bottom: var(--spacing-xl);
}
.classification-title {
- font-size: 1em;
+ font-size: var(--font-size-base);
font-weight: 600;
- margin-bottom: 0.8rem;
- color: #333;
+ margin-bottom: var(--spacing-md);
+ color: var(--color-text-primary);
}
.classification-field {
- margin-bottom: 1rem;
+ margin-bottom: var(--spacing-md);
}
.classification-field label {
display: block;
- font-size: 0.9em;
+ font-size: var(--font-size-sm);
font-weight: 500;
- margin-bottom: 0.4rem;
- color: #555;
+ margin-bottom: var(--spacing-xs);
+ color: var(--color-text-secondary);
}
.classification-select {
width: 100%;
- padding: 0.6rem;
- font-size: 1em;
- border: 1px solid #ccc;
- border-radius: 4px;
- background: white;
+ padding: var(--input-padding-y) var(--input-padding-x);
+ font-size: var(--font-size-base);
+ border: var(--border-width-thin) solid var(--input-border-color);
+ border-radius: var(--input-border-radius);
+ background: var(--color-bg-surface);
+ color: var(--color-text-primary);
cursor: pointer;
- transition: border-color 0.2s;
+ transition: var(--transition-base);
}
.classification-select:focus {
outline: none;
- border-color: #007bff;
- box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.1);
+ border-color: var(--input-focus-border-color);
+ box-shadow: var(--input-focus-shadow);
}
.classification-select:hover {
- border-color: #999;
+ border-color: var(--color-border-dark);
}
diff --git a/frontend/src/styles/components/EditItemModal.css b/frontend/src/styles/components/EditItemModal.css
index ab86854..272ff05 100644
--- a/frontend/src/styles/components/EditItemModal.css
+++ b/frontend/src/styles/components/EditItemModal.css
@@ -4,36 +4,36 @@
left: 0;
right: 0;
bottom: 0;
- background: rgba(0, 0, 0, 0.6);
+ background: var(--modal-backdrop-bg);
display: flex;
align-items: center;
justify-content: center;
- z-index: 1000;
- padding: 1em;
+ z-index: var(--z-modal);
+ padding: var(--spacing-md);
}
.edit-modal-content {
- background: white;
- border-radius: 12px;
- padding: 1.5em;
+ background: var(--modal-bg);
+ border-radius: var(--border-radius-xl);
+ padding: var(--spacing-xl);
max-width: 480px;
width: 100%;
max-height: 90vh;
overflow-y: auto;
- box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
+ box-shadow: var(--shadow-xl);
}
.edit-modal-title {
- font-size: 1.5em;
- margin: 0 0 1em 0;
+ font-size: var(--font-size-2xl);
+ margin: 0 0 var(--spacing-md) 0;
text-align: center;
- color: #333;
+ color: var(--color-text-primary);
}
.edit-modal-subtitle {
- font-size: 1.1em;
- margin: 0.5em 0 0.8em 0;
- color: #555;
+ font-size: var(--font-size-lg);
+ margin: var(--spacing-sm) 0 var(--spacing-md) 0;
+ color: var(--color-text-secondary);
}
.edit-modal-field {
@@ -42,33 +42,36 @@
.edit-modal-field label {
display: block;
- margin-bottom: 0.3em;
+ margin-bottom: var(--spacing-xs);
font-weight: 600;
- color: #333;
+ color: var(--color-text-primary);
font-size: 0.95em;
}
.edit-modal-input,
.edit-modal-select {
width: 100%;
- padding: 0.6em;
- font-size: 1em;
- border: 1px solid #ccc;
- border-radius: 6px;
+ padding: var(--input-padding-y) var(--input-padding-x);
+ font-size: var(--font-size-base);
+ border: var(--border-width-thin) solid var(--input-border-color);
+ border-radius: var(--input-border-radius);
box-sizing: border-box;
- transition: border-color 0.2s;
+ transition: var(--transition-base);
+ background: var(--color-bg-surface);
+ color: var(--color-text-primary);
}
.edit-modal-input:focus,
.edit-modal-select:focus {
outline: none;
- border-color: #007bff;
+ border-color: var(--input-focus-border-color);
+ box-shadow: var(--input-focus-shadow);
}
.edit-modal-divider {
height: 1px;
- background: #e0e0e0;
- margin: 1.5em 0;
+ background: var(--color-border-light);
+ margin: var(--spacing-xl) 0;
}
.edit-modal-actions {
@@ -79,13 +82,13 @@
.edit-modal-btn {
flex: 1;
- padding: 0.7em;
- font-size: 1em;
+ padding: var(--button-padding-y) var(--button-padding-x);
+ font-size: var(--font-size-base);
border: none;
- border-radius: 6px;
+ border-radius: var(--button-border-radius);
cursor: pointer;
- font-weight: 600;
- transition: all 0.2s;
+ font-weight: var(--button-font-weight);
+ transition: var(--transition-base);
}
.edit-modal-btn:disabled {
@@ -94,39 +97,39 @@
}
.edit-modal-btn-cancel {
- background: #6c757d;
- color: white;
+ background: var(--color-secondary);
+ color: var(--color-text-inverse);
}
.edit-modal-btn-cancel:hover:not(:disabled) {
- background: #5a6268;
+ background: var(--color-secondary-hover);
}
.edit-modal-btn-save {
- background: #007bff;
- color: white;
+ background: var(--color-primary);
+ color: var(--color-text-inverse);
}
.edit-modal-btn-save:hover:not(:disabled) {
- background: #0056b3;
+ background: var(--color-primary-hover);
}
.edit-modal-btn-image {
width: 100%;
- padding: 0.7em;
- font-size: 1em;
- border: 2px solid #28a745;
- border-radius: 6px;
+ padding: var(--button-padding-y) var(--button-padding-x);
+ font-size: var(--font-size-base);
+ border: var(--border-width-medium) solid var(--color-success);
+ border-radius: var(--button-border-radius);
cursor: pointer;
- font-weight: 600;
- transition: all 0.2s;
- background: white;
- color: #28a745;
+ font-weight: var(--button-font-weight);
+ transition: var(--transition-base);
+ background: var(--color-bg-surface);
+ color: var(--color-success);
}
.edit-modal-btn-image:hover:not(:disabled) {
- background: #28a745;
- color: white;
+ background: var(--color-success);
+ color: var(--color-text-inverse);
}
.edit-modal-btn-image:disabled {
diff --git a/frontend/src/styles/components/SuggestionList.css b/frontend/src/styles/components/SuggestionList.css
new file mode 100644
index 0000000..c3dcdf7
--- /dev/null
+++ b/frontend/src/styles/components/SuggestionList.css
@@ -0,0 +1,42 @@
+/* Suggestion List Component */
+.suggestion-list {
+ background: var(--color-bg-surface);
+ border: 2px solid var(--color-border-medium);
+ border-radius: var(--border-radius-md);
+ max-height: 200px;
+ overflow-y: auto;
+ list-style: none;
+ padding: var(--spacing-xs);
+ margin: 0;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
+ position: relative;
+ z-index: 100;
+}
+
+.suggestion-item {
+ padding: var(--spacing-sm) var(--spacing-md);
+ cursor: pointer;
+ border-radius: var(--border-radius-sm);
+ background: var(--color-bg-hover);
+ color: var(--color-text-primary);
+ transition: var(--transition-fast);
+ font-size: var(--font-size-base);
+ margin-bottom: var(--spacing-xs);
+ border: 1px solid var(--color-border-light);
+}
+
+.suggestion-item:last-child {
+ margin-bottom: 0;
+}
+
+.suggestion-item:hover {
+ background: var(--color-primary-light);
+ color: var(--color-primary);
+ font-weight: 500;
+ border-color: var(--color-primary);
+}
+
+.suggestion-item:active {
+ background: var(--color-primary);
+ color: var(--color-text-inverse);
+}
diff --git a/frontend/src/styles/pages/AdminPanel.css b/frontend/src/styles/pages/AdminPanel.css
new file mode 100644
index 0000000..e5bd149
--- /dev/null
+++ b/frontend/src/styles/pages/AdminPanel.css
@@ -0,0 +1,41 @@
+/* Admin Panel Page */
+.admin-panel-page {
+ padding: var(--spacing-lg);
+ min-height: 100vh;
+}
+
+.admin-panel-container {
+ max-width: 800px;
+ margin: 0 auto;
+ background: var(--color-bg-surface);
+ padding: var(--spacing-xl);
+ border-radius: var(--border-radius-lg);
+ box-shadow: var(--shadow-card);
+}
+
+.admin-panel-title {
+ font-size: var(--font-size-3xl);
+ font-weight: 700;
+ color: var(--color-text-primary);
+ margin: 0 0 var(--spacing-xl) 0;
+ text-align: center;
+}
+
+.admin-panel-users {
+ margin-top: var(--spacing-xl);
+}
+
+/* Mobile Responsive */
+@media (max-width: 768px) {
+ .admin-panel-page {
+ padding: var(--spacing-md);
+ }
+
+ .admin-panel-container {
+ padding: var(--spacing-lg);
+ }
+
+ .admin-panel-title {
+ font-size: var(--font-size-2xl);
+ }
+}
diff --git a/frontend/src/styles/pages/GroceryList.css b/frontend/src/styles/pages/GroceryList.css
index 9748444..541cb09 100644
--- a/frontend/src/styles/pages/GroceryList.css
+++ b/frontend/src/styles/pages/GroceryList.css
@@ -31,6 +31,40 @@
padding-top: var(--spacing-md);
}
+.glist-section-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-top: var(--spacing-xl);
+ border-top: var(--border-width-medium) solid var(--color-border-light);
+ padding-top: var(--spacing-md);
+}
+
+.glist-section-header .glist-section-title {
+ margin: 0;
+ border: none;
+ padding: 0;
+ text-align: left;
+}
+
+.glist-collapse-btn {
+ font-size: var(--font-size-sm);
+ padding: var(--spacing-xs) var(--spacing-md);
+ cursor: pointer;
+ border: var(--border-width-thin) solid var(--color-border-medium);
+ background: var(--color-bg-surface);
+ color: var(--color-text-secondary);
+ border-radius: var(--button-border-radius);
+ transition: var(--transition-base);
+ font-weight: var(--button-font-weight);
+}
+
+.glist-collapse-btn:hover {
+ background: var(--color-bg-hover);
+ color: var(--color-text-primary);
+ border-color: var(--color-primary);
+}
+
/* Classification Groups */
.glist-classification-group {
margin-bottom: var(--spacing-xl);
@@ -94,49 +128,52 @@
/* Suggestion dropdown */
.glist-suggest-box {
- background: #fff;
- border: 1px solid #ccc;
+ background: var(--color-bg-surface);
+ border: var(--border-width-thin) solid var(--color-border-medium);
max-height: 150px;
overflow-y: auto;
position: absolute;
- z-index: 999;
- border-radius: 8px;
- box-shadow: 0 0 10px rgba(0,0,0,0.08);
- padding: 1em;
+ z-index: var(--z-dropdown);
+ border-radius: var(--border-radius-lg);
+ box-shadow: var(--shadow-card);
+ padding: var(--spacing-md);
width: calc(100% - 8em);
max-width: 440px;
margin: 0 auto;
}
.glist-suggest-item {
- padding: 0.5em;
- padding-inline: 2em;
+ padding: var(--spacing-sm);
+ padding-inline: var(--spacing-xl);
cursor: pointer;
+ color: var(--color-text-primary);
+ border-radius: var(--border-radius-sm);
+ transition: var(--transition-fast);
}
.glist-suggest-item:hover {
- background: #eee;
+ background: var(--color-bg-hover);
}
/* Grocery list items */
.glist-ul {
list-style: none;
padding: 0;
- margin-top: 1em;
+ margin-top: var(--spacing-md);
}
.glist-li {
- background: #fff;
- border: 1px solid #e0e0e0;
- border-radius: 8px;
- margin-bottom: 0.8em;
+ background: var(--color-bg-surface);
+ border: var(--border-width-thin) solid var(--color-border-light);
+ border-radius: var(--border-radius-lg);
+ margin-bottom: var(--spacing-sm);
cursor: pointer;
- transition: box-shadow 0.2s, transform 0.2s;
+ transition: box-shadow var(--transition-base), transform var(--transition-base);
overflow: hidden;
}
.glist-li:hover {
- box-shadow: 0 2px 8px rgba(0,0,0,0.1);
+ box-shadow: var(--shadow-md);
transform: translateY(-2px);
}
@@ -151,21 +188,21 @@
width: 50px;
height: 50px;
min-width: 50px;
- background: #f5f5f5;
- border: 2px solid #e0e0e0;
- border-radius: 8px;
+ background: var(--color-gray-100);
+ border: var(--border-width-medium) solid var(--color-border-light);
+ border-radius: var(--border-radius-lg);
display: flex;
align-items: center;
justify-content: center;
font-size: 2em;
- color: #ccc;
+ color: var(--color-border-medium);
overflow: hidden;
position: relative;
}
.glist-item-image.has-image {
- border-color: #007bff;
- background: #fff;
+ border-color: var(--color-primary);
+ background: var(--color-bg-surface);
}
.glist-item-image img {
@@ -176,7 +213,7 @@
.glist-item-image.has-image:hover {
opacity: 0.8;
- box-shadow: 0 0 8px rgba(0, 123, 255, 0.3);
+ box-shadow: 0 0 8px var(--color-primary-light);
}
.glist-item-content {
@@ -197,37 +234,40 @@
.glist-item-name {
font-weight: 800;
font-size: 0.8em;
- color: #333;
+ color: var(--color-text-primary);
}
.glist-item-quantity {
position: absolute;
top: 0;
right: 0;
- background: rgba(0, 123, 255, 0.9);
- color: white;
+ background: var(--color-primary);
+ color: var(--color-text-inverse);
font-weight: 700;
font-size: 0.3em;
padding: 0.2em 0.4em;
- border-radius: 0 6px 0 4px;
+ border-radius: 0 var(--border-radius-md) 0 var(--border-radius-sm);
min-width: 20%;
text-align: center;
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
+ box-shadow: var(--shadow-sm);
}
.glist-item-users {
font-size: 0.7em;
- color: #888;
+ color: var(--color-text-secondary);
font-style: italic;
}
/* Sorting dropdown */
.glist-sort {
width: 100%;
- margin: 0.3em 0;
- padding: 0.5em;
- font-size: 1em;
- border-radius: 4px;
+ margin: var(--spacing-xs) 0;
+ padding: var(--spacing-sm);
+ font-size: var(--font-size-base);
+ border-radius: var(--border-radius-sm);
+ border: var(--border-width-thin) solid var(--color-border-medium);
+ background: var(--color-bg-surface);
+ color: var(--color-text-primary);
}
/* Image upload */
@@ -237,18 +277,19 @@
.glist-image-label {
display: block;
- padding: 0.6em;
- background: #f0f0f0;
- border: 2px dashed #ccc;
- border-radius: 4px;
+ padding: var(--spacing-sm);
+ background: var(--color-gray-100);
+ border: var(--border-width-medium) dashed var(--color-border-medium);
+ border-radius: var(--border-radius-sm);
text-align: center;
cursor: pointer;
- transition: all 0.2s;
+ transition: var(--transition-base);
+ color: var(--color-text-primary);
}
.glist-image-label:hover {
- background: #e8e8e8;
- border-color: #007bff;
+ background: var(--color-bg-hover);
+ border-color: var(--color-primary);
}
.glist-image-preview {
@@ -260,8 +301,8 @@
.glist-image-preview img {
max-width: 150px;
max-height: 150px;
- border-radius: 8px;
- border: 2px solid #ddd;
+ border-radius: var(--border-radius-lg);
+ border: var(--border-width-medium) solid var(--color-border-light);
}
.glist-remove-image {
@@ -270,10 +311,10 @@
right: -8px;
width: 28px;
height: 28px;
- border-radius: 50%;
- background: #ff4444;
- color: white;
- border: 2px solid white;
+ border-radius: var(--border-radius-full);
+ background: var(--color-danger);
+ color: var(--color-text-inverse);
+ border: var(--border-width-medium) solid var(--color-bg-surface);
font-size: 1.2rem;
line-height: 1;
cursor: pointer;
@@ -283,7 +324,7 @@
}
.glist-remove-image:hover {
- background: #cc0000;
+ background: var(--color-danger-hover);
}
/* Floating Action Button (FAB) */
@@ -291,10 +332,10 @@
position: fixed;
bottom: 20px;
right: 20px;
- background: #28a745;
- color: white;
+ background: var(--color-success);
+ color: var(--color-text-inverse);
border: none;
- border-radius: 50%;
+ border-radius: var(--border-radius-full);
width: 62px;
height: 62px;
font-size: 2em;
@@ -302,12 +343,14 @@
display: flex;
align-items: center;
justify-content: center;
- box-shadow: 0 3px 10px rgba(0,0,0,0.2);
+ box-shadow: var(--shadow-lg);
cursor: pointer;
+ transition: var(--transition-base);
}
.glist-fab:hover {
- background: #218838;
+ background: var(--color-success-hover);
+ transform: scale(1.05);
}
/* Mobile tweaks */
diff --git a/frontend/src/styles/pages/Settings.css b/frontend/src/styles/pages/Settings.css
new file mode 100644
index 0000000..364d7a5
--- /dev/null
+++ b/frontend/src/styles/pages/Settings.css
@@ -0,0 +1,297 @@
+/* Settings Page Styles */
+
+.settings-page {
+ padding: var(--spacing-lg);
+ max-width: 800px;
+ margin: 0 auto;
+}
+
+
+.settings-container {
+ background: var(--color-bg-surface);
+ border-radius: var(--border-radius-lg);
+ padding: var(--spacing-xl);
+ box-shadow: var(--shadow-sm);
+}
+
+
+.settings-title {
+ font-size: var(--font-size-2xl);
+ font-weight: 600;
+ color: var(--color-text-primary);
+ margin: 0 0 var(--spacing-xl);
+}
+
+
+/* === Tabs === */
+.settings-tabs {
+ display: flex;
+ gap: var(--spacing-sm);
+ margin-bottom: var(--spacing-xl);
+ border-bottom: 2px solid var(--color-border-light);
+}
+
+
+.settings-tab {
+ padding: var(--spacing-md) var(--spacing-lg);
+ background: none;
+ border: none;
+ border-bottom: 3px solid transparent;
+ color: var(--color-text-secondary);
+ font-size: var(--font-size-base);
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s;
+ margin-bottom: -2px;
+}
+
+
+.settings-tab:hover {
+ color: var(--color-primary);
+ background: var(--color-bg-hover);
+}
+
+
+.settings-tab.active {
+ color: var(--color-primary);
+ border-bottom-color: var(--color-primary);
+}
+
+
+/* === Content === */
+.settings-content {
+ min-height: 400px;
+}
+
+
+.settings-section {
+ animation: fadeIn 0.2s ease-in;
+}
+
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+
+.settings-section-title {
+ font-size: var(--font-size-xl);
+ font-weight: 600;
+ color: var(--color-text-primary);
+ margin: 0 0 var(--spacing-lg);
+}
+
+
+.settings-group {
+ margin-bottom: var(--spacing-xl);
+ padding-bottom: var(--spacing-xl);
+ border-bottom: 1px solid var(--color-border-light);
+}
+
+
+.settings-group:last-child {
+ border-bottom: none;
+}
+
+
+.settings-label {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ font-size: var(--font-size-base);
+ font-weight: 500;
+ color: var(--color-text-primary);
+ margin-bottom: var(--spacing-sm);
+ cursor: pointer;
+}
+
+
+.settings-label input[type="checkbox"] {
+ width: 20px;
+ height: 20px;
+ cursor: pointer;
+}
+
+
+.settings-description {
+ font-size: var(--font-size-sm);
+ color: var(--color-text-secondary);
+ margin: var(--spacing-sm) 0 0;
+ line-height: 1.5;
+}
+
+
+/* === Theme Buttons === */
+.settings-theme-options {
+ display: flex;
+ gap: var(--spacing-md);
+ margin-top: var(--spacing-sm);
+}
+
+
+.settings-theme-btn {
+ flex: 1;
+ padding: var(--spacing-md);
+ border: 2px solid var(--color-border-light);
+ background: var(--color-bg-surface);
+ color: var(--color-text-primary);
+ border-radius: var(--border-radius-md);
+ font-size: var(--font-size-base);
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s;
+}
+
+
+.settings-theme-btn:hover {
+ border-color: var(--color-primary);
+ background: var(--color-primary-light);
+}
+
+
+.settings-theme-btn.active {
+ border-color: var(--color-primary);
+ background: var(--color-primary);
+ color: var(--color-white);
+}
+
+
+/* === Select & Range === */
+.settings-select {
+ width: 100%;
+ padding: var(--spacing-sm) var(--spacing-md);
+ border: 1px solid var(--color-border-medium);
+ border-radius: var(--border-radius-md);
+ background: var(--color-bg-surface);
+ color: var(--color-text-primary);
+ font-size: var(--font-size-base);
+ cursor: pointer;
+ margin-top: var(--spacing-sm);
+}
+
+
+.settings-select:focus {
+ outline: none;
+ border-color: var(--color-primary);
+}
+
+
+.settings-range {
+ width: 100%;
+ height: 6px;
+ border-radius: 3px;
+ background: var(--color-gray-300);
+ outline: none;
+ margin-top: var(--spacing-sm);
+ cursor: pointer;
+ appearance: none;
+ -webkit-appearance: none;
+}
+
+
+.settings-range::-webkit-slider-thumb {
+ appearance: none;
+ -webkit-appearance: none;
+ width: 20px;
+ height: 20px;
+ border-radius: 50%;
+ background: var(--color-primary);
+ cursor: pointer;
+ transition: all 0.2s;
+}
+
+
+.settings-range::-webkit-slider-thumb:hover {
+ background: var(--color-primary-hover);
+ transform: scale(1.1);
+}
+
+
+.settings-range::-moz-range-thumb {
+ width: 20px;
+ height: 20px;
+ border-radius: 50%;
+ background: var(--color-primary);
+ cursor: pointer;
+ border: none;
+ transition: all 0.2s;
+}
+
+
+.settings-range::-moz-range-thumb:hover {
+ background: var(--color-primary-hover);
+ transform: scale(1.1);
+}
+
+
+/* === Actions === */
+.settings-actions {
+ margin-top: var(--spacing-2xl);
+ padding-top: var(--spacing-xl);
+ border-top: 2px solid var(--color-border-light);
+ text-align: center;
+}
+
+
+.settings-btn-reset {
+ padding: var(--spacing-md) var(--spacing-xl);
+ border: 2px solid var(--color-danger);
+ background: transparent;
+ color: var(--color-danger);
+ border-radius: var(--border-radius-md);
+ font-size: var(--font-size-base);
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s;
+}
+
+
+.settings-btn-reset:hover {
+ background: var(--color-danger);
+ color: var(--color-white);
+}
+
+
+/* === Responsive === */
+@media (max-width: 768px) {
+ .settings-page {
+ padding: var(--spacing-md);
+ }
+
+ .settings-container {
+ padding: var(--spacing-lg);
+ }
+
+ .settings-tabs {
+ flex-wrap: nowrap;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .settings-tab {
+ padding: var(--spacing-sm) var(--spacing-md);
+ white-space: nowrap;
+ }
+
+ .settings-theme-options {
+ flex-direction: column;
+ }
+}
+
+
+@media (max-width: 480px) {
+ .settings-title {
+ font-size: var(--font-size-xl);
+ }
+
+ .settings-container {
+ padding: var(--spacing-md);
+ }
+}
diff --git a/frontend/src/styles/theme.css b/frontend/src/styles/theme.css
index 97d9cf6..c9d7254 100644
--- a/frontend/src/styles/theme.css
+++ b/frontend/src/styles/theme.css
@@ -189,23 +189,94 @@
--modal-max-width: 500px;
}
+
+/* ============================================
+ DARK MODE
+ ============================================ */
+[data-theme="dark"] {
+ /* Primary Colors */
+ --color-primary: #4da3ff;
+ --color-primary-hover: #66b3ff;
+ --color-primary-light: #1a3a52;
+ --color-primary-dark: #3d8fdb;
+
+ /* Semantic Colors */
+ --color-success: #4ade80;
+ --color-success-hover: #5fe88d;
+ --color-success-light: #1a3a28;
+
+ --color-danger: #f87171;
+ --color-danger-hover: #fa8585;
+ --color-danger-light: #4a2020;
+
+ --color-warning: #fbbf24;
+ --color-warning-hover: #fcd34d;
+ --color-warning-light: #3a2f0f;
+
+ --color-info: #38bdf8;
+ --color-info-hover: #5dc9fc;
+ --color-info-light: #1a2f3a;
+
+ /* Text Colors */
+ --color-text-primary: #f1f5f9;
+ --color-text-secondary: #94a3b8;
+ --color-text-muted: #64748b;
+ --color-text-inverse: #1e293b;
+ --color-text-disabled: #475569;
+
+ /* Background Colors */
+ --color-bg-body: #0f172a;
+ --color-bg-surface: #1e293b;
+ --color-bg-hover: #334155;
+ --color-bg-disabled: #1e293b;
+
+ /* Border Colors */
+ --color-border-light: #334155;
+ --color-border-medium: #475569;
+ --color-border-dark: #64748b;
+ --color-border-disabled: #334155;
+
+ /* Neutral Colors - Dark adjusted */
+ --color-gray-50: #1e293b;
+ --color-gray-100: #1e293b;
+ --color-gray-200: #334155;
+ --color-gray-300: #475569;
+ --color-gray-400: #64748b;
+ --color-gray-500: #94a3b8;
+ --color-gray-600: #cbd5e1;
+ --color-gray-700: #e2e8f0;
+ --color-gray-800: #f1f5f9;
+ --color-gray-900: #f8fafc;
+
+ /* Shadows - Lighter for dark mode */
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.4);
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.5);
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.6);
+ --shadow-card: 0 0 10px rgba(0, 0, 0, 0.5);
+
+ /* Modals */
+ --modal-backdrop-bg: rgba(0, 0, 0, 0.8);
+ --modal-bg: var(--color-bg-surface);
+
+ /* Inputs */
+ --input-border-color: var(--color-border-medium);
+ --input-focus-shadow: 0 0 0 2px rgba(77, 163, 255, 0.3);
+
+ /* Cards */
+ --card-bg: var(--color-bg-surface);
+}
+
+
/* ============================================
DARK MODE SUPPORT (Future Implementation)
============================================ */
@media (prefers-color-scheme: dark) {
- /* Uncomment to enable dark mode
- :root {
- --color-text-primary: #f8f9fa;
- --color-text-secondary: #adb5bd;
- --color-bg-body: #212529;
- --color-bg-surface: #343a40;
- --color-border-light: #495057;
- --color-border-medium: #6c757d;
- }
- */
+ /* Auto mode will use data-theme attribute set by JS */
}
-/* Manual dark mode class override */
+
+/* Manual dark mode class override (deprecated - use data-theme) */
.dark-mode {
--color-text-primary: #f8f9fa;
--color-text-secondary: #adb5bd;