Elements & UI
Ready-to-use UI components with JavaScript interactivity. From utility components like notifications and timers to structural elements like modals and carousels.
Elements & UI
CSS Customisation Cheat-Sheet
Override Domma's CSS variables to match your existing project's design system. Learn which variables control colours, typography, spacing, and component styles - no need to rewrite CSS.
View Cheat-Sheet →<div class="card card-hover card-accent mb-8"><div class="card-body">
<div class="flex items-start gap-4">
<div data-icon="palette" class="text-primary" style="font-size: 2rem;"></div>
<div style="flex: 1;">
<h3 class="text-xl font-semibold mb-2">CSS Customisation Cheat-Sheet</h3>
<p class="mb-3">Override Domma's CSS variables to match your existing project's design system. Learn which variables control colours, typography, spacing, and component styles - no need to rewrite CSS.</p>
<a href="/showcase/elements/css-customisation" class="btn btn-primary btn-sm">View Cheat-Sheet →</a>
</div>
</div>
</div>
</div>UI Components
Utility components for user interaction, feedback, and compliance
Cookie Consent
GDPR-compliant cookie consent management.
- Fully configurable
- GDPR compliant
- Category management
- localStorage persistence
Back to Top
Scroll-to-top button that appears after scrolling.
- Auto show/hide
- Smooth scroll
- Customisable position
- Event callbacks
DesktopNotification
Browser native desktop notifications with permission handling.
- Desktop push alerts
- Permission management
- Event callbacks
- Instance tracking
Toast
Non-blocking notification messages with auto-dismiss.
- Success/error/info
- Auto-dismiss timer
- Position control
- Action buttons
Loader
Loading indicators with multiple animation types.
- 4 animation types
- Overlay mode
- Size customisation
- Loading text
Skeleton
Shimmering placeholders shaped like the content on its way.
- Text, card, list and table shapes
- E.skeleton.while(promise)
- DataTable loading rows
- CSS-only, theme-aware
Timer
Countdown timer with visual display or headless mode.
- Visual or headless
- Multiple formats
- Time manipulation
- Notification alerts
Alarm
Scheduled time-based alerts with localStorage persistence.
- Persistent alarms
- Repeat patterns
- Snooze support
- Auto-notification
<p class="text-gray-600 mb-6">Utility components for user interaction, feedback, and compliance</p>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 1.5rem;">
<!-- Cookie Consent -->
<a href="/showcase/elements/cookie-consent" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="shield"></div>
<h3 class="card-title">Cookie Consent</h3>
<p class="card-text">GDPR-compliant cookie consent management.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Fully configurable</li>
<li>GDPR compliant</li>
<li>Category management</li>
<li>localStorage persistence</li>
</ul>
</div>
<div class="card-footer">
<code>elements.cookieConsent({ ... })</code>
</div>
</a>
<!-- Back to Top -->
<a href="/showcase/elements/back-to-top" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="chevron-up"></div>
<h3 class="card-title">Back to Top</h3>
<p class="card-text">Scroll-to-top button that appears after scrolling.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Auto show/hide</li>
<li>Smooth scroll</li>
<li>Customisable position</li>
<li>Event callbacks</li>
</ul>
</div>
<div class="card-footer">
<code>elements.backToTop('#btn', { showAfter: 300 })</code>
</div>
</a>
<!-- DesktopNotification -->
<a href="/showcase/elements/notification" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="bell"></div>
<h3 class="card-title">DesktopNotification</h3>
<p class="card-text">Browser native desktop notifications with permission handling.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Desktop push alerts</li>
<li>Permission management</li>
<li>Event callbacks</li>
<li>Instance tracking</li>
</ul>
</div>
<div class="card-footer">
<code>elements.notify('Hello', { body: 'World!' })</code>
</div>
</a>
<!-- Toast -->
<a href="/showcase/elements/toast" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="check"></div>
<h3 class="card-title">Toast</h3>
<p class="card-text">Non-blocking notification messages with auto-dismiss.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Success/error/info</li>
<li>Auto-dismiss timer</li>
<li>Position control</li>
<li>Action buttons</li>
</ul>
</div>
<div class="card-footer">
<code>elements.toast('Saved!', { type: 'success' })</code>
</div>
</a>
<!-- Loader -->
<a href="/showcase/elements/loader" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="loader"></div>
<h3 class="card-title">Loader</h3>
<p class="card-text">Loading indicators with multiple animation types.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>4 animation types</li>
<li>Overlay mode</li>
<li>Size customisation</li>
<li>Loading text</li>
</ul>
</div>
<div class="card-footer">
<code>elements.loader('#box', { type: 'spinner' })</code>
</div>
</a>
<!-- Skeleton -->
<a href="/showcase/elements/skeleton" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="layout"></div>
<h3 class="card-title">Skeleton</h3>
<p class="card-text">Shimmering placeholders shaped like the content on its way.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Text, card, list and table shapes</li>
<li>E.skeleton.while(promise)</li>
<li>DataTable loading rows</li>
<li>CSS-only, theme-aware</li>
</ul>
</div>
<div class="card-footer">
<code>E.skeleton('#posts', { type: 'card' })</code>
</div>
</a>
<!-- Timer -->
<a href="/showcase/elements/timer" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="clock"></div>
<h3 class="card-title">Timer</h3>
<p class="card-text">Countdown timer with visual display or headless mode.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Visual or headless</li>
<li>Multiple formats</li>
<li>Time manipulation</li>
<li>Notification alerts</li>
</ul>
</div>
<div class="card-footer">
<code>elements.timer('#timer', { duration: 60000 })</code>
</div>
</a>
<!-- Alarm -->
<a href="/showcase/elements/alarm" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="bell"></div>
<h3 class="card-title">Alarm</h3>
<p class="card-text">Scheduled time-based alerts with localStorage persistence.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Persistent alarms</li>
<li>Repeat patterns</li>
<li>Snooze support</li>
<li>Auto-notification</li>
</ul>
</div>
<div class="card-footer">
<code>elements.alarm().add({ time: '09:00', label: 'Standup' })</code>
</div>
</a>
</div>Elements
Structural components for building interfaces
Accordion
Collapsible content sections with smooth animations.
- Single or multi-expand
- Smooth animations
- Nested support
- Keyboard accessible
Avatar
A person's picture, initials or an icon - alone or stacked in a group.
- Initials and a stable colour from the name
- Picture with initials fallback
- Sizes, shapes, status dot and ring
- Groups with "+N" and a popover
Badge
Small status indicators and labels.
- Multiple variants
- Pill & rounded styles
- Dismissible badges
- Counter badges
Number Badge
Positioned notification counters and presence dots.
- CSS-only or JS API
- Auto-hide at zero
- Dot mode for presence
- Pulse animation
List Group
Selectable lists with keyboard navigation and colour variants.
- Single & multi-select
- Keyboard navigation
- Colour variants
- Flush & numbered modes
Signature
Canvas-based handwriting pad for capturing signatures in forms.
- Mouse, touch & stylus
- Undo / redo history
- PNG & SVG export
- Type-your-name fallback
Breadcrumbs
Navigation trail showing user location.
- Dynamic updates
- Custom separators
- Home icon support
- Responsive collapsing
Button Group
Radio and checkbox button groups.
- Single or multi-select
- Vertical layout
- Value binding
- Programmatic control
Card
Container components with hover effects and clickability.
- Hover effects
- Click handling
- Header & footer
- Image support
Carousel
Image and content sliders with controls.
- Auto-play
- Touch support
- Multiple transitions
- Indicators & arrows
Dialog
Promise-based modal dialogs (alert, confirm, prompt).
- Promise-based API
- Alert, confirm, prompt
- Custom styling
- Keyboard support
Dropdown
Contextual overlay menus with smart positioning.
- Click or hover trigger
- Auto-positioning
- Nested support
- Close on outside click
Context Menu
Right-click menus bound to a container and delegated to its children.
- Delegated to rows
- Nests without overriding
- Keyboard and long-press
- Submenus
Sortable
Drag-to-reorder lists, rows and trees by mouse, touch and keyboard.
- Live or indicator mode
- Nested trees with onDrop
- Remembers the order
- Handles, touch and Alt+Arrow
Forms
Enhanced form controls with validation.
- Input validation
- Custom controls
- Error handling
- Submit management
hero
Hero sections with flexible layouts (CSS-only).
- Multiple layouts
- Split layouts
- Gradient overlays
- Responsive sizing
Modal
Dialog overlays with backdrop and animations.
- Backdrop control
- Keyboard shortcuts
- Nested support
- Size variants
Navbar
Responsive navigation bar with mobile menu.
- Mobile responsive
- Dropdown support
- Brand/logo area
- Fixed/sticky modes
Sidebar
Navigation sidebar with unlimited depth nesting.
- Unlimited depth menus
- Mobile drawer
- State persistence
- Light/dark themes
Footer
Page footer with three layout modes and theme variants.
- Simple/columns/minimal
- Theme variants
- Social media icons
- Brand integration
Autocomplete
Text input with intelligent suggestion dropdown.
- Static & async data
- Match highlighting
- Keyboard navigation
- Model binding
Pillbox
Multi-select tag input with removable pills.
- Tag creation
- Searchable dropdown
- Validation rules
- Model binding
Chooser
Visual option-picker with cards or chips, single or multi-select.
- Card or chip variants
- Per-option icons, badges, descriptions
- Keyboard accessible
- Blueprint-driven for forms
TreeView
Hierarchical tree structure with expand/collapse.
- Nested nodes
- Checkboxes
- Lazy loading
- Keyboard navigation
Editor
Rich text editor with formatting tools.
- Formatting toolbar
- HTML/Preview modes
- Image support
- Markdown export
Tabs
Tabbed content panels with animations.
- Animated transitions
- Vertical layout
- Dynamic tabs
- Keyboard navigation
Timeline
Chronological event display with multiple layouts.
- Vertical & horizontal
- Centered layout
- Custom styling
- Event markers
Tooltip
Contextual popups on hover or click.
- Multiple triggers
- Smart positioning
- HTML content
- Custom styling
Popover
Rich panels anchored to a trigger - a title, content or a small form.
- Click, hover, focus or manual
- Flips and shifts to stay on screen
- Focus moves in and comes back
- data-popover markup
Command Palette
A Cmd/Ctrl+K launcher - search every action and page from the keyboard.
- Fuzzy search with highlights
- Nested pages and async search
- Recent commands
- Shortcut hints
Dropzone
Drop, browse or paste files - checked, previewed, submitted or uploaded.
- Accept, size and count rules
- Image previews
- Submits with the form
- Uploads with progress
Focus Trap
Keep Tab and focus inside a panel while it is open.
- Live tabbable lookup
- Stacks with other traps
- Return focus on close
- Optional inert page
Range Slider
One value or two thumbs, with ticks, marks and a tooltip.
- Dual-thumb ranges
- Full keyboard and ARIA
- Vertical and right-to-left
- Real range inputs for forms
Split Pane
Resizable panes with draggable, keyboard-operable gutters.
- Side by side or stacked, nested
- Min / max in px or %, snapping
- Collapsible and remembered
- Separators with arrow keys
Virtual List
Huge lists that render only the rows in view, with infinite loading.
- 100,000 rows, a handful in the DOM
- Fixed or measured heights
- loadMore with retry
- Keyboard navigation
<p class="text-gray-600 mb-6">Structural components for building interfaces</p>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 1.5rem;">
<!-- Accordion -->
<a href="/showcase/elements/accordion" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="chevron-down"></div>
<h3 class="card-title">Accordion</h3>
<p class="card-text">Collapsible content sections with smooth animations.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Single or multi-expand</li>
<li>Smooth animations</li>
<li>Nested support</li>
<li>Keyboard accessible</li>
</ul>
</div>
<div class="card-footer">
<code>elements.accordion('#faq', { multiExpand: false })</code>
</div>
</a>
<!-- Avatar -->
<a href="/showcase/elements/avatar" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="users"></div>
<h3 class="card-title">Avatar</h3>
<p class="card-text">A person's picture, initials or an icon - alone or stacked in a group.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Initials and a stable colour from the name</li>
<li>Picture with initials fallback</li>
<li>Sizes, shapes, status dot and ring</li>
<li>Groups with "+N" and a popover</li>
</ul>
</div>
<div class="card-footer">
<code>E.avatarGroup('#team', { people, max: 4 })</code>
</div>
</a>
<!-- Badge -->
<a href="/showcase/elements/badge" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="box"></div>
<h3 class="card-title">Badge</h3>
<p class="card-text">Small status indicators and labels.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Multiple variants</li>
<li>Pill & rounded styles</li>
<li>Dismissible badges</li>
<li>Counter badges</li>
</ul>
</div>
<div class="card-footer">
<code>elements.badge('#el', { variant: 'primary' })</code>
</div>
</a>
<!-- Number Badge -->
<a href="/showcase/elements/number-badge" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="bell"></div>
<h3 class="card-title">Number Badge</h3>
<p class="card-text">Positioned notification counters and presence dots.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>CSS-only or JS API</li>
<li>Auto-hide at zero</li>
<li>Dot mode for presence</li>
<li>Pulse animation</li>
</ul>
</div>
<div class="card-footer">
<code>elements.numberBadge('#btn', { count: 5 })</code>
</div>
</a>
<!-- List Group -->
<a href="/showcase/elements/list-group" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="list"></div>
<h3 class="card-title">List Group</h3>
<p class="card-text">Selectable lists with keyboard navigation and colour variants.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Single & multi-select</li>
<li>Keyboard navigation</li>
<li>Colour variants</li>
<li>Flush & numbered modes</li>
</ul>
</div>
<div class="card-footer">
<code>elements.listGroup('#list', { mode: 'single' })</code>
</div>
</a>
<!-- Signature -->
<a href="/showcase/elements/signature" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="edit"></div>
<h3 class="card-title">Signature</h3>
<p class="card-text">Canvas-based handwriting pad for capturing signatures in forms.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Mouse, touch & stylus</li>
<li>Undo / redo history</li>
<li>PNG & SVG export</li>
<li>Type-your-name fallback</li>
</ul>
</div>
<div class="card-footer">
<code>E.signature('#pad', { typeFallback: true })</code>
</div>
</a>
<!-- Breadcrumbs -->
<a href="/showcase/elements/breadcrumbs" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="chevron-right"></div>
<h3 class="card-title">Breadcrumbs</h3>
<p class="card-text">Navigation trail showing user location.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Dynamic updates</li>
<li>Custom separators</li>
<li>Home icon support</li>
<li>Responsive collapsing</li>
</ul>
</div>
<div class="card-footer">
<code>elements.breadcrumbs('#nav', { items: [...] })</code>
</div>
</a>
<!-- Button Group -->
<a href="/showcase/elements/button-group" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="grid"></div>
<h3 class="card-title">Button Group</h3>
<p class="card-text">Radio and checkbox button groups.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Single or multi-select</li>
<li>Vertical layout</li>
<li>Value binding</li>
<li>Programmatic control</li>
</ul>
</div>
<div class="card-footer">
<code>elements.buttonGroup('.btns', { mode: 'single' })</code>
</div>
</a>
<!-- Card -->
<a href="/showcase/elements/card" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="zap"></div>
<h3 class="card-title">Card</h3>
<p class="card-text">Container components with hover effects and clickability.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Hover effects</li>
<li>Click handling</li>
<li>Header & footer</li>
<li>Image support</li>
</ul>
</div>
<div class="card-footer">
<code>elements.card('.card', { hover: true })</code>
</div>
</a>
<!-- Carousel -->
<a href="/showcase/elements/carousel" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="image"></div>
<h3 class="card-title">Carousel</h3>
<p class="card-text">Image and content sliders with controls.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Auto-play</li>
<li>Touch support</li>
<li>Multiple transitions</li>
<li>Indicators & arrows</li>
</ul>
</div>
<div class="card-footer">
<code>elements.carousel('#slider', { autoplay: true })</code>
</div>
</a>
<!-- Dialog -->
<a href="/showcase/elements/dialog" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="message-circle"></div>
<h3 class="card-title">Dialog</h3>
<p class="card-text">Promise-based modal dialogs (alert, confirm, prompt).</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Promise-based API</li>
<li>Alert, confirm, prompt</li>
<li>Custom styling</li>
<li>Keyboard support</li>
</ul>
</div>
<div class="card-footer">
<code>await elements.confirm('Are you sure?')</code>
</div>
</a>
<!-- Dropdown -->
<a href="/showcase/elements/dropdown" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="chevron-down"></div>
<h3 class="card-title">Dropdown</h3>
<p class="card-text">Contextual overlay menus with smart positioning.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Click or hover trigger</li>
<li>Auto-positioning</li>
<li>Nested support</li>
<li>Close on outside click</li>
</ul>
</div>
<div class="card-footer">
<code>elements.dropdown('#menu', { trigger: 'hover' })</code>
</div>
</a>
<!-- Context Menu -->
<a href="/showcase/elements/context-menu" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="menu"></div>
<h3 class="card-title">Context Menu</h3>
<p class="card-text">Right-click menus bound to a container and delegated to its children.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Delegated to rows</li>
<li>Nests without overriding</li>
<li>Keyboard and long-press</li>
<li>Submenus</li>
</ul>
</div>
<div class="card-footer">
<code>elements.contextMenu('#grid', { match: 'tr' })</code>
</div>
</a>
<!-- Sortable -->
<a href="/showcase/elements/sortable" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="move"></div>
<h3 class="card-title">Sortable</h3>
<p class="card-text">Drag-to-reorder lists, rows and trees by mouse, touch and keyboard.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Live or indicator mode</li>
<li>Nested trees with onDrop</li>
<li>Remembers the order</li>
<li>Handles, touch and Alt+Arrow</li>
</ul>
</div>
<div class="card-footer">
<code>E.sortable('#list', { persist: 'tasks' })</code>
</div>
</a>
<!-- Forms -->
<a href="/showcase/elements/forms" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="edit"></div>
<h3 class="card-title">Forms</h3>
<p class="card-text">Enhanced form controls with validation.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Input validation</li>
<li>Custom controls</li>
<li>Error handling</li>
<li>Submit management</li>
</ul>
</div>
<div class="card-footer">
<code><input class="form-input" required></code>
</div>
</a>
<!-- hero -->
<a href="/showcase/elements/hero" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="layout"></div>
<h3 class="card-title">hero</h3>
<p class="card-text">Hero sections with flexible layouts (CSS-only).</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Multiple layouts</li>
<li>Split layouts</li>
<li>Gradient overlays</li>
<li>Responsive sizing</li>
</ul>
</div>
<div class="card-footer">
<code>class="hero hero-primary"</code>
</div>
</a>
<!-- Modal -->
<a href="/showcase/elements/modal" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="box"></div>
<h3 class="card-title">Modal</h3>
<p class="card-text">Dialog overlays with backdrop and animations.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Backdrop control</li>
<li>Keyboard shortcuts</li>
<li>Nested support</li>
<li>Size variants</li>
</ul>
</div>
<div class="card-footer">
<code>elements.modal('#modal').open()</code>
</div>
</a>
<!-- Navbar -->
<a href="/showcase/elements/navbar" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="menu"></div>
<h3 class="card-title">Navbar</h3>
<p class="card-text">Responsive navigation bar with mobile menu.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Mobile responsive</li>
<li>Dropdown support</li>
<li>Brand/logo area</li>
<li>Fixed/sticky modes</li>
</ul>
</div>
<div class="card-footer">
<code>elements.navbar('#nav', { collapsible: true })</code>
</div>
</a>
<!-- Sidebar -->
<a href="/showcase/sidebar" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="sidebar"></div>
<h3 class="card-title">Sidebar</h3>
<p class="card-text">Navigation sidebar with unlimited depth nesting.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Unlimited depth menus</li>
<li>Mobile drawer</li>
<li>State persistence</li>
<li>Light/dark themes</li>
</ul>
</div>
<div class="card-footer">
<code>elements.sidebar('#nav', { variant: 'dark' })</code>
</div>
</a>
<!-- Footer -->
<a href="/showcase/footer" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="layout"></div>
<h3 class="card-title">Footer</h3>
<p class="card-text">Page footer with three layout modes and theme variants.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Simple/columns/minimal</li>
<li>Theme variants</li>
<li>Social media icons</li>
<li>Brand integration</li>
</ul>
</div>
<div class="card-footer">
<code>elements.footer('#footer', { layout: 'simple' })</code>
</div>
</a>
<!-- Autocomplete -->
<a href="/showcase/elements/autocomplete" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="search"></div>
<h3 class="card-title">Autocomplete</h3>
<p class="card-text">Text input with intelligent suggestion dropdown.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Static & async data</li>
<li>Match highlighting</li>
<li>Keyboard navigation</li>
<li>Model binding</li>
</ul>
</div>
<div class="card-footer">
<code>elements.autocomplete('#search', { data: [...] })</code>
</div>
</a>
<!-- Pillbox -->
<a href="/showcase/elements/pillbox" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="tag"></div>
<h3 class="card-title">Pillbox</h3>
<p class="card-text">Multi-select tag input with removable pills.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Tag creation</li>
<li>Searchable dropdown</li>
<li>Validation rules</li>
<li>Model binding</li>
</ul>
</div>
<div class="card-footer">
<code>elements.pillbox('#tags', { creatable: true })</code>
</div>
</a>
<!-- Chooser -->
<a href="/showcase/elements/chooser" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="check-square"></div>
<h3 class="card-title">Chooser</h3>
<p class="card-text">Visual option-picker with cards or chips, single or multi-select.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Card or chip variants</li>
<li>Per-option icons, badges, descriptions</li>
<li>Keyboard accessible</li>
<li>Blueprint-driven for forms</li>
</ul>
</div>
<div class="card-footer">
<code>elements.chooser('#host', { variant: 'card' })</code>
</div>
</a>
<!-- TreeView -->
<a href="/showcase/elements/treeview" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="folder"></div>
<h3 class="card-title">TreeView</h3>
<p class="card-text">Hierarchical tree structure with expand/collapse.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Nested nodes</li>
<li>Checkboxes</li>
<li>Lazy loading</li>
<li>Keyboard navigation</li>
</ul>
</div>
<div class="card-footer">
<code>elements.treeview('#tree', { data: tree })</code>
</div>
</a>
<!-- Editor -->
<a href="/showcase/elements/editor" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="edit"></div>
<h3 class="card-title">Editor</h3>
<p class="card-text">Rich text editor with formatting tools.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Formatting toolbar</li>
<li>HTML/Preview modes</li>
<li>Image support</li>
<li>Markdown export</li>
</ul>
</div>
<div class="card-footer">
<code>elements.editor('#editor', { toolbar: true })</code>
</div>
</a>
<!-- Tabs -->
<a href="/showcase/elements/tabs" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="layout"></div>
<h3 class="card-title">Tabs</h3>
<p class="card-text">Tabbed content panels with animations.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Animated transitions</li>
<li>Vertical layout</li>
<li>Dynamic tabs</li>
<li>Keyboard navigation</li>
</ul>
</div>
<div class="card-footer">
<code>elements.tabs('#tabs', { activeIndex: 0 })</code>
</div>
</a>
<!-- Timeline -->
<a href="/showcase/elements/timeline" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="activity"></div>
<h3 class="card-title">Timeline</h3>
<p class="card-text">Chronological event display with multiple layouts.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Vertical & horizontal</li>
<li>Centered layout</li>
<li>Custom styling</li>
<li>Event markers</li>
</ul>
</div>
<div class="card-footer">
<code>elements.progression('#timeline', { mode: 'timeline', layout: 'centered' })</code>
</div>
</a>
<!-- Tooltip -->
<a href="/showcase/elements/tooltip" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="info"></div>
<h3 class="card-title">Tooltip</h3>
<p class="card-text">Contextual popups on hover or click.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Multiple triggers</li>
<li>Smart positioning</li>
<li>HTML content</li>
<li>Custom styling</li>
</ul>
</div>
<div class="card-footer">
<code>elements.tooltip('[title]', { trigger: 'hover' })</code>
</div>
</a>
<!-- Popover -->
<a href="/showcase/elements/popover" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="message-square"></div>
<h3 class="card-title">Popover</h3>
<p class="card-text">Rich panels anchored to a trigger - a title, content or a small form.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Click, hover, focus or manual</li>
<li>Flips and shifts to stay on screen</li>
<li>Focus moves in and comes back</li>
<li>data-popover markup</li>
</ul>
</div>
<div class="card-footer">
<code>E.popover('#help', { title, content })</code>
</div>
</a>
<!-- Command Palette -->
<a href="/showcase/elements/command-palette" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="search"></div>
<h3 class="card-title">Command Palette</h3>
<p class="card-text">A Cmd/Ctrl+K launcher - search every action and page from the keyboard.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Fuzzy search with highlights</li>
<li>Nested pages and async search</li>
<li>Recent commands</li>
<li>Shortcut hints</li>
</ul>
</div>
<div class="card-footer">
<code>E.commandPalette({ commands })</code>
</div>
</a>
<!-- Dropzone -->
<a href="/showcase/elements/dropzone" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="upload"></div>
<h3 class="card-title">Dropzone</h3>
<p class="card-text">Drop, browse or paste files - checked, previewed, submitted or uploaded.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Accept, size and count rules</li>
<li>Image previews</li>
<li>Submits with the form</li>
<li>Uploads with progress</li>
</ul>
</div>
<div class="card-footer">
<code>E.dropzone('#files', { accept, maxSize })</code>
</div>
</a>
<!-- Focus Trap -->
<a href="/showcase/elements/focus-trap" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="lock"></div>
<h3 class="card-title">Focus Trap</h3>
<p class="card-text">Keep Tab and focus inside a panel while it is open.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Live tabbable lookup</li>
<li>Stacks with other traps</li>
<li>Return focus on close</li>
<li>Optional inert page</li>
</ul>
</div>
<div class="card-footer">
<code>E.focusTrap('#panel').activate()</code>
</div>
</a>
<!-- Range Slider -->
<a href="/showcase/elements/range-slider" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="sliders"></div>
<h3 class="card-title">Range Slider</h3>
<p class="card-text">One value or two thumbs, with ticks, marks and a tooltip.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Dual-thumb ranges</li>
<li>Full keyboard and ARIA</li>
<li>Vertical and right-to-left</li>
<li>Real range inputs for forms</li>
</ul>
</div>
<div class="card-footer">
<code>E.rangeSlider('#price', { range: true })</code>
</div>
</a>
<!-- Split Pane -->
<a href="/showcase/elements/split-pane" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="columns"></div>
<h3 class="card-title">Split Pane</h3>
<p class="card-text">Resizable panes with draggable, keyboard-operable gutters.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>Side by side or stacked, nested</li>
<li>Min / max in px or %, snapping</li>
<li>Collapsible and remembered</li>
<li>Separators with arrow keys</li>
</ul>
</div>
<div class="card-footer">
<code>E.splitPane('#editor', { sizes: [30, 70] })</code>
</div>
</a>
<!-- Virtual List -->
<a href="/showcase/elements/virtual-list" class="card card-hover h-full flex flex-col no-underline text-inherit">
<div class="card-body flex-1">
<div class="mb-4 text-primary" data-icon="list"></div>
<h3 class="card-title">Virtual List</h3>
<p class="card-text">Huge lists that render only the rows in view, with infinite loading.</p>
<ul class="list-none p-0 mt-4 feature-list-item-bullet">
<li>100,000 rows, a handful in the DOM</li>
<li>Fixed or measured heights</li>
<li>loadMore with retry</li>
<li>Keyboard navigation</li>
</ul>
</div>
<div class="card-footer">
<code>E.virtualList('#list', { items, render })</code>
</div>
</a>
</div>