@import "tailwindcss"; @source "../../templates/"; @source "../../static/js/"; /* ── Dark mode variant (selector-based) ────────────────────────── */ @custom-variant dark (&:where([data-theme="dark"] *)); /* ── Design tokens ─────────────────────────────────────────────── */ :root { color-scheme: light; /* Surfaces */ --page: #fafaf9; /* stone-50 */ --surface: #ffffff; /* white */ --surface-alt: #f5f5f4; /* stone-100 */ /* Borders */ --border: #e7e5e4; /* stone-200 */ --border-muted: #f5f5f4; /* stone-100 */ /* Accent */ --accent: #c2410c; /* orange-700 */ --accent-hover: #ea580c; /* orange-600 */ --accent-subtle: #fff7ed; /* orange-50 */ --accent-text: #ffffff; /* Text */ --text: #1c1917; /* stone-900 */ --text-secondary: #57534e; /* stone-600 */ --text-muted: #78716c; /* stone-500 */ } [data-theme="dark"] { color-scheme: dark; --page: #1c1917; --surface: #292524; --surface-alt: #44403c; --border: #57534e; --border-muted: #44403c; --accent: #ea580c; --accent-hover: #f97316; --accent-subtle: rgba(234, 88, 12, 0.1); --accent-text: #ffffff; --text: #e7e5e4; --text-secondary: #d6d3d1; --text-muted: #a8a29e; } /* ── Theme: map raw vars to Tailwind utilities ─────────────────── */ @theme { --color-page: var(--page); --color-surface: var(--surface); --color-surface-alt: var(--surface-alt); --color-accent: var(--accent); --color-accent-hover: var(--accent-hover); --color-accent-subtle: var(--accent-subtle); --color-accent-text: var(--accent-text); --color-text: var(--text); --color-text-secondary: var(--text-secondary); --color-text-muted: var(--text-muted); --color-border: var(--border); } /* ── Base: default border color ────────────────────────────────── */ @layer base { *, ::after, ::before { border-color: var(--border); } } /* ── Typography ────────────────────────────────────────────────── */ body { font-family: "Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } a { text-decoration: none; } /* ── Form controls ─────────────────────────────────────────────── */ .input-field { width: 100%; min-width: 0; border-radius: 0.5rem; border: 1px solid var(--border); background-color: var(--surface); padding: 0.6rem 0.75rem; color: var(--text); transition: border-color 150ms ease, box-shadow 150ms ease; } .input-field:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px rgba(194, 65, 12, 0.15); } .btn-adjust { display: flex; height: 2rem; width: 2rem; align-items: center; justify-content: center; border-radius: 0.375rem; border: 1px solid var(--border); background-color: transparent; color: var(--text-secondary); font-weight: 700; transition: background-color 150ms ease, border-color 150ms ease; } .btn-adjust:hover { background-color: var(--surface-alt); border-color: var(--accent); color: var(--accent); } /* ── Pills ─────────────────────────────────────────────────────── */ .pill { display: inline-flex; align-items: center; border-radius: 9999px; padding: 0.125rem 0.625rem; font-size: 0.75rem; line-height: 1rem; font-weight: 600; border: 1px solid transparent; } .pill-muted { border-color: var(--border); color: var(--text-secondary); background-color: var(--surface-alt); } .pill-warning { border-color: rgba(217, 119, 6, 0.4); color: #92400e; background-color: #fffbeb; } [data-theme="dark"] .pill-warning { color: #fbbf24; background-color: rgba(217, 119, 6, 0.1); } .pill-success { border-color: rgba(5, 150, 105, 0.4); color: #065f46; background-color: #ecfdf5; } [data-theme="dark"] .pill-success { color: #34d399; background-color: rgba(5, 150, 105, 0.1); } /* ── Tabs ──────────────────────────────────────────────────────── */ .tab { display: inline-flex; align-items: center; border-radius: 0.375rem; padding: 0.375rem 0.875rem; font-size: 0.875rem; font-weight: 500; cursor: pointer; border: none; background: none; transition: background-color 150ms ease, color 150ms ease; color: var(--text); } .tab:not(.tab-active):hover { background-color: var(--surface-alt); } .tab-active { background-color: var(--accent); color: var(--accent-text); } .tab-mobile { display: block; width: 100%; padding: 0.5rem 0.75rem; font-size: 0.875rem; text-align: left; cursor: pointer; border: none; background: none; transition: background-color 150ms ease, color 150ms ease; color: var(--text-secondary); } .tab-mobile:not(.tab-mobile-active):hover { background-color: var(--surface-alt); } .tab-mobile-active { background-color: var(--accent-subtle); color: var(--text); font-weight: 600; } /* ── Timeline layout ───────────────────────────────────────────── */ /* Mobile: single column, centred line behind cards */ .timeline-line { left: 50%; transform: translateX(-50%); } .timeline-item { padding-left: 0; } .timeline-node { left: 50%; top: -10px; transform: translateX(-50%); z-index: 2; } .timeline-heading { position: sticky; top: 0; z-index: 10; background-color: var(--page); padding-top: 1rem; padding-bottom: 1rem; border-bottom: 2px solid transparent; transition: border-color 0.15s ease; text-align: center; } .timeline-heading.is-stuck { border-bottom-color: var(--accent); } .timeline-top-btn { display: none; position: absolute; right: 0; top: 50%; transform: translateY(-50%); padding: 0.25rem; color: var(--text-secondary); opacity: 0.7; transition: opacity 0.15s ease; } .timeline-top-btn:hover { opacity: 1; } .timeline-heading.is-stuck .timeline-top-btn { display: block; } /* ── Data page ─────────────────────────────────────────────────── */ /* Hide duplicate search inside data page - search is in the tab bar */ .data-page-content section:has(.responsive-table) > div:first-child:has(input[type="search"]) { display: none; } /* Remove extra margin from list containers inside data page */ .data-page-content > div[id$="-list"] { margin-top: 0; } /* ── Responsive tables: convert rows to cards on mobile ────────── */ @media (max-width: 767px) { /* Remove outer section border/background on mobile - cards are standalone */ section:has(.responsive-table) { border: none !important; background: transparent !important; box-shadow: none !important; padding: 0 !important; } /* Search header: remove wrapper styling, let input fill width */ section:has(.responsive-table) > div:first-child:has(input[type="search"]) { border: none !important; background: transparent !important; padding: 0 !important; margin-bottom: 1rem; } /* Remove overflow wrapper styling */ section:has(.responsive-table) > .overflow-x-auto { overflow: visible; } .responsive-table { border: none !important; background: transparent !important; box-shadow: none !important; } /* Remove divide-y borders from table */ .responsive-table, .responsive-table tbody { border-color: transparent !important; } .responsive-table thead { display: none; } .responsive-table tbody { display: flex; flex-direction: column; gap: 1rem; padding: 0; } /* Mobile card style */ .responsive-table tr { display: flex; flex-direction: column; position: relative; padding: 1rem; border-radius: 0.5rem; border: 1px solid var(--border) !important; background-color: var(--surface); box-shadow: none; } .responsive-table td { display: flex; justify-content: space-between; align-items: baseline; padding: 0.25rem 0; white-space: normal; font-size: 0.875rem; border: none !important; } .responsive-table td::before { content: attr(data-label); flex-shrink: 0; min-width: 5.5rem; font-size: 0.8125rem; font-weight: 500; color: var(--text-secondary); margin-right: 0.75rem; } .responsive-table td[data-label=""]::before { display: none; } .responsive-table td.mobile-hidden { display: none; } /* Card title: header section with bottom divider */ .responsive-table td.card-title { order: -2; padding: 0 0 0.5rem 0; padding-right: 2.5rem; margin-bottom: 0.5rem; border-bottom: 1px solid var(--border-muted) !important; } .responsive-table td.card-title, .responsive-table td.card-title > :first-child { font-size: 1rem; font-weight: 600; color: var(--text); } .responsive-table td.card-title::before { display: none; } /* "Added" date: footer section with top divider */ .responsive-table td.card-date { order: 99; margin: 0.5rem -1rem -1rem !important; padding: 0.75rem 1rem !important; border-top: 1px solid var(--border-muted) !important; font-size: 0.75rem; color: var(--text-secondary); } .responsive-table td.card-date::before { font-size: 0.75rem; font-weight: 500; color: var(--text-secondary); min-width: auto; margin-right: 0.5rem; } /* Actions: absolute top-right in header area */ .responsive-table td.card-actions { order: -1; position: absolute; top: 0.75rem; right: 0.75rem; padding: 0; justify-content: flex-end; } .responsive-table td.card-actions::before { display: none; } /* Hide detail row on mobile — inline card-detail is used instead */ .responsive-table .detail-row { display: none !important; } /* Inline detail content within cards */ .responsive-table .card-detail { order: -1; margin: 0 -1rem 0.25rem !important; padding: 0.5rem 1rem !important; border-bottom: 1px solid var(--border-muted) !important; background-color: var(--surface-alt); justify-content: center; } .responsive-table .card-detail.hidden { display: none !important; } .responsive-table .card-detail::before { display: none; } .pagination-controls { display: none; } } /* ── Desktop timeline ──────────────────────────────────────────── */ @media (min-width: 768px) { /* Hide inline card-detail on desktop — detail row is used instead */ .responsive-table .card-detail { display: none !important; } .timeline-list { display: flex; flex-direction: column; } .timeline-item { width: 50%; padding-right: 0; } /* Reset node to side-of-card positioning on desktop */ .timeline-node { top: 50%; transform: translateY(-50%); } /* Left side items (odd) - counts only .timeline-item children, skipping month headings */ .timeline-item:nth-child(odd of .timeline-item) { align-self: flex-start; padding-right: 2rem; } .timeline-item:nth-child(odd of .timeline-item) .timeline-node { right: -10px; left: auto; top: 50%; transform: translateY(-50%); } /* Right side items (even) */ .timeline-item:nth-child(even of .timeline-item) { align-self: flex-end; padding-left: 2rem; } .timeline-item:nth-child(even of .timeline-item) .timeline-node { left: -10px; top: 50%; transform: translateY(-50%); } /* Allow vertical overlap between alternating cards (skip first item) */ .timeline-item + .timeline-item { margin-top: -4rem; } /* ── Spacious flat tables ─────────────────────────────────────── */ /* Strip card wrapper */ section:has(.responsive-table) { border: none; border-radius: 0; background-color: transparent; } /* Search header: remove border, tighten spacing */ section:has(.responsive-table) > div:first-child:has(input[type="search"]) { border-bottom: none; padding-top: 0; padding-bottom: 0.75rem; } /* Flat thead: typography-only distinction */ .responsive-table thead { background-color: transparent; } /* Remove thead/tbody divider from divide-y on