Dashboard Template

An application template with sidebar navigation, stats row, activity feed, and data table. Perfect for admin panels and analytics dashboards.

Preview

Structure

  • Sidebar — Logo, nav groups, user profile (hidden on mobile)
  • Header — Page title, mobile menu button, theme toggle, notifications
  • Stats Row — 4-column grid of ip-frame stat cards
  • Main Grid — Chart area, activity feed, data table
  • Activity Feed — ip-window with ip-list-item entries
  • Data Table — ip-table with pagination

Key Patterns

Sidebar Layout

<div class="flex min-h-screen">
    <aside class="hidden lg:flex w-56 shrink-0 border-r border-secondary flex-col">
        <!-- Sidebar content -->
    </aside>
    <div class="flex-1 flex flex-col">
        <!-- Main content -->
    </div>
</div>

Stats Row

<div class="grid grid-cols-2 lg:grid-cols-4 gap-4">
    <div class="ip-frame">
        <div class="ip-frame-header">Metric</div>
        <div class="ip-frame-body">
            <div class="ip-stat">
                <div class="ip-stat-value">12,847</div>
                <div class="ip-stat-trend ip-stat-trend-up">↑ 12.5%</div>
            </div>
        </div>
    </div>
</div>

Patterns Used

This template uses the following patterns from the Layouts & Patterns documentation:

  • Sidebar Layout — Fixed navigation sidebar with main content area
  • Stats Row — 4-column ip-frame grid for key metrics
  • Dashboard Grid — Mixed-size panels with chart area and activity feed
  • Activity Feed — Scrollable ip-window with ip-list-item entries

Theme Switcher

This template includes the theme switcher component for real-time theme, font, and mode changes. Theme preferences persist across page navigations via localStorage.

<!-- Include theme switcher in head -->
<link rel="stylesheet" href="/path/to/themes/planetary.css" id="theme-css">
<link rel="stylesheet" href="/path/to/fonts/terminal.css" id="font-css">
<script src="/path/to/theme.js"></script>
<script src="/path/to/theme-switcher.js" data-theme-base="/path/to/css"></script>

<!-- Add container in header -->
<div id="theme-switcher-container"></div>

<!-- Initialize on DOMContentLoaded -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    themeSwitcher.createSwitcher('#theme-switcher-container');
});
</script>

Source Code

dashboard.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dashboard — Interplanetary UI</title>
    
    <!-- Core CSS (with Tailwind utilities) -->
    <link rel="stylesheet" href="./css/styles.css">
    <!-- Theme and Font (dynamically switched by theme-switcher.js) -->
    <link rel="stylesheet" href="../interplanetary-ui/css/themes/planetary.css" id="theme-css">
    <link rel="stylesheet" href="../interplanetary-ui/css/fonts/terminal.css" id="font-css">
    
    <!-- Theme JS -->
    <script src="../interplanetary-ui/js/theme.js"></script>
    <script src="../interplanetary-ui/js/theme-switcher.js" data-theme-base="../interplanetary-ui/css"></script>
</head>
<body class="bg-primary text-secondary font-body text-xs min-h-screen">
    
    <div class="flex min-h-screen">
        
        <!-- Sidebar -->
        <aside class="hidden lg:flex w-56 shrink-0 border-r border-secondary flex-col">
            <div class="p-4 border-b border-secondary">
                <a href="#" class="font-display text-sm text-accent uppercase">Dashboard</a>
            </div>
            <nav class="flex-1 p-3 space-y-4 overflow-y-auto">
                <div class="ip-nav-group">
                    <div class="ip-nav-group-label">Main</div>
                    <div class="ip-nav-list-vertical">
                        <a href="#" class="active">Overview</a>
                        <a href="#">Analytics</a>
                        <a href="#">Reports</a>
                    </div>
                </div>
            </nav>
            <div class="p-3 border-t border-secondary">
                <div class="ip-list-item">
                    <div class="ip-list-item-icon">
                        <div class="ip-avatar ip-avatar-sm">JD</div>
                    </div>
                    <div class="ip-list-item-content">
                        <div class="ip-list-item-title">John Doe</div>
                        <div class="ip-list-item-meta">Admin</div>
                    </div>
                </div>
            </div>
        </aside>

        <!-- Main -->
        <div class="flex-1 flex flex-col min-h-screen">
            
            <!-- Header -->
            <header class="border-b border-secondary px-4 py-3">
                <div class="flex items-center justify-between">
                    <h1 class="font-display text-sm text-accent uppercase">Overview</h1>
                    <button onclick="themeManager.toggle()" class="ip-btn-icon">
                        <span class="ip-btn-icon-content">◐</span>
                    </button>
                </div>
            </header>

            <!-- Content -->
            <main class="flex-1 p-4 lg:p-6 overflow-y-auto">
                
                <!-- Stats Row -->
                <div class="grid grid-cols-2 lg:grid-cols-4 gap-4 mb-6">
                    <div class="ip-frame">
                        <div class="ip-frame-header">Users</div>
                        <div class="ip-frame-body">
                            <div class="ip-stat">
                                <div class="ip-stat-value">12,847</div>
                                <div class="ip-stat-trend ip-stat-trend-up">↑ 12.5%</div>
                            </div>
                        </div>
                    </div>
                    <!-- More stats... -->
                </div>

                <!-- Main Grid -->
                <div class="grid grid-cols-1 lg:grid-cols-3 gap-4">
                    <div class="lg:col-span-2 ip-window">
                        <div class="ip-window-header">Activity</div>
                        <div class="ip-window-body">
                            <!-- Chart placeholder -->
                        </div>
                    </div>
                    <div class="ip-window ip-scrollable">
                        <div class="ip-window-header">Recent Activity</div>
                        <div class="ip-window-body max-h-64">
                            <!-- Activity items -->
                        </div>
                    </div>
                </div>

            </main>
        </div>
    </div>

    <script src="../interplanetary-ui/js/window.js"></script>

</body>
</html>