Skip to content

Admin Panel

The internal-tool half on its own — dashboard, list view, settings, billing and sign-in. Ships noindex, because an admin panel has no business in a search result.

6 routes6 pages · 18 blocks35 files · 4,044 lineslucide-reactAdded 8 Aug 2026

What's included

  • app/billing/page.tsx
  • app/customers/page.tsx
  • app/globals.css
  • app/layout.tsx
  • app/login/page.tsx
  • app/not-found.tsx
  • and 10 more files
  • 6 pages it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab init admin-panel ./my-app

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?

Every screen

Overview

How the business is doing, as of a minute ago.

Monthly revenue
$48,290
+12.5%vs last month
Active users
2,847
+8.2%vs last month
Avg. session
4m 32s
-3.1%vs last month
Churn rate
1.8%
-0.4%vs last month

Revenue this week

Solid is this week. Faded is the week before.

$34,500
Revenue this week
PeriodThis weekPrevious week
Mon$4,200$3,800
Tue$5,100$4,400
Wed$4,800$4,900
Thu$6,300$5,200
Fri$7,100$5,800
Sat$3,900$3,600
Sun$3,100$3,000

Recent activity

View all
  • Northwind Ltd upgraded to Team annual

  • Marco Silva created an account

  • Priya Raman commented on Billing migration

  • Alex Chen pushed 3 commits to main

  • Dana Whitfield created an account

Live components in your current theme — switch routes, or the phone icon to check the mobile layout. Colours are this template’s Steel palette, which ships in app/globals.css. Denim blue, tight corners, nothing decorative. The palette of software people are made to use rather than choose — which an admin panel is, and should look like.

Get it

35 files · .zip · nothing to configure · Pro

then

cd admin-panel
npm install
npm run dev

The archive contains the whole project — routes, blocks, theme tokens, Tailwind and PostCSS config, tsconfig and a .gitignore. One runtime dependency, and no Hoverlab dependency at all: it is your code from the moment it unzips.

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

Routes

PathPageFile
/Dashboard Overviewapp/page.tsx
/customersCustomer List Screenapp/customers/page.tsx
/settingsAccount Settingsapp/settings/page.tsx
/billingBilling & Usage Screenapp/billing/page.tsx
/loginSign-In Screenapp/login/page.tsx
404404 Pageapp/not-found.tsx

What you get

project root(8 files)

  • GETTING-STARTED.md
  • gitignore
  • next.config.ts
  • package.json
  • postcss.config.mjs
  • README.md
  • tailwind.config.ts
  • tsconfig.json

app/(8 files)

  • billing/page.tsx
  • customers/page.tsx
  • globals.css
  • layout.tsx
  • login/page.tsx
  • not-found.tsx
  • page.tsx
  • settings/page.tsx

components/(19 files)

  • auth-login-card.tsx
  • bar-chart-panel.tsx
  • billing-plan-summary.tsx
  • dashboard-activity-feed.tsx
  • dashboard-page-header.tsx
  • dashboard-shell.tsx
  • dashboard-stat-cards.tsx
  • data-table-pagination.tsx
  • data-table-sortable.tsx
  • data-table-toolbar.tsx
  • invoice-history-table.tsx
  • not-found-404.tsx
  • settings-api-keys.tsx
  • settings-danger-zone.tsx
  • settings-nav-layout.tsx
  • settings-profile-form.tsx
  • settings-team-members.tsx
  • theme-provider.tsx
  • usage-meter-panel.tsx

Every file is listed. The 18 files in components/ are the blocks the pages import — each one has its own page if you want to read it on its own.

Project files

Everything except the blocks. Opens on app/globals.css — the file that makes the rest look right, since every block styles itself with bg-card and text-muted-foreground rather than literal colours.

app/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;

/**
 * Design tokens — the Steel palette.
 *
 * Denim blue, tight corners, nothing decorative. The palette of software people are made to use rather than choose — which an admin panel is, and should look like.
 *
 * This file is the reason a pasted block looks right. Every block and page
 * styles itself with semantic classes — `bg-card`, `text-muted-foreground`,
 * `border-border` — rather than literal colours, so they inherit whatever
 * you define here instead of fighting it. Change a value below and every
 * section in the project moves with it. Change the hue on `--primary` and
 * `--ring` together and you have rebranded the site.
 *
 * Values are bare HSL channels, not `hsl(...)` calls. That is what lets
 * Tailwind compose them with an alpha suffix: `bg-primary/10` expands to
 * `hsl(var(--primary) / 0.1)`, which is impossible if the variable already
 * carries its own function wrapper.
 *
 * Every foreground/background pair below clears WCAG AA (4.5:1) in both
 * themes. If you retune one, check the pair rather than trusting the eye —
 * mid-lightness accents are the ones that fail.
 */

@layer base {
  :root {
    --background: 205 30% 98%;
    --foreground: 205 38% 10%;
    --card: 0 0% 100%;
    --card-foreground: 205 38% 10%;
    --popover: 0 0% 100%;
    --popover-foreground: 205 38% 10%;
    --primary: 205 60% 34%;
    --primary-foreground: 0 0% 100%;
    --secondary: 205 28% 94%;
    --secondary-foreground: 205 38% 18%;
    --muted: 205 22% 95%;
    --muted-foreground: 205 12% 40%;
    --accent: 178 40% 92%;
    --accent-foreground: 182 50% 16%;
    --destructive: 0 72% 45%;
    --destructive-foreground: 0 0% 100%;
    --border: 205 20% 89%;
    --input: 205 20% 89%;
    --ring: 205 60% 34%;

    --radius: 0.375rem;
  }

  .dark {
    --background: 205 34% 5%;
    --foreground: 205 14% 96%;
    --card: 205 28% 8%;
    --card-foreground: 205 14% 96%;
    --popover: 205 28% 8%;
    --popover-foreground: 205 14% 96%;
    --primary: 205 80% 58%;
    --primary-foreground: 205 42% 7%;
    --secondary: 205 20% 15%;
    --secondary-foreground: 205 14% 96%;
    --muted: 205 22% 15%;
    --muted-foreground: 205 10% 66%;
    --accent: 178 28% 17%;
    --accent-foreground: 178 45% 84%;
    --destructive: 0 62% 52%;
    --destructive-foreground: 0 0% 100%;
    --border: 205 18% 18%;
    --input: 205 18% 18%;
    --ring: 205 80% 58%;
  }
}

@layer base {
  * {
    @apply border-border;
  }

  body {
    @apply bg-background text-foreground antialiased;
  }

  /**
   * Global motion opt-out.
   *
   * Blocks guard their own animations with Tailwind's `motion-safe:`, but
   * third-party CSS and anything you add later will not. This is the
   * backstop: it neutralises every animation and transition on the page
   * for users who have asked the OS for reduced motion, rather than
   * relying on each author to remember.
   */
  @media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

More Internal Tools

Pro
Open the full page for this template

Project Tracker

A board that does not lose a card

A board, a search that works across it, settings and a sign-in — plus the two screens every internal tool needs and nobody builds: a real 500 boundary and a 404.

6 routes6 pages16 blocksFern