diff --git a/AGENTS.md b/AGENTS.md index 59f0a3a..31a07f9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -61,6 +61,8 @@ These instructions apply to the entire repository. Known environment variable names: - `NEXT_PUBLIC_PROJECT_ID` +- `DEV_ALLOWED_ORIGINS` +- `S3_BUCKET` - `S3_ENDPOINT` - `S3_REGION` - `S3_KEY` diff --git a/app/api/channel/route.ts b/app/api/channel/route.ts index c50312f..eb7b3ac 100644 --- a/app/api/channel/route.ts +++ b/app/api/channel/route.ts @@ -3,7 +3,7 @@ import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; import { verifyMessage } from "ethers"; import { NextResponse } from "next/server"; -import { s3Client } from "../../config"; +import { getS3Bucket, s3Client } from "../../config"; import { MEMBER_SIGN_MESSAGE, NOT_MEMBER_ERROR, @@ -42,7 +42,7 @@ export async function POST(req: Request) { if (members.includes(address.toLowerCase())) { const bucketParams = { - Bucket: "raid-guild-valhalla", + Bucket: getS3Bucket(), Key: requestBody.key, }; diff --git a/app/api/files/route.ts b/app/api/files/route.ts index 7ea4490..c00c9c2 100644 --- a/app/api/files/route.ts +++ b/app/api/files/route.ts @@ -4,7 +4,7 @@ import { } from "@aws-sdk/client-s3"; import { verifyMessage } from "ethers"; import { NextResponse } from "next/server"; -import { s3Client } from "../../config"; +import { getS3Bucket, s3Client } from "../../config"; import { MEMBER_SIGN_MESSAGE, NOT_MEMBER_ERROR, @@ -14,7 +14,6 @@ import { logServerError, } from "../shared/memberAuth"; -const bucketParams = { Bucket: "raid-guild-valhalla" }; const S3_LIST_PAGE_SIZE = 500; const S3_LIST_MAX_PAGES = 10; const S3_LIST_MAX_FILES = S3_LIST_PAGE_SIZE * S3_LIST_MAX_PAGES; @@ -69,6 +68,7 @@ export async function POST(req: Request) { const members = await fetchMemberAddresses(); if (members.includes(address.toLowerCase())) { + const bucketParams = { Bucket: getS3Bucket() }; const files: ValhallaFile[] = []; let continuationToken: string | undefined; let pagesFetched = 0; diff --git a/app/config.ts b/app/config.ts index 0d89865..d82ea85 100644 --- a/app/config.ts +++ b/app/config.ts @@ -5,6 +5,16 @@ export const CONFIG = { THE_GRAPH_API_KEY: process.env.THE_GRAPH_API_KEY, }; +export function getS3Bucket() { + const bucket = process.env.S3_BUCKET?.trim(); + + if (!bucket) { + throw new Error("S3_BUCKET is not configured."); + } + + return bucket; +} + const hasS3Key = Boolean(process.env.S3_KEY); const hasS3Secret = Boolean(process.env.S3_SECRET); diff --git a/app/favicon.ico b/app/favicon.ico deleted file mode 100644 index 718d6fe..0000000 Binary files a/app/favicon.ico and /dev/null differ diff --git a/app/fonts.ts b/app/fonts.ts new file mode 100644 index 0000000..d4ca667 --- /dev/null +++ b/app/fonts.ts @@ -0,0 +1,39 @@ +import { EB_Garamond, Ubuntu_Mono } from "next/font/google"; +import localFont from "next/font/local"; + +export const maziusDisplay = localFont({ + src: [ + { + path: "../public/fonts/MAZIUSREVIEW20.09-Regular.woff", + weight: "400", + style: "normal", + }, + { + path: "../public/fonts/MaziusDisplay-Bold.otf", + weight: "700", + style: "normal", + }, + { + path: "../public/fonts/MaziusDisplay-Extraitalic.otf", + weight: "400", + style: "italic", + }, + ], + variable: "--font-display", + display: "swap", +}); + +export const ebGaramond = EB_Garamond({ + subsets: ["latin"], + variable: "--font-body", + weight: ["400", "500", "600", "700"], + style: ["normal", "italic"], + display: "swap", +}); + +export const ubuntuMono = Ubuntu_Mono({ + subsets: ["latin"], + variable: "--font-mono", + weight: ["400", "700"], + display: "swap", +}); diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..5afd466 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,891 @@ +:root { + color-scheme: light; + --moloch-100: #faeeeb; + --moloch-200: #efc5bb; + --moloch-300: #e39b8b; + --moloch-400: #d25c41; + --moloch-500: #bd482d; + --moloch-600: #8b3521; + --moloch-700: #5c2316; + --moloch-800: #29100a; + --scroll-100: #f9f7e7; + --scroll-200: #ece5ac; + --scroll-300: #dccd6a; + --scroll-400: #d2c141; + --scroll-500: #b5a22c; + --scroll-600: #837820; + --scroll-700: #534a13; + --scroll-800: #211e07; + --neutral-100: #f1efee; + --neutral-200: #d5cecd; + --neutral-300: #b9aeac; + --neutral-400: #9e8e8a; + --neutral-500: #806f6b; + --neutral-600: #645754; + --neutral-700: #433937; + --neutral-800: #221d1c; + --neutral-white: #fafafa; + --neutral-black: #0d0d0d; + --radius: 0.625rem; + --page-width: 80rem; + --page-gutter: clamp(1rem, 4vw, 3rem); +} + +* { + box-sizing: border-box; +} + +html { + min-width: 20rem; + background: var(--scroll-100); + scroll-behavior: smooth; +} + +body { + min-height: 100vh; + margin: 0; + background: var(--scroll-100); + color: var(--moloch-800); + font-family: var(--font-body), Georgia, serif; + font-size: 1rem; + line-height: 1.6; + font-variant: normal; + font-variant-caps: normal; + font-feature-settings: + "smcp" 0, + "c2sc" 0, + "pcap" 0, + "c2pc" 0; + text-rendering: optimizelegibility; +} + +button, +input, +textarea, +select { + font: inherit; +} + +button, +a { + -webkit-tap-highlight-color: transparent; +} + +button:focus-visible, +a:focus-visible { + outline: 0.125rem solid var(--moloch-500); + outline-offset: 0.25rem; +} + +::selection { + background: var(--moloch-500); + color: var(--scroll-100); +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip-path: inset(50%); + border: 0; + white-space: nowrap; +} + +.site-shell { + position: relative; + display: flex; + min-height: 100vh; + flex-direction: column; + background: + radial-gradient(circle at 92% 6%, rgb(189 72 45 / 11%), transparent 28rem), + linear-gradient(rgb(41 16 10 / 2.5%) 1px, transparent 1px), + linear-gradient(90deg, rgb(41 16 10 / 2.5%) 1px, transparent 1px), + var(--scroll-100); + background-size: + auto, + 4rem 4rem, + 4rem 4rem, + auto; +} + +.site-shell::before { + position: absolute; + top: 5rem; + left: 50%; + width: min(calc(100% - (2 * var(--page-gutter))), var(--page-width)); + border-top: 1px solid rgb(41 16 10 / 14%); + content: ""; + transform: translateX(-50%); +} + +.site-content { + z-index: 1; + display: flex; + width: 100%; + flex: 1; +} + +.site-header, +.valhalla-main { + width: min(calc(100% - (2 * var(--page-gutter))), var(--page-width)); + margin-inline: auto; +} + +.site-header { + z-index: 10; + display: flex; + min-height: 5rem; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +.brand-home-link { + display: inline-flex; + align-items: center; + gap: 1rem; + color: inherit; + text-decoration: none; +} + +.brand-logo-full { + width: clamp(8.75rem, 16vw, 11rem); + height: auto; +} + +.brand-logo-symbol { + display: none; + width: 2.5rem; + height: auto; +} + +.brand-context { + padding-left: 1rem; + border-left: 1px solid var(--neutral-300); + color: var(--neutral-600); + font-family: var(--font-mono), monospace; + font-size: 0.75rem; + letter-spacing: 0.04em; + line-height: 1.4; +} + +.wallet-control { + display: inline-flex; + min-width: 0; + align-items: center; +} + +.rg-button { + display: inline-flex; + min-height: 3rem; + align-items: center; + justify-content: center; + gap: 0.625rem; + padding: 0.75rem 2rem; + border: 2px solid transparent; + border-radius: var(--radius); + cursor: pointer; + font-family: var(--font-body), Georgia, serif; + font-size: 0.95rem; + font-weight: 700; + letter-spacing: 0.06em; + line-height: 1.2; + text-transform: uppercase; + transition: + background-color 150ms ease, + border-color 150ms ease, + color 150ms ease, + transform 150ms ease; +} + +.rg-button:hover:not(:disabled) { + transform: translateY(-2px); +} + +.rg-button:active:not(:disabled) { + transform: translateY(0); +} + +.rg-button:disabled { + cursor: wait; + opacity: 0.58; +} + +.rg-button--primary { + background: var(--moloch-500); + color: var(--scroll-100); +} + +.rg-button--primary:hover:not(:disabled) { + background: var(--moloch-700); +} + +.rg-button--secondary { + border-color: var(--moloch-800); + background: transparent; + color: var(--moloch-800); +} + +.rg-button--secondary:hover:not(:disabled) { + background: var(--moloch-800); + color: var(--scroll-100); +} + +.rg-button--header { + min-height: 2.5rem; + max-width: 14rem; + padding: 0.5rem 1rem; + overflow: hidden; + font-family: var(--font-mono), monospace; + font-size: 0.75rem; + text-overflow: ellipsis; + text-transform: none; + white-space: nowrap; +} + +.valhalla-main { + display: flex; + flex-direction: column; + justify-content: center; + padding-block: clamp(2rem, 4vw, 4rem); +} + +.hero { + display: grid; + align-items: center; + gap: clamp(2rem, 4vw, 4rem); + grid-template-columns: minmax(0, 1.05fr) minmax(18rem, 0.95fr); +} + +.hero-copy { + position: relative; + z-index: 1; + max-width: 42rem; +} + +.eyebrow { + display: flex; + align-items: center; + gap: 0.75rem; + margin: 0 0 1.25rem; + color: var(--moloch-600); + font-family: var(--font-mono), monospace; + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.08em; + line-height: 1.5; + text-transform: uppercase; +} + +.eyebrow::before { + width: 2.25rem; + border-top: 2px solid currentcolor; + content: ""; +} + +.hero-title { + max-width: 10ch; + margin: 0; + color: var(--moloch-800); + font-family: var(--font-display), Georgia, serif; + font-size: clamp(4rem, 7vw, 6.5rem); + font-weight: 700; + letter-spacing: -0.03em; + line-height: 0.9; +} + +.hero-title em { + color: var(--moloch-500); + font-weight: 400; +} + +.hero-description { + max-width: 35rem; + margin: 1.5rem 0 0; + color: var(--neutral-700); + font-size: clamp(1.125rem, 2vw, 1.35rem); + line-height: 1.5; +} + +.hero-action { + margin-top: 2rem; +} + +.hero-step { + margin-bottom: 0.75rem; +} + +.hero-art { + position: relative; + min-height: clamp(19rem, 34vw, 29rem); + isolation: isolate; +} + +.hero-art::before { + position: absolute; + z-index: -1; + inset: 8% 4%; + border: 1px solid rgb(189 72 45 / 38%); + border-radius: 50%; + content: ""; +} + +.hero-art-image { + object-fit: contain; + filter: saturate(0.9) contrast(1.03); + mix-blend-mode: multiply; + mask-image: + linear-gradient( + to right, + transparent 0%, + black 13%, + black 87%, + transparent 100% + ), + linear-gradient( + to bottom, + transparent 0%, + black 12%, + black 88%, + transparent 100% + ); + mask-composite: intersect; + -webkit-mask-image: + linear-gradient( + to right, + transparent 0%, + black 13%, + black 87%, + transparent 100% + ), + linear-gradient( + to bottom, + transparent 0%, + black 12%, + black 88%, + transparent 100% + ); + -webkit-mask-composite: source-in; +} + +.access-region { + position: relative; + z-index: 2; + margin-top: clamp(2rem, 5vw, 4rem); +} + +.gate-card { + display: grid; + align-items: center; + gap: 2rem; + padding-block: 1.5rem; + border-block: 1px solid var(--neutral-300); + color: var(--moloch-800); + grid-template-columns: minmax(0, 1fr) auto; +} + +.gate-card--error { + border-color: var(--moloch-400); +} + +.brand-crystal { + width: 2.75rem; + height: 2.75rem; + background: currentcolor; + mask: url("/brand/crystal.svg") center / contain no-repeat; + -webkit-mask: url("/brand/crystal.svg") center / contain no-repeat; +} + +.gate-copy { + max-width: 43rem; +} + +.gate-eyebrow { + margin-bottom: 0.65rem; +} + +.gate-title { + display: flex; + align-items: center; + gap: 0.75rem; + margin: 0; + font-family: var(--font-display), Georgia, serif; + font-size: clamp(1.75rem, 3vw, 2.5rem); + font-weight: 700; + letter-spacing: -0.01em; + line-height: 1.15; +} + +.gate-description { + max-width: 40rem; + margin: 0.65rem 0 0; + color: var(--neutral-600); + font-size: 1.05rem; + line-height: 1.55; +} + +.gate-error { + margin: 0.85rem 0 0; + color: var(--moloch-600); + font-size: 0.95rem; + line-height: 1.45; +} + +.gate-action { + display: flex; + min-width: max-content; + justify-content: flex-end; +} + +.loading-mark { + width: 1.5rem; + height: 1.5rem; + flex: 0 0 auto; + border: 2px solid var(--neutral-300); + border-top-color: var(--moloch-400); + border-radius: 50%; + animation: gate-spin 800ms linear infinite; +} + +.alert { + display: flex; + align-items: flex-start; + gap: 0.75rem; + margin-bottom: 1.5rem; + padding: 0.9rem 1rem; + border: 1px solid var(--moloch-300); + border-radius: calc(var(--radius) - 0.15rem); + background: var(--moloch-100); + color: var(--moloch-700); + font-size: 1rem; +} + +.alert::before { + flex: 0 0 auto; + width: 0.55rem; + height: 0.55rem; + margin-top: 0.5rem; + border-radius: 50%; + background: var(--moloch-500); + content: ""; +} + +.archive { + margin-top: clamp(3rem, 7vw, 6rem); +} + +.archive-header { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 2rem; + margin-bottom: 2rem; + padding-bottom: 1.5rem; + border-bottom: 1px solid var(--neutral-300); +} + +.archive-heading-group .eyebrow { + margin-bottom: 0.65rem; +} + +.archive-title { + margin: 0; + font-family: var(--font-display), Georgia, serif; + font-size: clamp(2.5rem, 5vw, 4.25rem); + font-weight: 700; + letter-spacing: -0.02em; + line-height: 1; +} + +.archive-count { + flex: 0 0 auto; + color: var(--neutral-600); + font-family: var(--font-mono), monospace; + font-size: 0.75rem; + letter-spacing: 0.04em; +} + +.archive-tools { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1rem; +} + +.archive-search { + display: flex; + width: min(100%, 30rem); + min-height: 2.75rem; + align-items: center; + gap: 0.6rem; + padding-inline: 0.8rem 0.45rem; + border: 1px solid var(--neutral-300); + border-radius: calc(var(--radius) - 0.2rem); + background: rgb(249 247 231 / 76%); + color: var(--neutral-600); + transition: + border-color 150ms ease, + box-shadow 150ms ease; +} + +.archive-search:focus-within { + border-color: var(--moloch-500); + box-shadow: 0 0 0 0.2rem rgb(189 72 45 / 12%); +} + +.archive-search-icon { + width: 1rem; + height: 1rem; + flex: 0 0 auto; +} + +.archive-search input { + width: 100%; + min-width: 0; + padding: 0; + border: 0; + outline: 0; + background: transparent; + color: var(--moloch-800); + font-size: 0.95rem; + line-height: 1.4; +} + +.archive-search input::placeholder { + color: var(--neutral-600); + opacity: 1; +} + +.archive-search input::-webkit-search-cancel-button { + display: none; +} + +.archive-search-clear { + display: grid; + width: 2rem; + height: 2rem; + flex: 0 0 auto; + padding: 0; + place-items: center; + border: 0; + border-radius: 50%; + background: transparent; + color: var(--neutral-600); + cursor: pointer; +} + +.archive-search-clear:hover { + background: var(--moloch-100); + color: var(--moloch-700); +} + +.archive-search-clear svg { + width: 1rem; + height: 1rem; +} + +.archive-search-status { + flex: 0 0 auto; + margin: 0; + color: var(--neutral-600); + font-family: var(--font-mono), monospace; + font-size: 0.7rem; + letter-spacing: 0.03em; +} + +.file-grid { + display: grid; + margin: 0; + padding: 0; + gap: 0.625rem; + grid-template-columns: repeat(3, minmax(0, 1fr)); + list-style: none; +} + +.file-card { + display: grid; + width: 100%; + min-height: 4.25rem; + align-items: center; + gap: 0.75rem; + padding: 0.7rem 0.85rem; + overflow: hidden; + border: 1px solid var(--neutral-300); + border-radius: calc(var(--radius) - 0.2rem); + background: rgb(249 247 231 / 68%); + color: var(--moloch-800); + cursor: pointer; + grid-template-columns: auto minmax(0, 1fr) auto; + text-align: left; + transition: + background-color 160ms ease, + border-color 160ms ease, + color 160ms ease, + transform 160ms ease; +} + +.file-card:hover:not(:disabled) { + border-color: var(--moloch-500); + background: var(--moloch-100); + transform: translateX(0.15rem); +} + +.file-card:disabled { + cursor: wait; + opacity: 0.66; +} + +.file-card-leading { + display: grid; + width: 1.75rem; + height: 1.75rem; + place-items: center; + border-radius: 50%; + background: var(--moloch-100); + color: var(--moloch-600); +} + +.file-card-copy { + min-width: 0; +} + +.file-card-icon, +.file-card-arrow { + width: 1rem; + height: 1rem; + flex: 0 0 auto; +} + +.file-card-spinner { + width: 1rem; + height: 1rem; + border: 2px solid currentcolor; + border-right-color: transparent; + border-radius: 50%; + animation: gate-spin 700ms linear infinite; +} + +.file-card-arrow { + color: var(--neutral-500); + transition: transform 160ms ease; +} + +.file-card:hover .file-card-arrow { + color: var(--moloch-600); + transform: translate(0.15rem, -0.15rem); +} + +.file-card-title { + display: block; + width: 100%; + overflow: hidden; + font-size: 0.95rem; + font-weight: 600; + line-height: 1.25; + text-overflow: ellipsis; + white-space: nowrap; +} + +.file-card-path { + display: block; + width: 100%; + overflow: hidden; + color: var(--neutral-600); + font-family: var(--font-mono), monospace; + font-size: 0.62rem; + letter-spacing: 0.02em; + text-overflow: ellipsis; + white-space: nowrap; +} + +.archive-state { + display: flex; + min-height: 16rem; + align-items: center; + justify-content: center; + flex-direction: column; + gap: 0.75rem; + padding: 2rem; + border: 1px dashed var(--neutral-400); + border-radius: var(--radius); + color: var(--neutral-600); + text-align: center; +} + +.archive-state .brand-crystal { + margin-bottom: 0.5rem; + color: var(--moloch-500); +} + +.archive-state-search-icon { + width: 2rem; + height: 2rem; + margin-bottom: 0.5rem; + color: var(--moloch-500); +} + +.archive-state p { + max-width: 34rem; + margin: 0 0 1rem; +} + +.archive-state--error { + border-color: var(--moloch-300); + background: rgb(250 238 235 / 62%); +} + +.archive-state-title { + margin: 0; + color: var(--moloch-800); + font-family: var(--font-display), Georgia, serif; + font-size: clamp(1.75rem, 4vw, 2.5rem); + font-weight: 700; + line-height: 1.2; +} + +@keyframes gate-spin { + to { + transform: rotate(360deg); + } +} + +@media (max-width: 63.999rem) { + .hero { + gap: 2rem; + grid-template-columns: minmax(0, 1fr) minmax(16rem, 0.8fr); + } + + .file-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 47.999rem) { + :root { + --page-gutter: 1rem; + } + + .site-header { + min-height: 4.75rem; + } + + .site-shell { + background-size: + auto, + 2rem 2rem, + 2rem 2rem, + auto; + } + + .site-shell::before { + top: 4.75rem; + } + + .brand-logo-full, + .brand-context { + display: none; + } + + .brand-logo-symbol { + display: block; + } + + .rg-button--header { + max-width: 11rem; + } + + .valhalla-main { + padding-top: 2.25rem; + } + + .hero { + gap: 1.5rem; + grid-template-columns: 1fr; + } + + .hero-title { + font-size: clamp(4rem, 20vw, 6rem); + } + + .hero-description { + margin-top: 1.5rem; + } + + .hero-action { + margin-top: 1.5rem; + } + + .hero-art { + min-height: min(88vw, 28rem); + } + + .hero--connected .hero-art { + display: none; + } + + .access-region { + margin-top: 2rem; + } + + .gate-card { + align-items: start; + grid-template-columns: 1fr; + } + + .gate-action { + width: 100%; + grid-column: auto; + } + + .gate-action .rg-button, + .gate-action .wallet-control, + .gate-action .wallet-control .rg-button { + width: 100%; + } + + .archive-header { + align-items: flex-start; + flex-direction: column; + gap: 1rem; + } + + .archive-tools { + align-items: stretch; + flex-direction: column; + } + + .archive-search { + width: 100%; + } + + .archive-search-status { + padding-inline: 0.15rem; + } + + .file-grid { + grid-template-columns: 1fr; + } + + .file-card { + min-height: 4rem; + } +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + } +} diff --git a/app/icon.svg b/app/icon.svg new file mode 100644 index 0000000..416d709 --- /dev/null +++ b/app/icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/layout.tsx b/app/layout.tsx index 41e512e..0766164 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,16 +1,19 @@ "use client"; -import { Titillium_Web } from "next/font/google"; import "@rainbow-me/rainbowkit/styles.css"; -import { getDefaultConfig, RainbowKitProvider } from "@rainbow-me/rainbowkit"; +import { + getDefaultConfig, + lightTheme, + RainbowKitProvider, +} from "@rainbow-me/rainbowkit"; import { WagmiProvider } from "wagmi"; import { gnosis } from "wagmi/chains"; import { QueryClientProvider, QueryClient } from "@tanstack/react-query"; -import { Providers } from "./providers"; -import { Flex } from "@chakra-ui/react"; import { Header } from "./shared/Header"; -import { Footer } from "./shared/Footer"; +import { ebGaramond, maziusDisplay, ubuntuMono } from "./fonts"; +import "./globals.css"; + const projectId = process.env.NEXT_PUBLIC_PROJECT_ID; const config = getDefaultConfig({ @@ -22,7 +25,39 @@ const config = getDefaultConfig({ const queryClient = new QueryClient(); -const titillium = Titillium_Web({ subsets: ["latin"], weight: ["400"] }); +const rainbowBaseTheme = lightTheme({ + accentColor: "#bd482d", + accentColorForeground: "#f9f7e7", + borderRadius: "medium", + fontStack: "system", + overlayBlur: "small", +}); + +const raidGuildRainbowTheme = { + ...rainbowBaseTheme, + colors: { + ...rainbowBaseTheme.colors, + actionButtonBorder: "#d5cecd", + actionButtonSecondaryBackground: "#f1efee", + connectButtonBackground: "#bd482d", + connectButtonText: "#f9f7e7", + generalBorder: "#d5cecd", + generalBorderDim: "#ece5ac", + menuItemBackground: "#faeeeb", + modalBackground: "#f9f7e7", + modalBorder: "#d5cecd", + modalText: "#29100a", + modalTextDim: "#645754", + modalTextSecondary: "#645754", + profileAction: "#f1efee", + profileActionHover: "#efc5bb", + profileForeground: "#f9f7e7", + selectedOptionBorder: "#bd482d", + }, + fonts: { + body: "var(--font-body)", + }, +}; export default function RootLayout({ children, @@ -31,29 +66,19 @@ export default function RootLayout({ }) { return ( - - - - - - -
- {children} -