GridKit v1.8.0

Demo UserDemo Userexpand_more

Table

Complete table with all features

Article No.DescriptionUnitNetVATStatus
ART-001Webdesign Paket Spsch1.200,00 €20%active
ART-002Hosting StandardStk9,90 €20%active
ART-003SEO Beratungh95,00 €20%inactive
ART-004Logo Designpsch450,00 €20%draft
ART-005Newsletter Setuppsch350,00 €20%active
ART-006Social Media Paketpsch680,00 €20%active
ART-007E-Mail Marketingpsch420,00 €20%draft
ART-008Content Erstellungh75,00 €20%active
ART-009Server Administrationh110,00 €20%inactive
ART-010SSL ZertifikatStk49,00 €20%active
ART-011Domain RegistrationStk15,00 €20%active
ART-012Webdesign Paket Lpsch3.500,00 €20%active
ART-013App Entwicklungh125,00 €20%draft
ART-014Datenbank Migrationpsch890,00 €20%active
ART-015Security Auditpsch1.500,00 €20%inactive

Invoice list with date and currency formatting

Inv. No.CustomerDateDueAmountStatus
RE-2026-001Mustermann GmbH01.02.202601.03.20261.450,00 €paid
RE-2026-002Tech Solutions AG05.02.202605.03.20263.200,00 €pending
RE-2026-003Weber & Partner08.02.202608.03.2026890,50 €overdue
RE-2026-004Digital Agentur Wien10.02.202610.03.20265.600,00 €draft
RE-2026-005Startup Hub Vienna12.02.202612.03.20262.100,00 €paid
RE-2026-006Cafe Central KG14.02.202614.03.2026780,00 €pending
RE-2026-007Alpen Consulting15.02.202615.03.20264.200,00 €paid
RE-2026-008Donau Logistics17.02.202617.03.20261.890,00 €pending
RE-2026-009Wiener Werkstatt18.02.202618.03.2026560,00 €draft
RE-2026-010Graz IT Services20.02.202620.03.20263.450,00 €paid
RE-2026-011Salzburg Media22.02.202622.03.20261.200,00 €overdue
RE-2026-012Linz Digital25.02.202625.03.20262.750,00 €pending

Compact table without toolbar

NameE-MailRoleActive
Martin Hubermartin@example.comadmin
Anna Schneideranna@example.comeditor
Thomas Bergerthomas@example.comviewer
Lisa Wagnerlisa@example.comeditor
Peter Gruberpeter@example.comadmin

Sizes

size('sm') Compact
NameValueStatus
Widget A1.200 €active
Widget B340 €inactive
Widget C890 €active
size('md') Standard
NameValueStatus
Widget A1.200 €active
Widget B340 €inactive
Widget C890 €active
size('lg') Spacious
NameValueStatus
Widget A1.200 €active
Widget B340 €inactive
Widget C890 €active
$table->size('sm');  // compact
$table->size('md');  // standard (default)
$table->size('lg');  // spacious

Display variants

variant('default') Default
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft
variant('bordered') Bordered
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft
variant('striped') Striped
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft
variant('celled') Celled
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft
variant('padded') Padded
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft
variant('compact') Compact
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft
variant('selectable') Selectable
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft
variant('minimal') Minimal
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft
variant('flat') Flat
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft
variant('inverted') Inverted
DescriptionPriceStatus
Webdesign Paket1.200 €active
Hosting Standard9,90 €active
SEO Beratung95 €inactive
Logo Design450 €draft

Definition table

First column as label/key — ideal for detail views.

Company nameSSI Schaefer IT Solutions GmbH
Founded2003
LocationWien, Oesterreich
Employees24
Websitessi.at
StatusActive
$table->variant('default');     // Default
$table->variant('bordered');    // Full border lines
$table->variant('striped');     // Zebra stripes
$table->variant('celled');      // Grid lines around each cell
$table->variant('padded');      // Extra spacing
$table->variant('compact');     // Compact, more rows
$table->variant('selectable');  // Hover cursor, clickable
$table->variant('minimal');     // Only separator, no border
$table->variant('flat');        // Completely flat
$table->variant('inverted');    // Dark table (also in Light Mode)

