diff --git a/app/birthday/page.tsx b/app/birthday/page.tsx index d1854f69..3eed37e4 100644 --- a/app/birthday/page.tsx +++ b/app/birthday/page.tsx @@ -1,6 +1,6 @@ import { env } from "@/lib/env"; import { JsonLd } from "react-schemaorg"; -import PageTitle from "@/components/page-title"; +import PageTitle from "@/components/layout/page-title"; import Video from "@/components/video"; import { createMetadata } from "@/lib/metadata"; import type { VideoObject } from "schema-dts"; diff --git a/app/cli/page.mdx b/app/cli/page.mdx index 3e1543c6..085158ba 100644 --- a/app/cli/page.mdx +++ b/app/cli/page.mdx @@ -1,4 +1,4 @@ -import PageTitle from "@/components/page-title"; +import PageTitle from "@/components/layout/page-title"; import Comments from "@/components/comments"; import { createMetadata } from "@/lib/metadata"; diff --git a/app/contact/form.tsx b/app/contact/form.tsx index c73f40e0..a74aab20 100644 --- a/app/contact/form.tsx +++ b/app/contact/form.tsx @@ -72,20 +72,20 @@ const ContactForm = () => { }} disabled={pending || formState.success} aria-invalid={!pending && formState.errors?.message ? "true" : undefined} - className="min-h-24" + className="min-h-[6lh] resize-y" /> {!pending && formState.errors?.message && ( {formState.errors.message[0]} )} -
+
{" "} @@ -102,9 +102,7 @@ const ContactForm = () => {
-
- -
+ {!pending && formState.errors?.["cf-turnstile-response"] && ( {formState.errors["cf-turnstile-response"][0]} @@ -112,7 +110,7 @@ const ContactForm = () => { )}
-
+
{!formState.success && ( )} + {!pending && formState.message && (
- {formState.success ? ( - - ) : ( - - )}{" "} - {formState.message} + {formState.success ? : }{" "} + {formState.message}
)}
diff --git a/app/contact/page.tsx b/app/contact/page.tsx index 7d4fb13c..e6995a16 100644 --- a/app/contact/page.tsx +++ b/app/contact/page.tsx @@ -1,4 +1,4 @@ -import PageTitle from "@/components/page-title"; +import PageTitle from "@/components/layout/page-title"; import Link from "@/components/link"; import { createMetadata } from "@/lib/metadata"; diff --git a/app/globals.css b/app/globals.css index 350ed1ab..0b86c5bf 100644 --- a/app/globals.css +++ b/app/globals.css @@ -2,51 +2,53 @@ @custom-variant dark (&:where([data-theme=dark] *)); -:root { - --radius: 0.625rem; - --background: oklch(1 0 0); - --foreground: oklch(0.141 0.005 285.823); - --card: oklch(1 0 0); - --card-foreground: oklch(0.141 0.005 285.823); - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.141 0.005 285.823); - --primary: oklch(0.5 0.134 242.749); - --primary-foreground: oklch(0.97 0.014 254.604); - --secondary: oklch(0.967 0.001 286.375); - --secondary-foreground: oklch(0.21 0.006 285.885); - --muted: oklch(0.967 0.001 286.375); - --muted-foreground: oklch(0.552 0.016 285.938); - --accent: oklch(0.967 0.001 286.375); - --accent-foreground: oklch(0.21 0.006 285.885); - --destructive: oklch(0.577 0.245 27.325); - --warning: oklch(0.67 0.179 58.318); - --success: oklch(0.63 0.194 149.214); - --border: oklch(0.92 0.004 286.32); - --input: oklch(0.92 0.004 286.32); - --ring: oklch(0.705 0.015 286.067); -} +@layer base { + :root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.141 0.005 285.823); + --card: oklch(1 0 0); + --card-foreground: oklch(0.141 0.005 285.823); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.141 0.005 285.823); + --primary: oklch(0.5 0.134 242.749); + --primary-foreground: oklch(0.97 0.014 254.604); + --secondary: oklch(0.967 0.001 286.375); + --secondary-foreground: oklch(0.21 0.006 285.885); + --muted: oklch(0.967 0.001 286.375); + --muted-foreground: oklch(0.552 0.016 285.938); + --accent: oklch(0.967 0.001 286.375); + --accent-foreground: oklch(0.21 0.006 285.885); + --destructive: oklch(0.577 0.245 27.325); + --warning: oklch(0.67 0.179 58.318); + --success: oklch(0.63 0.194 149.214); + --border: oklch(0.92 0.004 286.32); + --input: oklch(0.92 0.004 286.32); + --ring: oklch(0.705 0.015 286.067); + } -[data-theme="dark"] { - --background: oklch(0.205 0 0); - --foreground: oklch(0.985 0 0); - --card: oklch(0.21 0.006 285.885); - --card-foreground: oklch(0.985 0 0); - --popover: oklch(0.21 0.006 285.885); - --popover-foreground: oklch(0.985 0 0); - --primary: oklch(0.81 0.105 251.813); - --primary-foreground: oklch(0.18 0.0374 265.522); - --secondary: oklch(0.274 0.006 286.033); - --secondary-foreground: oklch(0.985 0 0); - --muted: oklch(0.274 0.006 286.033); - --muted-foreground: oklch(0.705 0.015 286.067); - --accent: oklch(0.274 0.006 286.033); - --accent-foreground: oklch(0.985 0 0); - --destructive: oklch(0.704 0.191 22.216); - --warning: oklch(0.8 0.184 86.047); - --success: oklch(0.79 0.209 151.711); - --border: oklch(1 0 0 / 10%); - --input: oklch(1 0 0 / 15%); - --ring: oklch(0.552 0.016 285.938); + [data-theme="dark"] { + --background: oklch(0.205 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.21 0.006 285.885); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.21 0.006 285.885); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.81 0.105 251.813); + --primary-foreground: oklch(0.18 0.0374 265.522); + --secondary: oklch(0.274 0.006 286.033); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.274 0.006 286.033); + --muted-foreground: oklch(0.705 0.015 286.067); + --accent: oklch(0.274 0.006 286.033); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --warning: oklch(0.8 0.184 86.047); + --success: oklch(0.79 0.209 151.711); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.552 0.016 285.938); + } } @theme inline { @@ -58,8 +60,6 @@ --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); - --container-default: var(--container-4xl); - --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); @@ -85,10 +85,13 @@ @theme { --animate-wave: wave 5s ease 1s infinite; --animate-heartbeat: heartbeat 10s ease 7.5s infinite; - --animate-loading: animation: loading 1.5s infinite ease-in-out both; + --animate-loading: loading 1.5s infinite ease-in-out both; + --animate-marquee: marquee 30s infinite linear; @keyframes wave { - 0% { + 0%, + 30%, + 100% { transform: rotate(0deg); } 5% { @@ -106,33 +109,21 @@ 25% { transform: rotate(10deg); } - 30% { - transform: rotate(0deg); - } - 100% { - transform: rotate(0deg); - } } @keyframes heartbeat { - 0% { + 0%, + 4%, + 8%, + 100% { transform: scale(1); } 2% { transform: scale(1.25); } - 4% { - transform: scale(1); - } 6% { transform: scale(1.2); } - 8% { - transform: scale(1); - } - 100% { - transform: scale(1); - } } @keyframes loading { @@ -145,4 +136,47 @@ transform: scale(0.6); } } + + @keyframes marquee { + from { + transform: translateX(0); + } + to { + transform: translateX(calc(-100% - var(--gap))); + } + } +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + + body { + @apply bg-background text-foreground; + font-synthesis-weight: none; + font-variant-ligatures: none; + text-rendering: optimizeLegibility; + } + + ::-webkit-scrollbar { + width: 5px; + } + ::-webkit-scrollbar-track { + background: transparent; + } + ::-webkit-scrollbar-thumb { + background: var(--border); + border-radius: 5px; + } + * { + scrollbar-width: thin; + scrollbar-color: var(--border) transparent; + } +} + +@layer components { + .youtube-embed { + @import "react-lite-youtube-embed/dist/LiteYouTubeEmbed.css"; + } } diff --git a/app/hillary/page.tsx b/app/hillary/page.tsx index 07f93659..90ea0aa8 100644 --- a/app/hillary/page.tsx +++ b/app/hillary/page.tsx @@ -1,6 +1,6 @@ import { env } from "@/lib/env"; import { JsonLd } from "react-schemaorg"; -import PageTitle from "@/components/page-title"; +import PageTitle from "@/components/layout/page-title"; import Link from "@/components/link"; import Video from "@/components/video"; import { createMetadata } from "@/lib/metadata"; diff --git a/app/layout.tsx b/app/layout.tsx index 0834e068..b7db636d 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,27 +5,24 @@ import { ThemeProvider, ThemeScript } from "@/components/layout/theme-context"; import Header from "@/components/layout/header"; import Footer from "@/components/layout/footer"; import { SkipNavLink, SkipNavTarget } from "@/components/layout/skip-nav"; -import { cn } from "@/lib/utils"; import { defaultMetadata } from "@/lib/metadata"; +import { GeistMono, GeistSans } from "@/lib/fonts"; import siteConfig from "@/lib/config/site"; import authorConfig from "@/lib/config/author"; import type { Person, WebSite } from "schema-dts"; -import { GeistMono, GeistSans } from "./fonts"; import "./globals.css"; export const metadata = defaultMetadata; const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => { return ( - + + + item={{ "@context": "https://schema.org", @@ -67,7 +64,7 @@ const RootLayout = ({ children }: Readonly<{ children: React.ReactNode }>) => { -
+
diff --git a/app/leo/page.tsx b/app/leo/page.tsx index b5f0020c..bff75434 100644 --- a/app/leo/page.tsx +++ b/app/leo/page.tsx @@ -1,6 +1,6 @@ import { env } from "@/lib/env"; import { JsonLd } from "react-schemaorg"; -import PageTitle from "@/components/page-title"; +import PageTitle from "@/components/layout/page-title"; import Link from "@/components/link"; import Video from "@/components/video"; import { createMetadata } from "@/lib/metadata"; diff --git a/app/license/page.mdx b/app/license/page.mdx index 40ec0e8e..522cba6a 100644 --- a/app/license/page.mdx +++ b/app/license/page.mdx @@ -1,4 +1,4 @@ -import PageTitle from "@/components/page-title"; +import PageTitle from "@/components/layout/page-title"; import { createMetadata } from "@/lib/metadata"; export const metadata = createMetadata({ diff --git a/app/notes/[slug]/page.tsx b/app/notes/[slug]/page.tsx index fcfbdcc7..a667f5c4 100644 --- a/app/notes/[slug]/page.tsx +++ b/app/notes/[slug]/page.tsx @@ -85,20 +85,23 @@ const Page = async ({ params }: { params: Promise<{ slug: string }> }) => { }} /> -
- - +
+ +