Components
Interactive previews of all available UI components.
Badge
Variants
With icons
Soft colors
Alert
Information
EJS UI-KIT - Components
Warning
Error
Modifications enregistrées
Spinner
Tailles
Bouton — prop loading (SSR)
Bouton — toggle JS setLoading()
Skeleton
Text
Card
List
Custom — classe .ui-skeleton directement
Card
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
Filtres
Le même bloc DOM passe dans le drawer sur 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" — un seul panneau ouvert à la fois
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" — plusieurs panneaux peuvent rester ouverts simultanément
open: true — panneau ouvert au chargement
open: true.Collapse
closed by default
Le panneau est masque au chargement, puis revele avec une animation de hauteur.
open: true
Le contenu ouvert utilise une hauteur automatique apres la transition, ce qui permet au contenu dynamique de grandir normalement.
external triggers
Ces deux boutons ciblent le meme collapse. Le JS synchronise leur attribut aria-expanded.
rich content
disabled
Ce panneau ne peut pas etre ouvert tant que le composant est desactive.
Dropdown
Tooltip
Popover
Toast
Variants
Positions
Tabs
Sans icône
Manage your account settings and preferences.
Change your password here.
Configure how you receive notifications.
Avec icônes
Paramètres du compte.
Mot de passe et authentification.
Préférences de notification.
Onglet actif par défaut (2e)
Vue générale du projet.
Historique des actions récentes.
Gérez les membres de l'équipe.
Table
Personnalisation des colonnes
Essayez de masquer des colonnes ou de les épingler à gauche / à droite. La configuration est persistée par table grâce à localStorage.
| Responsable | Région | Stock | Mise à jour | Statut | |
|---|---|---|---|---|---|
| Widget A | Lina Moreau | FR | 128 | Hier | En stock |
| Widget B | Hugo Bernard | BE | 42 | Il y a 2 j | Faible |
| Widget C | Nora Klein | DE | 0 | Aujourd’hui | Rupture |
| Widget D | Marc Vidal | ES | 86 | Hier | En stock |
Basique
| Rôle | Statut | ||
|---|---|---|---|
| Alice Martin | alice@example.com | Admin | Actif |
| Bob Dupont | bob@example.com | Éditeur | Actif |
| Clara Schmidt | clara@example.com | Lecteur | En attente |
| David Leroy | david@example.com | Éditeur | Inactif |
| Eva Nguyen | eva@example.com | Lecteur | Actif |
Tri actif et limite persistée (name asc)
| Alice Martin | Pro | 12 jan. 2024 | 29,00 € |
| Bob Dupont | Gratuit | 03 mar. 2024 | 0,00 € |
| Clara Schmidt | Entreprise | 27 nov. 2023 | 99,00 € |
Striped + compact
| Pays | Code | Utilisateurs |
|---|---|---|
| France | FR | 12 483 |
| Allemagne | DE | 9 201 |
| Espagne | ES | 7 654 |
| Italie | IT | 6 890 |
| Pays-Bas | NL | 4 312 |
| Belgique | BE | 3 107 |
Sélection de lignes
| Nom | Équipe | Statut | ||
|---|---|---|---|---|
| Alice Martin | alice@example.com | Produit | Actif | |
| Bob Dupont | bob@example.com | Support | Actif | |
| Clara Schmidt | clara@example.com | Finance | En attente | |
| David Leroy | david@example.com | Ops | Verrouillé |
Lignes + colonnes figées
| Équipe | Owner | Jan | Fév | Mar | Avr | Mai | Juin | Juil | Août | Total |
|---|---|---|---|---|---|---|---|---|---|---|
| Total | Toutes équipes | 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 |
| Produit | 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 Lefèvre | 94 | 106 | 118 | 129 | 141 | 153 | 160 | 169 | 1 070 |
| Partenariats | Tom Alvarez | 87 | 88 | 75 | 68 | 57 | 60 | 19 | 13 | 467 |
État vide
| Nom | Rôle | |
|---|---|---|
| Aucun utilisateur trouvé. | ||
Code
Exemple
const app = express();
const message = 'Cette ligne volontairement longue permet de tester le bouton de retour à la ligne automatique sans dépendre de la largeur de la fenêtre.';
app.get('/', (req, res) => {
res.send(message);
});
Pagination
Résultats paginés
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
Date simple
Plage
Mois / année
Temps
Planning
Exemple borne avec plage horaire jour limitee.
Exemple : colonne ressource sticky (responsive, active à partir de md).
Exemple compact responsive — aperçu dense sur mobile, vue complète à partir de md.
Exemples : personnaliser la hauteur max de la surface scrollable.
Exemple global — hauteur fixe 40rem.
Exemple responsive — base:24rem / md:38rem.
Exemple sans restriction — la surface occupe sa hauteur naturelle (`max-height: none`).
Form controls
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
Tapez pour filtrer la liste.
Ce champ est requis.
Autocomplete
Les suggestions arrivent après 1 caractère.
Affichage résolu via fetchByIdUrl au chargement.
Upload
Votre CV sera transmis aux recruteurs. Formats acceptés : PDF.
Ce champ est requis.
Mode édition — fichier existant
Le fichier préchargé est affiché dès le rendu côté serveur. Supprimer le fichier efface la valeur du champ caché. Sélectionner un nouveau fichier remplace automatiquement l'existant.
- contrat-2024.pdf 181.9 Ko
Mode édition — plusieurs fichiers existants
Chaque fichier existant produit un <input type="hidden" name="photos_existing[]">. La valeur est vidée si l'utilisateur supprime l'entrée. Les nouveaux fichiers s'ajoutent à la liste.
-
photo-1.jpg
82.2 Ko
-
photo-2.jpg
100.0 Ko
Signature
Signez dans la zone. La valeur soumise est une image PNG en data URL.
Ce champ est requis.
Le composant peut être rendu en lecture seule ou désactivé.
Timeline
Vertical — statuts & icônes
Commande passée
En préparation
Expédié
Livraison
Vertical — dots simples
Fondation
Série A
Expansion
Scale
International
Alterné
Fondation
Série A
Expansion
Scale
International
Horizontal — étapes de processus
Panier
Livraison
Paiement
Confirmation
Markup libre — corps HTML personnalisé
Contrat signé
Accès créé
alice@example.com.Onboarding
Étapes numérotées — auto ascendant
Création du compte
Vérification e-mail
Configuration du profil
Invitation des membres
Première publication
Étapes numérotées — auto descendant
Lancement v3
Tests de charge
Code freeze
Recette QA
Horizontal — nodeStep libre
Panier
Livraison
Paiement
Confirmation
Progress Bar
Couleurs
Tailles
Position du texte — extérieur
Position du texte — intérieur (labels courts)
Rayures
Mode indéterminé
Charts
Line
Bar
Area (line preset)
Stacked bar
Stacked 100%
Doughnut
Gauge
Horizontal bar
Combo (bar + line)
Editor
Toolbar complète (défaut)
Toolbar minimale
Mise en forme de base uniquement.
Valeur initiale + état d'erreur
Ce champ est requis.