// Combinable:
$table->variant('striped')->size('compact');
$table->variant('celled')->variant('padded');

Mobile-Responsive

Resize the browser window to <768px to see the mobile layout.

mobile('card') – Standard
Article No.DescriptionPriceStatus
ART-001Webdesign Paket S1.200 €active
ART-002Hosting Standard9,90 €active
ART-003SEO Beratung95 €inactive
mobile('scroll') – Horizontal Scroll
Article No.DescriptionPriceStatus
ART-001Webdesign Paket S1.200 €active
ART-002Hosting Standard9,90 €active
ART-003SEO Beratung95 €inactive
hideOnMobile – Hide columns
Article No.DescriptionPriceStatus
ART-001Webdesign Paket S1.200 €active
ART-002Hosting Standard9,90 €active
ART-003SEO Beratung95 €inactive
// Demo 1: Complete article table with pagination
$table = new Table('articles');
$table->setData($articles)
    ->search(['article_number', 'name'])
    ->column('name', 'Description', ['sortable' => true])
    ->column('net_price', 'Net', ['format' => 'currency'])
    ->column('tax_rate', 'VAT', ['format' => 'percent'])
    ->column('is_active', 'Status', ['format' => 'label'])
    ->button('edit', ['icon' => 'edit', 'class' => 'primary'])
    ->button('delete', ['icon' => 'delete', 'class' => 'danger'])
    ->newButton('New Article', ['icon' => 'add'])
    ->nowrap(true)
    ->paginate(5)
    ->render();

// Mobile-Responsive
$table->mobile('card');      // Cards on mobile (default)
$table->mobile('scroll');    // Horizontal Scroll
$table->column('desc', 'Description', ['hideOnMobile' => true]);

Form

Grid Layout (16 columns)

Checkbox & Radio

Toggle & Slider

50
75

File Upload

cloud_uploadDateien hierher ziehen oder klickenMax. 10MB

RichText Editor (CKEditor 5)

Local vendor bundle (vendor/ckeditor5/), no CDN. Initialization via IntersectionObserver — works in tabs and modals too.

Clearable date/time fields

Trash icon only appears when a value is set — disappears automatically after clearing.

New field types

Uniform height of 44px for all input types. No browser spinner for number.

Select extensions

Searchable Select – Country selection with search field


Multi-Select – Select multiple categories (with chips)

Webdesign SEO
expand_more
check Webdesign
check SEO
Hosting
Development
Support
Consulting

Ajax Select – Customer search via API (min. 2 characters)

search
// Grid Layout (16 columns)
$form->row()
    ->field('name', 'Name', 'text', ['width' => 8])
    ->field('email', 'E-Mail', 'email', ['width' => 8])
->endRow()
->field('agree', 'Accept terms', 'checkbox', ['checked' => true])
->field('payment', 'Payment method', 'radio', [
    'options' => ['card' => 'Credit card', 'bank' => 'Bank transfer'],
    'value' => 'card', 'inline' => true
])
->field('active', 'Active', 'toggle', ['inline' => true])
->field('volume', 'Volume', 'range', ['min' => 0, 'max' => 100, 'value' => 50])
->field('doc', 'Document', 'file', ['accept' => '.pdf', 'multiple' => true, 'maxSize' => '10MB'])
->field('content', 'Content', 'richtext', ['preset' => 'full'])
->field('datum',  'Date',    'date',     ['value' => date('Y-m-d'),      'clearable' => true])
->field('farbe', 'Color',  'color',  ['value' => '#6750a4'])
->field('preis', 'Price',  'number', ['placeholder' => '0.00'])

File Upload (extended)

drag_indicatorDrag & Drop

Select files via drag & drop or click

verifiedValidation

Type, size (min/max), count and total size

imagePreview

Image thumbnails directly in the upload zone

list_altQueue UI

Progress indicator, states, errors per file

Variant 1 — Simple

