diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css index fc3cbd5..651f8c0 100644 --- a/apps/web/src/app/globals.css +++ b/apps/web/src/app/globals.css @@ -1,35 +1,50 @@ @import "tailwindcss"; :root { - --paper-50: 247 240 229; - --paper-100: 240 229 210; - --paper-200: 227 212 187; - --paper-300: 213 196 166; - --ink-900: 43 39 35; - --ink-700: 77 70 63; - --ink-500: 107 98 88; - --forest-700: 23 55 45; - --forest-600: 31 67 56; - --forest-500: 42 87 71; - --sage-200: 215 228 214; + --paper-50: 248 243 232; + --paper-100: 242 232 214; + --paper-200: 229 213 187; + --paper-300: 214 191 154; + --ink-900: 52 40 30; + --ink-700: 90 72 58; + --ink-500: 119 101 85; + --forest-700: 46 78 55; + --forest-600: 63 98 70; + --forest-500: 83 125 86; + --sage-200: 210 224 206; --rose-100: 246 235 224; - --gold-200: 230 212 176; - --paper-noise: url("data:image/svg+xml;utf8,"); + --gold-200: 229 210 179; + --wood-800: 84 56 36; + --wood-700: 101 68 43; + --wood-600: 123 84 55; + --wood-500: 145 104 71; + --wood-400: 171 130 96; + --leaf-300: 199 214 188; + --leaf-500: 108 149 112; + --leaf-700: 73 111 77; + --paper-noise: url("data:image/svg+xml;utf8,"); + --leaf-pattern: url("data:image/svg+xml;utf8,"); + --leaf-icon: url("data:image/svg+xml;utf8,"); } body { min-height: 100%; background-color: rgb(var(--paper-50)); - background-image: radial-gradient( + background-image: + radial-gradient( circle at top, - rgb(246 236 224 / 0.8), + rgb(252 246 234 / 0.9), transparent 55% ), radial-gradient( - circle at 15% 30%, - rgb(231 217 183 / 0.6), + circle at 12% 25%, + rgb(229 212 186 / 0.55), transparent 45% - ); + ), + var(--leaf-pattern); + background-size: auto, auto, 260px 260px; + background-repeat: no-repeat, no-repeat, repeat; + background-attachment: fixed; color: rgb(var(--ink-900)); font-family: var(--font-body), serif; position: relative; @@ -41,11 +56,29 @@ body::before { position: fixed; inset: 0; background-image: var(--paper-noise); - opacity: 0.18; + opacity: 0.22; pointer-events: none; z-index: 0; } +body::after { + content: ""; + position: fixed; + inset: 12px; + border-radius: 26px; + border: 6px solid rgb(var(--wood-500) / 0.35); + box-shadow: + inset 0 0 0 2px rgb(255 255 255 / 0.35), + 0 22px 45px -30px rgba(84, 56, 36, 0.65); + pointer-events: none; + z-index: 1; +} + +body > * { + position: relative; + z-index: 2; +} + a { color: inherit; } @@ -60,17 +93,21 @@ h4 { } .paper-card { - background: linear-gradient( - 145deg, - rgb(var(--paper-50)), - rgb(var(--paper-100)) - ); - border-radius: 28px; - border: 1px solid rgb(var(--ink-900) / 0.12); + background: + linear-gradient( + 165deg, + rgb(var(--paper-50)), + rgb(var(--paper-100)) + ), + var(--leaf-pattern); + background-size: auto, 220px 220px; + background-repeat: no-repeat, repeat; + border-radius: 26px; + border: 2px solid rgb(var(--wood-400) / 0.55); box-shadow: - 0 22px 45px -34px rgba(34, 26, 18, 0.65), - 0 6px 14px -12px rgba(34, 26, 18, 0.35), - inset 0 1px 0 rgba(255, 255, 255, 0.8); + 0 18px 40px -28px rgba(60, 40, 22, 0.65), + 0 8px 16px -10px rgba(60, 40, 22, 0.35), + inset 0 1px 0 rgba(255, 255, 255, 0.75); } .paper-stack { @@ -79,29 +116,51 @@ h4 { rgb(var(--paper-100)), rgb(var(--paper-200)) ); - border-radius: 34px; - border: 1px solid rgb(var(--ink-900) / 0.1); + border-radius: 32px; + border: 2px solid rgb(var(--wood-400) / 0.4); box-shadow: - 0 28px 60px -40px rgba(34, 26, 18, 0.6), - 0 10px 20px -14px rgba(34, 26, 18, 0.35); + 0 28px 60px -40px rgba(60, 40, 22, 0.55), + 0 10px 22px -16px rgba(60, 40, 22, 0.3); } .paper-button { - background: rgb(var(--forest-600)); + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.45rem; + background: linear-gradient( + 180deg, + rgb(var(--forest-500)), + rgb(var(--forest-700)) + ); color: rgb(var(--paper-50)); border-radius: 999px; padding: 0.7rem 1.6rem; font-weight: 600; letter-spacing: 0.01em; box-shadow: - 0 12px 24px -18px rgba(31, 67, 56, 0.8), + 0 12px 24px -18px rgba(40, 62, 38, 0.75), inset 0 1px 0 rgba(255, 255, 255, 0.25); transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease; } +.paper-button::before { + content: ""; + width: 16px; + height: 16px; + background-image: var(--leaf-icon); + background-size: contain; + background-repeat: no-repeat; + display: inline-block; +} + .paper-button:hover { - background: rgb(var(--forest-500)); + background: linear-gradient( + 180deg, + rgb(var(--forest-500)), + rgb(var(--forest-600)) + ); transform: translateY(-1px); } @@ -110,8 +169,10 @@ h4 { color: rgb(var(--ink-700)); border-radius: 999px; padding: 0.55rem 1.3rem; - border: 1px solid rgb(var(--ink-900) / 0.18); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7); + border: 2px solid rgb(var(--wood-400) / 0.5); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.75), + 0 8px 16px -12px rgba(60, 40, 22, 0.35); transition: background 0.2s ease, color 0.2s ease; } @@ -132,11 +193,60 @@ h4 { background: linear-gradient( 90deg, rgb(var(--ink-900) / 0), - rgb(var(--ink-900) / 0.2), + rgb(var(--wood-600) / 0.35), rgb(var(--ink-900) / 0) ); } +.wood-nav { + background: + linear-gradient( + 180deg, + rgb(var(--wood-500)), + rgb(var(--wood-700)) + ); + border-radius: 999px; + border: 2px solid rgb(var(--wood-800) / 0.6); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.25), + 0 14px 24px -18px rgba(60, 40, 22, 0.6); + padding: 0.65rem 1.25rem; +} + +.wood-nav a, +.wood-nav button { + color: rgb(var(--paper-50)); +} + +.wood-nav .paper-button--ghost { + background: rgb(var(--paper-50) / 0.16); + color: rgb(var(--paper-50)); + border-color: rgb(255 255 255 / 0.25); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25); +} + +.wood-nav .paper-button { + background: linear-gradient( + 180deg, + rgb(var(--leaf-500)), + rgb(var(--leaf-700)) + ); +} + +.tool-card { + background: + linear-gradient( + 160deg, + rgb(var(--paper-50)), + rgb(var(--paper-100)) + ), + var(--leaf-pattern); + border: 2px solid rgb(var(--wood-400) / 0.65); + box-shadow: + 0 16px 28px -22px rgba(60, 40, 22, 0.6), + inset 0 1px 0 rgba(255, 255, 255, 0.7); +} + .fade-up { animation: fade-up 0.75s ease both; } diff --git a/apps/web/src/app/tools/page.tsx b/apps/web/src/app/tools/page.tsx index d1f106a..95a2bc2 100644 --- a/apps/web/src/app/tools/page.tsx +++ b/apps/web/src/app/tools/page.tsx @@ -843,7 +843,7 @@ export default function ToolsPage() { type="button" onClick={() => selectTool(item.id)} aria-pressed={item.id === activeTool} - className={`paper-card w-full p-4 text-left transition duration-200 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-forest-500/40 hover:shadow-paper-lift active:translate-y-0.5 active:shadow-paper ${ + className={`paper-card tool-card w-full p-4 text-left transition duration-200 ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-forest-500/40 hover:shadow-paper-lift active:translate-y-0.5 active:shadow-paper ${ item.id === activeTool ? "border-forest-600/60 ring-2 ring-forest-600/20" : "hover:border-forest-600/30 hover:ring-1 hover:ring-forest-600/10" diff --git a/apps/web/src/components/SiteHeader.tsx b/apps/web/src/components/SiteHeader.tsx index d98e23e..db56696 100644 --- a/apps/web/src/components/SiteHeader.tsx +++ b/apps/web/src/components/SiteHeader.tsx @@ -12,7 +12,7 @@ export default function SiteHeader() { return (
-
+
Z