Alpine landscape
Components
Interactive previews of all available UI components.
Internationalization preview
This page uses the active UI locale. Explicit demo labels remain final application text.
Use a fixed locale to verify a deterministic export.
Badges
Variants
With icons
Soft colors
Alerts
Information
EJS UI-KIT - Components
Warning
Error
Changes saved
Spinner
Sizes
Button — loading prop (SSR)
Button — JS toggle (setLoading())
Skeleton
Text
Card
List
Custom — classe .ui-skeleton directement
Cards
Card title
Card subtitle or description
Card body content goes here. It can contain any HTML.
Simple card with inline padding, no header/footer slots needed.
Image card
Optional media slot
Use the image prop for editorial cards, products, articles or dashboard previews.
Modal
Drawer
Responsive content
Filters
The same DOM block moves into the drawer on mobile.
Sliding Drawer
side="right"
Right panel
Drag or click the handle. Backdrop follows the drag.
side="left"
Left panel
Handle is on the right edge of the panel.
side="bottom"
Bottom panel
Horizontal grip at the top edge.
side="top"
Top panel
Slides down from the top edge.
size="full"
side="right" size="full"
Full height
Panel spans 100dvh. Body scrolls if content overflows.
side="bottom" size="full"
Full width
Panel spans 100vw. Useful for mobile action sheets.
handle variants
handle="arrow"
Arrow
Flips when open.
handle="icon"
Icon
Any Lucide icon.
handle="text"
Text
Custom label.
Accordion
mode: "single" — one panel open at a time
src/views/ui/, a JS module in public/ui/components/, register it in the loader map, and add CSS in assets/css/input.css.mode: "multiple" — several panels can remain open at once
open: true — panel open on load
open: true.Collapse
closed by default
The panel is hidden on load and revealed with a height animation.
open: true
The open content uses automatic height after the transition, allowing dynamic content to grow normally.
external triggers
Both buttons target the same collapse. JavaScript synchronizes their aria-expanded attribute.
rich content
disabled
This panel cannot be opened while the component is disabled.
Dropdown
Tooltip
Popover
Toast
Variants
Positions
Tabs
Without icons
Manage your account settings and preferences.
Change your password here.
Configure how you receive notifications.
With icons
Account settings.
Password and authentication.
Notification preferences.
Second tab active by default
Project overview.
Recent activity.
Manage team members.
Table
Column personalization
Hide columns or pin them left or right. The configuration is persisted per table through localStorage.
| Owner | Region | Stock | Updated | Status | |
|---|---|---|---|---|---|
| Widget A | Lina Moreau | FR | 128 | Yesterday | In stock |
| Widget B | Hugo Bernard | BE | 42 | 2 days ago | Low |
| Widget C | Nora Klein | DE | 0 | Today | Out of stock |
| Widget D | Marc Vidal | ES | 86 | Yesterday | In stock |
Basic
| Role | Status | ||
|---|---|---|---|
| Alice Martin | alice@example.com | Admin | Actif |
| Bob Dupont | bob@example.com | Editor | Active |
| Clara Schmidt | clara@example.com | Reader | Pending |
| David Leroy | david@example.com | Editor | Inactive |
| Eva Nguyen | eva@example.com | Reader | Active |
Active sort and persisted limit (name asc)
| Alice Martin | Pro | Jan 12, 2024 | €29.00 |
| Bob Dupont | Free | Mar 03, 2024 | €0.00 |
| Clara Schmidt | Enterprise | Nov 27, 2023 | €99.00 |
Striped + compact
| Country | Code | Users |
|---|---|---|
| France | FR | 12 483 |
| Germany | DE | 9 201 |
| Spain | ES | 7 654 |
| Italy | IT | 6 890 |
| Netherlands | NL | 4 312 |
| Belgium | BE | 3 107 |
Row selection
| Name | Team | Status | ||
|---|---|---|---|---|
| Alice Martin | alice@example.com | Product | Active | |
| Bob Dupont | bob@example.com | Support | Actif | |
| Clara Schmidt | clara@example.com | Finance | Pending | |
| David Leroy | david@example.com | Ops | Locked |
Sticky rows and columns
| Team | Owner | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Total |
|---|---|---|---|---|---|---|---|---|---|---|
| Total | All teams | 1 245 | 1 382 | 1 517 | 1 604 | 1 721 | 1 890 | 1 943 | 2 031 | 13 333 |
| Acquisition | Lina Moreau | 182 | 210 | 238 | 249 | 272 | 301 | 318 | 330 | 2 100 |
| Activation | Hugo Bernard | 154 | 168 | 191 | 207 | 225 | 248 | 263 | 276 | 1 732 |
| Retention | Nora Klein | 203 | 229 | 251 | 268 | 294 | 327 | 341 | 359 | 2 272 |
| Support | Marc Vidal | 121 | 137 | 145 | 153 | 166 | 181 | 194 | 202 | 1 299 |
| Finance | Emma Rossi | 98 | 104 | 116 | 123 | 131 | 144 | 149 | 155 | 1 020 |
| Product | Sofia Martin | 173 | 192 | 216 | 229 | 244 | 267 | 281 | 296 | 1 898 |
| Data | Noah Dubois | 133 | 148 | 167 | 178 | 191 | 209 | 218 | 231 | 1 475 |
| Ops | Iris Lefevre | 94 | 106 | 118 | 129 | 141 | 153 | 160 | 169 | 1 070 |
| Partnerships | Tom Alvarez | 87 | 88 | 75 | 68 | 57 | 60 | 19 | 13 | 467 |
Empty state
| Name | Role | |
|---|---|---|
| No users found. | ||
Code
Example
const app = express();
const message = 'This intentionally long line tests automatic wrapping without depending on the window width.';
app.get('/', (req, res) => {
res.send(message);
});
Pagination
Paginated results
Faible volume (10 pages)
Grand volume
Filters
submitOnChange: true (default)
submitMode: "event" + submitOnChange: false
responsive drawer on selected breakpoints
responsive collapse on all breakpoints
Datepicker
Single date
Range
Month / year
Time
Planning
Bounded example with a limited daily time range.
Sticky resource column (responsive, enabled from md).
Compact responsive example — dense mobile preview, full view from md.
Examples: customize the scrollable surface max height.
Global example — fixed height 40rem.
Responsive example — base:24rem / md:38rem.
Unbounded example — the surface uses its natural height (max-height: none).
Forms
Input
We'll never share your email.
This field is required.
Textarea & Select
Checkbox, Switch & Radio
Checkboxes
Receive product updates and news.
Switches
Receive critical account updates.
All available UI components
All available UI components
Input
Textarea
Select
Checkbox
Switch
Radio
Select Search
Type to filter the list.
This field is required.
Autocomplete
Suggestions appear after one character.
Resolved through fetchByIdUrl on load.
Upload
Your resume will be sent to recruiters. Accepted format: PDF.
This field is required.
Edit mode — existing file
The preloaded file is shown during server rendering. Removing it clears the hidden field value. Selecting a new file automatically replaces the existing one.
- contrat-2024.pdf 181.9 Ko
Edit mode — multiple existing files
Each existing file produces a <input type="hidden" name="photos_existing[]">. The value is cleared when the user removes the entry. New files are added to the list.
-
photo-1.jpg
82.2 Ko
-
photo-2.jpg
100.0 Ko
Signature
Sign in the area. The submitted value is a PNG image as a data URL.
This field is required.
The component can be rendered read-only or disabled.
Timeline
Vertical — statuses & icons
Order placed
Preparing
Shipped
Delivery
Vertical — simple dots
Foundation
Series A
Expansion
Scale
International
Alternating
Foundation
Series A
Expansion
Scale
International
Horizontal — process steps
Cart
Delivery
Payment
Confirmation
Free markup — custom HTML body
Signed contract
Access created
alice@example.com.Onboarding
Numbered steps — automatic ascending
Create account
Verify email
Configure profile
Invite members
First publication
Numbered steps — automatic descending
v3 launch
Load tests
Code freeze
QA review
Horizontal — custom nodeStep
Cart
Delivery
Payment
Confirmation
Progress Bar
Colors
Sizes
Text position — outside
Text position — inside (short labels)
Stripes
Indeterminate mode
Carousel
Full gallery
Swipe, trackpad, arrows, dots, scrollable thumbnails, and fullscreen opening.
Simple version
Without thumbnails or enlargement.
Vertical thumbnails
The gallery loops; thumbnails move below the carousel on mobile.
Lightbox
Charts
Line
Bar
Area (line preset)
Stacked bar
Stacked 100%
Doughnut
Gauge
Horizontal bar
Combo (bar + line)
Editor
Full toolbar (default)
Minimal toolbar
Basic formatting only.
Initial value + error state
This field is required.