Document upload with type filter and size limit.

cloud_uploadDatei hierher ziehen oder klickenPDF or Word, max. 10 MB

Variant 2 — Images with preview

Multi-upload with image thumbnails directly in the zone.

cloud_uploadDateien hierher ziehen oder klickenMax. 8 MB

Variant 3 — Full configuration

All options combined: types, min/max size, total limit, file count.

cloud_uploadDateien hierher ziehen oder klickenMax. 10 MB/file · 50 MB total · 10 files

Queue states live

Manually cycle queue items through states: pending → uploading → done / error.

Validation error demo

Zone with strict limits — PDF only, max. 100 KB.

cloud_uploadDatei hierher ziehen oder klickenPDF only, max. 100 KB — other files will be rejected

Color Picker

Styled native color input — color swatch on the left (clickable) + hex field on the right. Swatch and hex value sync automatically, validated as #RRGGBB.

Live Demo

Behavior

  • Clicking the color swatch opens the native browser color picker
  • The hex text field shows the current value and is directly editable
  • Both fields synchronize in real time
  • Validation: only valid #RRGGBB values are accepted
  • Uniform 44px height like all other GridKit inputs

Form Density

Wrap any form in .gk-form-compact for reduced spacing. All elements — inputs, selects, toggles, checkboxes — scale down proportionally.

Normal (default)
Compact .gk-form-compact
<!-- Normal (default) -->
<form>
  <div class="gk-field">...</div>
</form>

<!-- Compact -->
<form class="gk-form-compact">
  <div class="gk-field">...</div>
</form>

<!-- Also works as wrapper -->
<div class="gk-form-compact">
  <div class="gk-card">
    <div class="gk-field">...</div>
  </div>
</div>

Cards

Card grid for structured content — responsive, with header, body and footer.

Auto-Grid (responsive)

Webdesign
Package S · from 1,200 €
Responsive design, CMS integration and SEO basics for small projects.
Hosting
Managed · from 9.90 €/month
SSD storage, daily backups and SSL included. 99.9% uptime.
SEO
Consulting · 95 €/h
Keyword analysis, on-page optimization and monthly reports.

Fixed column count

speedPerformance
99.9% Uptime
securitySecurity
SSL & Firewall
support_agentSupport
Available 24/7
backupBackups
Daily automatic

2 columns

Development
Frontend and backend development with modern technologies.
Consulting
Strategic IT consulting for digital transformation.

3 columns

webWeb
phone_androidMobile
cloudCloud
.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

Stat Cards

Customers248
Revenue84.250,00 €
Orders64
Outstanding12.480,00 €
$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();

Layout

Segment

Container for related content — single, stacked or with header.

A simple segment visually groups related content.

Segment with header

Project overview

Segments can have a header to describe the content.

Stacked segments

Step 1

Create account and confirm email.

Step 2

Fill out profile and configure settings.

Step 3

Create first project and get started.

Variants

Raised

With shadow — stands out more from the background.

Muted

Muted background — for secondary content.

Compact

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

Message

Notices, warnings and status messages for users.

info
A neutral message without a specific status.

Types

info
Information
Your changes are saved automatically.
check_circle
Success
The profile has been successfully updated.
warning
Warning
Your SSL certificate expires in 7 days.
error
Error
Could not establish connection to the database.
  • Host unreachable
  • Timeout after 30 seconds

Compact

info
Compact message for less space.

Dismissible

warning
This message can be closed.
.gk-message / .gk-message-info / .gk-message-success
.gk-message-warning / .gk-message-error / .gk-message-compact
.gk-message-dismiss  // Close button

Navigation & Filter

Accordion

Collapsible content areas — individually or as a group.

GRIDKit is a lightweight PHP/CSS/JS framework for admin dashboards and internal tools. Zero dependencies, M3-inspired.
Table, Form, Modal, Cards, StatCards, Sidebar, Header, Tabs, Accordion, Breadcrumb, Toast, Confirm and more. All with Light & Dark Mode.
No. GRIDKit has no dependencies — one CSS file, one JS file, done. Just include and get started.
<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 default

