eny.space Landingpage
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'main' into develop

Sam Sauer cb04ec3f fb9eea05

+1229 -328
app/actions/components/ui/.gitkeep

This is a binary file and will not be displayed.

+6
app/actions/lib/utils.ts
··· 1 + import { clsx, type ClassValue } from "clsx" 2 + import { twMerge } from "tailwind-merge" 3 + 4 + export function cn(...inputs: ClassValue[]) { 5 + return twMerge(clsx(inputs)) 6 + }
+433
app/globals.css
··· 1 + @import "tailwindcss"; 2 + @import "tw-animate-css"; 3 + 4 + @custom-variant dark (&:is(.dark *)); 5 + 6 + /* Variables */ 7 + :root { 8 + --body-color: #050505; 9 + --body-text-color: #f5f5f5; 10 + --checkout-color: #8f6ed5; 11 + --elements-color: #7c7cff; 12 + --h1-color: #f9fafb; 13 + --h2-color: #e5e7eb; 14 + --h3-color: #9ca3af; 15 + --radius: 0.625rem; 16 + --container-width-max: 1280px; 17 + --page-width-max: 600px; 18 + --transition-duration: 2s; 19 + --background: oklch(1 0 0); 20 + --foreground: oklch(0.141 0.005 285.823); 21 + --card: oklch(1 0 0); 22 + --card-foreground: oklch(0.141 0.005 285.823); 23 + --popover: oklch(1 0 0); 24 + --popover-foreground: oklch(0.141 0.005 285.823); 25 + --primary: oklch(0.21 0.006 285.885); 26 + --primary-foreground: oklch(0.985 0 0); 27 + --secondary: oklch(0.967 0.001 286.375); 28 + --secondary-foreground: oklch(0.21 0.006 285.885); 29 + --muted: oklch(0.967 0.001 286.375); 30 + --muted-foreground: oklch(0.552 0.016 285.938); 31 + --accent: oklch(0.967 0.001 286.375); 32 + --accent-foreground: oklch(0.21 0.006 285.885); 33 + --destructive: oklch(0.577 0.245 27.325); 34 + --border: oklch(0.92 0.004 286.32); 35 + --input: oklch(0.92 0.004 286.32); 36 + --ring: oklch(0.705 0.015 286.067); 37 + --chart-1: oklch(0.646 0.222 41.116); 38 + --chart-2: oklch(0.6 0.118 184.704); 39 + --chart-3: oklch(0.398 0.07 227.392); 40 + --chart-4: oklch(0.828 0.189 84.429); 41 + --chart-5: oklch(0.769 0.188 70.08); 42 + --sidebar: oklch(0.985 0 0); 43 + --sidebar-foreground: oklch(0.141 0.005 285.823); 44 + --sidebar-primary: oklch(0.21 0.006 285.885); 45 + --sidebar-primary-foreground: oklch(0.985 0 0); 46 + --sidebar-accent: oklch(0.967 0.001 286.375); 47 + --sidebar-accent-foreground: oklch(0.21 0.006 285.885); 48 + --sidebar-border: oklch(0.92 0.004 286.32); 49 + --sidebar-ring: oklch(0.705 0.015 286.067); 50 + } 51 + 52 + body { 53 + margin: 0; 54 + padding: 0; 55 + background: var(--body-color); 56 + color: var(--body-text-color); 57 + overflow-y: scroll; 58 + } 59 + 60 + * { 61 + box-sizing: border-box; 62 + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 63 + } 64 + 65 + #__next { 66 + display: flex; 67 + justify-content: center; 68 + } 69 + 70 + .container { 71 + max-width: var(--container-width-max); 72 + padding: 45px 25px; 73 + display: flex; 74 + flex-direction: row; 75 + } 76 + 77 + .page-container { 78 + padding-bottom: 60px; 79 + max-width: var(--page-width-max); 80 + } 81 + 82 + h1 { 83 + font-weight: 600; 84 + color: var(--h1-color); 85 + margin: 6px 0 12px; 86 + font-size: 27px; 87 + line-height: 32px; 88 + } 89 + 90 + h1 span.light { 91 + color: var(--h3-color); 92 + } 93 + 94 + h2 { 95 + color: var(--h2-color); 96 + margin: 8px 0; 97 + } 98 + 99 + h3 { 100 + font-size: 17px; 101 + color: var(--h3-color); 102 + margin: 8px 0; 103 + } 104 + 105 + a { 106 + color: #ffffff; 107 + text-decoration: none; 108 + } 109 + 110 + header { 111 + position: relative; 112 + flex: 0 0 250px; 113 + padding-right: 48px; 114 + } 115 + 116 + .header-content { 117 + position: sticky; 118 + top: 45px; 119 + } 120 + 121 + .logo img { 122 + height: 20px; 123 + margin-bottom: 52px; 124 + } 125 + 126 + ul, 127 + li { 128 + list-style: none; 129 + padding: 0; 130 + margin: 0; 131 + } 132 + 133 + .card-list { 134 + display: flex; 135 + flex-wrap: wrap; 136 + align-content: flex-start; 137 + padding-top: 64px; 138 + } 139 + 140 + .card { 141 + display: block; 142 + border-radius: 10px; 143 + position: relative; 144 + padding: 12px; 145 + height: 320px; 146 + flex: 0 0 33%; 147 + min-width: 304px; 148 + width: 33%; 149 + margin: 0 20px 20px 0; 150 + text-decoration: none; 151 + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6), 152 + 0 0 0 1px rgba(255, 255, 255, 0.08); 153 + background: #0b0b0f; 154 + } 155 + .card h2 { 156 + color: #fff; 157 + } 158 + .card h2.bottom { 159 + position: absolute; 160 + bottom: 10px; 161 + } 162 + 163 + .card img { 164 + width: 80%; 165 + position: absolute; 166 + top: 50%; 167 + left: 50%; 168 + transform: translate(-50%, -50%); 169 + } 170 + 171 + .error-message { 172 + color: #ef2961; 173 + } 174 + 175 + .FormRow, 176 + fieldset, 177 + input[type="number"], 178 + input[type="text"] { 179 + border-radius: var(--radius); 180 + padding: 5px 12px; 181 + width: 100%; 182 + background: #111827; 183 + color: var(--body-text-color); 184 + appearance: none; 185 + font-size: 16px; 186 + margin-top: 10px; 187 + } 188 + 189 + input[type="range"] { 190 + margin: 5px 0; 191 + width: 100%; 192 + } 193 + 194 + button { 195 + border-radius: var(--radius); 196 + color: white; 197 + font-size: larger; 198 + border: 0; 199 + padding: 12px 16px; 200 + margin-top: 10px; 201 + font-weight: 600; 202 + cursor: pointer; 203 + transition: all 0.2s ease; 204 + display: block; 205 + width: 100%; 206 + } 207 + button:disabled { 208 + opacity: 0.5; 209 + cursor: not-allowed; 210 + } 211 + 212 + .elements-style { 213 + color: var(--elements-color); 214 + border: 1px solid var(--elements-color); 215 + } 216 + .elements-style-background { 217 + background: var(--elements-color); 218 + transition: box-shadow var(--transition-duration); 219 + } 220 + .card.elements-style-background:hover { 221 + box-shadow: 20px 20px 60px #464e9c, -20px -20px 60px #8896ff; 222 + } 223 + .checkout-style { 224 + color: var(--checkout-color); 225 + border: 1px solid var(--checkout-color); 226 + } 227 + .checkout-style-background { 228 + background: #000000; 229 + color: #ffffff; 230 + border: 1px solid #ffffff; 231 + transition: box-shadow var(--transition-duration), transform 0.15s ease; 232 + } 233 + .card.checkout-style-background:hover { 234 + box-shadow: 0 0 0 2px #ffffff; 235 + transform: translateY(-2px); 236 + } 237 + 238 + /* Test card number */ 239 + .test-card-notice { 240 + display: block; 241 + margin-block-start: 1em; 242 + margin-block-end: 1em; 243 + margin-inline-start: 0px; 244 + margin-inline-end: 0px; 245 + } 246 + .card-number { 247 + display: inline; 248 + white-space: nowrap; 249 + font-family: Menlo, Consolas, monospace; 250 + color: #3c4257; 251 + font-weight: 500; 252 + } 253 + .card-number span { 254 + display: inline-block; 255 + width: 4px; 256 + } 257 + 258 + /* Code block */ 259 + code, 260 + pre { 261 + font-family: "SF Mono", "IBM Plex Mono", "Menlo", monospace; 262 + font-size: 12px; 263 + background: rgba(255, 255, 255, 0.04); 264 + padding: 12px; 265 + border-radius: var(--radius); 266 + max-height: 500px; 267 + width: var(--page-width-max); 268 + overflow: auto; 269 + } 270 + 271 + .banner { 272 + max-width: 825px; 273 + margin: 0 auto; 274 + font-size: 14px; 275 + background: #111827; 276 + color: #e5e7eb; 277 + border-radius: 50px; 278 + box-shadow: 0 12px 30px rgba(0, 0, 0, 0.8), 279 + 0 0 0 1px rgba(255, 255, 255, 0.08); 280 + display: flex; 281 + align-items: center; 282 + box-sizing: border-box; 283 + padding: 15px; 284 + line-height: 1.15; 285 + position: fixed; 286 + bottom: 2vh; 287 + left: 0; 288 + right: 0; 289 + text-align: center; 290 + justify-content: center; 291 + } 292 + 293 + @media only screen and (max-width: 980px) { 294 + .container { 295 + flex-direction: column; 296 + } 297 + 298 + .header-content { 299 + max-width: 280px; 300 + position: relative; 301 + top: 0; 302 + } 303 + 304 + .card { 305 + margin: 0 20px 20px 0; 306 + box-shadow: none; 307 + } 308 + 309 + .card-list { 310 + padding-top: 0; 311 + } 312 + 313 + .banner { 314 + box-shadow: none; 315 + bottom: 0; 316 + } 317 + } 318 + 319 + @media only screen and (max-width: 600px) { 320 + .container { 321 + flex-direction: column; 322 + } 323 + 324 + .card { 325 + display: block; 326 + border-radius: 8px; 327 + flex: 1 0 100%; 328 + max-width: 100%; 329 + padding-left: 0; 330 + padding-right: 0; 331 + margin: 0 0 20px 0; 332 + box-shadow: none; 333 + } 334 + 335 + .card-list { 336 + padding-top: 0; 337 + } 338 + 339 + code, 340 + pre, 341 + h3 { 342 + display: none; 343 + } 344 + 345 + .banner { 346 + box-shadow: none; 347 + bottom: 0; 348 + } 349 + } 350 + 351 + @theme inline { 352 + --radius-sm: calc(var(--radius) - 4px); 353 + --radius-md: calc(var(--radius) - 2px); 354 + --radius-lg: var(--radius); 355 + --radius-xl: calc(var(--radius) + 4px); 356 + --radius-2xl: calc(var(--radius) + 8px); 357 + --radius-3xl: calc(var(--radius) + 12px); 358 + --radius-4xl: calc(var(--radius) + 16px); 359 + --color-background: var(--background); 360 + --color-foreground: var(--foreground); 361 + --color-card: var(--card); 362 + --color-card-foreground: var(--card-foreground); 363 + --color-popover: var(--popover); 364 + --color-popover-foreground: var(--popover-foreground); 365 + --color-primary: var(--primary); 366 + --color-primary-foreground: var(--primary-foreground); 367 + --color-secondary: var(--secondary); 368 + --color-secondary-foreground: var(--secondary-foreground); 369 + --color-muted: var(--muted); 370 + --color-muted-foreground: var(--muted-foreground); 371 + --color-accent: var(--accent); 372 + --color-accent-foreground: var(--accent-foreground); 373 + --color-destructive: var(--destructive); 374 + --color-border: var(--border); 375 + --color-input: var(--input); 376 + --color-ring: var(--ring); 377 + --color-chart-1: var(--chart-1); 378 + --color-chart-2: var(--chart-2); 379 + --color-chart-3: var(--chart-3); 380 + --color-chart-4: var(--chart-4); 381 + --color-chart-5: var(--chart-5); 382 + --color-sidebar: var(--sidebar); 383 + --color-sidebar-foreground: var(--sidebar-foreground); 384 + --color-sidebar-primary: var(--sidebar-primary); 385 + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); 386 + --color-sidebar-accent: var(--sidebar-accent); 387 + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); 388 + --color-sidebar-border: var(--sidebar-border); 389 + --color-sidebar-ring: var(--sidebar-ring); 390 + } 391 + 392 + .dark { 393 + --background: oklch(0.141 0.005 285.823); 394 + --foreground: oklch(0.985 0 0); 395 + --card: oklch(0.21 0.006 285.885); 396 + --card-foreground: oklch(0.985 0 0); 397 + --popover: oklch(0.21 0.006 285.885); 398 + --popover-foreground: oklch(0.985 0 0); 399 + --primary: oklch(0.92 0.004 286.32); 400 + --primary-foreground: oklch(0.21 0.006 285.885); 401 + --secondary: oklch(0.274 0.006 286.033); 402 + --secondary-foreground: oklch(0.985 0 0); 403 + --muted: oklch(0.274 0.006 286.033); 404 + --muted-foreground: oklch(0.705 0.015 286.067); 405 + --accent: oklch(0.274 0.006 286.033); 406 + --accent-foreground: oklch(0.985 0 0); 407 + --destructive: oklch(0.704 0.191 22.216); 408 + --border: oklch(1 0 0 / 10%); 409 + --input: oklch(1 0 0 / 15%); 410 + --ring: oklch(0.552 0.016 285.938); 411 + --chart-1: oklch(0.488 0.243 264.376); 412 + --chart-2: oklch(0.696 0.17 162.48); 413 + --chart-3: oklch(0.769 0.188 70.08); 414 + --chart-4: oklch(0.627 0.265 303.9); 415 + --chart-5: oklch(0.645 0.246 16.439); 416 + --sidebar: oklch(0.21 0.006 285.885); 417 + --sidebar-foreground: oklch(0.985 0 0); 418 + --sidebar-primary: oklch(0.488 0.243 264.376); 419 + --sidebar-primary-foreground: oklch(0.985 0 0); 420 + --sidebar-accent: oklch(0.274 0.006 286.033); 421 + --sidebar-accent-foreground: oklch(0.985 0 0); 422 + --sidebar-border: oklch(1 0 0 / 10%); 423 + --sidebar-ring: oklch(0.552 0.016 285.938); 424 + } 425 + 426 + @layer base { 427 + * { 428 + @apply border-border outline-ring/50; 429 + } 430 + body { 431 + @apply bg-background text-foreground; 432 + } 433 + }
+1 -1
app/layout.tsx
··· 3 3 import { Analytics } from "@vercel/analytics/next"; 4 4 import { Space_Grotesk } from "next/font/google"; 5 5 6 - import "../styles.css"; 6 + import "./globals.css"; 7 7 8 8 const fontSans = Space_Grotesk({ 9 9 subsets: ["latin"],
+1 -1
app/page.tsx
··· 35 35 style={{ display: "flex", gap: 12, marginTop: 24, flexWrap: "wrap" }} 36 36 > 37 37 <Link 38 - href="mailto:hello@eny.space?subject=I%27d%20like%20early%20access%20to%20eny.space%20PDS" 38 + href="mailto:hello@krekeny.com?subject=I%27d%20like%20early%20access%20to%20eny.space%20PDS" 39 39 style={{ 40 40 display: "inline-block", 41 41 padding: "12px 24px",
+22
components.json
··· 1 + { 2 + "$schema": "https://ui.shadcn.com/schema.json", 3 + "style": "new-york", 4 + "rsc": true, 5 + "tsx": true, 6 + "tailwind": { 7 + "config": "", 8 + "css": "app/globals.css", 9 + "baseColor": "zinc", 10 + "cssVariables": true, 11 + "prefix": "" 12 + }, 13 + "iconLibrary": "lucide", 14 + "aliases": { 15 + "components": "@/actions/components", 16 + "utils": "@/actions/lib/utils", 17 + "ui": "@/actions/components/ui", 18 + "lib": "@/actions/lib", 19 + "hooks": "@/actions/hooks" 20 + }, 21 + "registries": {} 22 + }
+749 -12
package-lock.json
··· 5 5 "packages": { 6 6 "": { 7 7 "dependencies": { 8 + "@radix-ui/react-slot": "^1.2.4", 8 9 "@stripe/react-stripe-js": "2.4.0", 9 10 "@stripe/stripe-js": "2.2.2", 11 + "@tailwindcss/postcss": "^4.1.18", 10 12 "@vercel/analytics": "^1.6.1", 11 13 "@vercel/speed-insights": "^1.3.1", 14 + "class-variance-authority": "^0.7.1", 15 + "clsx": "^2.1.1", 16 + "lucide-react": "^0.562.0", 12 17 "next": "latest", 18 + "postcss": "^8.5.6", 13 19 "react": "18.2.0", 14 20 "react-dom": "18.2.0", 15 21 "server-only": "0.0.1", 16 - "stripe": "14.8.0" 22 + "stripe": "14.8.0", 23 + "tailwind-merge": "^3.4.0", 24 + "tailwindcss": "^4.1.18" 17 25 }, 18 26 "devDependencies": { 19 27 "@types/node": "20.4.6", 20 28 "@types/react": "18.2.8", 29 + "tw-animate-css": "^1.4.0", 21 30 "typescript": "5.1.6" 31 + } 32 + }, 33 + "node_modules/@alloc/quick-lru": { 34 + "version": "5.2.0", 35 + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 36 + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 37 + "license": "MIT", 38 + "engines": { 39 + "node": ">=10" 40 + }, 41 + "funding": { 42 + "url": "https://github.com/sponsors/sindresorhus" 22 43 } 23 44 }, 24 45 "node_modules/@emnapi/runtime": { ··· 497 518 "url": "https://opencollective.com/libvips" 498 519 } 499 520 }, 521 + "node_modules/@jridgewell/gen-mapping": { 522 + "version": "0.3.13", 523 + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", 524 + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", 525 + "license": "MIT", 526 + "dependencies": { 527 + "@jridgewell/sourcemap-codec": "^1.5.0", 528 + "@jridgewell/trace-mapping": "^0.3.24" 529 + } 530 + }, 531 + "node_modules/@jridgewell/remapping": { 532 + "version": "2.3.5", 533 + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", 534 + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", 535 + "license": "MIT", 536 + "dependencies": { 537 + "@jridgewell/gen-mapping": "^0.3.5", 538 + "@jridgewell/trace-mapping": "^0.3.24" 539 + } 540 + }, 541 + "node_modules/@jridgewell/resolve-uri": { 542 + "version": "3.1.2", 543 + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 544 + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 545 + "license": "MIT", 546 + "engines": { 547 + "node": ">=6.0.0" 548 + } 549 + }, 550 + "node_modules/@jridgewell/sourcemap-codec": { 551 + "version": "1.5.5", 552 + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", 553 + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", 554 + "license": "MIT" 555 + }, 556 + "node_modules/@jridgewell/trace-mapping": { 557 + "version": "0.3.31", 558 + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", 559 + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", 560 + "license": "MIT", 561 + "dependencies": { 562 + "@jridgewell/resolve-uri": "^3.1.0", 563 + "@jridgewell/sourcemap-codec": "^1.4.14" 564 + } 565 + }, 500 566 "node_modules/@next/env": { 501 567 "version": "16.0.10", 502 568 "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.10.tgz", ··· 631 697 "node": ">= 10" 632 698 } 633 699 }, 700 + "node_modules/@radix-ui/react-compose-refs": { 701 + "version": "1.1.2", 702 + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", 703 + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", 704 + "license": "MIT", 705 + "peerDependencies": { 706 + "@types/react": "*", 707 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 708 + }, 709 + "peerDependenciesMeta": { 710 + "@types/react": { 711 + "optional": true 712 + } 713 + } 714 + }, 715 + "node_modules/@radix-ui/react-slot": { 716 + "version": "1.2.4", 717 + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz", 718 + "integrity": "sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==", 719 + "license": "MIT", 720 + "dependencies": { 721 + "@radix-ui/react-compose-refs": "1.1.2" 722 + }, 723 + "peerDependencies": { 724 + "@types/react": "*", 725 + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" 726 + }, 727 + "peerDependenciesMeta": { 728 + "@types/react": { 729 + "optional": true 730 + } 731 + } 732 + }, 634 733 "node_modules/@stripe/react-stripe-js": { 635 734 "version": "2.4.0", 636 735 "resolved": "https://registry.npmjs.org/@stripe/react-stripe-js/-/react-stripe-js-2.4.0.tgz", ··· 660 759 "tslib": "^2.8.0" 661 760 } 662 761 }, 762 + "node_modules/@tailwindcss/node": { 763 + "version": "4.1.18", 764 + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", 765 + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", 766 + "license": "MIT", 767 + "dependencies": { 768 + "@jridgewell/remapping": "^2.3.4", 769 + "enhanced-resolve": "^5.18.3", 770 + "jiti": "^2.6.1", 771 + "lightningcss": "1.30.2", 772 + "magic-string": "^0.30.21", 773 + "source-map-js": "^1.2.1", 774 + "tailwindcss": "4.1.18" 775 + } 776 + }, 777 + "node_modules/@tailwindcss/oxide": { 778 + "version": "4.1.18", 779 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", 780 + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", 781 + "license": "MIT", 782 + "engines": { 783 + "node": ">= 10" 784 + }, 785 + "optionalDependencies": { 786 + "@tailwindcss/oxide-android-arm64": "4.1.18", 787 + "@tailwindcss/oxide-darwin-arm64": "4.1.18", 788 + "@tailwindcss/oxide-darwin-x64": "4.1.18", 789 + "@tailwindcss/oxide-freebsd-x64": "4.1.18", 790 + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", 791 + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", 792 + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", 793 + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", 794 + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", 795 + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", 796 + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", 797 + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" 798 + } 799 + }, 800 + "node_modules/@tailwindcss/oxide-android-arm64": { 801 + "version": "4.1.18", 802 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", 803 + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", 804 + "cpu": [ 805 + "arm64" 806 + ], 807 + "license": "MIT", 808 + "optional": true, 809 + "os": [ 810 + "android" 811 + ], 812 + "engines": { 813 + "node": ">= 10" 814 + } 815 + }, 816 + "node_modules/@tailwindcss/oxide-darwin-arm64": { 817 + "version": "4.1.18", 818 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", 819 + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", 820 + "cpu": [ 821 + "arm64" 822 + ], 823 + "license": "MIT", 824 + "optional": true, 825 + "os": [ 826 + "darwin" 827 + ], 828 + "engines": { 829 + "node": ">= 10" 830 + } 831 + }, 832 + "node_modules/@tailwindcss/oxide-darwin-x64": { 833 + "version": "4.1.18", 834 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", 835 + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", 836 + "cpu": [ 837 + "x64" 838 + ], 839 + "license": "MIT", 840 + "optional": true, 841 + "os": [ 842 + "darwin" 843 + ], 844 + "engines": { 845 + "node": ">= 10" 846 + } 847 + }, 848 + "node_modules/@tailwindcss/oxide-freebsd-x64": { 849 + "version": "4.1.18", 850 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", 851 + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", 852 + "cpu": [ 853 + "x64" 854 + ], 855 + "license": "MIT", 856 + "optional": true, 857 + "os": [ 858 + "freebsd" 859 + ], 860 + "engines": { 861 + "node": ">= 10" 862 + } 863 + }, 864 + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { 865 + "version": "4.1.18", 866 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", 867 + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", 868 + "cpu": [ 869 + "arm" 870 + ], 871 + "license": "MIT", 872 + "optional": true, 873 + "os": [ 874 + "linux" 875 + ], 876 + "engines": { 877 + "node": ">= 10" 878 + } 879 + }, 880 + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { 881 + "version": "4.1.18", 882 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", 883 + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", 884 + "cpu": [ 885 + "arm64" 886 + ], 887 + "license": "MIT", 888 + "optional": true, 889 + "os": [ 890 + "linux" 891 + ], 892 + "engines": { 893 + "node": ">= 10" 894 + } 895 + }, 896 + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { 897 + "version": "4.1.18", 898 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", 899 + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", 900 + "cpu": [ 901 + "arm64" 902 + ], 903 + "license": "MIT", 904 + "optional": true, 905 + "os": [ 906 + "linux" 907 + ], 908 + "engines": { 909 + "node": ">= 10" 910 + } 911 + }, 912 + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { 913 + "version": "4.1.18", 914 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", 915 + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", 916 + "cpu": [ 917 + "x64" 918 + ], 919 + "license": "MIT", 920 + "optional": true, 921 + "os": [ 922 + "linux" 923 + ], 924 + "engines": { 925 + "node": ">= 10" 926 + } 927 + }, 928 + "node_modules/@tailwindcss/oxide-linux-x64-musl": { 929 + "version": "4.1.18", 930 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", 931 + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", 932 + "cpu": [ 933 + "x64" 934 + ], 935 + "license": "MIT", 936 + "optional": true, 937 + "os": [ 938 + "linux" 939 + ], 940 + "engines": { 941 + "node": ">= 10" 942 + } 943 + }, 944 + "node_modules/@tailwindcss/oxide-wasm32-wasi": { 945 + "version": "4.1.18", 946 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", 947 + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", 948 + "bundleDependencies": [ 949 + "@napi-rs/wasm-runtime", 950 + "@emnapi/core", 951 + "@emnapi/runtime", 952 + "@tybys/wasm-util", 953 + "@emnapi/wasi-threads", 954 + "tslib" 955 + ], 956 + "cpu": [ 957 + "wasm32" 958 + ], 959 + "license": "MIT", 960 + "optional": true, 961 + "dependencies": { 962 + "@emnapi/core": "^1.7.1", 963 + "@emnapi/runtime": "^1.7.1", 964 + "@emnapi/wasi-threads": "^1.1.0", 965 + "@napi-rs/wasm-runtime": "^1.1.0", 966 + "@tybys/wasm-util": "^0.10.1", 967 + "tslib": "^2.4.0" 968 + }, 969 + "engines": { 970 + "node": ">=14.0.0" 971 + } 972 + }, 973 + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { 974 + "version": "4.1.18", 975 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", 976 + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", 977 + "cpu": [ 978 + "arm64" 979 + ], 980 + "license": "MIT", 981 + "optional": true, 982 + "os": [ 983 + "win32" 984 + ], 985 + "engines": { 986 + "node": ">= 10" 987 + } 988 + }, 989 + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { 990 + "version": "4.1.18", 991 + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", 992 + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", 993 + "cpu": [ 994 + "x64" 995 + ], 996 + "license": "MIT", 997 + "optional": true, 998 + "os": [ 999 + "win32" 1000 + ], 1001 + "engines": { 1002 + "node": ">= 10" 1003 + } 1004 + }, 1005 + "node_modules/@tailwindcss/postcss": { 1006 + "version": "4.1.18", 1007 + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", 1008 + "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", 1009 + "license": "MIT", 1010 + "dependencies": { 1011 + "@alloc/quick-lru": "^5.2.0", 1012 + "@tailwindcss/node": "4.1.18", 1013 + "@tailwindcss/oxide": "4.1.18", 1014 + "postcss": "^8.4.41", 1015 + "tailwindcss": "4.1.18" 1016 + } 1017 + }, 663 1018 "node_modules/@types/node": { 664 1019 "version": "20.4.6", 665 1020 "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.6.tgz", ··· 670 1025 "version": "15.7.15", 671 1026 "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", 672 1027 "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", 673 - "dev": true, 1028 + "devOptional": true, 674 1029 "license": "MIT" 675 1030 }, 676 1031 "node_modules/@types/react": { 677 1032 "version": "18.2.8", 678 1033 "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.8.tgz", 679 1034 "integrity": "sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==", 680 - "dev": true, 1035 + "devOptional": true, 681 1036 "license": "MIT", 682 1037 "dependencies": { 683 1038 "@types/prop-types": "*", ··· 689 1044 "version": "0.26.0", 690 1045 "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.26.0.tgz", 691 1046 "integrity": "sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==", 692 - "dev": true, 1047 + "devOptional": true, 693 1048 "license": "MIT" 694 1049 }, 695 1050 "node_modules/@vercel/analytics": { ··· 813 1168 ], 814 1169 "license": "CC-BY-4.0" 815 1170 }, 1171 + "node_modules/class-variance-authority": { 1172 + "version": "0.7.1", 1173 + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", 1174 + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", 1175 + "license": "Apache-2.0", 1176 + "dependencies": { 1177 + "clsx": "^2.1.1" 1178 + }, 1179 + "funding": { 1180 + "url": "https://polar.sh/cva" 1181 + } 1182 + }, 816 1183 "node_modules/client-only": { 817 1184 "version": "0.0.1", 818 1185 "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 819 1186 "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", 820 1187 "license": "MIT" 821 1188 }, 1189 + "node_modules/clsx": { 1190 + "version": "2.1.1", 1191 + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", 1192 + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", 1193 + "license": "MIT", 1194 + "engines": { 1195 + "node": ">=6" 1196 + } 1197 + }, 822 1198 "node_modules/csstype": { 823 1199 "version": "3.2.3", 824 1200 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", 825 1201 "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", 826 - "dev": true, 1202 + "devOptional": true, 827 1203 "license": "MIT" 828 1204 }, 829 1205 "node_modules/detect-libc": { ··· 831 1207 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", 832 1208 "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", 833 1209 "license": "Apache-2.0", 834 - "optional": true, 835 1210 "engines": { 836 1211 "node": ">=8" 837 1212 } ··· 848 1223 }, 849 1224 "engines": { 850 1225 "node": ">= 0.4" 1226 + } 1227 + }, 1228 + "node_modules/enhanced-resolve": { 1229 + "version": "5.18.4", 1230 + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", 1231 + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", 1232 + "license": "MIT", 1233 + "dependencies": { 1234 + "graceful-fs": "^4.2.4", 1235 + "tapable": "^2.2.0" 1236 + }, 1237 + "engines": { 1238 + "node": ">=10.13.0" 851 1239 } 852 1240 }, 853 1241 "node_modules/es-define-property": { ··· 938 1326 "url": "https://github.com/sponsors/ljharb" 939 1327 } 940 1328 }, 1329 + "node_modules/graceful-fs": { 1330 + "version": "4.2.11", 1331 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 1332 + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 1333 + "license": "ISC" 1334 + }, 941 1335 "node_modules/has-symbols": { 942 1336 "version": "1.1.0", 943 1337 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", ··· 962 1356 "node": ">= 0.4" 963 1357 } 964 1358 }, 1359 + "node_modules/jiti": { 1360 + "version": "2.6.1", 1361 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", 1362 + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", 1363 + "license": "MIT", 1364 + "bin": { 1365 + "jiti": "lib/jiti-cli.mjs" 1366 + } 1367 + }, 965 1368 "node_modules/js-tokens": { 966 1369 "version": "4.0.0", 967 1370 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 968 1371 "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 969 1372 "license": "MIT" 970 1373 }, 1374 + "node_modules/lightningcss": { 1375 + "version": "1.30.2", 1376 + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", 1377 + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", 1378 + "license": "MPL-2.0", 1379 + "dependencies": { 1380 + "detect-libc": "^2.0.3" 1381 + }, 1382 + "engines": { 1383 + "node": ">= 12.0.0" 1384 + }, 1385 + "funding": { 1386 + "type": "opencollective", 1387 + "url": "https://opencollective.com/parcel" 1388 + }, 1389 + "optionalDependencies": { 1390 + "lightningcss-android-arm64": "1.30.2", 1391 + "lightningcss-darwin-arm64": "1.30.2", 1392 + "lightningcss-darwin-x64": "1.30.2", 1393 + "lightningcss-freebsd-x64": "1.30.2", 1394 + "lightningcss-linux-arm-gnueabihf": "1.30.2", 1395 + "lightningcss-linux-arm64-gnu": "1.30.2", 1396 + "lightningcss-linux-arm64-musl": "1.30.2", 1397 + "lightningcss-linux-x64-gnu": "1.30.2", 1398 + "lightningcss-linux-x64-musl": "1.30.2", 1399 + "lightningcss-win32-arm64-msvc": "1.30.2", 1400 + "lightningcss-win32-x64-msvc": "1.30.2" 1401 + } 1402 + }, 1403 + "node_modules/lightningcss-android-arm64": { 1404 + "version": "1.30.2", 1405 + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", 1406 + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", 1407 + "cpu": [ 1408 + "arm64" 1409 + ], 1410 + "license": "MPL-2.0", 1411 + "optional": true, 1412 + "os": [ 1413 + "android" 1414 + ], 1415 + "engines": { 1416 + "node": ">= 12.0.0" 1417 + }, 1418 + "funding": { 1419 + "type": "opencollective", 1420 + "url": "https://opencollective.com/parcel" 1421 + } 1422 + }, 1423 + "node_modules/lightningcss-darwin-arm64": { 1424 + "version": "1.30.2", 1425 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", 1426 + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", 1427 + "cpu": [ 1428 + "arm64" 1429 + ], 1430 + "license": "MPL-2.0", 1431 + "optional": true, 1432 + "os": [ 1433 + "darwin" 1434 + ], 1435 + "engines": { 1436 + "node": ">= 12.0.0" 1437 + }, 1438 + "funding": { 1439 + "type": "opencollective", 1440 + "url": "https://opencollective.com/parcel" 1441 + } 1442 + }, 1443 + "node_modules/lightningcss-darwin-x64": { 1444 + "version": "1.30.2", 1445 + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", 1446 + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", 1447 + "cpu": [ 1448 + "x64" 1449 + ], 1450 + "license": "MPL-2.0", 1451 + "optional": true, 1452 + "os": [ 1453 + "darwin" 1454 + ], 1455 + "engines": { 1456 + "node": ">= 12.0.0" 1457 + }, 1458 + "funding": { 1459 + "type": "opencollective", 1460 + "url": "https://opencollective.com/parcel" 1461 + } 1462 + }, 1463 + "node_modules/lightningcss-freebsd-x64": { 1464 + "version": "1.30.2", 1465 + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", 1466 + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", 1467 + "cpu": [ 1468 + "x64" 1469 + ], 1470 + "license": "MPL-2.0", 1471 + "optional": true, 1472 + "os": [ 1473 + "freebsd" 1474 + ], 1475 + "engines": { 1476 + "node": ">= 12.0.0" 1477 + }, 1478 + "funding": { 1479 + "type": "opencollective", 1480 + "url": "https://opencollective.com/parcel" 1481 + } 1482 + }, 1483 + "node_modules/lightningcss-linux-arm-gnueabihf": { 1484 + "version": "1.30.2", 1485 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", 1486 + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", 1487 + "cpu": [ 1488 + "arm" 1489 + ], 1490 + "license": "MPL-2.0", 1491 + "optional": true, 1492 + "os": [ 1493 + "linux" 1494 + ], 1495 + "engines": { 1496 + "node": ">= 12.0.0" 1497 + }, 1498 + "funding": { 1499 + "type": "opencollective", 1500 + "url": "https://opencollective.com/parcel" 1501 + } 1502 + }, 1503 + "node_modules/lightningcss-linux-arm64-gnu": { 1504 + "version": "1.30.2", 1505 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", 1506 + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", 1507 + "cpu": [ 1508 + "arm64" 1509 + ], 1510 + "license": "MPL-2.0", 1511 + "optional": true, 1512 + "os": [ 1513 + "linux" 1514 + ], 1515 + "engines": { 1516 + "node": ">= 12.0.0" 1517 + }, 1518 + "funding": { 1519 + "type": "opencollective", 1520 + "url": "https://opencollective.com/parcel" 1521 + } 1522 + }, 1523 + "node_modules/lightningcss-linux-arm64-musl": { 1524 + "version": "1.30.2", 1525 + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", 1526 + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", 1527 + "cpu": [ 1528 + "arm64" 1529 + ], 1530 + "license": "MPL-2.0", 1531 + "optional": true, 1532 + "os": [ 1533 + "linux" 1534 + ], 1535 + "engines": { 1536 + "node": ">= 12.0.0" 1537 + }, 1538 + "funding": { 1539 + "type": "opencollective", 1540 + "url": "https://opencollective.com/parcel" 1541 + } 1542 + }, 1543 + "node_modules/lightningcss-linux-x64-gnu": { 1544 + "version": "1.30.2", 1545 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", 1546 + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", 1547 + "cpu": [ 1548 + "x64" 1549 + ], 1550 + "license": "MPL-2.0", 1551 + "optional": true, 1552 + "os": [ 1553 + "linux" 1554 + ], 1555 + "engines": { 1556 + "node": ">= 12.0.0" 1557 + }, 1558 + "funding": { 1559 + "type": "opencollective", 1560 + "url": "https://opencollective.com/parcel" 1561 + } 1562 + }, 1563 + "node_modules/lightningcss-linux-x64-musl": { 1564 + "version": "1.30.2", 1565 + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", 1566 + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", 1567 + "cpu": [ 1568 + "x64" 1569 + ], 1570 + "license": "MPL-2.0", 1571 + "optional": true, 1572 + "os": [ 1573 + "linux" 1574 + ], 1575 + "engines": { 1576 + "node": ">= 12.0.0" 1577 + }, 1578 + "funding": { 1579 + "type": "opencollective", 1580 + "url": "https://opencollective.com/parcel" 1581 + } 1582 + }, 1583 + "node_modules/lightningcss-win32-arm64-msvc": { 1584 + "version": "1.30.2", 1585 + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", 1586 + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", 1587 + "cpu": [ 1588 + "arm64" 1589 + ], 1590 + "license": "MPL-2.0", 1591 + "optional": true, 1592 + "os": [ 1593 + "win32" 1594 + ], 1595 + "engines": { 1596 + "node": ">= 12.0.0" 1597 + }, 1598 + "funding": { 1599 + "type": "opencollective", 1600 + "url": "https://opencollective.com/parcel" 1601 + } 1602 + }, 1603 + "node_modules/lightningcss-win32-x64-msvc": { 1604 + "version": "1.30.2", 1605 + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", 1606 + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", 1607 + "cpu": [ 1608 + "x64" 1609 + ], 1610 + "license": "MPL-2.0", 1611 + "optional": true, 1612 + "os": [ 1613 + "win32" 1614 + ], 1615 + "engines": { 1616 + "node": ">= 12.0.0" 1617 + }, 1618 + "funding": { 1619 + "type": "opencollective", 1620 + "url": "https://opencollective.com/parcel" 1621 + } 1622 + }, 971 1623 "node_modules/loose-envify": { 972 1624 "version": "1.4.0", 973 1625 "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", ··· 980 1632 "loose-envify": "cli.js" 981 1633 } 982 1634 }, 1635 + "node_modules/lucide-react": { 1636 + "version": "0.562.0", 1637 + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz", 1638 + "integrity": "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==", 1639 + "license": "ISC", 1640 + "peerDependencies": { 1641 + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" 1642 + } 1643 + }, 1644 + "node_modules/magic-string": { 1645 + "version": "0.30.21", 1646 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", 1647 + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", 1648 + "license": "MIT", 1649 + "dependencies": { 1650 + "@jridgewell/sourcemap-codec": "^1.5.5" 1651 + } 1652 + }, 983 1653 "node_modules/math-intrinsics": { 984 1654 "version": "1.1.0", 985 1655 "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", ··· 1059 1729 } 1060 1730 } 1061 1731 }, 1732 + "node_modules/next/node_modules/postcss": { 1733 + "version": "8.4.31", 1734 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 1735 + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 1736 + "funding": [ 1737 + { 1738 + "type": "opencollective", 1739 + "url": "https://opencollective.com/postcss/" 1740 + }, 1741 + { 1742 + "type": "tidelift", 1743 + "url": "https://tidelift.com/funding/github/npm/postcss" 1744 + }, 1745 + { 1746 + "type": "github", 1747 + "url": "https://github.com/sponsors/ai" 1748 + } 1749 + ], 1750 + "license": "MIT", 1751 + "dependencies": { 1752 + "nanoid": "^3.3.6", 1753 + "picocolors": "^1.0.0", 1754 + "source-map-js": "^1.0.2" 1755 + }, 1756 + "engines": { 1757 + "node": "^10 || ^12 || >=14" 1758 + } 1759 + }, 1062 1760 "node_modules/object-assign": { 1063 1761 "version": "4.1.1", 1064 1762 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", ··· 1087 1785 "license": "ISC" 1088 1786 }, 1089 1787 "node_modules/postcss": { 1090 - "version": "8.4.31", 1091 - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 1092 - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 1788 + "version": "8.5.6", 1789 + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", 1790 + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", 1093 1791 "funding": [ 1094 1792 { 1095 1793 "type": "opencollective", ··· 1106 1804 ], 1107 1805 "license": "MIT", 1108 1806 "dependencies": { 1109 - "nanoid": "^3.3.6", 1110 - "picocolors": "^1.0.0", 1111 - "source-map-js": "^1.0.2" 1807 + "nanoid": "^3.3.11", 1808 + "picocolors": "^1.1.1", 1809 + "source-map-js": "^1.2.1" 1112 1810 }, 1113 1811 "engines": { 1114 1812 "node": "^10 || ^12 || >=14" ··· 1361 2059 } 1362 2060 } 1363 2061 }, 2062 + "node_modules/tailwind-merge": { 2063 + "version": "3.4.0", 2064 + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", 2065 + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", 2066 + "license": "MIT", 2067 + "funding": { 2068 + "type": "github", 2069 + "url": "https://github.com/sponsors/dcastil" 2070 + } 2071 + }, 2072 + "node_modules/tailwindcss": { 2073 + "version": "4.1.18", 2074 + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", 2075 + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", 2076 + "license": "MIT" 2077 + }, 2078 + "node_modules/tapable": { 2079 + "version": "2.3.0", 2080 + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", 2081 + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", 2082 + "license": "MIT", 2083 + "engines": { 2084 + "node": ">=6" 2085 + }, 2086 + "funding": { 2087 + "type": "opencollective", 2088 + "url": "https://opencollective.com/webpack" 2089 + } 2090 + }, 1364 2091 "node_modules/tslib": { 1365 2092 "version": "2.8.1", 1366 2093 "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", 1367 2094 "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", 1368 2095 "license": "0BSD" 2096 + }, 2097 + "node_modules/tw-animate-css": { 2098 + "version": "1.4.0", 2099 + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", 2100 + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", 2101 + "dev": true, 2102 + "license": "MIT", 2103 + "funding": { 2104 + "url": "https://github.com/sponsors/Wombosvideo" 2105 + } 1369 2106 }, 1370 2107 "node_modules/typescript": { 1371 2108 "version": "5.1.6",
+10 -1
package.json
··· 6 6 "start": "next start" 7 7 }, 8 8 "dependencies": { 9 + "@radix-ui/react-slot": "^1.2.4", 9 10 "@stripe/react-stripe-js": "2.4.0", 10 11 "@stripe/stripe-js": "2.2.2", 12 + "@tailwindcss/postcss": "^4.1.18", 11 13 "@vercel/analytics": "^1.6.1", 12 14 "@vercel/speed-insights": "^1.3.1", 15 + "class-variance-authority": "^0.7.1", 16 + "clsx": "^2.1.1", 17 + "lucide-react": "^0.562.0", 13 18 "next": "latest", 19 + "postcss": "^8.5.6", 14 20 "react": "18.2.0", 15 21 "react-dom": "18.2.0", 16 22 "server-only": "0.0.1", 17 - "stripe": "14.8.0" 23 + "stripe": "14.8.0", 24 + "tailwind-merge": "^3.4.0", 25 + "tailwindcss": "^4.1.18" 18 26 }, 19 27 "devDependencies": { 20 28 "@types/node": "20.4.6", 21 29 "@types/react": "18.2.8", 30 + "tw-animate-css": "^1.4.0", 22 31 "typescript": "5.1.6" 23 32 } 24 33 }
+7
postcss.config.mjs
··· 1 + const config = { 2 + plugins: { 3 + "@tailwindcss/postcss": {}, 4 + }, 5 + }; 6 + 7 + export default config;
-313
styles.css
··· 1 - /* Variables */ 2 - :root { 3 - --body-color: #050505; 4 - --body-text-color: #f5f5f5; 5 - --checkout-color: #8f6ed5; 6 - --elements-color: #7c7cff; 7 - --h1-color: #f9fafb; 8 - --h2-color: #e5e7eb; 9 - --h3-color: #9ca3af; 10 - --radius: 6px; 11 - --container-width-max: 1280px; 12 - --page-width-max: 600px; 13 - --transition-duration: 2s; 14 - } 15 - 16 - body { 17 - margin: 0; 18 - padding: 0; 19 - background: var(--body-color); 20 - color: var(--body-text-color); 21 - overflow-y: scroll; 22 - } 23 - 24 - * { 25 - box-sizing: border-box; 26 - -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 27 - } 28 - 29 - #__next { 30 - display: flex; 31 - justify-content: center; 32 - } 33 - 34 - .container { 35 - max-width: var(--container-width-max); 36 - padding: 45px 25px; 37 - display: flex; 38 - flex-direction: row; 39 - } 40 - 41 - .page-container { 42 - padding-bottom: 60px; 43 - max-width: var(--page-width-max); 44 - } 45 - 46 - h1 { 47 - font-weight: 600; 48 - color: var(--h1-color); 49 - margin: 6px 0 12px; 50 - font-size: 27px; 51 - line-height: 32px; 52 - } 53 - 54 - h1 span.light { 55 - color: var(--h3-color); 56 - } 57 - 58 - h2 { 59 - color: var(--h2-color); 60 - margin: 8px 0; 61 - } 62 - 63 - h3 { 64 - font-size: 17px; 65 - color: var(--h3-color); 66 - margin: 8px 0; 67 - } 68 - 69 - a { 70 - color: #ffffff; 71 - text-decoration: none; 72 - } 73 - 74 - header { 75 - position: relative; 76 - flex: 0 0 250px; 77 - padding-right: 48px; 78 - } 79 - 80 - .header-content { 81 - position: sticky; 82 - top: 45px; 83 - } 84 - 85 - .logo img { 86 - height: 20px; 87 - margin-bottom: 52px; 88 - } 89 - 90 - ul, 91 - li { 92 - list-style: none; 93 - padding: 0; 94 - margin: 0; 95 - } 96 - 97 - .card-list { 98 - display: flex; 99 - flex-wrap: wrap; 100 - align-content: flex-start; 101 - padding-top: 64px; 102 - } 103 - 104 - .card { 105 - display: block; 106 - border-radius: 10px; 107 - position: relative; 108 - padding: 12px; 109 - height: 320px; 110 - flex: 0 0 33%; 111 - min-width: 304px; 112 - width: 33%; 113 - margin: 0 20px 20px 0; 114 - text-decoration: none; 115 - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6), 116 - 0 0 0 1px rgba(255, 255, 255, 0.08); 117 - background: #0b0b0f; 118 - } 119 - .card h2 { 120 - color: #fff; 121 - } 122 - .card h2.bottom { 123 - position: absolute; 124 - bottom: 10px; 125 - } 126 - 127 - .card img { 128 - width: 80%; 129 - position: absolute; 130 - top: 50%; 131 - left: 50%; 132 - transform: translate(-50%, -50%); 133 - } 134 - 135 - .error-message { 136 - color: #ef2961; 137 - } 138 - 139 - .FormRow, 140 - fieldset, 141 - input[type="number"], 142 - input[type="text"] { 143 - border-radius: var(--radius); 144 - padding: 5px 12px; 145 - width: 100%; 146 - background: #111827; 147 - color: var(--body-text-color); 148 - appearance: none; 149 - font-size: 16px; 150 - margin-top: 10px; 151 - } 152 - 153 - input[type="range"] { 154 - margin: 5px 0; 155 - width: 100%; 156 - } 157 - 158 - button { 159 - border-radius: var(--radius); 160 - color: white; 161 - font-size: larger; 162 - border: 0; 163 - padding: 12px 16px; 164 - margin-top: 10px; 165 - font-weight: 600; 166 - cursor: pointer; 167 - transition: all 0.2s ease; 168 - display: block; 169 - width: 100%; 170 - } 171 - button:disabled { 172 - opacity: 0.5; 173 - cursor: not-allowed; 174 - } 175 - 176 - .elements-style { 177 - color: var(--elements-color); 178 - border: 1px solid var(--elements-color); 179 - } 180 - .elements-style-background { 181 - background: var(--elements-color); 182 - transition: box-shadow var(--transition-duration); 183 - } 184 - .card.elements-style-background:hover { 185 - box-shadow: 20px 20px 60px #464e9c, -20px -20px 60px #8896ff; 186 - } 187 - .checkout-style { 188 - color: var(--checkout-color); 189 - border: 1px solid var(--checkout-color); 190 - } 191 - .checkout-style-background { 192 - background: #000000; 193 - color: #ffffff; 194 - border: 1px solid #ffffff; 195 - transition: box-shadow var(--transition-duration), transform 0.15s ease; 196 - } 197 - .card.checkout-style-background:hover { 198 - box-shadow: 0 0 0 2px #ffffff; 199 - transform: translateY(-2px); 200 - } 201 - 202 - /* Test card number */ 203 - .test-card-notice { 204 - display: block; 205 - margin-block-start: 1em; 206 - margin-block-end: 1em; 207 - margin-inline-start: 0px; 208 - margin-inline-end: 0px; 209 - } 210 - .card-number { 211 - display: inline; 212 - white-space: nowrap; 213 - font-family: Menlo, Consolas, monospace; 214 - color: #3c4257; 215 - font-weight: 500; 216 - } 217 - .card-number span { 218 - display: inline-block; 219 - width: 4px; 220 - } 221 - 222 - /* Code block */ 223 - code, 224 - pre { 225 - font-family: "SF Mono", "IBM Plex Mono", "Menlo", monospace; 226 - font-size: 12px; 227 - background: rgba(255, 255, 255, 0.04); 228 - padding: 12px; 229 - border-radius: var(--radius); 230 - max-height: 500px; 231 - width: var(--page-width-max); 232 - overflow: auto; 233 - } 234 - 235 - .banner { 236 - max-width: 825px; 237 - margin: 0 auto; 238 - font-size: 14px; 239 - background: #111827; 240 - color: #e5e7eb; 241 - border-radius: 50px; 242 - box-shadow: 0 12px 30px rgba(0, 0, 0, 0.8), 243 - 0 0 0 1px rgba(255, 255, 255, 0.08); 244 - display: flex; 245 - align-items: center; 246 - box-sizing: border-box; 247 - padding: 15px; 248 - line-height: 1.15; 249 - position: fixed; 250 - bottom: 2vh; 251 - left: 0; 252 - right: 0; 253 - text-align: center; 254 - justify-content: center; 255 - } 256 - 257 - @media only screen and (max-width: 980px) { 258 - .container { 259 - flex-direction: column; 260 - } 261 - 262 - .header-content { 263 - max-width: 280px; 264 - position: relative; 265 - top: 0; 266 - } 267 - 268 - .card { 269 - margin: 0 20px 20px 0; 270 - box-shadow: none; 271 - } 272 - 273 - .card-list { 274 - padding-top: 0; 275 - } 276 - 277 - .banner { 278 - box-shadow: none; 279 - bottom: 0; 280 - } 281 - } 282 - 283 - @media only screen and (max-width: 600px) { 284 - .container { 285 - flex-direction: column; 286 - } 287 - 288 - .card { 289 - display: block; 290 - border-radius: 8px; 291 - flex: 1 0 100%; 292 - max-width: 100%; 293 - padding-left: 0; 294 - padding-right: 0; 295 - margin: 0 0 20px 0; 296 - box-shadow: none; 297 - } 298 - 299 - .card-list { 300 - padding-top: 0; 301 - } 302 - 303 - code, 304 - pre, 305 - h3 { 306 - display: none; 307 - } 308 - 309 - .banner { 310 - box-shadow: none; 311 - bottom: 0; 312 - } 313 - }