Initial commit: Diario Conversazioni Olimpic Nastri

- Django 5.2 + PostgreSQL + Gunicorn
- Conversazioni, Obiettivi, Documenti PDF, Persone
- Commenti e aggiornamenti con modifica/eliminazione
- Agenda, ricerca live, giorni rimanenti scadenze
- Bootstrap 5 + HTMX + toast notifications
- Deploy: Nginx + Gunicorn + SSL
This commit is contained in:
automationkriz
2026-04-05 14:48:22 +00:00
commit d296353dcb
48 changed files with 3538 additions and 0 deletions

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

@@ -0,0 +1,329 @@
/* ── Olimpic Nastri — Style v2 ─────────────────────────────────────────── */
:root {
--bs-body-bg: #f0f2f5;
--accent: #4361ee;
--accent-soft: #eef0fd;
--accent-hover: #3451d1;
--danger: #ef4444;
--success-bg: #dcfce7;
--success-fg: #15803d;
}
body {
background: var(--bs-body-bg);
font-size: .93rem;
}
/* ── Navbar ── */
.navbar {
background: #1a1f36 !important;
box-shadow: 0 2px 8px rgba(0,0,0,.25);
padding-top: .6rem;
padding-bottom: .6rem;
}
.navbar-brand { font-weight: 800; font-size: 1.05rem; letter-spacing: .5px; color: #fff !important; }
.navbar-brand span { color: #7c8ff9; }
.nav-link { color: rgba(255,255,255,.75) !important; font-weight: 500; transition: color .15s; }
.nav-link:hover, .nav-link.active { color: #fff !important; }
/* ── Cards ── */
.card {
border: none;
border-radius: 12px;
box-shadow: 0 1px 6px rgba(0,0,0,.07);
background: #fff;
transition: box-shadow .2s ease, transform .2s ease;
}
.card:hover {
box-shadow: 0 4px 16px rgba(0,0,0,.1);
}
.card-header-accent {
background: var(--accent-soft);
border-bottom: 1px solid #d9ddfc;
border-radius: 12px 12px 0 0 !important;
padding: .75rem 1.25rem;
font-weight: 600;
font-size: .85rem;
color: var(--accent);
letter-spacing: .3px;
}
/* ── Animations ── */
@keyframes fadeIn {
from { opacity: 0; transform: translateY(8px); }
to { opacity: 1; transform: translateY(0); }
}
.fade-in {
animation: fadeIn .3s ease both;
}
.fade-in-delay-1 { animation-delay: .05s; }
.fade-in-delay-2 { animation-delay: .1s; }
.fade-in-delay-3 { animation-delay: .15s; }
/* HTMX transitions */
.htmx-settling {
opacity: 0;
}
.htmx-settling .container-lg,
.htmx-settling .fade-in {
animation: none;
}
#main-content {
transition: opacity .15s ease;
}
#main-content.htmx-swapping {
opacity: 0;
}
/* ── Timeline ── */
.timeline { position: relative; padding-left: 28px; }
.timeline::before {
content: '';
position: absolute; left: 10px; top: 4px; bottom: 4px;
width: 2px; background: #e0e4f0; border-radius: 2px;
}
.tl-item { position: relative; margin-bottom: 1.4rem; }
.tl-dot {
position: absolute; left: -24px; top: 3px;
width: 14px; height: 14px; border-radius: 50%;
border: 2px solid #fff;
box-shadow: 0 0 0 2px currentColor;
}
.tl-dot.conv { color: var(--accent); background: var(--accent); }
.tl-dot.agg { color: #f97316; background: #f97316; }
.tl-dot.doc { color: #10b981; background: #10b981; }
/* ── Badge stati ── */
.badge-stato {
font-size: .7rem; font-weight: 600;
padding: .3em .65em; border-radius: 6px;
}
.stato-aperto { background: #dbeafe; color: #1d4ed8; }
.stato-in_corso { background: #ffedd5; color: #c2410c; }
.stato-completato{ background: #dcfce7; color: #15803d; }
.stato-sospeso { background: #f1f5f9; color: #64748b; }
/* ── Progress slider AJAX ── */
.slider-wrap { position: relative; }
.progress-slider {
-webkit-appearance: none;
width: 100%; height: 6px;
border-radius: 4px; outline: none; cursor: pointer;
background: linear-gradient(
to right,
var(--accent) 0%,
var(--accent) var(--val, 0%),
#dee2e6 var(--val, 0%),
#dee2e6 100%
);
transition: opacity .15s;
}
.progress-slider::-webkit-slider-thumb {
-webkit-appearance: none;
width: 18px; height: 18px;
border-radius: 50%; cursor: pointer;
background: var(--accent);
border: 3px solid #fff;
box-shadow: 0 1px 4px rgba(67,97,238,.5);
transition: transform .15s;
}
.progress-slider::-webkit-slider-thumb:hover {
transform: scale(1.15);
}
.slider-label {
font-size: .78rem; font-weight: 700; color: var(--accent);
min-width: 36px; text-align: right;
}
.slider-saving { font-size: .72rem; color: #94a3b8; }
/* ── Pill tipo ── */
.pill-collettivo { background:#ede9fe; color:#6d28d9; }
.pill-individuale{ background:#fce7f3; color:#9d174d; }
.pill-tipo { font-size:.7rem; font-weight:600; padding:.25em .6em; border-radius:20px; }
/* ── Misc ── */
.section-title {
font-weight: 700; font-size: .8rem; text-transform: uppercase;
letter-spacing: .8px; color: #94a3b8; margin-bottom: .75rem;
}
.btn-icon {
width: 32px; height: 32px; padding: 0;
display: inline-flex; align-items: center; justify-content: center;
border-radius: 8px;
}
.avatar {
width: 28px; height: 28px; border-radius: 50%;
background: var(--accent); color: #fff;
font-size: .7rem; font-weight: 700;
display: inline-flex; align-items: center; justify-content: center;
flex-shrink: 0;
}
.avatar-lg {
width: 48px; height: 48px; font-size: 1rem;
}
hr.soft { border-color: #f1f3f9; }
/* ── Forms ── */
textarea.form-control, input.form-control { border-radius: 10px; border-color: #e2e8f0; }
textarea.form-control:focus, input.form-control:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(67,97,238,.12); }
.form-select { border-radius: 10px; border-color: #e2e8f0; }
.form-select:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(67,97,238,.12); }
/* ── Buttons ── */
.btn-primary { background: var(--accent); border-color: var(--accent); border-radius: 9px; font-weight: 600; }
.btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
.btn-outline-secondary { border-radius: 9px; }
.btn-outline-danger { border-radius: 9px; }
/* ── Search bar ── */
.search-wrapper {
position: relative;
}
.search-wrapper .form-control {
padding-left: 2.2rem;
border-radius: 20px;
background: rgba(255,255,255,.1);
border-color: rgba(255,255,255,.15);
color: #fff;
font-size: .85rem;
transition: background .2s, border-color .2s, width .3s;
width: 200px;
}
.search-wrapper .form-control::placeholder { color: rgba(255,255,255,.5); }
.search-wrapper .form-control:focus {
background: rgba(255,255,255,.18);
border-color: rgba(255,255,255,.3);
color: #fff;
width: 280px;
box-shadow: none;
}
.search-wrapper .search-icon {
position: absolute; left: .75rem; top: 50%; transform: translateY(-50%);
color: rgba(255,255,255,.5); font-size: .8rem; pointer-events: none;
}
.search-results-dropdown {
position: absolute; top: 100%; left: 0; right: 0;
margin-top: 4px;
background: #fff; border-radius: 12px;
box-shadow: 0 8px 24px rgba(0,0,0,.15);
z-index: 1050; max-height: 400px; overflow-y: auto;
display: none;
}
.search-results-dropdown.show { display: block; }
.search-results-dropdown .result-item {
padding: .6rem 1rem; cursor: pointer;
transition: background .1s;
color: #1a1f36; text-decoration: none; display: block;
}
.search-results-dropdown .result-item:hover { background: var(--accent-soft); }
.search-results-dropdown .result-type {
font-size: .65rem; font-weight: 700; text-transform: uppercase; letter-spacing: .5px;
color: var(--accent); margin-bottom: .15rem;
}
/* ── Toast container ── */
.toast-container {
position: fixed; bottom: 1.5rem; right: 1.5rem; z-index: 1090;
}
.toast {
border-radius: 10px; border: none;
box-shadow: 0 4px 16px rgba(0,0,0,.12);
animation: fadeIn .25s ease;
}
/* ── Person card ── */
.person-card {
text-align: center;
padding: 1.5rem 1rem;
}
.person-card .avatar { margin-bottom: .75rem; }
.person-card .stat { font-size: .75rem; color: #94a3b8; }
.person-card .stat-num { font-weight: 700; color: var(--accent); font-size: .9rem; }
/* ── Document badge ── */
.doc-badge {
background: #ecfdf5; color: #059669;
font-size: .7rem; font-weight: 600;
padding: .25em .6em; border-radius: 6px;
}
/* ── Clickable card ── */
.card-link {
text-decoration: none;
color: inherit;
display: block;
}
.card-link:hover .card {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0,0,0,.1);
}
/* ── Empty state ── */
.empty-state {
text-align: center; padding: 3rem 1rem; color: #94a3b8;
}
.empty-state i {
font-size: 2.5rem; opacity: .3; margin-bottom: .75rem; display: block;
}
/* ── Countdown badges ── */
.countdown {
font-size: .7rem; font-weight: 600;
padding: .2em .55em; border-radius: 6px;
display: inline-block;
}
.countdown-urgent {
background: #fef2f2; color: #dc2626;
}
.countdown-soon {
background: #fff7ed; color: #c2410c;
}
.countdown-ok {
background: #ecfdf5; color: #059669;
}
/* ── Agenda ── */
.agenda-row {
transition: background .15s ease;
}
.agenda-row:hover {
background: #f8fafc;
}
.agenda-row-scaduto {
background: #fef2f2;
}
.agenda-row-scaduto:hover {
background: #fee2e2;
}
.agenda-date {
width: 42px;
}
.agenda-day {
font-size: 1.1rem; font-weight: 700; line-height: 1.1; color: #1a1f36;
}
.agenda-month {
font-size: .6rem; text-transform: uppercase; letter-spacing: .5px; color: #94a3b8;
}
.agenda-icon {
width: 32px; height: 32px; border-radius: 8px;
display: flex; align-items: center; justify-content: center;
font-size: .85rem; flex-shrink: 0;
}
.agenda-icon-scadenza {
background: var(--accent-soft); color: var(--accent);
}
.agenda-icon-conv {
background: #f0f9ff; color: #0284c7;
}
.agenda-icon-danger {
background: #fef2f2; color: #dc2626;
}
/* ── Comment actions dropdown ── */
.card .dropdown .btn-icon {
opacity: 0; transition: opacity .15s;
}
.card:hover .dropdown .btn-icon {
opacity: 1;
}