Meez.
Browse Prompts Backgrounds Pricing
Contact Sign in ·

Landing Page · Free prompt

Fun 404 Page

free · paste into Lovable, Bolt, v0, Cursor or Claude

Fun 404 Page is a complete, paste-ready landing page build-prompt — a full art-direction spec for Lovable, Bolt, v0, Cursor and Claude. It's free: copy it below and paste it into your builder.

Fun 404 Page preview

“Build a full-screen animated 404 error page for a children's brand called "TinyTrails" using React, Tailwind CSS, and Lucide React icons. The page must be a single `App.tsx` component. Use the Inter font (weights …”

Fun 404 PageLanding Page · free prompt · copy-paste

Prompt page

Build a full-screen animated 404 error page for a children's brand called "TinyTrails" using React, Tailwind CSS, and Lucide React icons. The page must be a single `App.tsx` component. Use the Inter font (weights 400–900) loaded from Google Fonts. The page is a single viewport-height screen with no scrolling.

---

**LAYOUT & BACKGROUND:**

- The full page is `w-full h-screen overflow-hidden flex flex-col` with a CSS linear gradient background from `#FF8233` (top) to `#FDAC55` (bottom).

---

**BACKGROUND "404" TEXT EFFECT:**

- Behind everything, centered in the viewport, render the text "404" in white (`#FFFFFF`), `font-black`, `leading-none`, `tracking-tighter`, `whitespace-nowrap`.
- Font size: `clamp(200px, 48vw, 800px)`.
- The text is scaled horizontally by `1.15` and vertically dynamically: on mount (and resize), measure the text element's `offsetHeight`, divide `window.innerHeight` by that height, and multiply by `1.4` to get the Y scale. Apply via `transform: scale(1.15, ${scaleY * 1.4})`.
- Over the "404" text (same centered container), render a white (`#FFFFFF`) oval: a `div` with `rounded-full`, height `h-[22vh] sm:h-[26vh] md:h-[50vh]`, width `clamp(120px, 20vw, 400px)`, scaled vertically by the same dynamic `scaleY` value with `transformOrigin: center`.
- The entire background layer (text + oval) is wrapped in a container with `opacity: 0.8` and a CSS mask that fades to transparent at the bottom: `mask-image: linear-gradient(to bottom, black 40%, transparent 95%)` (with `-webkit-mask-image` for Safari).
- This layer is `absolute inset-0 pointer-events-none`.

---

**NAVIGATION BAR:**

- `relative z-20`, flex row, items centered, `justify-between`, padding `px-4 sm:px-6 md:px-12 py-4 sm:py-5`.
- **Logo (left):** A 2x2 grid of white circles (`grid-cols-2 gap-0.5`), each circle `w-2.5 h-2.5 sm:w-3 sm:h-3 bg-white rounded-full`. Next to it, the text "TinyTrails" in `text-white font-bold text-lg sm:text-xl ml-1`.
- **Desktop nav links (center/right):** Hidden on mobile (`hidden md:flex`), a row of pill buttons with `gap-1`. Items: "About Us", "Programs", "Reviews", "FAQ", "Contacts". Each is an `<a>` with `px-4 py-1.5 text-sm font-medium rounded-full bg-white` and text color `#F16524`, with `hover:opacity-90 transition-colors`.
- **Menu button (right):** A pill button with `px-4 py-2 sm:px-5 sm:py-2.5 rounded-full text-white` and background color `#F16524`. Contains a Lucide `Menu` icon (`w-4 h-4`) and the text "Menu" (`text-sm font-medium hidden sm:inline`). Has `hover:opacity-90 transition-colors`.

---

**MOBILE MENU OVERLAY:**

