Documentation
Documentation
Introduction

Getting Started

Getting StartedInstallationQuick StartProject Structure

Architecture

Architecture OverviewTech StacktRPC MiddlewareDesign Principles

Patterns

Code Patterns & ConventionsFeature ModulesError HandlingType Safety

Database

DatabaseSchema DefinitionDatabase OperationsMigrationsCaching

API

tRPCProceduresRouterstRPC Proxy Setup
APIsOpenAPIREST Endpoints

Auth & Access

AuthenticationConfigurationOAuth ProvidersRolesSession Management
AuthorizationUser RolesPermissions

Routing & i18n

RoutingDeclarative RoutingNavigation
InternationalizationTranslationsLocale Routing

Components & UI

ComponentsButtonsFormsNavigationDialogs
StylesTailwind CSSThemingTypography

Storage

StorageConfigurationUsageBuckets

Configuration

ConfigurationEnvironment VariablesFeature Flags

Templates

Template GuidesCreate New FeatureCreate New PageCreate Database TableCreate tRPC RouterAdd Translations

Development

DevelopmentCommandsAI AgentsBest Practices

Navigation

Header, sidebar, and navigation components

Navigation components provide consistent UI elements for site structure and user navigation.

Header & Footer

Located in src/components/navigation/:

import { Header } from "@/components/navigation/header";
import { Footer } from "@/components/navigation/footer";

export default function Layout({ children }) {
  return (
    <>
      <Header />
      <main>{children}</main>
      <Footer />
    </>
  );
}

The Header component includes:

  • Logo and branding
  • Main navigation menu
  • User account menu (when authenticated)
  • Mobile menu toggle
  • Theme switcher
  • Language selector

Dashboard Sidebar

For authenticated layouts with a sidebar:

import { DashboardSidebar } from "@/components/navigation/sidebar";

<DashboardSidebar items={menuItems} />

Menu Items Structure

type MenuItem = {
  label: string;
  href: string;
  icon: IconKeys;
  badge?: number | string;
  children?: MenuItem[];
};

const menuItems: MenuItem[] = [
  {
    label: t("menu.links.PageDashboard"),
    href: PageDashboard(),
    icon: "layoutDashboard",
  },
  {
    label: t("menu.groups.settings"),
    icon: "settings",
    children: [
      {
        label: t("menu.links.PageSettingsProfile"),
        href: PageSettingsProfile(),
        icon: "user",
      },
      {
        label: t("menu.links.PageSettingsSecurity"),
        href: PageSettingsSecurity(),
        icon: "shield",
      },
    ],
  },
];

Breadcrumbs

Display the current page hierarchy:

import { Breadcrumbs } from "@/components/navigation/breadcrumbs";

<Breadcrumbs
  items={[
    { label: "Home", href: PageHome() },
    { label: "Dashboard", href: PageDashboard() },
    { label: "Current Page" },
  ]}
/>

Breadcrumb Items

PropTypeRequiredDescription
labelstringYesDisplay text
hrefstringNoLink URL (omit for current page)

PreservedTabs

Tab component that syncs with URL hash:

import { PreservedTabs } from "@/forms/preserved-tabs";

<PreservedTabs
  tabs={[
    {
      id: "profile",
      label: "Profile",
      icon: "user",
      component: <ProfileTab />,
    },
    {
      id: "settings",
      label: "Settings",
      icon: "settings",
      component: <SettingsTab />,
    },
    {
      id: "billing",
      label: "Billing",
      icon: "creditCard",
      badge: 3,
      component: <BillingTab />,
    },
  ]}
  initialTab="profile"
/>

Navigating to /page#settings automatically selects the "settings" tab.

Props

PropTypeDefaultDescription
tabsTabItem[]—Array of tab configurations
initialTabstringFirst tabDefault tab if no URL fragment
displayMode"scroll" | "wrap""scroll"Horizontal scroll or flex wrap
fullWidthbooleanfalseStretch tabs to full width
forceMountbooleantrueKeep all tab content mounted
disableFragmentSyncbooleanfalseDisable URL hash synchronization

Menu Configuration

Navigation menus are centrally configured in src/routes/routing.ts:

import { createMenuGroups } from "@/routes/utils";

export const menuGroups = createMenuGroups([
  {
    id: "main",
    links: ["PageHome", "PageAbout", "PagePricing"],
  },
  {
    id: "dashboard",
    links: ["PageDashboard", "PageDashboardApiKeys"],
    requireAuth: true,
  },
  {
    id: "admin",
    links: ["PageAdminUsers", "PageAdminSettings"],
    requireAuth: true,
    requireRole: "admin",
  },
]);

Menu Group Options

OptionTypeDescription
idstringGroup identifier
linksstring[]Array of route names
requireAuthbooleanShow only when authenticated
requireRolestringShow only for specific role

Menu Translations

Menu labels are defined in messages/dictionaries/{locale}/menu.json:

{
  "links": {
    "PageHome": "Home",
    "PageAbout": "About",
    "PageDashboard": "Dashboard"
  },
  "groups": {
    "content": "Content",
    "settings": "Settings",
    "admin": "Administration"
  }
}

Best Practices

Always use route functions like PageHome() instead of hardcoded paths

Define menus in routing.ts for consistency

Icons improve scanability and recognition

Help users understand their location in deep hierarchies

On this page

Header & Footer
Dashboard Sidebar
Menu Items Structure
Breadcrumbs
Breadcrumb Items
PreservedTabs
Props
Menu Configuration
Menu Group Options
Menu Translations
Best Practices