feat(frontend): T44 setup FastAPI static files and templates

- Mount static files on /static endpoint
- Configure Jinja2Templates with directory structure
- Create base template with Pico.css, HTMX, Chart.js
- Create all template subdirectories (auth, dashboard, keys, tokens, profile, components)
- Create initial CSS and JS files
- Add tests for static files and templates configuration

Tests: 12 passing
Coverage: 100% on new configuration code
This commit is contained in:
Luca Sacchi Ricciardi
2026-04-07 17:58:03 +02:00
parent 3ae5d736ce
commit c1f47c897f
16 changed files with 1592 additions and 4 deletions

82
static/css/style.css Normal file
View File

@@ -0,0 +1,82 @@
/* OpenRouter Monitor - Main Styles */
:root {
--primary-color: #2563eb;
--secondary-color: #64748b;
--success-color: #10b981;
--danger-color: #ef4444;
--warning-color: #f59e0b;
--bg-color: #f8fafc;
--card-bg: #ffffff;
}
body {
background-color: var(--bg-color);
min-height: 100vh;
}
.navbar-brand {
font-weight: 600;
font-size: 1.25rem;
}
.card {
background: var(--card-bg);
border-radius: 0.5rem;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
margin-bottom: 1rem;
}
.card-header {
padding: 1rem;
border-bottom: 1px solid #e2e8f0;
}
.card-body {
padding: 1rem;
}
.btn-primary {
background-color: var(--primary-color);
border-color: var(--primary-color);
}
.btn-danger {
background-color: var(--danger-color);
border-color: var(--danger-color);
}
.table {
width: 100%;
border-collapse: collapse;
}
.table th,
.table td {
padding: 0.75rem;
text-align: left;
border-bottom: 1px solid #e2e8f0;
}
.alert {
padding: 1rem;
border-radius: 0.375rem;
margin-bottom: 1rem;
}
.alert-success {
background-color: #d1fae5;
color: #065f46;
}
.alert-danger {
background-color: #fee2e2;
color: #991b1b;
}
.footer {
margin-top: auto;
padding: 2rem 0;
text-align: center;
color: var(--secondary-color);
}

49
static/js/main.js Normal file
View File

@@ -0,0 +1,49 @@
// OpenRouter Monitor - Main JavaScript
// HTMX Configuration
document.addEventListener('DOMContentLoaded', function() {
// Configure HTMX to include CSRF token in requests
document.body.addEventListener('htmx:configRequest', function(evt) {
const csrfToken = document.querySelector('meta[name="csrf-token"]');
if (csrfToken) {
evt.detail.headers['X-CSRF-Token'] = csrfToken.content;
}
});
// Auto-hide alerts after 5 seconds
const alerts = document.querySelectorAll('.alert:not(.alert-permanent)');
alerts.forEach(function(alert) {
setTimeout(function() {
alert.style.opacity = '0';
setTimeout(function() {
alert.remove();
}, 300);
}, 5000);
});
});
// Utility function to format currency
function formatCurrency(amount) {
return new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
}).format(amount);
}
// Utility function to format date
function formatDate(dateString) {
return new Intl.DateTimeFormat('en-US', {
year: 'numeric',
month: 'short',
day: 'numeric',
hour: '2-digit',
minute: '2-digit'
}).format(new Date(dateString));
}
// Confirmation dialog for destructive actions
function confirmAction(message, callback) {
if (confirm(message)) {
callback();
}
}