- Fixed fullscreen (`fixed inset-0 z-50`), with visibility toggled. Transition: `duration-500 ease-[cubic-bezier(0.16,1,0.3,1)]`.
- **Backdrop:** `absolute inset-0 bg-black/40 backdrop-blur-sm`, fades in/out with `opacity` transition over 500ms. Clicking it closes the menu.
- **Panel:** Slides in from right. `absolute top-0 right-0 h-full w-full sm:w-[380px]`, translates between `translate-x-full` (closed) and `translate-x-0` (open). Background: `linear-gradient(135deg, #FF6B1A 0%, #FF9642 100%)`.
  - **Panel header:** Same logo as nav (2x2 white dots + "TinyTrails" bold white text). Close button: `w-10 h-10 rounded-full bg-white/20 text-white hover:bg-white/30` with Lucide `X` icon (`w-5 h-5`).
  - **Menu items:** Staggered animation. Each item is `px-6 py-4 text-lg font-semibold text-white rounded-2xl bg-white/10 hover:bg-white/20 transition-all duration-300`. When open: `opacity-100 translate-y-0`; when closed: `opacity-0 translate-y-4`. Transition delay per item: `150 + i * 60`ms when opening, `0ms` when closing.
  - **Bottom CTA:** Absolutely positioned at bottom (`absolute bottom-0 left-0 right-0 p-6`). A pill link: `w-full py-4 rounded-full bg-white font-semibold text-base` with text color `#F16524`, `hover:scale-[1.02]`. Contains Lucide `ArrowLeft` icon + "Back to Home". Fades in with 450ms delay when opening.
- Body scroll is locked (`overflow: hidden`) when menu is open.

---

**CENTER VIDEO:**

- An absolutely positioned container (`absolute inset-0 flex items-center justify-center pointer-events-none`) with `margin-top: calc(-6vh - 40px)` to shift it upward.
- Inside, a responsive container: `w-[120vw] h-[85vh] sm:w-[70vw] sm:h-[70vh] md:w-[62vw] md:h-[78vh]`.
- Contains a `<video>` element with `autoPlay loop muted playsInline`, class `w-full h-full object-contain pointer-events-none mix-blend-darken`.
- **Video source URL:** `https://meez.design/web/media/prompt-media/v/118ba14fa3179a4f.mp4`

---

**BOTTOM CONTENT:**

- `relative z-30 mt-auto pb-8 sm:pb-16 flex flex-col items-center text-center px-4`.
- Heading: "Oops, something went wrong!" in `text-white text-lg sm:text-xl md:text-2xl font-medium mb-3 sm:mb-4`.
- Button/link: An `<a href="/">` pill with `inline-flex items-center gap-2 px-6 py-3 sm:px-8 sm:py-4 rounded-full text-white font-semibold text-sm sm:text-base` and background `#F16524`. Has `hover:scale-105 hover:shadow-lg transition-all`. Contains Lucide `ArrowLeft` icon (`w-4 h-4 sm:w-5 sm:h-5`) + "Back to Home".

---

**GLOBAL CSS (`index.css`):**

```css
@tailwind base;
@tailwind components;
@tailwind utilities;

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: 'Inter', sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
```

---

**HTML HEAD:**

- Load Inter font from Google Fonts: `https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap` with preconnect to `fonts.googleapis.com` and `fonts.gstatic.com`.
- Title: "404 - Page Not Found".

---

**KEY COLOR PALETTE:**
- Page gradient: `#FF8233` to `#FDAC55`
- Accent/buttons: `#F16524`
- Text & shapes: `#FFFFFF`
- Menu gradient: `#FF6B1A` to `#FF9642`
- Menu overlay backdrop: `black/40` with `backdrop-blur-sm`
- Menu item backgrounds: `white/10`, `white/20` on hover

---

**DEPENDENCIES:** React, Tailwind CSS, Lucide React (`ArrowLeft`, `Menu`, `X` icons). Vite build system. No other libraries.

---

