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 (