Avatar

Profile pictures with initials fallback, status dot and groups.

Sizes
XS
SM
MD
LG
XL
Status
MM
Group (stacked)
+3
.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

Gallery + Lightbox

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 visible

Breadcrumb

Path 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>

Tabs

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>

Combinations

Combination examples showing the full potential of GRIDKit.

Tabs + Accordion (combined)

Tabs for main categories, accordion for details — a common pattern in admin UIs.

3 packages available: S (1,200 €), M (2,400 €), L (3,500 €). All incl. responsive design and CMS.
Managed hosting from 9.90 €/month. SSD, backups, SSL included. 99.9% uptime guarantee.
info
24 active customers, 3 open inquiries
Mustermann GmbH
Since 2024 · 12 projects
Tech Solutions AG
Since 2023 · 8 projects
Weber & Partner
Since 2025 · 3 projects
Notifications


Segment + Message + Table

Dashboard view with status message and data table in a segment.

Server-Status
check_circle
All 3 servers are online — last check 2 minutes ago.
ServerStatusCPURAMUptime
Baerli (server8)Online12%4.2 GB47 days
Theo (server7)Online8%3.8 GB23 days
Waldi (server6)Online15%5.1 GB31 days

Pagination (standalone)

Page navigation — automatically generated by Table, but can also be used standalone.

<nav class="gk-pagination">
    <button class="gk-page-btn" disabled>&laquo;</button>
    <button class="gk-page-btn gk-active">1</button>
    <button class="gk-page-btn">2</button>
    <button class="gk-page-btn">&raquo;</button>
</nav>

FilterChips

$chips = new FilterChips('status-filter', 'status');
$chips->chip('', 'All', ['count' => 152])
    ->chip('active', 'Active', ['count' => 89, 'color' => 'green'])
    ->render();

YearFilter

$years = new YearFilter('year-nav', 'year');
$years->range(2022, 2026)->render();

Formatter

Built-in formatting for table columns: currency, percent, date, boolean, label, email.

CurrencyPercentDateBooleanLabelEmail
1.234,56 €20%13.02.2026paidinfo@ssi.at
99,00 €10%28.01.2026pendingoffice@panel.at
5.500,00 €0%01.12.2025cancelled
->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: Link

Feedback & Dialogs

Toast

Toast 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

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) { /* ... */ } });

Modal

Modals in four sizes. Loaded via AJAX, backdrop click and ESC close them.

Nesting: Modal with form

A modal loads a form via AJAX – the most common use case.

Nesting: Modal with table + sub-modal

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']);

UI Components

Buttons

Variants

Colors – Filled

Colors – Outlined

Colors – Tonal

Colors – Text

Icon-Only

Sizes

States

Icon Position & Special

open_in_newAs Link

Button Group

 

Shapes

FAB (Floating Action Button)

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']);

Labels

Colored labels for status display — also usable standalone, not only in tables.

Active Draft Error Archived Info
<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>

Tooltip

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>

Empty State

Placeholder for empty tables or lists.

NameE-MailStatus
inboxNo entries found
<div class="gk-empty">No entries found</div>

Header

Invoices

Martin HuberMartin Huberexpand_more
badgeAdministrator
personProfilesettingsSettings
logoutSign out
Design

Minimal (title + user with initials only)

Dashboard

AK
Anna K.expand_more
logoutSign out
Design
$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();

Sidebar

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();

Themes

M3-compliant theme system with 6 themes and Dark/Light Mode.

Layout Mode

Theme Selection

Live Preview

Card Title

Surface-container background with on-surface text colors.

Color Roles

Primary Secondary Tertiary Error
Primary Container Secondary Container Tertiary Container
Surface Container Highest
Theme::set('ocean', 'dark');
echo Theme::bodyTag('gk-root');
echo Theme::switcher();
GK.theme.set('forest'); GK.theme.toggleMode(); GK.theme.restore();

Examples

Dashboard Demo

