Replace HTTP Basic Auth with a branded /login flow and signed session cookie, using Next.js 16's proxy convention for route protection. Co-authored-by: Cursor <cursoragent@cursor.com>
139 lines
3.2 KiB
CSS
139 lines
3.2 KiB
CSS
@import "tailwindcss";
|
|
|
|
@theme {
|
|
--font-sans: var(--font-instrument-sans), ui-sans-serif, system-ui, sans-serif;
|
|
--font-serif: var(--font-playfair), ui-serif, Georgia, serif;
|
|
|
|
/* Light palette: mirrors the app's `lightColors` (constants/colors.ts). */
|
|
--color-canvas: #f8fafc;
|
|
--color-surface: #ffffff;
|
|
--color-surface-soft: #f1f5f9;
|
|
--color-primary: #0f766e;
|
|
--color-primary-light: #ccfbf1;
|
|
--color-primary-button: #0f766e;
|
|
--color-foreground: #0f172a;
|
|
--color-muted-foreground: #64748b;
|
|
--color-border-soft: #e2e8f0;
|
|
--color-success: #047857;
|
|
--color-success-light: #d1fae5;
|
|
}
|
|
|
|
@layer base {
|
|
:root {
|
|
color-scheme: light;
|
|
--grid-line: rgba(15, 23, 42, 0.055);
|
|
}
|
|
|
|
/*
|
|
* Dark palette: mirrors the app's `darkColors` (constants/colors.ts).
|
|
* `--color-primary` stays the bright accent (text/icons/borders); filled
|
|
* buttons use the muted `--color-primary-button` so white text keeps its
|
|
* contrast, matching the app's primary vs. primaryButton split.
|
|
*/
|
|
@media (prefers-color-scheme: dark) {
|
|
:root {
|
|
color-scheme: dark;
|
|
--color-canvas: #0b1220;
|
|
--color-surface: #1e293b;
|
|
--color-surface-soft: #111827;
|
|
--color-primary: #2dd4bf;
|
|
--color-primary-light: #134e4a;
|
|
--color-primary-button: #115e59;
|
|
--color-foreground: #f1f5f9;
|
|
--color-muted-foreground: #94a3b8;
|
|
--color-border-soft: #334155;
|
|
--color-success: #34d399;
|
|
--color-success-light: #064e3b;
|
|
--grid-line: rgba(45, 212, 191, 0.08);
|
|
}
|
|
}
|
|
|
|
html {
|
|
scroll-behavior: smooth;
|
|
}
|
|
|
|
body {
|
|
@apply bg-canvas font-sans text-foreground antialiased;
|
|
}
|
|
}
|
|
|
|
.card-hover {
|
|
@apply transition-all duration-200 hover:-translate-y-0.5 hover:shadow-[0_8px_24px_rgba(15,23,42,0.08)];
|
|
}
|
|
|
|
@keyframes fade-in-up {
|
|
from {
|
|
opacity: 0;
|
|
transform: translateY(10px);
|
|
}
|
|
to {
|
|
opacity: 1;
|
|
transform: translateY(0);
|
|
}
|
|
}
|
|
|
|
.animate-fade-in-up {
|
|
animation: fade-in-up 0.5s ease-out both;
|
|
}
|
|
|
|
.animate-fade-in-up-delay-1 {
|
|
animation: fade-in-up 0.5s ease-out 0.1s both;
|
|
}
|
|
|
|
.animate-fade-in-up-delay-2 {
|
|
animation: fade-in-up 0.5s ease-out 0.2s both;
|
|
}
|
|
|
|
.animate-fade-in-up-delay-3 {
|
|
animation: fade-in-up 0.5s ease-out 0.3s both;
|
|
}
|
|
|
|
/*
|
|
* Branded one-page PDF sheet: a green-to-white gradient washed over a faint
|
|
* teal grid. Only rendered for print (the on-screen page mirrors the homepage).
|
|
*/
|
|
.print-sheet {
|
|
background:
|
|
linear-gradient(150deg, #ccfbf1 0%, #f0fdfa 30%, #ffffff 64%),
|
|
linear-gradient(rgba(15, 118, 110, 0.07) 1px, transparent 1px),
|
|
linear-gradient(90deg, rgba(15, 118, 110, 0.06) 1px, transparent 1px);
|
|
background-size: auto, 22px 22px, 22px 22px;
|
|
}
|
|
|
|
@media print {
|
|
@page {
|
|
margin: 0.25in;
|
|
size: letter;
|
|
}
|
|
|
|
html,
|
|
body {
|
|
background: #ffffff !important;
|
|
print-color-adjust: exact;
|
|
-webkit-print-color-adjust: exact;
|
|
}
|
|
|
|
body {
|
|
color: #0f172a !important;
|
|
}
|
|
|
|
.print-hidden {
|
|
display: none !important;
|
|
}
|
|
|
|
.print-page {
|
|
max-width: none !important;
|
|
padding: 0 !important;
|
|
}
|
|
|
|
.print-page * {
|
|
box-shadow: none !important;
|
|
animation: none !important;
|
|
}
|
|
|
|
.print-sheet {
|
|
print-color-adjust: exact;
|
|
-webkit-print-color-adjust: exact;
|
|
}
|
|
}
|