## Source Code

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>404 - Page Not Found</title>
  <link rel="preconnect" href="https://fonts.googleapis.com" />
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet" />
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    body {
      font-family: 'Inter', sans-serif;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      overflow: hidden;
    }

    .page {
      position: relative;
      width: 100%;
      height: 100vh;
      overflow: hidden;
      display: flex;
      flex-direction: column;
      background: linear-gradient(to bottom, #FF8233, #FDAC55);
    }

    /* Background 404 layer */
    .bg-layer {
      position: absolute;
      inset: 0;
      pointer-events: none;
      opacity: 0.8;
      -webkit-mask-image: linear-gradient(to bottom, black 40%, transparent 95%);
      mask-image: linear-gradient(to bottom, black 40%, transparent 95%);
    }

    .bg-text-container {
      position: absolute;
      inset: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      overflow: hidden;
      user-select: none;
    }

    .bg-text {
      font-size: clamp(200px, 48vw, 800px);
      font-weight: 900;
      line-height: 1;
      letter-spacing: -0.05em;
      white-space: nowrap;
      color: #FFFFFF;
      -webkit-text-fill-color: #FFFFFF;
    }

    .bg-oval-container {
      position: absolute;
      inset: 0;
      display: flex;
      align-items: center;
      justify-content: center;
    }

    .bg-oval {
      width: clamp(120px, 20vw, 400px);
      height: 22vh;
      border-radius: 9999px;
      background: #FFFFFF;
      transform-origin: center;
    }

    /* Navigation */
    .nav {
      position: relative;
      z-index: 20;
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 16px 16px;
    }

    .nav-left {
      display: flex;
      align-items: center;
      gap: 8px;
    }

    .logo-dots {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 2px;
    }

    .logo-dot {
      width: 10px;
      height: 10px;
      background: white;
      border-radius: 50%;
    }

    .logo-text {
      color: white;
      font-weight: 700;
      font-size: 18px;
      margin-left: 4px;
    }

    .nav-links {
      display: none;
      align-items: center;
      gap: 4px;
    }

    .nav-link {
      padding: 6px 16px;
      font-size: 14px;
      font-weight: 500;
      border-radius: 9999px;
      background: white;
      color: #F16524;
      text-decoration: none;
      transition: opacity 0.2s;
    }

    .nav-link:hover {
      opacity: 0.9;
    }

    .menu-btn {
      display: flex;
      align-items: center;
      gap: 8px;
      padding: 8px 16px;
      border-radius: 9999px;
      background: #F16524;
      color: white;
      border: none;
      cursor: pointer;
      font-family: inherit;
      transition: opacity 0.2s;
    }

    .menu-btn:hover {
      opacity: 0.9;
    }

    .menu-btn-text {
      font-size: 14px;
      font-weight: 500;
      display: none;
    }

    /* Menu Overlay */
    .menu-overlay {
      position: fixed;
      inset: 0;
      z-index: 50;
      visibility: hidden;
      transition: visibility 0s 0.5s;
    }

    .menu-overlay.open {
      visibility: visible;
      transition: visibility 0s 0s;
    }

    .menu-backdrop {
      position: absolute;
      inset: 0;
      background: rgba(0, 0, 0, 0.4);
      backdrop-filter: blur(4px);
      -webkit-backdrop-filter: blur(4px);
      opacity: 0;
      transition: opacity 0.5s;
    }

    .menu-overlay.open .menu-backdrop {
      opacity: 1;
    }

    .menu-panel {
      position: absolute;
      top: 0;
      right: 0;
      height: 100%;
      width: 100%;
      background: linear-gradient(135deg, #FF6B1A 0%, #FF9642 100%);
      transform: translateX(100%);
      transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1);
    }

    .menu-overlay.open .menu-panel {
      transform: translateX(0);
    }

    .menu-header {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 20px 24px;
    }

    .menu-close-btn {
      width: 40px;
      height: 40px;
      display: flex;
      align-items: center;
      justify-content: center;
      border-radius: 50%;
      background: rgba(255, 255, 255, 0.2);
      color: white;
      border: none;
      cursor: pointer;
      transition: background 0.2s;
    }

    .menu-close-btn:hover {
      background: rgba(255, 255, 255, 0.3);
    }

    .menu-items {
      padding: 32px 24px 0;
      display: flex;
      flex-direction: column;
      gap: 8px;
    }

    .menu-item {
      display: block;
      padding: 16px 24px;
      font-size: 18px;
      font-weight: 600;
      color: white;
      text-decoration: none;
      border-radius: 16px;
      background: rgba(255, 255, 255, 0.1);
      transition: all 0.3s;
      opacity: 0;
      transform: translateY(16px);
    }

    .menu-item:hover {
      background: rgba(255, 255, 255, 0.2);
    }

    .menu-overlay.open .menu-item {
      opacity: 1;
      transform: translateY(0);
    }

    .menu-overlay.open .menu-item:nth-child(1) { transition-delay: 150ms; }
    .menu-overlay.open .menu-item:nth-child(2) { transition-delay: 210ms; }
    .menu-overlay.open .menu-item:nth-child(3) { transition-delay: 270ms; }
    .menu-overlay.open .menu-item:nth-child(4) { transition-delay: 330ms; }
    .menu-overlay.open .menu-item:nth-child(5) { transition-delay: 390ms; }

    .menu-bottom {
      position: absolute;
      bottom: 0;
      left: 0;
      right: 0;
      padding: 24px;
      opacity: 0;
      transform: translateY(24px);
      transition: all 0.5s;
    }

    .menu-overlay.open .menu-bottom {
      opacity: 1;
      transform: translateY(0);
      transition-delay: 450ms;
    }

    .menu-bottom-btn {
      display: flex;
      align-items: center;
      justify-content: center;
      gap: 8px;
      width: 100%;
      padding: 16px;
      border-radius: 9999px;
      background: white;
      color: #F16524;
      font-weight: 600;
      font-size: 16px;
      text-decoration: none;
      transition: transform 0.2s;
    }

    .menu-bottom-btn:hover {
      transform: scale(1.02);
    }

    /* Video */
    .video-container {
      position: absolute;
      inset: 0;
      display: flex;
      align-items: center;
      justify-content: center;
      pointer-events: none;
      margin-top: calc(-6vh - 40px);
    }

    .video-wrapper {
      width: 120vw;
      height: 85vh;
      position: relative;
    }

    .video-wrapper video {
      width: 100%;
      height: 100%;
      object-fit: contain;
      pointer-events: none;
      mix-blend-mode: darken;
    }

    /* Bottom content */
    .bottom-content {
      position: relative;
      z-index: 30;
      margin-top: auto;
      padding-bottom: 32px;
      display: flex;
      flex-direction: column;
      align-items: center;
      text-align: center;
      padding-left: 16px;
      padding-right: 16px;
    }

    .bottom-heading {
      color: white;
      font-size: 18px;
      font-weight: 500;
      margin-bottom: 12px;
    }

    .bottom-btn {
      display: inline-flex;
      align-items: center;
      gap: 8px;
      padding: 12px 24px;
      border-radius: 9999px;
      background: #F16524;
      color: white;
      font-weight: 600;
      font-size: 14px;
      text-decoration: none;
      transition: all 0.2s;
    }

    .bottom-btn:hover {
      transform: scale(1.05);
      box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
    }

    /* Responsive */
    @media (min-width: 640px) {
      .nav {
        padding: 20px 24px;
      }

      .logo-dot {
        width: 12px;
        height: 12px;
      }

      .logo-text {
        font-size: 20px;
      }

      .menu-btn {
        padding: 10px 20px;
      }

      .menu-btn-text {
        display: inline;
      }

      .menu-panel {
        width: 380px;
      }

      .video-wrapper {
        width: 70vw;
        height: 70vh;
      }

      .bg-oval {
        height: 26vh;
      }

      .bottom-content {
        padding-bottom: 64px;
      }

      .bottom-heading {
        font-size: 20px;
        margin-bottom: 16px;
      }

      .bottom-btn {
        padding: 16px 32px;
        font-size: 16px;
      }
    }

    @media (min-width: 768px) {
      .nav {
        padding: 20px 48px;
      }

      .nav-links {
        display: flex;
      }

      .video-wrapper {
        width: 62vw;
        height: 78vh;
      }

      .bg-oval {
        height: 50vh;
      }

      .bottom-heading {
        font-size: 24px;
      }
    }
  </style>
</head>
<body>
  <div class="page">
    <!-- Background 404 text + oval -->
    <div class="bg-layer">
      <div class="bg-text-container">
        <span class="bg-text" id="bgText">404</span>
      </div>
      <div class="bg-oval-container">
        <div class="bg-oval" id="bgOval"></div>
      </div>
    </div>

    <!-- Navigation -->
    <nav class="nav">
      <div class="nav-left">
        <div class="logo-dots">
          <div class="logo-dot"></div>
          <div class="logo-dot"></div>
          <div class="logo-dot"></div>
          <div class="logo-dot"></div>
        </div>
        <span class="logo-text">TinyTrails</span>
      </div>

      <div class="nav-links">
        <a href="#" class="nav-link">About Us</a>
        <a href="#" class="nav-link">Programs</a>
        <a href="#" class="nav-link">Reviews</a>
        <a href="#" class="nav-link">FAQ</a>
        <a href="#" class="nav-link">Contacts</a>
      </div>

      <button class="menu-btn" onclick="openMenu()">
        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="4" x2="20" y1="12" y2="12"/><line x1="4" x2="20" y1="6" y2="6"/><line x1="4" x2="20" y1="18" y2="18"/></svg>
        <span class="menu-btn-text">Menu</span>
      </button>
    </nav>

    <!-- Menu Overlay -->
    <div class="menu-overlay" id="menuOverlay">
      <div class="menu-backdrop" onclick="closeMenu()"></div>
      <div class="menu-panel">
        <div class="menu-header">
          <div class="nav-left">
            <div class="logo-dots">
              <div class="logo-dot"></div>
              <div class="logo-dot"></div>
              <div class="logo-dot"></div>
              <div class="logo-dot"></div>
            </div>
            <span class="logo-text">TinyTrails</span>
          </div>
          <button class="menu-close-btn" onclick="closeMenu()">
            <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>
          </button>
        </div>
        <div class="menu-items">
          <a href="#" class="menu-item">About Us</a>
          <a href="#" class="menu-item">Programs</a>
          <a href="#" class="menu-item">Reviews</a>
          <a href="#" class="menu-item">FAQ</a>
          <a href="#" class="menu-item">Contacts</a>
        </div>
        <div class="menu-bottom">
          <a href="/" class="menu-bottom-btn">
            <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
            Back to Home
          </a>
        </div>
      </div>
    </div>

    <!-- Video -->
    <div class="video-container">
      <div class="video-wrapper">
        <video autoplay loop muted playsinline src="https://meez.design/web/media/prompt-media/v/118ba14fa3179a4f.mp4"></video>
      </div>
    </div>

    <!-- Bottom content -->
    <div class="bottom-content">
      <h2 class="bottom-heading">Oops, something went wrong!</h2>
      <a href="/" class="bottom-btn">
        <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
        Back to Home
      </a>
    </div>
  </div>

  <script>
    const bgText = document.getElementById('bgText');
    const bgOval = document.getElementById('bgOval');
    const menuOverlay = document.getElementById('menuOverlay');

    function updateScale() {
      if (!bgText) return;
      const naturalHeight = bgText.offsetHeight;
      const viewportHeight = window.innerHeight;
      const scaleY = viewportHeight / naturalHeight;
      bgText.style.transform = `scale(1.15, ${scaleY * 1.4})`;
      bgOval.style.transform = `scaleY(${scaleY})`;
    }

    updateScale();
    window.addEventListener('resize', updateScale);

    function openMenu() {
      menuOverlay.classList.add('open');
      document.body.style.overflow = 'hidden';
    }

    function closeMenu() {
      menuOverlay.classList.remove('open');
      document.body.style.overflow = '';
    }
  </script>
</body>
</html>

Browse & preview free → Unlock everything — from $19/mo

More like this

Orbis NFT — Landing Page website build-promptOrbis NFT Bloom — Landing Page website build-promptBloom PROMPT — Landing Page website build-promptPROMPT AI Automation — Landing Page website build-promptAI Automation Future-State — Landing Page website build-promptFuture-State Art Landing — Landing Page website build-promptArt Landing
Meez.

The biggest library of AI website build-prompts & motion backgrounds — from $19/mo, ≈3¢ per asset.

Library
Browse all Free prompts Prompts by category Section prompts Motion backgrounds Pricing
Learn & contact
How it works Why AI sites look generic Compare AI builders Terms Privacy Contact Affiliates
© Meez — an open archive. Start free · Unlimited from $19/mo · cancel anytime.