Invoices152
Revenue 2026127.840,00 €
Open18.320,00 €
Overdue4.280,00 €
Invoice No.CustomerAmountDateStatus
RE-2026-001Mustermann GmbH2.400,00 €01.02.2026paid
RE-2026-002Technik AG5.800,00 €05.02.2026pending
RE-2026-003Design Studio1.200,00 €15.01.2026overdue
RE-2026-004Web Solutions3.600,00 €10.02.2026paid
RE-2026-005Media House950,00 €12.02.2026pending

Skeleton — Starting point for new projects

skeleton.php is the ready-made scaffolding for a new GridKit project. Just copy, adjust title + navigation, fill in sections — done.

Quick start:
cp /path/to/gridkit/skeleton.php my-project/index.php

Anatomy of a GRIDKit Page

Every page follows this structure — from skeleton.php to production.

settings Config
widgets
home people settings
SIDEBAR
Header
search
Content
Footer · JS
settings
Configuration
Theme::set('indigo') · Layout::bodyTag('gk-root')
menu
Sidebar
->brand() · ->group() · ->item(label, url, icon)
web
Header
->title() · ->fixed() · ->user(name, opts)
dashboard
Content
<main class="gk-main"> · Tables, Forms, Cards…
code
Footer
Modal::container() · <script src="gridkit.js">

Auth — Login Protection

Auth protects pages with session-based login. Passwords are stored as bcrypt hashes.

Auth::protect(); // Protect page Auth::login($user, $pass); // Login attempt Auth::logout('login.php'); // Clear session Auth::check(); // Logged in? Auth::user(); // Username Auth::hashPassword('abc'); // bcrypt hash Auth::renderLogin([...]); // Login page

Open the login page live demo:

lock_open Open Login Demo

Credentials: demo / demo

Tooltip

CSS-only Tooltips

Pure CSS tooltips via data-gk-tooltip attribute. No JavaScript needed.

Top (default) Bottom Left Right

Multiline Tooltip

Hover for multiline

Rich Tooltip (HTML content)

Rich tooltips use data-gk-tooltip-rich pointing to a hidden element. Supports links, formatting, and stays open on hover.

Hover for details
GridKit Tooltip

Rich tooltips support full HTML content including links, images, and interactive elements.

Learn more →

Tooltip on Buttons

Usage

<!-- 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>

Changelog

