← back to Trademarks Copyright

src/app/layout.tsx

98 lines

import "./globals.css";
import Link from "next/link";
import type { Metadata } from "next";

const APP_BASE = process.env.APP_BASE_URL || "http://localhost:9770";

export const metadata: Metadata = {
  metadataBase: new URL(APP_BASE),
  title: {
    default: "Drops — Daily trademark & domain opportunities",
    template: "%s | Drops",
  },
  description: "A daily newsletter of abandoned US trademarks, public-domain works, and expiring domains — curated, scored, and ready to build on.",
  openGraph: {
    type: "website",
    url: APP_BASE,
    title: "Drops — Daily trademark & domain opportunities",
    description: "Curated daily brief of abandoned trademarks, public-domain works, and expiring domains.",
    siteName: "Drops",
  },
  twitter: {
    card: "summary_large_image",
    title: "Drops — Daily trademark & domain opportunities",
    description: "Daily brief of abandoned trademarks, PD works, and expiring domains.",
  },
  robots: { index: true, follow: true },
};

const JSONLD_ORG = {
  "@context": "https://schema.org",
  "@type": "Organization",
  name: "Drops",
  url: APP_BASE,
  email: "drops@agentabrams.com",
  description: "Daily newsletter of abandoned US trademarks, public-domain works, and expiring domains.",
};

const JSONLD_WEBAPP = {
  "@context": "https://schema.org",
  "@type": "WebApplication",
  name: "Drops",
  applicationCategory: "BusinessApplication",
  offers: [
    { "@type": "Offer", name: "Trial", price: "0", priceCurrency: "USD" },
    { "@type": "Offer", name: "Standard", price: "29", priceCurrency: "USD", priceSpecification: { "@type": "UnitPriceSpecification", billingIncrement: 1, unitText: "MON" } },
    { "@type": "Offer", name: "Pro", price: "99", priceCurrency: "USD", priceSpecification: { "@type": "UnitPriceSpecification", billingIncrement: 1, unitText: "MON" } },
  ],
};

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="en">
      <head>
        <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(JSONLD_ORG) }} />
        <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(JSONLD_WEBAPP) }} />
      </head>
      <body>
        <header className="border-b border-ink/10 bg-ledger text-parchment">
          <div className="mx-auto flex max-w-[1600px] items-center gap-6 px-6 py-4">
            <Link href="/" className="text-xl font-semibold tracking-tight">
              Trademarks <span className="text-brass">&</span> Copyright
            </Link>
            <nav className="ml-auto flex gap-4 text-sm">
              <Link href="/drops" className="hover:text-brass">Drops</Link>
              <Link href="/drops/archive" className="hover:text-brass">Archive</Link>
              <Link href="/pricing" className="hover:text-brass">Pricing</Link>
              <Link href="/faq" className="hover:text-brass">FAQ</Link>
              <Link href="/about" className="hover:text-brass">About</Link>
              <span className="mx-1 text-ink/20">·</span>
              <Link href="/alerts" className="hover:text-brass opacity-60">Alerts</Link>
              <Link href="/" className="hover:text-brass opacity-60">Index</Link>
              <Link href="/unregistered" className="hover:text-brass opacity-60">Hunter</Link>
              <Link href="/canvas" className="hover:text-brass opacity-60">Canvas</Link>
              <Link href="/admin/drops" className="hover:text-brass opacity-40">Admin</Link>
              <Link href="/admin/subscribers" className="hover:text-brass opacity-40">Subs</Link>
            </nav>
          </div>
        </header>
        <main className="mx-auto max-w-[1600px] px-6 py-6">{children}</main>
        <footer className="mx-auto max-w-[1600px] px-6 py-8 text-xs text-ink/60">
          <div className="flex flex-wrap gap-x-4 gap-y-2 mb-2">
            <Link href="/about" className="hover:text-brass">About</Link>
            <Link href="/pricing" className="hover:text-brass">Pricing</Link>
            <Link href="/faq" className="hover:text-brass">FAQ</Link>
            <Link href="/changelog" className="hover:text-brass">Changelog</Link>
            <Link href="/legal/terms" className="hover:text-brass">Terms</Link>
            <Link href="/legal/privacy" className="hover:text-brass">Privacy</Link>
            <Link href="/legal/refund" className="hover:text-brass">Refunds</Link>
            <a href="mailto:drops@agentabrams.com" className="hover:text-brass">Contact</a>
          </div>
          <strong>Not legal advice.</strong> Abandoned marks can carry common-law rights. Public-domain works may still have derivative-work protections.
          Consult a USPTO-registered attorney before use.
        </footer>
      </body>
    </html>
  );
}