173 lines
5.8 KiB
CSS
173 lines
5.8 KiB
CSS
@import "tailwindcss";
|
|
|
|
/* ─────────────────────────────────────────────────────────────────────────
|
|
* Theme — "Field Almanac"
|
|
*
|
|
* Inspiration: 1970s ecological-movement print, agricultural cooperative
|
|
* publications, hand-bound field journals. Warm cream paper, deep
|
|
* botanical green ink, sparing terracotta accent for emphasis.
|
|
*
|
|
* The palette is built in OKLCH for perceptual uniformity. Every neutral
|
|
* is tinted toward the leaf hue (h≈130) so cream and green feel like they
|
|
* came from the same press run.
|
|
* ─────────────────────────────────────────────────────────────────────── */
|
|
|
|
@theme {
|
|
/* Typography */
|
|
--font-display: var(--font-display), ui-serif, Georgia, "Times New Roman", serif;
|
|
--font-body: var(--font-body), ui-sans-serif, system-ui, -apple-system, sans-serif;
|
|
|
|
/* Custom utility names */
|
|
--color-paper: oklch(97.5% 0.012 95); /* warm cream */
|
|
--color-paper-2: oklch(95.5% 0.018 90); /* deeper cream — section bands */
|
|
--color-ink: oklch(20% 0.02 130); /* near-black, slight green tint */
|
|
--color-ink-soft: oklch(35% 0.018 130);
|
|
--color-ink-mute: oklch(55% 0.014 120);
|
|
--color-rule: oklch(82% 0.025 100); /* hairline rules — like ink on cream */
|
|
--color-rule-soft: oklch(89% 0.02 100);
|
|
|
|
/* Botanical green — primary */
|
|
--color-leaf-50: oklch(97% 0.025 135);
|
|
--color-leaf-100: oklch(93% 0.05 135);
|
|
--color-leaf-200: oklch(87% 0.085 135);
|
|
--color-leaf-300: oklch(78% 0.115 135);
|
|
--color-leaf-400: oklch(68% 0.13 135);
|
|
--color-leaf-500: oklch(57% 0.135 135);
|
|
--color-leaf-600: oklch(47% 0.13 135);
|
|
--color-leaf-700: oklch(38% 0.115 135);
|
|
--color-leaf-800: oklch(30% 0.09 135);
|
|
--color-leaf-900: oklch(22% 0.06 135);
|
|
|
|
/* Terracotta — accent. Used sparingly: current-stage marker, key CTAs. */
|
|
--color-clay-100: oklch(94% 0.04 50);
|
|
--color-clay-200: oklch(86% 0.075 50);
|
|
--color-clay-400: oklch(70% 0.13 45);
|
|
--color-clay-500: oklch(63% 0.15 42);
|
|
--color-clay-600: oklch(54% 0.155 40);
|
|
--color-clay-700: oklch(45% 0.135 38);
|
|
|
|
/* Stone — kept as a familiar alias mapping to our warm neutrals so any
|
|
* earlier `text-stone-*` / `border-stone-*` references stay readable. */
|
|
--color-stone-50: var(--color-paper);
|
|
--color-stone-100: var(--color-paper-2);
|
|
--color-stone-200: var(--color-rule-soft);
|
|
--color-stone-300: var(--color-rule);
|
|
--color-stone-400: oklch(70% 0.018 110);
|
|
--color-stone-500: var(--color-ink-mute);
|
|
--color-stone-600: oklch(48% 0.015 120);
|
|
--color-stone-700: var(--color-ink-soft);
|
|
--color-stone-800: oklch(28% 0.018 130);
|
|
--color-stone-900: var(--color-ink);
|
|
}
|
|
|
|
/* Base — paper texture and ink defaults */
|
|
:root {
|
|
color-scheme: light;
|
|
}
|
|
|
|
html {
|
|
-webkit-text-size-adjust: 100%;
|
|
font-feature-settings: "kern", "liga", "calt", "ss01";
|
|
}
|
|
|
|
body {
|
|
background-color: var(--color-paper);
|
|
color: var(--color-ink);
|
|
/* Subtle paper grain — two diagonal repeating linear gradients combined
|
|
* with a soft radial overlay. No external image. Survives dark mode if
|
|
* we ever add one. */
|
|
background-image:
|
|
radial-gradient(ellipse 90% 60% at 50% 0%, oklch(99% 0.01 95 / 0.7), transparent 60%),
|
|
repeating-linear-gradient(
|
|
105deg,
|
|
oklch(96% 0.02 95 / 0.4) 0,
|
|
oklch(96% 0.02 95 / 0.4) 1px,
|
|
transparent 1px,
|
|
transparent 6px
|
|
),
|
|
repeating-linear-gradient(
|
|
15deg,
|
|
oklch(94% 0.02 95 / 0.25) 0,
|
|
oklch(94% 0.02 95 / 0.25) 1px,
|
|
transparent 1px,
|
|
transparent 9px
|
|
);
|
|
}
|
|
|
|
/* Typography defaults */
|
|
.font-display { font-family: var(--font-display); font-feature-settings: "ss01", "cv01"; }
|
|
.font-body { font-family: var(--font-body); }
|
|
|
|
/* Long-form headings get optical-size tuning for richer letterforms */
|
|
h1.font-display, h2.font-display, h3.font-display {
|
|
font-variation-settings: "opsz" 144, "SOFT" 50;
|
|
letter-spacing: -0.015em;
|
|
}
|
|
|
|
/* Forms: shared input rhythm */
|
|
input, select, textarea, button {
|
|
font: inherit;
|
|
}
|
|
|
|
/* A more deliberate focus ring — uses the leaf token */
|
|
*:focus-visible {
|
|
outline: 2px solid var(--color-leaf-500);
|
|
outline-offset: 2px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
/* Date input chevron styled to match */
|
|
input[type="date"]::-webkit-calendar-picker-indicator {
|
|
opacity: 0.5;
|
|
cursor: pointer;
|
|
filter: hue-rotate(70deg);
|
|
}
|
|
|
|
/* Print: lay it out like a real field-journal page when a user hits Cmd+P */
|
|
@media print {
|
|
body { background: white; color: black; }
|
|
body { background-image: none; }
|
|
details { display: block !important; }
|
|
details > div[role="region"] { display: block !important; }
|
|
.no-print { display: none !important; }
|
|
}
|
|
|
|
/* Reduced motion: defer to user preference */
|
|
@media (prefers-reduced-motion: reduce) {
|
|
*, *::before, *::after {
|
|
animation-duration: 0.01ms !important;
|
|
animation-iteration-count: 1 !important;
|
|
transition-duration: 0.01ms !important;
|
|
scroll-behavior: auto !important;
|
|
}
|
|
}
|
|
|
|
/* A small cohort of utility classes — rule lines, rough underlines, etc. */
|
|
.rule-soft {
|
|
background: linear-gradient(
|
|
90deg,
|
|
transparent 0%,
|
|
var(--color-rule) 12%,
|
|
var(--color-rule) 88%,
|
|
transparent 100%
|
|
);
|
|
}
|
|
|
|
/* Ink-bloom focus — used on text inputs to feel handwritten */
|
|
.input-ink {
|
|
background-image: linear-gradient(
|
|
to top,
|
|
var(--color-leaf-200) 0%,
|
|
var(--color-leaf-200) 1px,
|
|
transparent 1px,
|
|
transparent 100%
|
|
);
|
|
background-size: 0% 100%;
|
|
background-repeat: no-repeat;
|
|
background-position: 0 100%;
|
|
transition: background-size 280ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
}
|
|
.input-ink:focus {
|
|
background-size: 100% 100%;
|
|
}
|