Pantry tracker app with: - FastAPI backend + Vue 3 SPA frontend - SQLite via circuitforge-core (migrations 001-005) - Inventory CRUD, barcode scan, receipt OCR pipeline - Expiry prediction (deterministic + LLM fallback) - CF-core tier system integration - Cloud session support (menagerie)
255 lines
5.4 KiB
CSS
255 lines
5.4 KiB
CSS
:root {
|
|
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
|
line-height: 1.5;
|
|
font-weight: 400;
|
|
|
|
color-scheme: light dark;
|
|
|
|
font-synthesis: none;
|
|
text-rendering: optimizeLegibility;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
|
|
/* Theme Colors - Dark Mode (Default) */
|
|
--color-text-primary: rgba(255, 255, 255, 0.87);
|
|
--color-text-secondary: rgba(255, 255, 255, 0.6);
|
|
--color-text-muted: rgba(255, 255, 255, 0.4);
|
|
|
|
--color-bg-primary: #242424;
|
|
--color-bg-secondary: #1a1a1a;
|
|
--color-bg-elevated: #2d2d2d;
|
|
--color-bg-card: #2d2d2d;
|
|
--color-bg-input: #1a1a1a;
|
|
|
|
--color-border: rgba(255, 255, 255, 0.1);
|
|
--color-border-focus: rgba(255, 255, 255, 0.2);
|
|
|
|
/* Brand Colors */
|
|
--color-primary: #667eea;
|
|
--color-primary-dark: #5568d3;
|
|
--color-primary-light: #7d8ff0;
|
|
--color-secondary: #764ba2;
|
|
|
|
/* Status Colors */
|
|
--color-success: #4CAF50;
|
|
--color-success-dark: #45a049;
|
|
--color-success-light: #66bb6a;
|
|
--color-success-bg: rgba(76, 175, 80, 0.1);
|
|
--color-success-border: rgba(76, 175, 80, 0.3);
|
|
|
|
--color-warning: #ff9800;
|
|
--color-warning-dark: #f57c00;
|
|
--color-warning-light: #ffb74d;
|
|
--color-warning-bg: rgba(255, 152, 0, 0.1);
|
|
--color-warning-border: rgba(255, 152, 0, 0.3);
|
|
|
|
--color-error: #f44336;
|
|
--color-error-dark: #d32f2f;
|
|
--color-error-light: #ff6b6b;
|
|
--color-error-bg: rgba(244, 67, 54, 0.1);
|
|
--color-error-border: rgba(244, 67, 54, 0.3);
|
|
|
|
--color-info: #2196F3;
|
|
--color-info-dark: #1976D2;
|
|
--color-info-light: #64b5f6;
|
|
--color-info-bg: rgba(33, 150, 243, 0.1);
|
|
--color-info-border: rgba(33, 150, 243, 0.3);
|
|
|
|
/* Gradient */
|
|
--gradient-primary: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);
|
|
|
|
/* Shadows */
|
|
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
|
|
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.3);
|
|
--shadow-lg: 0 10px 20px rgba(0, 0, 0, 0.4);
|
|
--shadow-xl: 0 20px 40px rgba(0, 0, 0, 0.5);
|
|
|
|
/* Typography */
|
|
--font-size-xs: 12px;
|
|
--font-size-sm: 14px;
|
|
--font-size-base: 16px;
|
|
--font-size-lg: 18px;
|
|
--font-size-xl: 24px;
|
|
--font-size-2xl: 32px;
|
|
|
|
/* Spacing */
|
|
--spacing-xs: 4px;
|
|
--spacing-sm: 8px;
|
|
--spacing-md: 16px;
|
|
--spacing-lg: 24px;
|
|
--spacing-xl: 32px;
|
|
|
|
/* Border Radius */
|
|
--radius-sm: 4px;
|
|
--radius-md: 6px;
|
|
--radius-lg: 8px;
|
|
--radius-xl: 12px;
|
|
|
|
color: var(--color-text-primary);
|
|
background-color: var(--color-bg-primary);
|
|
}
|
|
|
|
a {
|
|
font-weight: 500;
|
|
color: #646cff;
|
|
text-decoration: inherit;
|
|
}
|
|
a:hover {
|
|
color: #535bf2;
|
|
}
|
|
|
|
body {
|
|
margin: 0;
|
|
display: flex;
|
|
place-items: center;
|
|
min-width: 320px;
|
|
min-height: 100vh;
|
|
}
|
|
|
|
h1 {
|
|
font-size: 3.2em;
|
|
line-height: 1.1;
|
|
}
|
|
|
|
button {
|
|
border-radius: 8px;
|
|
border: 1px solid transparent;
|
|
padding: 0.6em 1.2em;
|
|
font-size: 1em;
|
|
font-weight: 500;
|
|
font-family: inherit;
|
|
background-color: #1a1a1a;
|
|
cursor: pointer;
|
|
transition: border-color 0.25s;
|
|
}
|
|
button:hover {
|
|
border-color: #646cff;
|
|
}
|
|
button:focus,
|
|
button:focus-visible {
|
|
outline: 4px auto -webkit-focus-ring-color;
|
|
}
|
|
|
|
.card {
|
|
padding: 2em;
|
|
}
|
|
|
|
#app {
|
|
max-width: 1280px;
|
|
margin: 0 auto;
|
|
padding: 2rem;
|
|
text-align: center;
|
|
}
|
|
|
|
@media (prefers-color-scheme: light) {
|
|
:root {
|
|
/* Theme Colors - Light Mode */
|
|
--color-text-primary: #213547;
|
|
--color-text-secondary: #666;
|
|
--color-text-muted: #999;
|
|
|
|
--color-bg-primary: #f5f5f5;
|
|
--color-bg-secondary: #ffffff;
|
|
--color-bg-elevated: #ffffff;
|
|
--color-bg-card: #ffffff;
|
|
--color-bg-input: #ffffff;
|
|
|
|
--color-border: #ddd;
|
|
--color-border-focus: #ccc;
|
|
|
|
/* Status colors stay the same in light mode */
|
|
/* But we adjust backgrounds for better contrast */
|
|
--color-success-bg: #d4edda;
|
|
--color-success-border: #c3e6cb;
|
|
|
|
--color-warning-bg: #fff3cd;
|
|
--color-warning-border: #ffeaa7;
|
|
|
|
--color-error-bg: #f8d7da;
|
|
--color-error-border: #f5c6cb;
|
|
|
|
--color-info-bg: #d1ecf1;
|
|
--color-info-border: #bee5eb;
|
|
|
|
/* Shadows for light mode (lighter) */
|
|
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1);
|
|
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
--shadow-lg: 0 10px 20px rgba(0, 0, 0, 0.15);
|
|
--shadow-xl: 0 20px 40px rgba(0, 0, 0, 0.2);
|
|
|
|
color: var(--color-text-primary);
|
|
background-color: var(--color-bg-primary);
|
|
}
|
|
|
|
a:hover {
|
|
color: #747bff;
|
|
}
|
|
|
|
button {
|
|
background-color: #f9f9f9;
|
|
}
|
|
}
|
|
|
|
/* Mobile Responsive Typography and Spacing */
|
|
@media (max-width: 480px) {
|
|
:root {
|
|
/* Reduce font sizes for mobile */
|
|
--font-size-xs: 11px;
|
|
--font-size-sm: 13px;
|
|
--font-size-base: 14px;
|
|
--font-size-lg: 16px;
|
|
--font-size-xl: 20px;
|
|
--font-size-2xl: 24px;
|
|
|
|
/* Reduce spacing for mobile */
|
|
--spacing-xs: 4px;
|
|
--spacing-sm: 6px;
|
|
--spacing-md: 12px;
|
|
--spacing-lg: 16px;
|
|
--spacing-xl: 20px;
|
|
|
|
/* Reduce shadows for mobile */
|
|
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
|
|
--shadow-md: 0 2px 4px rgba(0, 0, 0, 0.2);
|
|
--shadow-lg: 0 4px 8px rgba(0, 0, 0, 0.3);
|
|
--shadow-xl: 0 8px 16px rgba(0, 0, 0, 0.4);
|
|
}
|
|
|
|
h1 {
|
|
font-size: 2em;
|
|
}
|
|
|
|
.card {
|
|
padding: 1em;
|
|
}
|
|
|
|
#app {
|
|
padding: 1rem;
|
|
}
|
|
}
|
|
|
|
@media (min-width: 481px) and (max-width: 768px) {
|
|
:root {
|
|
/* Slightly reduced sizes for tablets */
|
|
--font-size-base: 15px;
|
|
--font-size-lg: 17px;
|
|
--font-size-xl: 22px;
|
|
--font-size-2xl: 28px;
|
|
|
|
--spacing-md: 14px;
|
|
--spacing-lg: 20px;
|
|
--spacing-xl: 28px;
|
|
}
|
|
|
|
h1 {
|
|
font-size: 2.5em;
|
|
}
|
|
|
|
.card {
|
|
padding: 1.5em;
|
|
}
|
|
|
|
#app {
|
|
padding: 1.5rem;
|
|
}
|
|
}
|