One Calendar is a privacy-first calendar web app built with Next.js. It has modern security features, including e2ee, password-protected sharing, and self-destructing share links 馃搮 calendar.xyehr.cn
at main 330 lines 8.3 kB view raw
1@tailwind base; 2@tailwind components; 3@tailwind utilities; 4 5html { 6 scroll-behavior: smooth; 7} 8 9body { 10 font-family: Arial, Helvetica, sans-serif; 11} 12 13@layer utilities { 14 .text-balance { 15 text-wrap: balance; 16 } 17 18} 19 20@keyframes landing-title-in-view { 21 from { 22 opacity: 0; 23 filter: blur(12px); 24 transform: translateY(10px); 25 } 26 to { 27 opacity: 1; 28 filter: blur(0); 29 transform: translateY(0); 30 } 31} 32 33 34.landing-title { 35 opacity: 0; 36 filter: blur(12px); 37 transform: translateY(10px); 38} 39 40.landing-title-visible { 41 animation: landing-title-in-view 1300ms cubic-bezier(0.22, 1, 0.36, 1) both; 42} 43 44@layer components { 45 .cn-toast { 46 background-color: hsl(var(--popover)); 47 color: hsl(var(--popover-foreground)); 48 border: 1px solid hsl(var(--border)); 49 box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); 50 } 51} 52 53@layer base { 54 :root { 55 --landing-bg: #080808; 56 --landing-panel: #0b0b0b; 57 --landing-text: #ffffff; 58 --landing-muted: #9b9b9b; 59 --landing-subtle: #6f6f6f; 60 --background: 0 0% 100%; 61 --foreground: 0 0% 3.9%; 62 --card: 0 0% 100%; 63 --card-foreground: 0 0% 3.9%; 64 --popover: 0 0% 100%; 65 --popover-foreground: 0 0% 3.9%; 66 --primary: 0 0% 9%; 67 --primary-foreground: 0 0% 98%; 68 --secondary: 0 0% 96.1%; 69 --secondary-foreground: 0 0% 9%; 70 --muted: 0 0% 96.1%; 71 --muted-foreground: 0 0% 45.1%; 72 --accent: 0 0% 96.1%; 73 --accent-foreground: 0 0% 9%; 74 --destructive: 0 84.2% 60.2%; 75 --destructive-foreground: 0 0% 98%; 76 --border: 0 0% 89.8%; 77 --input: 0 0% 89.8%; 78 --ring: 0 0% 3.9%; 79 --chart-1: 12 76% 61%; 80 --chart-2: 173 58% 39%; 81 --chart-3: 197 37% 24%; 82 --chart-4: 43 74% 66%; 83 --chart-5: 27 87% 67%; 84 --radius: 0.5rem; 85 --sidebar-background: 0 0% 98%; 86 --sidebar-foreground: 240 5.3% 26.1%; 87 --sidebar-primary: 240 5.9% 10%; 88 --sidebar-primary-foreground: 0 0% 98%; 89 --sidebar-accent: 240 4.8% 95.9%; 90 --sidebar-accent-foreground: 240 5.9% 10%; 91 --sidebar-border: 220 13% 91%; 92 --sidebar-ring: 217.2 91.2% 59.8%; 93 } 94 .dark { 95 --background: 0 0% 3.9%; 96 --foreground: 0 0% 98%; 97 --card: 0 0% 3.9%; 98 --card-foreground: 0 0% 98%; 99 --popover: 0 0% 3.9%; 100 --popover-foreground: 0 0% 98%; 101 --primary: 0 0% 98%; 102 --primary-foreground: 0 0% 9%; 103 --secondary: 0 0% 14.9%; 104 --secondary-foreground: 0 0% 98%; 105 --muted: 0 0% 14.9%; 106 --muted-foreground: 0 0% 63.9%; 107 --accent: 0 0% 14.9%; 108 --accent-foreground: 0 0% 98%; 109 --destructive: 0 62.8% 30.6%; 110 --destructive-foreground: 0 0% 98%; 111 --border: 0 0% 14.9%; 112 --input: 0 0% 14.9%; 113 --ring: 0 0% 83.1%; 114 --chart-1: 220 70% 50%; 115 --chart-2: 160 60% 45%; 116 --chart-3: 30 80% 55%; 117 --chart-4: 280 65% 60%; 118 --chart-5: 340 75% 55%; 119 --sidebar-background: 240 5.9% 10%; 120 --sidebar-foreground: 240 4.8% 95.9%; 121 --sidebar-primary: 224.3 76.3% 48%; 122 --sidebar-primary-foreground: 0 0% 100%; 123 --sidebar-accent: 240 3.7% 15.9%; 124 --sidebar-accent-foreground: 240 4.8% 95.9%; 125 --sidebar-border: 240 3.7% 15.9%; 126 --sidebar-ring: 217.2 91.2% 59.8%; 127 } 128 129.green, 130.green .app-theme-scope { 131 --background: 142 35% 92%; 132 --foreground: 140 20% 15%; 133 --card: 142 30% 88%; 134 --card-foreground: 140 20% 15%; 135 --popover: 142 30% 88%; 136 --popover-foreground: 140 20% 15%; 137 --primary: 142 65% 40%; 138 --primary-foreground: 0 0% 100%; 139 --secondary: 138 20% 82%; 140 --secondary-foreground: 140 20% 15%; 141 --muted: 138 20% 87%; 142 --muted-foreground: 140 15% 40%; 143 --accent: 142 35% 85%; 144 --accent-foreground: 142 65% 40%; 145 --destructive: 0 84% 60%; 146 --destructive-foreground: 0 0% 100%; 147 --border: 141 32% 72%; 148 --input: 141 25% 83%; 149 --ring: 142 65% 40%; 150 --chart-1: 142 65% 40%; 151 --chart-2: 217 91% 60%; 152 --chart-3: 38 92% 50%; 153 --chart-4: 270 95% 75%; 154 --chart-5: 340 82% 52%; 155 --sidebar-background: 142 30% 88%; 156 --sidebar-foreground: 140 20% 15%; 157 --sidebar-primary: 142 65% 40%; 158 --sidebar-primary-foreground: 0 0% 100%; 159 --sidebar-accent: 138 20% 82%; 160 --sidebar-accent-foreground: 140 20% 15%; 161 --sidebar-border: 141 32% 72%; 162 --sidebar-ring: 142 65% 40%; 163} 164 165.orange, 166.orange .app-theme-scope { 167 --background: 28 50% 92%; 168 --foreground: 20 24% 15%; 169 --card: 28 45% 88%; 170 --card-foreground: 20 24% 15%; 171 --popover: 28 45% 88%; 172 --popover-foreground: 20 24% 15%; 173 --primary: 25 85% 48%; 174 --primary-foreground: 0 0% 100%; 175 --secondary: 28 20% 82%; 176 --secondary-foreground: 20 24% 15%; 177 --muted: 28 20% 87%; 178 --muted-foreground: 20 15% 40%; 179 --accent: 25 50% 87%; 180 --accent-foreground: 25 85% 48%; 181 --destructive: 0 84% 60%; 182 --destructive-foreground: 0 0% 100%; 183 --border: 28 32% 72%; 184 --input: 28 25% 83%; 185 --ring: 25 85% 48%; 186 --chart-1: 25 85% 48%; 187 --chart-2: 142 71% 45%; 188 --chart-3: 217 91% 60%; 189 --chart-4: 270 95% 75%; 190 --chart-5: 340 82% 52%; 191 --sidebar-background: 28 45% 88%; 192 --sidebar-foreground: 20 24% 15%; 193 --sidebar-primary: 25 85% 48%; 194 --sidebar-primary-foreground: 0 0% 100%; 195 --sidebar-accent: 28 20% 82%; 196 --sidebar-accent-foreground: 20 24% 15%; 197 --sidebar-border: 28 32% 72%; 198 --sidebar-ring: 25 85% 48%; 199} 200 201.azalea, 202.azalea .app-theme-scope { 203 --background: 331 25% 95%; 204 --foreground: 331 15% 18%; 205 --card: 331 20% 90%; 206 --card-foreground: 331 15% 18%; 207 --popover: 331 20% 90%; 208 --popover-foreground: 331 15% 18%; 209 --primary: 331 63% 49%; 210 --primary-foreground: 0 0% 100%; 211 --secondary: 328 15% 85%; 212 --secondary-foreground: 331 15% 18%; 213 --muted: 328 15% 88%; 214 --muted-foreground: 331 12% 42%; 215 --accent: 331 25% 87%; 216 --accent-foreground: 331 63% 49%; 217 --destructive: 0 84% 60%; 218 --destructive-foreground: 0 0% 100%; 219 --border: 331 20% 75%; 220 --input: 331 18% 85%; 221 --ring: 331 63% 49%; 222 --chart-1: 331 63% 49%; 223 --chart-2: 217 91% 60%; 224 --chart-3: 38 92% 50%; 225 --chart-4: 270 95% 75%; 226 --chart-5: 340 82% 52%; 227 --sidebar-background: 331 20% 90%; 228 --sidebar-foreground: 331 15% 18%; 229 --sidebar-primary: 331 63% 49%; 230 --sidebar-primary-foreground: 0 0% 100%; 231 --sidebar-accent: 328 15% 85%; 232 --sidebar-accent-foreground: 331 15% 18%; 233 --sidebar-border: 331 20% 75%; 234 --sidebar-ring: 331 63% 49%; 235} 236 237 238 239 240.green, 241.green .app-theme-scope, 242.orange, 243.orange .app-theme-scope, 244.azalea, 245.azalea .app-theme-scope { 246 --card: var(--background); 247 --popover: var(--background); 248} 249 250.green .app-theme-scope button[variant="outline"], 251.orange .app-theme-scope button[variant="outline"], 252.azalea .app-theme-scope button[variant="outline"] { 253 border: 1px solid hsl(var(--border)); 254 background: transparent; 255} 256 257.green .app-theme-scope button[variant="ghost"], 258.orange .app-theme-scope button[variant="ghost"], 259.azalea .app-theme-scope button[variant="ghost"] { 260 border: none; 261 background: transparent; 262} 263 264.green .app-theme-scope hr, .green .app-theme-scope .divider, 265.orange .app-theme-scope hr, .orange .app-theme-scope .divider, 266.azalea .app-theme-scope hr, .azalea .app-theme-scope .divider { 267 border-color: hsl(var(--border)); 268 opacity: 0.8; 269} 270 271.green .app-theme-scope .separator, 272.orange .app-theme-scope .separator, 273.azalea .app-theme-scope .separator { 274 height: 1px; 275 background: hsl(var(--border)); 276 opacity: 0.6; 277} 278} 279 280@layer base { 281 * { 282 @apply border-border; 283 scrollbar-width: none; 284 -ms-overflow-style: none; 285 } 286 287 *::-webkit-scrollbar { 288 display: none; 289 width: 0; 290 height: 0; 291 } 292 293 body { 294 @apply bg-background text-foreground; 295 } 296} 297 298 299.text-balance { 300 text-wrap: balance; 301} 302 303.text-pretty { 304 text-wrap: pretty; 305} 306 307.font-inter { 308 font-family: var(--font-inter), ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; 309} 310 311.font-instrument-serif { 312 font-family: var(--font-instrument-serif); 313 font-display: swap; 314} 315 316/* Added explicit font loading optimization */ 317@supports (font-display: swap) { 318 @font-face { 319 font-family: "Instrument Serif"; 320 font-display: swap; 321 } 322} 323 324.mix-blend-multiply { 325 mix-blend-mode: multiply; 326} 327 328.backdrop-blur-custom { 329 backdrop-filter: blur(8.25px); 330}