Skip to content

Legal Document

Terms, privacy, DPA and cookies in one frame — the docs layout, because people arrive at a legal page looking for a specific clause and a wall of text makes that a Ctrl-F expedition.

Take 1 of 23 blocks50 lineslucide-reactAdded 13 Sept 2026

What's included

  • app/legal-page.tsx
  • 3 blocks it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab add legal-page

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Preview

Docs navigation

Terms of Service

Last updated 6 January 2026. Changes that reduce your rights are announced 30 days before they take effect, by email, to the billing contact on the account.

Acme issues two kinds of keys. Secret keys (prefixed sk_live_) can read and write everything in your project and must only ever live on a server. Publishable keys (prefixed pk_live_) are safe to ship in a browser bundle and can only create client sessions.

Keys are scoped to a project, not to your account. Deleting a project revokes its keys immediately; removing a teammate does not, so treat offboarding as a reason to rotate.

Create a key from the dashboard under Settings → API keys, then pass it as a bearer token on every request:

curl https://api.acme.dev/v1/projects \
  -H "Authorization: Bearer $ACME_API_KEY"

Note: the full secret is shown once, at creation. Acme stores only a hash, so a lost key cannot be recovered — it can only be rotated.

Rotation is overlap, not replacement: create the new key, deploy it everywhere, and only then revoke the old one. Both keys stay valid during the window, so a slow rollout never turns into an outage.

The real page, rendered in your current theme — every section below is a live block, not a screenshot.

The other take

Same page type, different bet about what the reader came for. Neither is the “correct” one — pick the layout whose opening section matches the question your visitors arrive with.

Take 2 of 2
Open the full page for this page

Legal Document 02

One document with a plain-language column beside each clause, for the reader who cannot name the clause they need — and the cookie control inline, because a banner is unreachable the moment it has been dismissed.

System Pages6 blocks200 lines

Built from

All blocks
  1. Responsive NavbarBrand, links and CTAs with a mobile panel that unmounts when closed — so its links are never tabbable while invisible — plus escape-to-close and focus return.
  2. Three-Column Docs FrameSidebar, article and on-this-page rail — each column answers a different question, and they collapse on mobile in the order that keeps the article alive.
  3. Regulated Seller FooterLegal entity, company number, registered address, VAT and the consumer links an EU or UK seller has to publish — with a region control that changes the terms, not just the currency.

Only want one section? Open it and copy that block instead — browse Navigation.

Shipped in these templates

Want the whole project rather than this one screen? A template ships every route, the theme tokens and the layout.

Source

app/legal-page.tsx
/**
 * The legal page — terms, privacy, DPA, cookies, one frame.
 *
 *   docs        the document, in the three-column docs frame
 *   compliance  the entities, registrations and addresses
 *
 * The docs frame rather than a bare `<article>`, and that is the whole design
 * decision. Terms of service are the longest document on most sites and the
 * only one people arrive at looking for a *specific clause* — the sub-processor
 * list, the notice period, the governing law. A wall of text with no
 * navigation makes that a Ctrl-F expedition; the docs layout gives a sidebar
 * and anchored headings, which is what turns a legal page into something
 * someone can actually be pointed at.
 *
 * In a real project this is one catch-all route: `/legal/[slug]` with terms,
 * privacy, dpa, subprocessors and cookies as the slugs. The frame does not
 * change between them, which is the argument for one page rather than five.
 *
 * `FooterCompliance` is here rather than the usual footer because this is the
 * page where the registered entity, company number and registered address
 * are legally expected to be findable. It defaults to three regions of a
 * fictional multinational — replace them, and delete the ones you do not
 * have, because listing an entity you do not operate is its own problem.
 */

import * as React from 'react'
import { NavbarSimple } from '@/components/navbar-simple'
import { DocsLayout } from '@/components/docs-layout'
import { FooterCompliance } from '@/components/footer-compliance'

export default function LegalPage() {
  return (
    <div className="min-h-screen bg-background text-foreground">
      <NavbarSimple brand="Acme" activeLabel="Legal" ctaLabel="Contact" ctaHref="#terms" />

      <main>
        <div id="terms">
          <DocsLayout
            anchorPrefix="legal-"
            title="Terms of Service"
            standfirst="Last updated 6 January 2026. Changes that reduce your rights are announced 30 days before they take effect, by email, to the billing contact on the account."
          />
        </div>
      </main>

      <FooterCompliance brand="Acme" />
    </div>
  )
}

How to use it

  1. 1. Copy each of the 3 blocks above into components/ — each block page has its own copy button.
  2. 2. Drop this file at app/legal-page.tsx. The imports already point at @/components/…, so they resolve with no edits.
  3. 3. Delete the sections you do not want. Every block takes props, so the copy changes without the layout moving.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

More System Pages

Open the full page for this page

404 Page

Drops straight into app/not-found.tsx, and keeps the site header and footer — on a 404 the navigation is the most useful thing on screen.

System Pages1 blocks62 lines
Open the full page for this page

Server Error

Retry first, because a 500 is our failure and offering navigation implies the rest of the site works — which is exactly what is in doubt.

System Pages2 blocks44 lines
Open the full page for this page

Scheduled Maintenance

Planned downtime with an actual end time on it — "back soon" is not a time, and a maintenance page without one looks like an outage nobody has noticed.

System Pages2 blocks35 lines
Open the full page for this page

Permission Denied

A 403 that names who can grant what was refused, because the next question is always "then who can" and a support link is the wrong answer to it.

System Pages2 blocks42 lines
Take 1 of 2
Open the full page for this page

Status Page

Written for the person refreshing it during an outage: current state above the fold, the maintenance window as a real block with an end time, and a component list that names what still works.

System Pages6 blocks155 lines
Take 2 of 2
Open the full page for this page

Status Page 02

The status page read during diligence rather than during an outage: ninety days of uptime, the latency curve, and every incident carrying its post-mortem — including the bad one.

System Pages7 blocks237 lines