styles.css
1 @import url("https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,500;9..144,700&family=Manrope:wght@400;500;600;700;800&display=swap"); 2 @import "tailwindcss"; 3 @plugin "@tailwindcss/typography"; 4 @import "leaflet/dist/leaflet.css"; 5 6 @theme { 7 --font-sans: "Manrope", ui-sans-serif, system-ui, sans-serif; 8 } 9 10 :root { 11 --sea-ink: #173a40; 12 --sea-ink-soft: #416166; 13 --lagoon: #4fb8b2; 14 --lagoon-deep: #328f97; 15 --palm: #2f6a4a; 16 --sand: #e7f0e8; 17 --foam: #f3faf5; 18 --surface: rgba(255, 255, 255, 0.74); 19 --surface-strong: rgba(255, 255, 255, 0.9); 20 --line: rgba(23, 58, 64, 0.14); 21 --inset-glint: rgba(255, 255, 255, 0.82); 22 --kicker: rgba(47, 106, 74, 0.9); 23 --bg-base: #e7f3ec; 24 --header-bg: rgba(251, 255, 248, 0.84); 25 --chip-bg: rgba(255, 255, 255, 0.8); 26 --chip-line: rgba(47, 106, 74, 0.18); 27 --link-bg-hover: rgba(255, 255, 255, 0.9); 28 --hero-a: rgba(79, 184, 178, 0.36); 29 --hero-b: rgba(47, 106, 74, 0.2); 30 } 31 32 :root[data-theme="dark"] { 33 --sea-ink: #d7ece8; 34 --sea-ink-soft: #afcdc8; 35 --lagoon: #60d7cf; 36 --lagoon-deep: #8de5db; 37 --palm: #6ec89a; 38 --sand: #0f1a1e; 39 --foam: #101d22; 40 --surface: rgba(16, 30, 34, 0.8); 41 --surface-strong: rgba(15, 27, 31, 0.92); 42 --line: rgba(141, 229, 219, 0.18); 43 --inset-glint: rgba(194, 247, 238, 0.14); 44 --kicker: #b8efe5; 45 --bg-base: #0a1418; 46 --header-bg: rgba(10, 20, 24, 0.8); 47 --chip-bg: rgba(13, 28, 32, 0.9); 48 --chip-line: rgba(141, 229, 219, 0.24); 49 --link-bg-hover: rgba(24, 44, 49, 0.8); 50 --hero-a: rgba(96, 215, 207, 0.18); 51 --hero-b: rgba(110, 200, 154, 0.12); 52 } 53 54 @media (prefers-color-scheme: dark) { 55 :root:not([data-theme="light"]) { 56 --sea-ink: #d7ece8; 57 --sea-ink-soft: #afcdc8; 58 --lagoon: #60d7cf; 59 --lagoon-deep: #8de5db; 60 --palm: #6ec89a; 61 --sand: #0f1a1e; 62 --foam: #101d22; 63 --surface: rgba(16, 30, 34, 0.8); 64 --surface-strong: rgba(15, 27, 31, 0.92); 65 --line: rgba(141, 229, 219, 0.18); 66 --inset-glint: rgba(194, 247, 238, 0.14); 67 --kicker: #b8efe5; 68 --bg-base: #0a1418; 69 --header-bg: rgba(10, 20, 24, 0.8); 70 --chip-bg: rgba(13, 28, 32, 0.9); 71 --chip-line: rgba(141, 229, 219, 0.24); 72 --link-bg-hover: rgba(24, 44, 49, 0.8); 73 --hero-a: rgba(96, 215, 207, 0.18); 74 --hero-b: rgba(110, 200, 154, 0.12); 75 } 76 } 77 78 * { 79 box-sizing: border-box; 80 } 81 82 html, 83 body, 84 #app { 85 min-height: 100%; 86 } 87 88 body { 89 margin: 0; 90 color: var(--sea-ink); 91 font-family: var(--font-sans); 92 background-color: var(--bg-base); 93 background: 94 radial-gradient(1100px 620px at -8% -10%, var(--hero-a), transparent 58%), 95 radial-gradient(1050px 620px at 112% -12%, var(--hero-b), transparent 62%), 96 radial-gradient(720px 380px at 50% 115%, rgba(79, 184, 178, 0.1), transparent 68%), 97 linear-gradient(180deg, color-mix(in oklab, var(--sand) 68%, white) 0%, var(--foam) 44%, var(--bg-base) 100%); 98 overflow-x: hidden; 99 -webkit-font-smoothing: antialiased; 100 -moz-osx-font-smoothing: grayscale; 101 } 102 103 body::before { 104 content: ""; 105 position: fixed; 106 inset: 0; 107 pointer-events: none; 108 z-index: -1; 109 opacity: 0.28; 110 background: 111 radial-gradient(circle at 20% 15%, rgba(255, 255, 255, 0.8), transparent 34%), 112 radial-gradient(circle at 78% 26%, rgba(79, 184, 178, 0.2), transparent 42%), 113 radial-gradient(circle at 42% 82%, rgba(47, 106, 74, 0.14), transparent 36%); 114 } 115 116 body::after { 117 content: ""; 118 position: fixed; 119 inset: 0; 120 pointer-events: none; 121 z-index: -1; 122 opacity: 0.14; 123 background-image: 124 linear-gradient(rgba(255, 255, 255, 0.07) 1px, transparent 1px), 125 linear-gradient(90deg, rgba(255, 255, 255, 0.06) 1px, transparent 1px); 126 background-size: 28px 28px; 127 mask-image: radial-gradient(circle at 50% 30%, black, transparent 78%); 128 } 129 130 a { 131 color: var(--lagoon-deep); 132 text-decoration-color: rgba(50, 143, 151, 0.4); 133 text-decoration-thickness: 1px; 134 text-underline-offset: 2px; 135 } 136 137 a:hover { 138 color: #246f76; 139 } 140 141 code { 142 font-size: 0.9em; 143 border: 1px solid var(--line); 144 background: color-mix(in oklab, var(--surface-strong) 82%, white 18%); 145 border-radius: 7px; 146 padding: 2px 7px; 147 } 148 149 pre code { 150 border: 0; 151 background: transparent; 152 padding: 0; 153 border-radius: 0; 154 font-size: inherit; 155 color: inherit; 156 } 157 158 .page-wrap { 159 width: min(1080px, calc(100% - 2rem)); 160 margin-inline: auto; 161 } 162 163 .display-title { 164 font-family: "Fraunces", Georgia, serif; 165 } 166 167 .island-shell { 168 border: 1px solid var(--line); 169 background: linear-gradient(165deg, var(--surface-strong), var(--surface)); 170 box-shadow: 171 0 1px 0 var(--inset-glint) inset, 172 0 22px 44px rgba(30, 90, 72, 0.1), 173 0 6px 18px rgba(23, 58, 64, 0.08); 174 backdrop-filter: blur(4px); 175 } 176 177 .feature-card { 178 background: linear-gradient(165deg, color-mix(in oklab, var(--surface-strong) 93%, white 7%), var(--surface)); 179 box-shadow: 180 0 1px 0 var(--inset-glint) inset, 181 0 18px 34px rgba(30, 90, 72, 0.1), 182 0 4px 14px rgba(23, 58, 64, 0.06); 183 } 184 185 .feature-card:hover { 186 transform: translateY(-2px); 187 border-color: color-mix(in oklab, var(--lagoon-deep) 35%, var(--line)); 188 } 189 190 button, 191 .island-shell, 192 a { 193 transition: background-color 180ms ease, color 180ms ease, border-color 180ms ease, 194 transform 180ms ease; 195 } 196 197 .island-kicker { 198 letter-spacing: 0.16em; 199 text-transform: uppercase; 200 font-weight: 700; 201 font-size: 0.69rem; 202 color: var(--kicker); 203 } 204 205 .nav-link { 206 position: relative; 207 display: inline-flex; 208 align-items: center; 209 text-decoration: none; 210 color: var(--sea-ink-soft); 211 } 212 213 .nav-link::after { 214 content: ""; 215 position: absolute; 216 left: 0; 217 bottom: -6px; 218 width: 100%; 219 height: 2px; 220 transform: scaleX(0); 221 transform-origin: left; 222 background: linear-gradient(90deg, var(--lagoon), #7ed3bf); 223 transition: transform 170ms ease; 224 } 225 226 .nav-link:hover, 227 .nav-link.is-active { 228 color: var(--sea-ink); 229 } 230 231 .nav-link:hover::after, 232 .nav-link.is-active::after { 233 transform: scaleX(1); 234 } 235 236 @media (max-width: 640px) { 237 .nav-link::after { 238 bottom: -4px; 239 } 240 } 241 242 .site-footer { 243 border-top: 1px solid var(--line); 244 background: color-mix(in oklab, var(--header-bg) 84%, transparent 16%); 245 } 246 247 .rise-in { 248 animation: rise-in 700ms cubic-bezier(0.16, 1, 0.3, 1) both; 249 } 250 251 @keyframes rise-in { 252 from { 253 opacity: 0; 254 transform: translateY(12px); 255 } 256 to { 257 opacity: 1; 258 transform: translateY(0); 259 } 260 }