An encrypted personal cloud built on the AT Protocol.
at main 333 lines 10 kB view raw
1@import "tailwindcss"; 2@plugin "daisyui"; 3 4/* ─── Fallback font metric overrides (eliminates layout shift on swap) ──── */ 5 6@font-face { 7 font-family: "Inter Fallback"; 8 src: local("Arial"), local("Helvetica Neue"), local("Helvetica"); 9 size-adjust: 111.93%; 10 ascent-override: 86.55%; 11 descent-override: 21.55%; 12 line-gap-override: 0%; 13} 14 15@font-face { 16 font-family: "Cormorant Garamond Fallback"; 17 src: local("Times New Roman"), local("Times"); 18 size-adjust: 98.32%; 19 ascent-override: 93.98%; 20 descent-override: 29.19%; 21 line-gap-override: 0%; 22} 23 24/* ─── Self-hosted fonts ──────────────────────────────────────────────────── */ 25 26@font-face { 27 font-family: "Cormorant Garamond"; 28 font-style: normal; 29 font-weight: 300 600; 30 font-display: swap; 31 src: url("/fonts/cormorant-garamond-latin-normal.woff2") format("woff2"); 32 unicode-range: 33 U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, 34 U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 35} 36 37@font-face { 38 font-family: "Cormorant Garamond"; 39 font-style: normal; 40 font-weight: 300 600; 41 font-display: swap; 42 src: url("/fonts/cormorant-garamond-latin-ext-normal.woff2") format("woff2"); 43 unicode-range: 44 U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 45 U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 46 U+A720-A7FF; 47} 48 49@font-face { 50 font-family: "Cormorant Garamond"; 51 font-style: italic; 52 font-weight: 300 600; 53 font-display: swap; 54 src: url("/fonts/cormorant-garamond-latin-italic.woff2") format("woff2"); 55 unicode-range: 56 U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, 57 U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 58} 59 60@font-face { 61 font-family: "Cormorant Garamond"; 62 font-style: italic; 63 font-weight: 300 600; 64 font-display: swap; 65 src: url("/fonts/cormorant-garamond-latin-ext-italic.woff2") format("woff2"); 66 unicode-range: 67 U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 68 U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 69 U+A720-A7FF; 70} 71 72@font-face { 73 font-family: "Inter"; 74 font-style: normal; 75 font-weight: 300 600; 76 font-display: swap; 77 src: url("/fonts/inter-latin-normal.woff2") format("woff2"); 78 unicode-range: 79 U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, 80 U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 81} 82 83@font-face { 84 font-family: "Inter"; 85 font-style: normal; 86 font-weight: 300 600; 87 font-display: swap; 88 src: url("/fonts/inter-latin-ext-normal.woff2") format("woff2"); 89 unicode-range: 90 U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 91 U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 92 U+A720-A7FF; 93} 94 95@font-face { 96 font-family: "Inter"; 97 font-style: italic; 98 font-weight: 300 400; 99 font-display: swap; 100 src: url("/fonts/inter-latin-italic.woff2") format("woff2"); 101 unicode-range: 102 U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, 103 U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 104} 105 106@font-face { 107 font-family: "Inter"; 108 font-style: italic; 109 font-weight: 300 400; 110 font-display: swap; 111 src: url("/fonts/inter-latin-ext-italic.woff2") format("woff2"); 112 unicode-range: 113 U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, 114 U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, 115 U+A720-A7FF; 116} 117 118/* ─── Opake theme ─────────────────────────────────────────────────────────── */ 119 120@plugin "daisyui/theme" { 121 name: "opake"; 122 default: true; 123 124 /* Surfaces */ 125 --color-base-100: oklch(0.985 0.005 85); /* #FDFAF5 — panel bg */ 126 --color-base-200: oklch(0.957 0.012 85); /* #F5F1E8 — sidebar bg */ 127 --color-base-300: oklch(0.93 0.015 85); /* #EDE8DC — page bg */ 128 --color-base-content: oklch(0.155 0.035 70); /* #1C1408 — primary text */ 129 130 /* Accent gold */ 131 --color-primary: oklch(0.58 0.095 75); /* #9A7840 */ 132 --color-primary-content: oklch(0.976 0.008 85); /* #FAF7F1 */ 133 134 /* Muted text / secondary */ 135 --color-secondary: oklch(0.39 0.055 65); /* #5C4A2E */ 136 --color-secondary-content: oklch(0.976 0.008 85); /* #FAF7F1 */ 137 138 /* Accent light bg */ 139 --color-accent: oklch(0.94 0.035 85); /* #F5E9D0 */ 140 --color-accent-content: oklch(0.49 0.08 70); /* #7D6230 */ 141 142 /* Dark UI */ 143 --color-neutral: oklch(0.155 0.035 70); /* #1C1408 */ 144 --color-neutral-content: oklch(0.976 0.008 85); /* #FAF7F1 */ 145 146 /* Semantic */ 147 --color-success: oklch(0.53 0.065 145); /* #5C7A54 — shared/sage */ 148 --color-success-content: oklch(0.976 0.008 85); 149 --color-warning: oklch(0.68 0.135 75); /* #C4952A — gold star */ 150 --color-warning-content: oklch(0.155 0.035 70); 151 --color-error: oklch(0.45 0.11 25); /* #A04840 — destructive */ 152 --color-error-content: oklch(0.976 0.008 85); 153 --color-info: oklch(0.58 0.095 75); 154 --color-info-content: oklch(0.976 0.008 85); 155 156 /* Shape */ 157 --radius-selector: 0.625rem; 158 --radius-field: 0.5625rem; 159 --radius-box: 1rem; 160 --border: 1px; 161 --depth: 1; 162 --noise: 0; 163} 164 165/* ─── Design tokens ───────────────────────────────────────────────────────── */ 166 167@theme { 168 --font-display: "Cormorant Garamond", "Cormorant Garamond Fallback", serif; 169 --font-sans: "Inter", "Inter Fallback", sans-serif; 170 171 /* Text scale */ 172 --text-ui: 0.8125rem; /* 13px — primary UI text */ 173 --text-caption: 0.6875rem; /* 11px — meta/caption */ 174 --text-label: 0.625rem; /* 10px — small labels */ 175 --text-micro: 0.5625rem; /* 9px — tiny text */ 176 177 /* Custom colours */ 178 --color-border-accent: oklch(0.79 0.06 80); /* #D4BC96 */ 179 --color-text-faint: oklch(0.76 0.035 75); /* #C4B09A */ 180 --color-text-muted: oklch(0.62 0.04 70); /* #9A8768 */ 181 --color-bg-hover: oklch(0.58 0.095 75 / 0.055); /* gold hover */ 182 --color-bg-ghost-1: oklch(0.94 0.025 80); /* #F5EDDB */ 183 --color-bg-ghost-2: oklch(0.965 0.015 80); /* #FAF5EC */ 184 --color-bg-sage: oklch(0.94 0.02 140); /* #EEF2E8 */ 185 --color-bg-stone: oklch(0.95 0.01 80); /* #F4F1EC */ 186 187 /* File-type icon colours */ 188 --color-file-doc: #6676a8; 189 --color-file-doc-bg: #eef0f8; 190 --color-file-sheet: #5c8a5c; 191 --color-file-sheet-bg: #eef4ee; 192 --color-file-pdf: #a05040; 193 --color-file-pdf-bg: #f5eeec; 194 --color-file-note: #8a6a30; 195 --color-file-code: #7a6a98; 196 --color-file-code-bg: #f0eef5; 197 --color-file-image: #8a5a8a; 198 --color-file-image-bg: #f2eef2; 199 200 /* Elevation */ 201 --shadow-panel-sm: 0 1px 8px oklch(0.35 0.05 60 / 0.07); 202 --shadow-panel-md: 0 2px 16px oklch(0.35 0.05 60 / 0.09); 203 --shadow-panel-lg: 0 6px 32px oklch(0.35 0.05 60 / 0.12); 204 205 /* Keyframes */ 206 --animate-logo-square: logo-square 2s linear infinite; 207 @keyframes logo-square { 208 0%, 209 100% { 210 transform: translate(0, 0); 211 background: var(--sq-from); 212 border: var(--sq-border-from); 213 } 214 25% { 215 transform: translate(calc(var(--sq-dir) * var(--space)), 0); 216 } 217 50% { 218 transform: translate(calc(var(--sq-dir) * var(--space)), calc(var(--sq-dir) * var(--space))); 219 background: var(--sq-to); 220 border: var(--sq-border-to); 221 } 222 75% { 223 transform: translate(0, calc(var(--sq-dir) * var(--space))); 224 } 225 } 226 227 --animate-hover-lift: hover-lift 0.2s ease-out forwards; 228 @keyframes hover-lift { 229 to { 230 transform: translateY(-2px); 231 box-shadow: var(--shadow-panel-sm); 232 } 233 } 234 235 --animate-ghost-panel: ghost-panel 0.3s ease-out both; 236 @keyframes ghost-panel { 237 from { 238 opacity: 0; 239 translate: 0 0; 240 } 241 } 242 243 --animate-toast-enter: toast-enter 0.25s ease-out both; 244 @keyframes toast-enter { 245 from { 246 opacity: 0; 247 translate: 1rem 0; 248 } 249 } 250} 251 252/* ─── Utilities ──────────────────────────────────────────────────────────── */ 253 254@utility bg-encrypted-pattern { 255 background-image: repeating-linear-gradient( 256 0deg, 257 transparent, 258 transparent 13px, 259 oklch(0.58 0.095 75 / 0.04) 13px, 260 oklch(0.58 0.095 75 / 0.04) 14px 261 ); 262} 263 264/* ─── Base styles ─────────────────────────────────────────────────────────── */ 265 266@layer base { 267 body { 268 font-family: var(--font-sans); 269 -webkit-font-smoothing: antialiased; 270 } 271 272 /* Scoped prose — for MDX content blocks */ 273 .prose p { 274 margin-block: 0.75em; 275 } 276 .prose a { 277 color: var(--color-primary); 278 text-decoration: underline; 279 text-underline-offset: 2px; 280 } 281 .prose strong { 282 font-weight: 600; 283 } 284 .prose h2 { 285 font-family: var(--font-display); 286 font-weight: 400; 287 font-size: clamp(1.3rem, 2.5vw, 1.8rem); 288 line-height: 1.2; 289 letter-spacing: -0.01em; 290 margin-top: 2.5em; 291 margin-bottom: 0.75em; 292 color: var(--color-base-content); 293 } 294 .prose h3 { 295 font-size: 1.05rem; 296 font-weight: 600; 297 margin-top: 1.8em; 298 margin-bottom: 0.5em; 299 color: var(--color-base-content); 300 } 301 .prose ul, 302 .prose ol { 303 margin-block: 0.75em; 304 padding-left: 1.5em; 305 } 306 .prose li { 307 margin-block: 0.25em; 308 } 309 .prose hr { 310 border: none; 311 border-top: 1px solid var(--color-border-accent); 312 opacity: 0.4; 313 margin-block: 2em; 314 } 315 .prose code:not(pre code) { 316 font-size: 0.85em; 317 padding: 0.15em 0.35em; 318 border-radius: 0.25rem; 319 background: var(--color-base-300); 320 } 321 .prose blockquote { 322 border-left: 3px solid var(--color-border-accent); 323 padding-left: 1em; 324 margin-block: 1em; 325 color: var(--color-text-muted); 326 font-style: italic; 327 } 328 .prose pre { 329 margin-block: 1em; 330 border-radius: 0.5rem; 331 overflow-x: auto; 332 } 333}