Account Settings

About this block

Account SettingsPRO

A settings dashboard with a vertical section nav that live-switches panels: an editable profile, security with a two-factor toggle and active sessions, notification switches, a billing panel with plan/payment/invoices, and a team list with per-member role selects.

Dashboard13: Account Settings

A full-height account settings page for an app or SaaS dashboard: a vertical settings nav that live-switches panels covering an editable profile, security, notifications, billing, and team management. Use it as a drop-in settings dashboard UI, a Next.js / React account settings template built on shadcn/ui, with forms, toggles, and per-member role selects already wired up.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/dashboard13?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/dashboard13?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/dashboard13.tsx, the Beste user-menu component it composes to components/beste/component/user-menu.tsx, and the shadcn/ui dependencies they need (button, badge, avatar, input, label, textarea, switch, select, separator).

Quick start

The installed file exports dashboard13Demo alongside the block: the exact props behind the preview above. Spread it to get the settings page in one line. It fills its parent, so drop it into a full-height layout (or a h-screen wrapper).

tsx
import { Dashboard13, dashboard13Demo } from "@/components/beste/block/dashboard13";

export default function Page() {
  return <Dashboard13 {...dashboard13Demo} />;
}

Props

Every prop is optional. Omit any and the block falls back to its built-in demo data, so <Dashboard13 /> renders a complete, populated settings page out of the box. Pass just the props you want to override.

PropTypeDefaultDescription
brandNamestring"Nimbus"Wordmark shown in the top bar, next to the "· Settings" label
userDashboardUserdemo userSigned-in identity, used in the top-bar menu and as the Profile form's name/email defaults
biostringdemo bioDefault value of the Profile panel's bio textarea
userItemsUserMenuItem[]demo itemsRows in the top-bar account dropdown menu
notifRowsNotifRow[]demo rowsToggle rows in the Notifications panel
sessionsSession[]demo sessionsThe Active sessions list in the Security panel
teamMembersTeamMember[]demo membersThe Team roster, each with a per-member role select
billingBillingInfodemo billingPlan and payment-method summary in the Billing panel; omitted fields keep their demo values
invoicesInvoice[]demo invoicesThe billing-history rows in the Billing panel

The block-local data types:

ts
type DashboardUser = {
  name: string;
  email: string;
  avatar: string; // image URL, rendered with the shadcn Avatar's <img>
};

type NotifRow = {
  key: string; // maps to an entry in the notification switch state
  label: string;
  desc: string;
};

type Session = {
  device: string;
  meta: string;
  icon: LucideIcon;
  current: boolean; // true renders a "Current" badge instead of "Revoke"
};

type TeamMember = {
  name: string;
  email: string;
  avatar: string;
  role: string; // one of the Select options: "owner" | "admin" | "member"
};

type Invoice = { id: string; date: string; amount: string };

type BillingInfo = {
  plan?: string; // "Scale plan"
  priceCaption?: string; // "$49 monthly · renews Apr 1, 2026"
  card?: string; // "Visa ending 4242"
  cardExpires?: string; // "Expires 08 · 2028"
};

The account menu reuses the interface exported by the composed Beste component:

ts
// from user-menu
type UserMenuItem = {
  id: string;
  label: string;
  icon?: LucideIcon;
  destructive?: boolean; // red row with a separator above it
};

Still internal

A few structural and inline bits stay as constants in the installed file — edit them in place:

  • sections — the vertical settings-nav structure and Lucide icons (Profile, Security, Notifications, Billing, Team). The union of their ids types the active-section state, so it drives panel switching rather than being swappable content; keep ids and panels in sync.
  • The two-factor Switch default and the notification switch state's initial booleans are set inline in component state.

Components

  • user-menu — the avatar dropdown in the top-right of the header, driven by the user and userItems constants.

Behavior notes

  • The vertical nav live-switches panels via local state: clicking Profile, Security, Notifications, Billing, or Team swaps the panel on the right, with the active item highlighted. On screens below md the nav collapses to a horizontal, scrollable row above the panel.
  • The Security panel has a controlled two-factor authentication Switch (on by default) and lists active sessions, tagging the current device with a "Current" badge and offering "Revoke" on the others.
  • The Notifications panel renders a switch per row from notifRows, backed by a single record of booleans; toggling a row updates only its key.
  • The Billing panel shows the current plan, payment method, and a downloadable invoice list.
  • The Team panel shows each member with a per-member role Select (Owner / Admin / Member) and an "Invite" action.
  • The Profile, Security, and Team panels use uncontrolled inputs (defaultValue) and non-submitting buttons; wire the Save / Cancel / form actions to your own handlers.

Requirements

  • Next.js App Router. Rendered as a client component ("use client"), since the panel switching, toggles, and selects are stateful.
  • Fills its parent height (h-screen on the root <section>), so place it in a full-height layout.
  • Avatars render with a plain <img> (via the shadcn Avatar), so no next.config images.remotePatterns setup is needed for the remote avatar hosts.

Wiring the form up

This block ships the form markup only; state, validation, and submit are yours to add. Our guide wires the shadcn Field primitives to React Hook Form, TanStack Form, and Formisch on one field system.

More Dashboard blocks

View all Dashboard
PRO

dashboard5

Booking Workspace

A split booking dashboard: a left panel with a top nav, functional tab bar, a Manage menu, a bento of revenue/occupancy/metric tiles and an image, toggleable active-booking cards, and a room-availability timeline; a right rail with a real month calendar (selectable days, booked-day dots) and a time-slotted day agenda.

PRO

dashboard8

Finance Overview

A personal-finance dashboard: sidebar + search topbar, a dark total-balance hero with account tiles, a budget radial gauge, income/expense/savings KPIs, a cashflow bar chart, a spending-mix donut, and a colored transactions table.

PRO

dashboard12

Service Monitoring

An observability console with an icon rail and a live status ribbon: a service-health grid with status dots and latency/uptime, a latency line chart, a request-volume area chart, a 30-day uptime bar strip, and a recent-events feed. A 1h/24h/7d tab control live-swaps the chart data.

PRO

dashboard1

Admin Shell

A full admin dashboard shell: collapsible icon sidebar, topbar with a ⌘K command palette and account menu, a greeting header, a three-up KPI row with trend badges, and a recent-orders data table. The frame the rest of the dashboard blocks drop into.

PRO

dashboard2

Customers Table

A customers management section powered by the data-table engine: avatar cells, status badges, sortable columns, keyword search, row selection with a live selected count, per-row action menus, pagination, and an export / add-customer toolbar.

PRO

dashboard11

Fitness Overview

A health dashboard with a top navigation bar (no sidebar): three activity-ring radial gauges, a steps area chart and a heart-rate line chart, and a recent-workouts list. A Today/Week/Month segmented control live-swaps the chart data and totals.