1.8.0]2026-04-17 — Table: Tabular-Nums für Währung/Zahlen
Added / Changed · **Table**: Spalten mit `format: 'currency'` oder `format: 'number'` bekommen automatisch: - `font-variant-numeric: tabular-nums` → gleichbreite Ziffern, Euro-Zeichen stehen zeilenübergreifend untereinander - `text-align: right` (wenn nicht anders gesetzt) - `white-space: nowrap` (wenn nicht explizit gesetzt) Damit sehen Beträge in Tabellen sofort typografisch korrekt aus, ohne dass jede View einzeln CSS setzen muss. ---
1.7.1]2026-04-17 — YearFilter: Fix `URL is not a constructor`
Fixed · **YearFilter Dropdown**: `new URL(...)` → `new window.URL(...)` und `window.location.href` statt `window.location`. Behebt `Uncaught TypeError: URL is not a constructor` auf Seiten, die irgendwo ein Element mit `id="URL"` oder `name="URL"` haben (z.B. `/faktura/invoices`) — "named access on Window" überschattet sonst den globalen `URL`-Konstruktor. ---
1.7.0]2026-04-17 — YearFilter: Toolbar-tauglich + „Alle"-Option
Added · **`allOption(string $label = 'Alle Jahre', int $value = 0)`**: Fügt eine „Alle"-Option am Anfang des Dropdowns ein. Der Controller muss den übergebenen Wert (default `0`) als „kein Filter" interpretieren. · **`selectClass(string $class)`**: Legt die CSS-Klasse des `<select>` fest (default `gk-filter`). Changed · **`mode('dropdown')` rendert jetzt nur das `<select>`** — ohne umgebenden `<div class="gk-year-filter-dropdown">`. Dadurch lässt sich das Dropdown direkt in eine bestehende `.gk-toolbar` (z.B. via `Table::toolbarHtml()`) einspeisen, ohne Layout-Bruch. Example ```php ob_start(); (new YearFilter('cust-year', 'year')) ->baseUrl('/faktura/customers') ->range(2010, (int)date('Y')) ->preserve(['quarter', 'month', 'q']) ->mode('dropdown') ->allOption('Alle Jahre') ->render(); $toolbarHtml = ob_get_clean(); (new Table('customers'))->setData($rows)->toolbarHtml($toolbarHtml)->render(); ``` ---
1.6.0]2026-04-17 — YearFilter: Dropdown-Modus
Added · **YearFilter `mode('dropdown')`**: Zeigt die Jahre als `<select>`-Dropdown statt als Chip-Liste — nützlich wenn der verfügbare Zeitraum groß ist (z.B. 17 Jahre Firmenhistorie) und die Chip-Leiste zu lang würde. · Default bleibt `mode('chips')` — bestehende Verwendungen ändern sich nicht. · Kombinierbar mit `->range($from, $to)` um auch Jahre ohne Daten anzubieten. Example ```php (new YearFilter('cust-year-filter', 'year')) ->baseUrl('/faktura/customers') ->range(2010, (int)date('Y')) ->preserve(['quarter', 'month', 'show', 'q']) ->mode('dropdown') ->render(); ``` ---
1.5.0]2026-04-15 — AJAX Sidebar Navigation (SPA-lite)
Added · **AJAX Navigation**: Sidebar-Links laden Content per fetch() ohne Full-Page-Reload - Opt-in: `$sidebar->ajaxNav(true)` + `data-gk-content` auf Content-Container - Ladebalken (Progress-Bar) am oberen Bildschirmrand - Browser Zurück/Vorwärts via pushState/popstate - Automatische Re-Initialisierung von GRIDKit-Komponenten - Fallback auf normale Navigation bei Fehler · Sidebar.php: Neue Methode `ajaxNav(bool $enabled)` ---
1.4.17]2026-04-15 — Form: Date-Felder max-Jahr begrenzen
Fixed · **Form date/datetime**: Automatisch `max="9999-12-31"` gesetzt, damit Browser kein 6-stelliges Jahr erlaubt · **Form**: `min` und `max` Attribute für alle Input-Typen unterstützt (text, number, date etc.) ---
1.4.13]2026-04-10 — Form Compact: alle Elemente + Demo
Added · **Form Compact — vollständig**: `.gk-form-compact` skaliert jetzt alle Formular-Elemente: - Inputs: 44px → 34px, Padding/Font reduziert - Selects: Höhe 34px, kompakteres Arrow-Positioning - Toggles: 48×28px → 38×22px - Checkboxen: 20×20px → 16×16px - Searchable Selects: Display + Options kompakter - Field-Inline: Gap 12px → 8px · **Demo**: Side-by-side Vergleich Normal vs Compact unter gridkit.ssi.at/demo/#form · **Doku**: SPEC.md, GRIDKIT_SKILL.md mit Form Density Tabellen Changed · **Input Borders** (global): 1.5px #d0d7de → 1px #dde1e6 (zartere Linien) ---
1.4.1]2026-03-31 — Table renderStatic Button-Fix + Icons
Fixed · **Table renderBtnGroup JS**: Buttons nach renderStatic (Suche/Sort) hatten nur `gk-btn gk-btn-icon` — fehlten `gk-btn-text`, `gk-btn-neutral`, `gk-btn-sm`. Jetzt identisch mit PHP-Renderer (variant=text, color=neutral, size=sm per Default). · **iconSvg()**: Nur 3 Icons bekannt — unbekannte Icons wurden als roher Text gerendert. Jetzt erweitert: `add`, `visibility`, `download`, `upload`, `copy`, `email`, `search`, `settings`, `open_in_new`, `auto_awesome`, `login`, `print`. Unbekannte Icons fallen auf Material Icons `<span class="material-icons">` zurück statt Text. ---