Card grid for structured content — responsive, with header, body and footer.
.gk-cards // Auto-Grid (min 280px) .gk-cards-2 / -3 / -4 // Fixed columns .gk-card .gk-card-header / .gk-card-body / .gk-card-footer .gk-card-link // Clickable Card
$stats = new StatCards('dashboard');
$stats->card('Customers', 248, ['format' => 'number', 'color' => 'blue'])
->card('Revenue', 84250.00, ['format' => 'currency', 'color' => 'green'])
->card('Outstanding', 12480.00, ['format' => 'currency', 'color' => 'red'])
->render();Container for related content — single, stacked or with header.
A simple segment visually groups related content.
Segments can have a header to describe the content.
Create account and confirm email.
Fill out profile and configure settings.
Create first project and get started.
With shadow — stands out more from the background.
Muted background — for secondary content.
Less padding — for denser layouts.
.gk-segment / .gk-segment-raised / .gk-segment-muted / .gk-segment-compact .gk-segment-padded / .gk-segment-basic .gk-segments > .gk-segment // Stacked
Notices, warnings and status messages for users.
.gk-message / .gk-message-info / .gk-message-success .gk-message-warning / .gk-message-error / .gk-message-compact .gk-message-dismiss // Close button
Collapsible content areas — individually or as a group.
<div class="gk-accordion" data-gk-single>
<div class="gk-accordion-item open">
<button class="gk-accordion-trigger">
<span>Question?</span>
<span class="material-icons">expand_more</span>
</button>
<div class="gk-accordion-content">
<div class="gk-accordion-body">Answer...</div>
</div>
</div>
</div>
// data-gk-single: only one item open at a time
// .open: item open by defaultProfile pictures with initials fallback, status dot and groups.
.gk-avatar.gk-avatar-lg // Sizes: xs, sm, md, lg, xl .gk-avatar-status.online // Status: online, away, busy, offline .gk-avatar-group // Stacked group .gk-avatar-square // Square instead of round
Image grid with lazy loading, hover overlay and lightbox (arrow keys, Escape).
<div class="gk-gallery">
<div class="gk-gallery-item" data-lightbox="full.jpg" data-caption="Titel" data-lazy>
<img data-src="thumb.jpg" alt="">
<div class="gk-gallery-overlay">
<span class="gk-gallery-caption">Titel</span>
</div>
</div>
</div>
// Variants:
.gk-gallery-sm // Smaller thumbnails (100px min)
.gk-gallery-lg // Larger thumbnails (220px min)
.gk-gallery-masonry // Pinterest layout (columns)
// Lightbox: arrow keys, Escape, click outside to close
// data-lazy: load images only when visiblePath navigation for orientation in nested areas.
Page content here...
<nav class="gk-breadcrumb">
<a href="#"><span class="material-icons">home</span></a>
<span class="gk-breadcrumb-sep"><span class="material-icons">chevron_right</span></span>
<a href="#">Products</a>
<span class="gk-breadcrumb-sep">...</span>
<span class="gk-breadcrumb-current">Current Page</span>
</nav>Tab navigation for switching between content areas.
This is the overview — the first tab is active by default.
Detail information is displayed here.
Settings and configuration options.
<div class="gk-tabs">
<div class="gk-tab-nav">
<button class="gk-tab-btn gk-active" data-tab="tab-1">Tab 1</button>
<button class="gk-tab-btn" data-tab="tab-2">Tab 2</button>
</div>
<div class="gk-tab-panel gk-active" data-tab="tab-1">Content 1</div>
<div class="gk-tab-panel" data-tab="tab-2">Content 2</div>
</div>Combination examples showing the full potential of GRIDKit.
Tabs for main categories, accordion for details — a common pattern in admin UIs.
Dashboard view with status message and data table in a segment.
| Server | Status | CPU | RAM | Uptime |
|---|---|---|---|---|
| Baerli (server8) | Online | 12% | 4.2 GB | 47 days |
| Theo (server7) | Online | 8% | 3.8 GB | 23 days |
| Waldi (server6) | Online | 15% | 5.1 GB | 31 days |
Page navigation — automatically generated by Table, but can also be used standalone.
<nav class="gk-pagination">
<button class="gk-page-btn" disabled>«</button>
<button class="gk-page-btn gk-active">1</button>
<button class="gk-page-btn">2</button>
<button class="gk-page-btn">»</button>
</nav>$chips = new FilterChips('status-filter', 'status');
$chips->chip('', 'All', ['count' => 152])
->chip('active', 'Active', ['count' => 89, 'color' => 'green'])
->render();$years = new YearFilter('year-nav', 'year');
$years->range(2022, 2026)->render();Built-in formatting for table columns: currency, percent, date, boolean, label, email.
| Currency | Percent | Date | Boolean | Label | |
|---|---|---|---|---|---|
| 1.234,56 € | 20% | 13.02.2026 | ✓ | paid | info@ssi.at |
| 99,00 € | 10% | 28.01.2026 | – | pending | office@panel.at |
| 5.500,00 € | 0% | 01.12.2025 | ✓ | cancelled |
->column('amount', 'Amount', ['format' => 'currency']) // 1,234.56 EUR
->column('tax', 'VAT', ['format' => 'percent']) // 20%
->column('date', 'Date', ['format' => 'date']) // 02/13/2026
->column('active', 'Active', ['format' => 'boolean']) // Yes / No
->column('status', 'Status', ['format' => 'label']) // Colored label
->column('email', 'E-Mail', ['format' => 'email']) // mailto: LinkToast notifications for success, error and info messages. Disappear after 3 seconds.
GK.toast.success('Successfully saved!');
GK.toast.error('Error while saving!');
GK.toast.warning('Warning: Limit reached!');
GK.toast.info('3 new entries');Confirm dialogs as clean modals. Promise-based, with danger mode for destructive actions.
GK.confirm('Send invoice?', {
title: 'Send Invoice', confirmText: 'Send'
}).then(ok => { if (ok) GK.toast.success('Sent!'); });
GK.confirm('Really delete?', {
title: 'Delete', confirmText: 'Delete', danger: true
}).then(ok => { if (ok) { /* ... */ } });Modals in four sizes. Loaded via AJAX, backdrop click and ESC close them.
A modal loads a form via AJAX – the most common use case.
A large modal shows a customer list. Clicking "Edit" opens a second modal with the form.
GK.modal.open('Titel', 'form/edit.php', {id: 42}, 'small');
GK.modal.open('Titel', 'form/edit.php', {id: 42}, 'medium');
GK.modal.open('Titel', 'form/edit.php', {id: 42}, 'large');
GK.modal.open('Titel', 'form/edit.php', {id: 42}, 'full');
$table->button('edit', ['icon' => 'edit', 'modal' => 'edit_form'])
->modal('edit_form', 'Edit', 'form/edit.php', ['size' => 'large']);use GridKit\Button;
echo Button::render('Save', ['variant' => 'filled', 'color' => 'primary', 'icon' => 'save']);
echo Button::icon('edit', ['variant' => 'filled', 'color' => 'primary']);
echo Button::fab('add');
echo Button::fab('edit', ['extended' => true, 'label' => 'Edit']);Colored labels for status display — also usable standalone, not only in tables.
<span class="gk-label gk-label-green">Active</span> <span class="gk-label gk-label-orange">Draft</span> <span class="gk-label gk-label-red">Error</span> <span class="gk-label gk-label-gray">Archived</span> <span class="gk-label gk-label-blue">Info</span>
Tooltips appear automatically on buttons with a title attribute. Hover over the buttons:
// Tooltip via title attribute (CSS-only, no JS)
Button::icon('edit', ['title' => 'Edit']);
<button class="gk-btn" title="Tooltip-Text">...</button>Placeholder for empty tables or lists.
| Name | Status | |
|---|---|---|
No entries found | ||
<div class="gk-empty">No entries found</div>
$header = new Header();
echo $header->title('Invoices')
->breadcrumb(['Dashboard' => '/', 'Invoices'])
->search('Search...', 'q')
->action(Button::render('New', ['icon' => 'add', 'size' => 'sm']))
->user('Martin Huber', ['avatar' => '...', 'menu' => [...]])
->sticky()->render();Responsive sidebar navigation with groups, icons, badges and mobile toggle. Visible live on this page.
$sidebar = new Sidebar('main');
$sidebar->brand('My Project', 'dashboard', 'v0.7.0')
->group('Modules')
->item('Dashboard', '/dashboard', 'analytics', ['active' => true])
->item('Invoices', '/invoices', 'receipt_long', ['badge' => 3])
->render();
GK.sidebar.toggle(); GK.sidebar.open(); GK.sidebar.close();M3-compliant theme system with 6 themes and Dark/Light Mode.
Surface-container background with on-surface text colors.
Theme::set('ocean', 'dark');
echo Theme::bodyTag('gk-root');
echo Theme::switcher();
GK.theme.set('forest'); GK.theme.toggleMode(); GK.theme.restore();| Invoice No. | Customer | Amount | Date | Status |
|---|---|---|---|---|
| RE-2026-001 | Mustermann GmbH | 2.400,00 € | 01.02.2026 | paid |
| RE-2026-002 | Technik AG | 5.800,00 € | 05.02.2026 | pending |
| RE-2026-003 | Design Studio | 1.200,00 € | 15.01.2026 | overdue |
| RE-2026-004 | Web Solutions | 3.600,00 € | 10.02.2026 | paid |
| RE-2026-005 | Media House | 950,00 € | 12.02.2026 | pending |
skeleton.php is the ready-made scaffolding for a new GridKit project. Just copy, adjust title + navigation, fill in sections — done.
cp /path/to/gridkit/skeleton.php my-project/index.php
Every page follows this structure — from skeleton.php to production.
Theme::set('indigo') · Layout::bodyTag('gk-root')
->brand() · ->group() · ->item(label, url, icon)
->title() · ->fixed() · ->user(name, opts)
<main class="gk-main"> · Tables, Forms, Cards…
Modal::container() · <script src="gridkit.js">
Auth protects pages with session-based login. Passwords are stored as bcrypt hashes.
Pure CSS tooltips via data-gk-tooltip attribute. No JavaScript needed.
Rich tooltips use data-gk-tooltip-rich pointing to a hidden element. Supports links, formatting, and stays open on hover.
Rich tooltips support full HTML content including links, images, and interactive elements.
Learn more →<!-- Simple tooltip (CSS-only) --> <span data-gk-tooltip="Hello!">Hover me</span> <!-- Position: top (default), bottom, left, right --> <span data-gk-tooltip="Bottom" data-gk-tooltip-pos="bottom">...</span> <!-- Multiline --> <span data-gk-tooltip="Long text here" data-gk-tooltip-wrap>...</span> <!-- Rich tooltip (HTML content) --> <span data-gk-tooltip-rich="#myTip">Hover</span> <div id="myTip">HTML content here</div>