Référence
Documentation des composants
Configuration EJS complète, paramètres publics et API JavaScript de chaque composant du kit. Les options incompatibles entre elles sont tout de même présentées dans le snippet afin de rendre le contrat complet visible.
Conventions publiques
- Les paramètres EJS utilisent
camelCase; les booléens explicites utilisent notammentshow…etenable…. classcible la racine ou l’élément principal; les extensions ciblées portent le suffixeClass.- Les API d’instance sont exposées sur
root.__ui<Component>et leurs méthodes commencent par un verbe. - Chaque argument d’une méthode indique son type attendu; le suffixe
?et la mention « optionnel » signalent qu’il peut être omis. - Les événements suivent
component:action, remontent dans le DOM et exposent leurs données dansevent.detail. - Chaque capacité ne possède qu’un nom canonique; aucun alias historique n’est maintenu.
Badge
Voir la démoIndicateur compact de statut ou de catégorie.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/badge', {
label: 'Nouveau',
variant: 'soft',
color: 'success',
iconName: 'sparkles',
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| label | string | Oui | — | any text | badge text |
| variant | string | Non | default | default muted success warning danger info soft | default | success | warning | danger | info | muted | soft |
| color | string | Non | primary | primary secondary muted success warning danger info when variant is soft | primary | secondary | success | warning | danger | info | muted (for variant: soft) |
| iconName | string | Non | — | Lucide icon name shown before the label (e.g. 'circle-check') | optional Lucide icon name shown before the label (e.g. 'check') |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Alert
Voir la démoMessage contextuel avec niveau de sévérité et contenu HTML.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/alert', {
variant: 'warning',
title: 'Attention',
message: '<p>Contenu <strong>HTML</strong> de l’alerte.</p>',
dismissible: true,
dismissLabel: 'Fermer l’alerte',
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| variant | string | Non | info | info success warning danger | info | success | warning | danger |
| title | string | Non | — | optional bold heading | optional bold title |
| message | string | Oui | — | HTML allowed | alert content (HTML allowed) |
| dismissible | boolean | Non | false | adds an accessible close button | show a close button |
| dismissLabel | string | Non | Fermer | accessible label for the close button | accessible label for the close button |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes |
API JavaScript
Point d’accès : root.__uiAlert
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| dismiss() | — | boolean | Ferme l’alerte et la retire du DOM. Retourne false si l’événement est annulé. |
| Événement | Détail | Description |
|---|---|---|
| alert:dismiss | { alert, reason } | Émis avant la fermeture, annulable. reason vaut button ou api. |
Spinner
Voir la démoIndicateur de chargement autonome, sans initialisation JavaScript.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/spinner', {
size: "md",
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| size | string | Non | md | sm | md | lg | sm | md | lg |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Skeleton
Voir la démoPlaceholder de chargement avec presets texte, carte, liste et composition libre.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/skeleton', {
type: 'custom',
lines: 4,
items: 3,
body: '<div class="ui-skeleton h-12 w-full"></div>',
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| type | string | Non | text | text | card | list | custom | text | card | list | custom |
| lines | number | Non | 3 | Nombre conforme aux contraintes décrites | type='text' : nombre de lignes |
| items | number | Non | 3 | Nombre conforme aux contraintes décrites | type='list' : nombre d'items |
| body | string | Non | — | Texte libre ou valeur conforme au format décrit | type='custom' : HTML arbitraire |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | classes supplémentaires sur le wrapper |
API JavaScript
Point d’accès : import { showSkeleton } from '/ui/utils.js'
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| showSkeleton(element, type?, options?) |
|
void | Injecte un preset text, card ou list dans un conteneur. |
Card
Voir la démoConteneur structuré avec média, en-tête, corps et pied.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/card', {
title: 'Titre du composant',
subtitle: 'Description secondaire',
image: { src: '/images/example.jpg', alt: 'Illustration', position: 'top', aspect: '16 / 9', class: 'object-cover', mediaClass: 'bg-muted', loading: 'lazy' },
imageAlt: 'Illustration',
imagePosition: 'top',
imageAspect: '16 / 9',
imageClass: 'object-cover',
imageMediaClass: 'bg-muted',
footer: '<button type="button" class="ui-btn ui-btn-regular ui-btn-md">Valider</button>',
body: '<p>Contenu HTML du composant.</p>',
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| title | string | Non | — | Texte libre ou valeur conforme au format décrit | card header title (optional) |
| subtitle | string | Non | — | Texte libre ou valeur conforme au format décrit | card header subtitle (optional) |
| image | string/object | Non | — | Objet conforme à la structure décrite | image URL or { src, alt, position, aspect, class, mediaClass, loading } |
| imageAlt | string | Non | — | Texte libre ou valeur conforme au format décrit | image alt text (optional) |
| imagePosition | string | Non | top | top | bottom | top | bottom |
| imageAspect | string | Non | 16 / 9 | Texte libre ou valeur conforme au format décrit | CSS aspect-ratio value |
| imageClass | string | Non | — | Texte libre ou valeur conforme au format décrit | extra classes on the image element |
| imageMediaClass | string | Non | — | Texte libre ou valeur conforme au format décrit | extra classes on the media wrapper |
| footer | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | raw HTML for footer (optional) |
| body | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | raw HTML for body (optional) |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on the card root |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Modal
Voir la démoDialogue modal avec focus piégé, fermeture clavier et actions structurées.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/modal', {
id: 'example-modal',
title: 'Titre du composant',
titleIcon: 'info',
body: '<p>Contenu HTML du composant.</p>',
size: 'lg',
class: 'w-full',
footerHidden: false,
buttons: [
{ label: 'Annuler', variant: 'ghost', color: 'muted', size: 'sm', close: true },
{ label: 'Enregistrer', variant: 'regular', color: 'primary', size: 'md', shape: 'default', iconLeft: 'save', iconRight: 'arrow-right', type: 'submit', id: 'save', class: 'font-semibold', attrs: { 'data-action': 'save' }, disabled: false },
],
footer: '<button type="button" class="ui-btn ui-btn-regular ui-btn-md">Valider</button>',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | required, used by data-target |
| title | string | Non | — | Texte libre ou valeur conforme au format décrit | modal title |
| titleIcon | string | Non | — | Texte libre ou valeur conforme au format décrit | Lucide icon name (e.g. 'trash-2') |
| body | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | raw HTML body content |
| size | string | Non | md | sm | md | lg | full | sm md lg full |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Extra Tailwind classes |
| footerHidden | boolean | Non | false | true | false | Renders the footer in the DOM but hides it initially |
| buttons | array | Non | — | Tableau conforme à la structure décrite | Structured CTAs (preferred over footer) |
| footer | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | Raw HTML fallback when buttons not set |
API JavaScript
Point d’accès : root.__uiModal
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| open() | — | boolean | Ouvre la modale. Retourne true si l’état a changé. |
| close() | — | boolean | Ferme la modale. Retourne true si l’état a changé. |
| isOpen() | — | boolean | Indique si la modale est ouverte. |
| Événement | Détail | Description |
|---|---|---|
| modal:open | { id, reason } | Émis sur la modale après son ouverture. |
| modal:close | { id, reason } | Émis sur la modale au début de sa fermeture. |
Drawer
Voir la démoPanneau latéral ou vertical, statique ou alimenté par un emplacement responsive.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/drawer', {
id: 'example-drawer',
title: 'Titre du composant',
titleIcon: 'info',
body: '<p>Contenu HTML du composant.</p>',
side: 'right',
width: { base: 'calc(100vw - 2rem)', sm: '24rem', lg: '32rem' },
responsive: { source: '#drawer-content', breakpoints: ['base', 'sm', 'md'], media: '(max-width: 1023px)', controls: true },
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Identifiant du drawer |
| title | string | Non | — | Texte libre ou valeur conforme au format décrit | Titre du panneau |
| titleIcon | string | Non | — | Texte libre ou valeur conforme au format décrit | Nom d'icône Lucide affichée avant le titre |
| body | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | Contenu statique du drawer |
| side | string | Non | right | left | right | top | bottom | left right top bottom |
| width | string|number|object | Non | 20rem | Objet conforme à la structure décrite | Largeur des drawers left/right; accepte { base, sm, md, lg, xl, '2xl' } |
| responsive | object | Non | — | Objet conforme à la structure décrite | { source, breakpoints, media, controls } pour déplacer un noeud existant dans le drawer selon une condition responsive |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes |
API JavaScript
Point d’accès : root.__uiDrawer
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| open() | — | boolean | Ouvre le drawer. Retourne true si l’état a changé. |
| close() | — | boolean | Ferme le drawer. Retourne true si l’état a changé. |
| isOpen() | — | boolean | Indique si le drawer est ouvert. |
| Événement | Détail | Description |
|---|---|---|
| drawer:open | { id, reason } | Émis sur le drawer après son ouverture. |
| drawer:close | { id, reason } | Émis sur le drawer au début de sa fermeture. |
Sliding Drawer
Voir la démoPanneau coulissant persistant avec poignée et dimensions adaptatives.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/sliding-drawer', {
id: 'example-sliding-drawer',
body: '<p>Contenu HTML du composant.</p>',
side: 'right',
size: 'full',
overlay: true,
handle: 'icon',
handleIcon: 'panel-right',
handleText: 'Ouvrir',
handleAriaLabel: 'Ouvrir le panneau',
radiusClass: 'rounded-l-xl',
radius: '1rem',
edgeInset: '1rem',
responsive: { source: '#sliding-content', breakpoints: ['base', 'sm', 'md'], controls: true },
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Identifiant du panneau |
| body | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | Contenu statique du panneau |
| side | string | Non | right | left | right | top | bottom | left right top bottom |
| size | string | Non | auto | auto (content-based) | full (100vh/100vw) | auto ou full. En full, les bordures au contact du viewport/conteneur sont retirées |
| overlay | boolean | Non | true | true | false | Affiche un backdrop à l'ouverture |
| handle | string | Non | grip | grip | arrow | icon | text | grip arrow icon text |
| handleIcon | string | Non | — | Texte libre ou valeur conforme au format décrit | Icône Lucide utilisée avec handle: 'icon' |
| handleText | string | Non | — | Texte libre ou valeur conforme au format décrit | Libellé utilisé avec handle: 'text' |
| handleAriaLabel | string | Non | — | Texte libre ou valeur conforme au format décrit | accessible label for the handle |
| radiusClass | string | Non | — | Texte libre ou valeur conforme au format décrit | Classe de radius personnalisée sur le panneau. Prend le dessus sur radius |
| radius | string | Non | var(--radius) | Texte libre ou valeur conforme au format décrit | Valeur CSS appliquée aux coins exposés du panneau |
| edgeInset | string | number | Non | 0 | Nombre conforme aux contraintes décrites | Marge minimale conservée entre le côté handle et le bord opposé du viewport/sandbox |
| responsive | object | Non | — | Objet conforme à la structure décrite | Même API que Drawer: { source, breakpoints, media, controls } |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le panneau |
API JavaScript
Point d’accès : root.__uiSlidingDrawer
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| open() | — | boolean | Ouvre le panneau coulissant. Retourne true si l’état a changé. |
| close() | — | boolean | Ferme le panneau coulissant. Retourne true si l’état a changé. |
| isOpen() | — | boolean | Indique si le panneau est ouvert. |
| Événement | Détail | Description |
|---|---|---|
| sliding-drawer:open | { id, reason } | Émis après ouverture, y compris après un glissement. |
| sliding-drawer:close | { id, reason } | Émis après fermeture, y compris après un glissement. |
Accordion
Voir la démoCollection de panneaux repliables en mode simple ou multiple.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/accordion', {
items: [
{ id: 'general', title: 'Général', content: '<p>Contenu HTML</p>', open: true },
{ id: 'advanced', title: 'Avancé', content: '<p>Autre contenu</p>' },
],
mode: 'multiple',
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| items | array | Non | [] | Tableau conforme à la structure décrite | [{ id, title, content, open }] |
| mode | string | Non | single | single | multiple | single — ouvrir un item ferme les autres · multiple — chaque item s'ouvre/ferme indépendamment |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes |
API JavaScript
Point d’accès : Initialisation automatique par /ui/loader.js
Collapse
Voir la démoPanneau repliable autonome, contrôlable par plusieurs déclencheurs.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/collapse', {
id: 'example-collapse',
label: 'Libellé',
trigger: '<button type="button" class="ui-btn ui-btn-outline ui-btn-md">Afficher</button>',
body: '<p>Contenu HTML du composant.</p>',
open: true,
showIcon: true,
duration: 200,
responsive: { open: { base: false, lg: true } },
class: 'w-full',
triggerClass: '',
panelClass: '',
contentClass: '',
disabled: false,
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Identifiant du root. Recommande avec un trigger externe. |
| label | string | Non | null | Texte libre ou valeur conforme au format décrit | Texte du trigger interne |
| trigger | string (HTML) | Non | null | Texte libre ou valeur conforme au format décrit | Contenu HTML du trigger interne, prioritaire sur label |
| body | string (HTML) | Non | '' | Texte libre ou valeur conforme au format décrit | Contenu du panneau |
| open | boolean | Non | false | true | false | Panneau ouvert au chargement |
| showIcon | boolean | Non | true | true | false | Affiche le chevron du trigger interne |
| duration | number | Non | 200 | Nombre conforme aux contraintes décrites | Duree de transition en ms, exposee via --ui-collapse-duration |
| responsive | object | Non | — | Objet conforme à la structure décrite | Même API responsive que Drawer pour déplacer un noeud existant dans le panneau |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le root |
| triggerClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le trigger interne |
| panelClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le panneau |
| contentClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le wrapper de contenu |
| disabled | boolean | Non | false | true | false | Bloque le changement d'etat |
API JavaScript
Point d’accès : root.__uiCollapse
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| open() | — | void | Ouvre le panneau. |
| close() | — | void | Ferme le panneau. |
| toggle() | — | void | Inverse l’état ouvert/fermé. |
| isOpen() | — | boolean | Retourne l’état courant. |
| Événement | Détail | Description |
|---|---|---|
| collapse:open | { open: true } | Émis à l’ouverture. |
| collapse:close | { open: false } | Émis à la fermeture. |
| collapse:change | { open } | Émis après chaque changement d’état. |
Dropdown
Voir la démoMenu d’actions positionné avec Floating UI et portail optionnel.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/dropdown', {
id: 'example-dropdown',
trigger: '<button class="ui-btn ui-btn-outline ui-btn-md">Actions</button>',
items: [
{ label: 'Modifier', icon: 'pencil', href: '/edit' },
{ type: 'separator' },
{ label: 'Supprimer', icon: 'trash-2', danger: true, attrs: { 'data-action': 'delete' } },
],
placement: "bottom-start",
class: 'w-full',
portal: true,
portalBreakpoints: [],
portalMedia: 'portalMedia',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | required |
| trigger | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | raw HTML for the trigger element |
| items | array | Non | [] | Tableau conforme à la structure décrite | [{ label, href, icon (Lucide name), disabled, separator, isLabel }] |
| placement | string | Non | bottom-start | Texte libre ou valeur conforme au format décrit | any Floating UI placement |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on the menu panel |
| portal | boolean | Non | false | true | false | enables portaled positioning |
| portalBreakpoints | string \/ array | Non | — | Tableau conforme à la structure décrite | base sm md lg xl 2xl (space-separated or array) |
| portalMedia | string | Non | — | Texte libre ou valeur conforme au format décrit | custom media query (overrides breakpoints) |
API JavaScript
Point d’accès : Initialisation automatique par /ui/loader.js
Tooltip
Voir la démoInfo-bulle accessible positionnée avec Floating UI.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/tooltip', {
id: 'example-tooltip',
content: 'Information complémentaire',
placement: 'top',
trigger: '<button type="button" class="ui-btn ui-btn-ghost ui-btn-sm">Aide</button>',
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | optional, auto-generated if omitted |
| content | string | Non | — | Texte libre ou valeur conforme au format décrit | tooltip text |
| placement | string | Non | top | Texte libre ou valeur conforme au format décrit | Floating UI placement |
| trigger | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | raw HTML for the trigger element |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on root |
API JavaScript
Point d’accès : Initialisation automatique par /ui/loader.js
Popover
Voir la démoPanneau flottant interactif avec contenu HTML libre.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/popover', {
id: 'example-popover',
trigger: '<button type="button" class="ui-btn ui-btn-outline ui-btn-md">Détails</button>',
body: '<p>Contenu HTML du composant.</p>',
placement: 'bottom-start',
class: 'w-full',
portal: true,
portalBreakpoints: ['base', 'sm'],
portalMedia: '(max-width: 639px)',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | optional, auto-generated if omitted |
| trigger | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | raw HTML for the trigger element |
| body | string (HTML) | Non | — | Texte libre ou valeur conforme au format décrit | raw HTML popover content |
| placement | string | Non | bottom | Texte libre ou valeur conforme au format décrit | any Floating UI placement |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on the panel |
| portal | boolean | Non | false | true | false | enables portaled positioning |
| portalBreakpoints | string \/ array | Non | — | Tableau conforme à la structure décrite | base sm md lg xl 2xl (space-separated or array) |
| portalMedia | string | Non | — | Texte libre ou valeur conforme au format décrit | custom media query (overrides breakpoints) |
API JavaScript
Point d’accès : Initialisation automatique par /ui/loader.js
Toast
Voir la démoNotification éphémère créée depuis JavaScript ou par événement.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/toast-container') %>
<script type="module">
window.UI.toast({
title: 'Enregistrement terminé',
message: 'Les modifications ont été enregistrées.',
variant: 'success',
duration: 4000,
position: 'top-right',
});
</script>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| title | string | Non | — | Texte libre | Titre optionnel affiché en emphase. |
| message | string | Non | — | HTML autorisé | Corps de la notification. |
| variant | string | Non | info | info | success | warning | danger | Niveau sémantique et variante visuelle. |
| duration | number | Non | 4000 | 0 ou durée en millisecondes | Délai avant fermeture automatique. 0 rend le toast persistant. |
| position | string | Non | bottom-right | top-left | top-center | top-right | bottom-left | bottom-center | bottom-right | Position du conteneur de notifications. |
API JavaScript
Point d’accès : window.UI.toast
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| toast(options) |
|
void | Crée un toast dans le conteneur correspondant à sa position. |
| Événement | Détail | Description |
|---|---|---|
| ui:toast | { title?, message?, variant?, duration?, position? } | Alternative événementielle à window.UI.toast(). |
Tabs
Voir la démoOnglets ARIA avec navigation clavier et panneaux HTML.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/tabs', {
id: 'example-tabs',
items: [
{ id: 'account', label: 'Compte', icon: 'user', iconPosition: 'start', content: '<p>Compte</p>', active: true },
{ id: 'security', label: 'Sécurité', icon: 'lock', iconPosition: 'end', content: '<p>Sécurité</p>' },
],
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | required |
| items | array | Non | [] | Tableau conforme à la structure décrite | [{ id, label, content (HTML), active (bool), icon (string), iconPosition ('start'|'end') }] |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on root |
API JavaScript
Point d’accès : Initialisation automatique par /ui/loader.js
Table
Voir la démoTable SSR avec tri, sélection, limite de lignes, sticky et personnalisation.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/table', {
id: 'example-table',
columns: [
{ key: 'name', label: 'Nom', sortable: true, align: 'left', width: '16rem', personalization: { hideable: false, pinnable: true, defaultVisible: true, defaultPin: 'left' } },
{ key: 'status', label: 'Statut', align: 'center', personalization: { hideable: true, pinnable: true } },
],
rows: [
{ name: 'Alice', status: 'Active', rowDataAttributes: { url: '/users/1' }, cellDataAttributes: { status: { state: 'active' } } },
],
tableTitle: {},
tableTitleAs: "h2",
sort: {},
selectable: { key: 'id', name: 'selected[]', selected: ['1'], disabledKey: 'locked', dataAttribute: 'selectionValue', sticky: true },
rowsLimit: { value: 25, defaultValue: 25, options: [10, 25, 50, 100], name: 'limit', label: 'Lignes', persist: true, storageKey: 'users:limit' },
personalization: { persist: true, storageKey: 'users:columns', label: 'Colonnes', resetLabel: 'Réinitialiser', titleLabel: 'Personnaliser', description: 'Choisissez les colonnes', pinLabels: { free: 'Libre', left: 'Gauche', right: 'Droite' } },
ariaLabels: {},
sticky: { header: true, topRows: 1, leftColumns: 1, rightColumns: 1, maxScrollHeight: '32rem', breakpoints: { base: { header: true }, lg: { leftColumns: 2 } } },
striped: true,
compact: true,
caption: 'caption',
empty: "Aucune donnée",
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Id du wrapper. Recommandé pour la persistance |
| columns | array | Non | [] | Tableau conforme à la structure décrite | [{ key, label, sortable?, align?, width?, personalization? }] |
| rows | array | Non | [] | Tableau conforme à la structure décrite | [{ [key]: string|HTML, rowDataAttributes?, cellDataAttributes? }] |
| tableTitle | string|object | Non | — | Objet conforme à la structure décrite | Titre visible |
| tableTitleAs | string | Non | h2 | Texte libre ou valeur conforme au format décrit | Tag du titre visible |
| sort | object | Non | — | Objet conforme à la structure décrite | { key, dir } |
| selectable | object|boolean | Non | — | true | false | Colonne de sélection et event table:selection-change |
| rowsLimit | object|boolean | Non | — | true | false | Sélecteur de lignes et event table:rows-limit-change; préférence persistée par défaut si id est défini |
| personalization | object|boolean | Non | — | true | false | { persist?, storageKey?, label?, resetLabel? } pour afficher un panneau de colonnes |
| ariaLabels | object | Non | — | Objet conforme à la structure décrite | libellés accessibles optionnels pour les contrôles de tri/sélection (sort, selectAll, selectRow) |
| sticky | object | Non | — | Objet conforme à la structure décrite | { header?, topRows?, leftColumns?, rightColumns?, maxScrollHeight?, breakpoints? } |
| striped | boolean | Non | false | true | false | Lignes alternées |
| compact | boolean | Non | false | true | false | Padding réduit |
| caption | string | Non | — | Texte libre ou valeur conforme au format décrit | Légende accessible |
| empty | string | Non | Aucune donnée | Texte libre ou valeur conforme au format décrit | Message quand rows est vide |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | classes supplémentaires sur la racine |
API JavaScript
Point d’accès : root.__uiTable
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| selection.getSelected() | — | string[] | Retourne les valeurs sélectionnées. |
| selection.getSelectedRows() | — | HTMLElement[] | Retourne les lignes sélectionnées. |
| selection.setSelected(values) |
|
void | Remplace la sélection courante. |
| selection.clear() | — | void | Vide la sélection. |
| selection.selectAll() | — | void | Sélectionne toutes les lignes disponibles. |
| rowsLimit.getValue() | — | number | Retourne la limite de lignes courante. |
| rowsLimit.getOptions() | — | number[] | Retourne les limites proposées. |
| rowsLimit.setValue(value) |
|
void | Change la limite et émet l’événement associé. |
| rowsLimit.clearStoredValue() | — | void | Supprime la limite persistée. |
| personalization.open() | — | void | Ouvre le panneau de personnalisation. |
| personalization.close() | — | void | Ferme le panneau de personnalisation. |
| personalization.getState() | — | object | Retourne une copie de l’état courant des colonnes. |
| personalization.getDefaults() | — | object | Retourne une copie de l’état par défaut. |
| personalization.reset() | — | void | Restaure l’état par défaut. |
| personalization.clearStoredValue() | — | void | Supprime la personnalisation persistée. |
| refresh() | — | void | Recalcule les positions sticky. |
| Événement | Détail | Description |
|---|---|---|
| table:sort | { key, dir } | Signale un nouveau tri ; dir vaut asc, desc ou null. |
| table:selection-change | { selected, selectedCount, selectedRows, allSelected } | Signale un changement de sélection. |
| table:rows-limit-change | { value, previousValue, name, options, reason } | Signale un changement de limite. reason vaut user, api ou storage. |
| table:personalization-change | { state, defaults, dirty, visibleColumns, pinnedColumns } | Signale une modification des colonnes. |
Code
Voir la démoBloc de code avec coloration, copie, numéros de ligne et retour à la ligne.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/code', {
id: 'example-code',
language: 'ejs',
code: '<h1>Titre</h1>',
title: 'Titre du composant',
copyLabel: "Copier",
copiedLabel: "Copié !",
copyAriaLabel: 'copyAriaLabel',
copyIconLeft: 'copy',
copyIconRight: 'check',
copyButtonVariant: "outline",
copyButtonColor: "primary",
copyButtonSize: "sm",
copyButtonClass: '',
copyButton: true,
languageBadgeVariant: "primary-soft",
lineNumbers: true,
wrap: true,
wrapButton: true,
wrapButtonLabel: "Retour à la ligne automatique",
preClass: '',
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Id racine optionnel |
| language | string | Non | plaintext | Texte libre ou valeur conforme au format décrit | Langage Prism (javascript, html, css, json, etc.) |
| code | string | Non | '' | Texte libre ou valeur conforme au format décrit | Contenu affiché dans le bloc |
| title | string | Non | — | Texte libre ou valeur conforme au format décrit | Libellé affiché dans l'en-tête |
| copyLabel | string | Non | Copier | Texte libre ou valeur conforme au format décrit | Label visible à partir de sm; tooltip sur mobile |
| copiedLabel | string | Non | Copié ! | Texte libre ou valeur conforme au format décrit | Label temporaire après copie |
| copyAriaLabel | string | Non | — | Texte libre ou valeur conforme au format décrit | accessibility label for copy button (useful in icon-only mode) |
| copyIconLeft | string | Non | — | Texte libre ou valeur conforme au format décrit | Icônes Lucide du bouton desktop; mobile utilise une icône ronde |
| copyIconRight | string | Non | — | Texte libre ou valeur conforme au format décrit | Icônes Lucide du bouton desktop; mobile utilise une icône ronde |
| copyButtonVariant | string | Non | outline | regular | soft | outline | ghost | regular soft outline ghost |
| copyButtonColor | string | Non | primary | primary | secondary | success | warning | danger | info | muted | primary secondary success warning danger info muted |
| copyButtonSize | string | Non | sm | sm | md | lg | sm md lg |
| copyButtonClass | string | Non | — | Texte libre ou valeur conforme au format décrit | extra classes for copy button |
| copyButton | boolean | Non | true | true | false | Affiche le bouton de copie |
| languageBadgeVariant | string | Non | primary-soft | primary-soft | primary | secondary | muted | success | warning | danger | info | Mappe vers Badge soft color |
| lineNumbers | boolean | Non | false | true | false | Active les classes Prism line numbers |
| wrap | boolean | Non | false | true | false | État initial du retour à la ligne automatique |
| wrapButton | boolean | Non | true | true | false | Affiche le bouton qui active/désactive le retour à la ligne |
| wrapButtonLabel | string | Non | Retour à la ligne automatique | Texte libre ou valeur conforme au format décrit | Tooltip et aria-label du bouton |
| preClass | string | Non | — | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur <pre> |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on root |
API JavaScript
Point d’accès : Initialisation automatique par /ui/loader.js
Pagination
Voir la démoPagination SSR ou pilotée par événements, responsive à sa largeur.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/pagination', {
id: 'example-pagination',
page: 1,
totalPages: 1,
totalItems: 1,
itemsPerPage: 1,
siblings: 1,
boundaries: 1,
showAllThreshold: 10,
name: 'pagination',
href: '/destination',
showSummary: true,
summaryLabel: "sur",
ariaLabel: "Pagination",
previousLabel: "Précédent",
nextLabel: "Suivant",
previousAriaLabel: "Page précédente",
nextAriaLabel: "Page suivante",
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | id HTML optionnel |
| page | number | Non | 1 | Nombre conforme aux contraintes décrites | page courante |
| totalPages | number | Non | — | Nombre conforme aux contraintes décrites | nombre total de pages, prioritaire si fourni |
| totalItems | number | Non | — | Nombre conforme aux contraintes décrites | nombre total d'items, utilisé pour le résumé et totalPages |
| itemsPerPage | number | Non | — | Nombre conforme aux contraintes décrites | items par page, générique (table, grille, galerie...) |
| siblings | number | Non | 1 | Nombre conforme aux contraintes décrites | pages voisines autour de la page courante |
| boundaries | number | Non | 1 | Nombre conforme aux contraintes décrites | pages toujours affichées au début/à la fin |
| showAllThreshold | number | Non | 10 | Nombre conforme aux contraintes décrites | affiche toutes les pages si totalPages <= cette valeur et si la largeur le permet |
| name | string | Non | 'page' | Texte libre ou valeur conforme au format décrit | nom métier émis dans pagination:page-change |
| href | function|string | Non | — | Fonction conforme à la signature décrite | lien SSR optionnel. Function: page => url. String: remplace :page ou {page} |
| showSummary | boolean | Non | true | true | false | affiche "x-y sur n" si totalItems/itemsPerPage |
| summaryLabel | string | Non | 'sur' | Texte libre ou valeur conforme au format décrit | libellé du résumé entre la plage et le total |
| ariaLabel | string | Non | 'Pagination' | Texte libre ou valeur conforme au format décrit | label accessible du nav |
| previousLabel | string | Non | 'Précédent' | Texte libre ou valeur conforme au format décrit | label visible du contrôle précédent |
| nextLabel | string | Non | 'Suivant' | Texte libre ou valeur conforme au format décrit | label visible du contrôle suivant |
| previousAriaLabel | string | Non | 'Page précédente' | Texte libre ou valeur conforme au format décrit | label accessible du contrôle précédent |
| nextAriaLabel | string | Non | 'Page suivante' | Texte libre ou valeur conforme au format décrit | label accessible du contrôle suivant |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | classes CSS additionnelles sur le nav |
API JavaScript
Point d’accès : root.__uiPagination
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| getPage() | — | number | Retourne la page courante. |
| getTotalPages() | — | number | Retourne le nombre total de pages. |
| refresh() | — | void | Recalcule la pagination responsive. |
| Événement | Détail | Description |
|---|---|---|
| pagination:page-change | { page, previousPage, totalPages, totalItems, itemsPerPage, name } | Émis avant le changement de page. Annulable. |
Filters
Voir la démoFormulaire de filtres SSR-first avec modes natif, asynchrone et événementiel.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/filters', {
method: "GET",
submitMode: "form",
submitOnChange: true,
showReset: true,
showTitle: true,
responsive: { drawer: true, breakpoints: ['base', 'sm', 'md'], drawerId: 'filters-drawer', drawerTitle: 'Filtres', side: 'right', width: { base: 'calc(100vw - 2rem)', sm: '26rem' }, submitOnChange: false },
componentFallbacks: { selectSearch: 'select', autocomplete: 'text' },
debounce: 150,
asyncTarget: "",
responseType: 'responseType',
id: 'example-filters',
action: "",
fields: [
{ type: 'search', name: 'q', label: 'Recherche', placeholder: 'Mot-clé' },
{ type: 'select-search', name: 'status', label: 'Statut', options: [{ value: 'active', label: 'Actif' }] },
{ type: 'autocomplete', name: 'owner', label: 'Responsable', fetchUrl: '/api/users' },
{ type: 'datepicker', name: 'period', label: 'Période', mode: 'range' },
{ type: 'switch', name: 'active', label: 'Actifs uniquement' },
{ type: 'custom', name: 'custom', html: '<strong>Champ libre</strong>' },
],
activeFilters: [{ label: 'Statut', value: 'Actif', href: '/users', name: 'status', class: 'font-medium' }],
fieldsClass: '',
actionsClass: '',
activeFiltersClass: '',
labels: {},
resetHref: "action en GET",
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| method | string | Non | GET | GET | POST | GET ou POST |
| submitMode | string | Non | form | form | async | event | form pour soumission native, async pour fetch, event pour laisser l'app gérer |
| submitOnChange | boolean | Non | true | true | false | Soumet au changement d'un champ. Masque le bouton submit, garde reset |
| showReset | boolean | Non | true | true | false | Affiche le contrôle de réinitialisation |
| showTitle | boolean | Non | true | true | false | Affiche labels.title |
| responsive | object | Non | null | Objet conforme à la structure décrite | Wrapper responsive optionnel : drawer ou collapse |
| componentFallbacks | object | Non | { selectSearch: 'select', autocomplete: 'text' } | Objet conforme à la structure décrite | Garde-fou si les composants optionnels sont absents |
| debounce | number | Non | 150 | Nombre conforme aux contraintes décrites | Délai en ms avant submit onchange |
| asyncTarget | string | Non | '' | Texte libre ou valeur conforme au format décrit | Sélecteur DOM mis à jour avec une réponse HTML/text en submitMode: 'async' |
| responseType | string | Non | auto | auto | html | text | json | auto, html, text, json pour le parsing async |
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Id du <form data-ui="filters"> |
| action | string | Non | '' | Texte libre ou valeur conforme au format décrit | URL de soumission |
| fields | array | Non | [] | Tableau conforme à la structure décrite | Champs rendus dans le formulaire |
| activeFilters | array | Non | [] | Tableau conforme à la structure décrite | Badges de filtres actifs |
| fieldsClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur la grille de champs |
| actionsClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur la zone d'actions |
| activeFiltersClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur les filtres actifs |
| labels | object | Non | voir ci-dessous | Objet conforme à la structure décrite | Tous les textes visibles/aria du composant |
| resetHref | string | Non | action en GET | Texte libre ou valeur conforme au format décrit | URL de réinitialisation. Si absent en POST, reset JS + submit selon le mode |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le form |
API JavaScript
Point d’accès : form.__uiFilters
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| submit() | — | void | Promise | Soumet les filtres selon le mode configuré. |
| reset() | — | void | Promise | Réinitialise les contrôles puis applique les filtres. |
| getValues() | — | object | Retourne les valeurs courantes sous forme d’objet. |
| Événement | Détail | Description |
|---|---|---|
| filters:change | { form, values, field, cause } | Signale la modification d’un champ. |
| filters:submit | { form, values, mode, cause } | Signale une soumission. Annulable. |
| filters:reset | { form, values, resetHref } | Signale une réinitialisation. Annulable. |
| filters:success | { form, values, response, responseType, data, cause } | Émis après une réponse asynchrone réussie. |
| filters:error | { form, values, error, cause } | Émis après un échec asynchrone. |
Datepicker
Voir la démoSélecteur de date, plage, mois, année ou heure avec valeurs normalisées.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/datepicker', {
mode: 'range',
type: 'datetime',
rangeDisplay: "full",
compactSeparator: ",",
panelMonths: 2,
locale: "fr-FR",
firstDayOfWeek: 1,
timePrecision: 'minute',
id: 'example-datepicker',
name: 'datepicker',
startName: "${name}_start",
endName: "${name}_end",
label: 'Libellé',
value: '',
startValue: '',
endValue: '',
placeholder: 'Sélectionner…',
startPlaceholder: "Début",
endPlaceholder: "Fin",
rangeSeparator: "-",
min: 'min',
max: 'max',
clearable: true,
required: true,
disabled: false,
readonly: false,
helpText: 'Texte d’aide',
errorText: '',
triggerClass: '',
panelClass: '',
attrs: { 'data-context': 'booking' },
labels: { clear: 'Effacer', today: "Aujourd’hui", previousMonth: 'Mois précédent', nextMonth: 'Mois suivant' },
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| mode | string | Non | single | single | range | single ou range |
| type | string | Non | date | date | datetime | month | year | time | date, datetime, month, year, time |
| rangeDisplay | string | Non | full | full | compact | full ou compact pour un range datetime |
| compactSeparator | string | Non | , | Texte libre ou valeur conforme au format décrit | Séparateur entre la date et le créneau en mode compact |
| panelMonths | number | Non | 1 | Nombre conforme aux contraintes décrites | Nombre de mois affichés côte à côte dans le panel de sélection date/range, limité à 1 ou 2 |
| locale | string | Non | fr-FR | Texte libre ou valeur conforme au format décrit | Locale Intl.DateTimeFormat, ex. en-US, fr-FR |
| firstDayOfWeek | number | Non | 1 | Nombre conforme aux contraintes décrites | 0 dimanche, 1 lundi |
| timePrecision | string | Non | minute | hour | minute | second | hour, minute, second |
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Id racine. Sert aussi à lier trigger, panel et inputs |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | Nom soumis en mode single |
| startName | string | Non | ${name}_start | Texte libre ou valeur conforme au format décrit | Nom du début en mode range |
| endName | string | Non | ${name}_end | Texte libre ou valeur conforme au format décrit | Nom de fin en mode range |
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | Libellé visible |
| value | string | Non | '' | Texte libre ou valeur conforme au format décrit | Valeur initiale en mode single |
| startValue | string | Non | '' | Texte libre ou valeur conforme au format décrit | Valeur initiale de début |
| endValue | string | Non | '' | Texte libre ou valeur conforme au format décrit | Valeur initiale de fin |
| placeholder | string | Non | Choisir une date | Texte libre ou valeur conforme au format décrit | Texte quand aucune valeur n'est sélectionnée |
| startPlaceholder | string | Non | Début | Texte libre ou valeur conforme au format décrit | Placeholder de début pour l'affichage range |
| endPlaceholder | string | Non | Fin | Texte libre ou valeur conforme au format décrit | Placeholder de fin pour l'affichage range |
| rangeSeparator | string | Non | - | Texte libre ou valeur conforme au format décrit | Séparateur affiché entre début et fin |
| min | string | Non | — | Texte libre ou valeur conforme au format décrit | Valeur minimale dans le même format que type |
| max | string | Non | — | Texte libre ou valeur conforme au format décrit | Valeur maximale dans le même format que type |
| clearable | boolean | Non | true | true | false | Affiche le bouton d'effacement |
| required | boolean | Non | false | true | false | Ajoute required sur les inputs hidden |
| disabled | boolean | Non | false | true | false | Désactive le trigger et les inputs |
| readonly | boolean | Non | false | true | false | Empêche l'ouverture sans désactiver la valeur soumise |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d'aide |
| errorText | string | Non | — | Texte libre ou valeur conforme au format décrit | Message d'erreur SSR |
| triggerClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le bouton trigger |
| panelClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le panel flottant |
| attrs | object | Non | {} | Objet conforme à la structure décrite | Attributs additionnels sur la racine data-ui="datepicker" |
| labels | object | Non | voir ci-dessous | Objet conforme à la structure décrite | Textes d'actions et aria |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le wrapper field |
API JavaScript
Point d’accès : root.__uiDatepicker
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| open() | — | void | Ouvre le panneau. |
| close() | — | void | Ferme le panneau. |
| clear() | — | void | Efface les valeurs. |
| setValue(value, options?) |
|
boolean | Définit la valeur simple ou les bornes de plage. Retourne false si la valeur est invalide. |
| getValue() | — | { value, startValue, endValue } | Retourne les valeurs normalisées. |
| Événement | Détail | Description |
|---|---|---|
| datepicker:open | — | Émis à l’ouverture. |
| datepicker:close | — | Émis à la fermeture. |
| datepicker:change | { mode, type, value, startValue, endValue } | Émis après modification. |
| datepicker:clear | — | Émis après effacement. |
Planning
Voir la démoPlanning jour, semaine et mois avec ressources, mode compact et chargement asynchrone.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/planning', {
id: 'example-planning',
items: [{ id: 'event-1', title: 'Intervention', subtitle: 'Client', start: '2026-07-21T09:00', end: '2026-07-21T10:30', resourceId: 'tech-1', color: '#2563eb', status: 'planned', class: 'priority', href: '/events/1', dataAttrs: { customerId: '42' } }],
resources: [{ id: 'tech-1', label: 'Alice Martin', avatar: 'AM', color: '#2563eb' }],
view: "week",
currentDate: "aujourd'hui",
minDate: 'minDate',
maxDate: 'maxDate',
firstDayOfWeek: 1,
showWeekNumber: true,
dayStartHour: 7,
dayEndHour: 20,
slotMinutes: 60,
locale: "fr-FR",
timezone: "timezone navigateur",
compact: { base: true, lg: false },
compactViews: [],
dayCompactMode: "resource-focus",
legend: true,
enableFullscreen: true,
fullscreenCompact: true,
fullscreenToolbarSticky: true,
loading: false,
errorText: '',
labels: { today: "Aujourd'hui", empty: 'Aucun événement', retry: 'Réessayer' },
cta: { label: 'Nouvelle intervention', href: '/events/new', iconLeft: 'plus', variant: 'regular', color: 'primary' },
resourceFilters: "",
class: 'w-full',
resourceSticky: { base: false, md: true },
hourSticky: { base: true },
surfaceMaxHeight: { base: '24rem', md: '40rem' },
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Id racine |
| items | array | Non | [] | Tableau conforme à la structure décrite | Événements (start/end + resourceId) |
| resources | array | Non | [] | Tableau conforme à la structure décrite | Ressources affichées en colonnes/lignes |
| view | string | Non | week | day | week | month | day, week, month |
| currentDate | string | Non | aujourd'hui | Texte libre ou valeur conforme au format décrit | Date ancre (YYYY-MM-DD ou ISO datetime) |
| minDate | string | Non | — | Texte libre ou valeur conforme au format décrit | Borne min de navigation |
| maxDate | string | Non | — | Texte libre ou valeur conforme au format décrit | Borne max de navigation |
| firstDayOfWeek | number | Non | 1 | Nombre conforme aux contraintes décrites | 0 dimanche, 1 lundi |
| showWeekNumber | boolean | Non | false | true | false | Affiche le numéro de semaine dans la 1ère cellule de l'entête hebdo |
| dayStartHour | number | Non | 7 | Nombre conforme aux contraintes décrites | Début affichage en vue jour |
| dayEndHour | number | Non | 20 | Nombre conforme aux contraintes décrites | Fin affichage en vue jour |
| slotMinutes | number | Non | 60 | Nombre conforme aux contraintes décrites | Pas de grille en vue jour |
| locale | string | Non | fr-FR | Texte libre ou valeur conforme au format décrit | Locale utilisée par Intl.DateTimeFormat pour les jours, mois et plages de dates |
| timezone | string | Non | timezone navigateur | Texte libre ou valeur conforme au format décrit | Métadonnée timezone transmise dans les événements async (planning:range-change) |
| compact | boolean | object | Non | null | true | false | Active le mode compact globalement ou par breakpoint ({ base: true, md: false }) |
| compactViews | array | string | Non | ['week', 'month'] | Tableau conforme à la structure décrite | Vues affectées par le compact. Accepte ['week', 'month', 'day'] ou 'all' |
| dayCompactMode | string | Non | resource-focus | Texte libre ou valeur conforme au format décrit | Stratégie de vue jour compacte : timeline focalisée sur une ressource |
| legend | boolean | string | Non | auto | resource legend display: auto | true | false | Affichage de la légende ressources : auto, true, false |
| enableFullscreen | boolean | Non | false | true | false | Affiche un bouton plein écran dans la barre d'outils du planning |
| fullscreenCompact | boolean | object | Non | null | true | false | Override du mode compact quand le fullscreen est actif. Si omis, le fullscreen reprend compact |
| fullscreenToolbarSticky | boolean | Non | true | true | false | keep toolbar sticky while fullscreen is active |
| loading | boolean | Non | false | true | false | État initial de chargement async |
| errorText | string | Non | '' | Texte libre ou valeur conforme au format décrit | Message d'erreur initial async |
| labels | object | Non | voir defaults | Objet conforme à la structure décrite | Libellés UI + aria labels + templates de plage |
| cta | object | Non | — | Objet conforme à la structure décrite | CTA à gauche du sélecteur de vue, rendue via le bouton du kit |
| resourceFilters | string | Non | '' | Texte libre ou valeur conforme au format décrit | Zone d'injection HTML libre (ou rendu d'un composant kit) |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur la racine |
| resourceSticky | object | Non | — | Objet conforme à la structure décrite | Option « resourceSticky » transmise au partial EJS. |
| hourSticky | object | Non | — | Objet conforme à la structure décrite | Option « hourSticky » transmise au partial EJS. |
| surfaceMaxHeight | string | object | Non | null | Objet conforme à la structure décrite | Hauteur max du conteneur scrollable ui-planning-surface. Accepte une taille CSS (ex: "38rem", "60vh") ou un objet responsive `{ base?: string |
API JavaScript
Point d’accès : root.__uiPlanning
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| next() | — | void | Passe à la période suivante. |
| previous() | — | void | Passe à la période précédente. |
| today() | — | void | Revient à aujourd’hui. |
| setView(view, options?) |
|
void | Change la vue day, week ou month. |
| setDate(date, options?) |
|
void | Change la date d’ancrage. |
| setData(data, options?) |
|
void | Met à jour items, resources et états asynchrones en une opération. |
| setLoading(loading, options?) |
|
void | Met à jour l’état de chargement. |
| setError(error, options?) |
|
void | Définit l’erreur courante. |
| clearError(options?) |
|
void | Efface l’erreur courante. |
| setItems(items) |
|
void | Remplace les événements. |
| setResources(resources) |
|
void | Remplace les ressources. |
| setCompact(config) |
|
void | Change le mode compact. |
| setFullscreenCompact(config) |
|
void | Change le mode compact en plein écran. |
| setFullscreenToolbarSticky(sticky) |
|
void | Configure la toolbar sticky en plein écran. |
| setCompactViews(views) |
|
void | Définit les vues concernées par le compact. |
| setCompactResource(resourceId) |
|
void | Sélectionne la ressource compacte. |
| setLegend(legend) |
|
void | Change l’affichage de la légende. |
| setFullscreen(active) |
|
void | Active ou quitte le plein écran. |
| toggleFullscreen() | — | void | Inverse le plein écran. |
| retry() | — | void | Émet une demande de nouvel essai. |
| getRange() | — | object | Retourne la plage visible. |
| refreshRange(reason?) |
|
void | Réémet la plage visible. |
| refresh() | — | void | Réhydrate et recalcule le planning. |
| getState() | — | object | Retourne un instantané complet de l’état public. |
| Événement | Détail | Description |
|---|---|---|
| planning:ready | Consulter getRange() ou getState() selon l’événement | Initialisation terminée, avec api. |
| planning:range-change | Consulter getRange() ou getState() selon l’événement | Plage visible modifiée. |
| planning:view-change | Consulter getRange() ou getState() selon l’événement | Vue modifiée. |
| planning:date-change | Consulter getRange() ou getState() selon l’événement | Date d’ancrage modifiée. |
| planning:data-change | Consulter getRange() ou getState() selon l’événement | Collections de données modifiées. |
| planning:loading-change | Consulter getRange() ou getState() selon l’événement | État de chargement modifié. |
| planning:error-change | Consulter getRange() ou getState() selon l’événement | Erreur courante modifiée. |
| planning:item-click | Consulter getRange() ou getState() selon l’événement | Événement du planning activé. |
| planning:slot-click | Consulter getRange() ou getState() selon l’événement | Créneau vide activé. |
| planning:retry | Consulter getRange() ou getState() selon l’événement | Nouvel essai demandé. |
| planning:fullscreen-change | Consulter getRange() ou getState() selon l’événement | État plein écran modifié. |
Input
Voir la démoChamp de saisie natif avec label, aide, erreur et attributs additionnels.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/input', {
label: 'Libellé',
type: "text",
class: 'w-full',
inputClass: '',
attrs: { 'data-example': 'complete' },
id: 'example-input',
name: 'input',
placeholder: 'Sélectionner…',
value: '',
helpText: 'Texte d’aide',
errorText: '',
required: true,
disabled: false,
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | visible label (optional) |
| type | string | Non | text | text | email | password | number | tel | url | text | email | password | number | tel | url |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on the field root |
| inputClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on the input |
| attrs | object | Non | {} | Objet conforme à la structure décrite | extra HTML attributes |
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Identifiant HTML unique du composant. |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | Nom du champ envoyé lors de la soumission du formulaire. |
| placeholder | string | Non | '' | Texte libre ou valeur conforme au format décrit | Texte affiché lorsqu’aucune valeur n’est renseignée. |
| value | string | Non | '' | Texte libre ou valeur conforme au format décrit | Valeur initiale ou valeur soumise. |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d’aide affiché sous le contrôle. |
| errorText | string | Non | — (triggers red border) | Texte libre ou valeur conforme au format décrit | Message d’erreur SSR, prioritaire sur le texte d’aide. |
| required | boolean | Non | false | true | false | Marque la valeur comme obligatoire. |
| disabled | boolean | Non | false | true | false | Désactive les interactions du composant. |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Textarea
Voir la démoZone de texte multiligne avec états de validation.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/textarea', {
id: 'example-textarea',
name: 'textarea',
label: 'Libellé',
placeholder: 'Sélectionner…',
value: '',
rows: [],
helpText: 'Texte d’aide',
errorText: '',
required: true,
disabled: false,
inputClass: '',
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Identifiant HTML unique du composant. |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | Nom du champ envoyé lors de la soumission du formulaire. |
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | Libellé visible du composant. |
| placeholder | string | Non | '' | Texte libre ou valeur conforme au format décrit | Texte affiché lorsqu’aucune valeur n’est renseignée. |
| value | string | Non | '' | Texte libre ou valeur conforme au format décrit | Valeur initiale ou valeur soumise. |
| rows | number | Non | 4 | Nombre conforme aux contraintes décrites | Option « rows » transmise au partial EJS. |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d’aide affiché sous le contrôle. |
| errorText | string | Non | — | Texte libre ou valeur conforme au format décrit | Message d’erreur SSR, prioritaire sur le texte d’aide. |
| required | boolean | Non | false | true | false | Marque la valeur comme obligatoire. |
| disabled | boolean | Non | false | true | false | Désactive les interactions du composant. |
| inputClass | string | Non | — | Texte libre ou valeur conforme au format décrit | Classes CSS additionnelles appliquées au contrôle de saisie natif. |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes CSS additionnelles appliquées à l’élément racine. |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Select
Voir la démoSélecteur natif avec options simples ou groupées.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/select', {
id: 'example-select',
name: 'select',
label: 'Libellé',
options: [
{ value: '', label: 'Sélectionner…' },
{ label: 'Groupe', options: [{ value: 'one', label: 'Option 1' }, { value: 'two', label: 'Option 2', disabled: true }] },
],
value: '',
helpText: 'Texte d’aide',
errorText: '',
required: true,
disabled: false,
inputClass: '',
attrs: { 'data-action': 'change-status' },
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Identifiant HTML unique du composant. |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | Nom du champ envoyé lors de la soumission du formulaire. |
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | Libellé visible du composant. |
| options | array | Non | [] | Tableau conforme à la structure décrite | Options proposées par le contrôle. |
| value | string | Non | '' | Texte libre ou valeur conforme au format décrit | Valeur initiale ou valeur soumise. |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d’aide affiché sous le contrôle. |
| errorText | string | Non | — | Texte libre ou valeur conforme au format décrit | Message d’erreur SSR, prioritaire sur le texte d’aide. |
| required | boolean | Non | false | true | false | Marque la valeur comme obligatoire. |
| disabled | boolean | Non | false | true | false | Désactive les interactions du composant. |
| inputClass | string | Non | — | Texte libre ou valeur conforme au format décrit | Classes CSS additionnelles appliquées au contrôle de saisie natif. |
| attrs | object | Non | {} | Objet conforme à la structure décrite | Attributs HTML additionnels appliqués à l’élément principal. |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes CSS additionnelles appliquées à l’élément racine. |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Checkbox
Voir la démoCase à cocher native avec aide et état désactivé.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/checkbox', {
id: 'example-checkbox',
name: 'checkbox',
label: 'Libellé',
checked: true,
disabled: false,
helpText: 'Texte d’aide',
value: '',
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Identifiant HTML unique du composant. |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | Nom du champ envoyé lors de la soumission du formulaire. |
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | Libellé visible du composant. |
| checked | boolean | Non | false | true | false | Option « checked » transmise au partial EJS. |
| disabled | boolean | Non | false | true | false | Désactive les interactions du composant. |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d’aide affiché sous le contrôle. |
| value | string | Non | 1 | Texte libre ou valeur conforme au format décrit | Valeur initiale ou valeur soumise. |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes CSS additionnelles appliquées à l’élément racine. |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Switch
Voir la démoInterrupteur accessible avec description et position de libellé configurable.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/switch', {
value: '',
labelPosition: "right",
attrs: { 'data-example': 'complete' },
class: 'w-full',
id: 'example-switch',
name: 'switch',
label: 'Libellé',
description: 'description',
errorText: '',
checked: true,
disabled: false,
required: true,
inputClass: '',
trackClass: '',
thumbClass: '',
labelClass: '',
descriptionClass: '',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| value | string | Non | 1 | Texte libre ou valeur conforme au format décrit | Valeur soumise quand le switch est actif |
| labelPosition | string | Non | right | right | left | right ou left |
| attrs | object | Non | {} | Objet conforme à la structure décrite | Attributs HTML additionnels sur l'input |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le root |
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Id de l'input |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | Nom soumis |
| label | string | Non | '' | Texte libre ou valeur conforme au format décrit | Libellé visible |
| description | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte descriptif sous le label |
| errorText | string | Non | — | Texte libre ou valeur conforme au format décrit | Message d'erreur, ajoute aria-invalid |
| checked | boolean | Non | false | true | false | État initial |
| disabled | boolean | Non | false | true | false | Désactive le contrôle |
| required | boolean | Non | false | true | false | Exige l'état actif avant soumission |
| inputClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur l'input masqué |
| trackClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur la piste |
| thumbClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le pouce |
| labelClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le label |
| descriptionClass | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur la description |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Radio
Voir la démoGroupe de boutons radio natifs.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/radio', {
name: 'radio',
label: 'Libellé',
options: [
{ value: 'email', label: 'E-mail', checked: true },
{ value: 'sms', label: 'SMS', disabled: true },
],
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | required, shared name for the group |
| label | string | Non | — (group legend) | Texte libre ou valeur conforme au format décrit | group label |
| options | array | Non | [] | Tableau conforme à la structure décrite | [{ id, value, label, checked, disabled, helpText }] |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes CSS additionnelles appliquées à l’élément racine. |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Select Search
Voir la démoSélecteur enrichi avec recherche locale et champ caché soumis.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/select-search', {
id: 'example-select-search',
name: 'select-search',
label: 'Libellé',
options: [
{ value: 'active', label: 'Actif' },
{ value: 'paused', label: 'Suspendu', disabled: true },
],
value: '',
placeholder: 'Sélectionner…',
searchPlaceholder: "Rechercher…",
emptyText: "Aucun résultat",
portal: true,
portalBreakpoints: ['base', 'sm'],
portalMedia: '(max-width: 639px)',
class: 'w-full',
helpText: 'Texte d’aide',
errorText: '',
required: true,
disabled: false,
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | HTML id |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | hidden input name |
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | visible label |
| options | array | Non | [] | Tableau conforme à la structure décrite | [{ value, label, disabled }] |
| value | string | Non | '' | Texte libre ou valeur conforme au format décrit | pre-selected value |
| placeholder | string | Non | Sélectionner… | Texte libre ou valeur conforme au format décrit | trigger placeholder |
| searchPlaceholder | string | Non | Rechercher… | Texte libre ou valeur conforme au format décrit | search input placeholder |
| emptyText | string | Non | Aucun résultat | Texte libre ou valeur conforme au format décrit | no-results message |
| portal | boolean | Non | false | true | false | enables portaled positioning |
| portalBreakpoints | string \/ array | Non | — | Tableau conforme à la structure décrite | base sm md lg xl 2xl (space-separated or array) |
| portalMedia | string | Non | — | Texte libre ou valeur conforme au format décrit | custom media query (overrides breakpoints) |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on field root |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d’aide affiché sous le contrôle. |
| errorText | string | Non | — | Texte libre ou valeur conforme au format décrit | Message d’erreur SSR, prioritaire sur le texte d’aide. |
| required | boolean | Non | false | true | false | Marque la valeur comme obligatoire. |
| disabled | boolean | Non | false | true | false | Désactive les interactions du composant. |
API JavaScript
Point d’accès : Initialisation automatique par /ui/loader.js
| Événement | Détail | Description |
|---|---|---|
| select-search:change | { value, label, option } | Émis après sélection. |
Autocomplete
Voir la démoChamp de recherche distant avec sélection structurée et hooks applicatifs.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/autocomplete', {
id: 'example-autocomplete',
name: 'autocomplete',
label: 'Libellé',
value: '',
selectedId: '',
fetchUrl: 'fetchUrl',
fetchByIdUrl: 'fetchByIdUrl',
keyName: "label",
idKey: "id",
minChars: 1,
debounce: 300,
emptyText: "Aucun résultat",
portal: true,
portalBreakpoints: [],
portalMedia: 'portalMedia',
class: 'w-full',
placeholder: 'Sélectionner…',
helpText: 'Texte d’aide',
errorText: '',
required: true,
disabled: false,
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | text input id |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | hidden input name |
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | libellé visible |
| value | string | Non | '' | Texte libre ou valeur conforme au format décrit | displayed value |
| selectedId | string | Non | '' | Texte libre ou valeur conforme au format décrit | hidden input value |
| fetchUrl | string | Non | — | Texte libre ou valeur conforme au format décrit | GET {fetchUrl}?search=... |
| fetchByIdUrl | string | Non | — | Texte libre ou valeur conforme au format décrit | GET {fetchByIdUrl}/{id} |
| keyName | string | Non | label | Texte libre ou valeur conforme au format décrit | display property |
| idKey | string | Non | id | Texte libre ou valeur conforme au format décrit | value property |
| minChars | number | Non | 1 | Nombre conforme aux contraintes décrites | min chars before fetch |
| debounce | number | Non | 300 | Nombre conforme aux contraintes décrites | debounce in ms |
| emptyText | string | Non | Aucun résultat | Texte libre ou valeur conforme au format décrit | no-results message |
| portal | boolean | Non | false | true | false | enables portaled positioning |
| portalBreakpoints | string \/ array | Non | — | Tableau conforme à la structure décrite | base sm md lg xl 2xl (space-separated or array) |
| portalMedia | string | Non | — | Texte libre ou valeur conforme au format décrit | custom media query (overrides breakpoints) |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on field root |
| placeholder | string | Non | Rechercher… | Texte libre ou valeur conforme au format décrit | Texte affiché lorsqu’aucune valeur n’est renseignée. |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d’aide affiché sous le contrôle. |
| errorText | string | Non | — | Texte libre ou valeur conforme au format décrit | Message d’erreur SSR, prioritaire sur le texte d’aide. |
| required | boolean | Non | false | true | false | Marque la valeur comme obligatoire. |
| disabled | boolean | Non | false | true | false | Désactive les interactions du composant. |
API JavaScript
Point d’accès : root.__uiAutocomplete
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| getValue() | — | { value, label } | Retourne la valeur soumise et le libellé affiché. |
| setValue(item) |
|
boolean | Sélectionne un résultat selon keyName et idKey. |
| clear() | — | void | Efface la sélection et émet autocomplete:change. |
| focus() | — | void | Donne le focus au champ de recherche. |
| setFilter(callback) |
|
void | Configure la transformation des résultats après chargement. |
| setOnSelect(callback) |
|
void | Configure un callback appelé après sélection. |
| Événement | Détail | Description |
|---|---|---|
| autocomplete:change | { item, value, label } | Signale une modification de la valeur soumise. |
| autocomplete:select | { item } | Signale la sélection d’un résultat. |
Upload
Voir la démoSélection, glisser-déposer, collage et prévisualisation de fichiers.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/upload', {
id: 'example-upload',
name: 'upload',
label: 'Libellé',
accept: 'image/*,.pdf',
multiple: true,
maxSize: 5242880,
placeholder: 'Sélectionner…',
subtext: 'subtext',
hint: 'hint',
preview: true,
existingFiles: [
{ name: 'document.pdf', size: 184200, url: '/uploads/document.pdf', type: 'application/pdf' },
],
class: 'w-full',
helpText: 'Texte d’aide',
errorText: '',
required: true,
disabled: false,
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | HTML id |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | input name |
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | visible label |
| accept | string | Non | — | Texte libre ou valeur conforme au format décrit | types acceptés ex: 'image/*' ou '.pdf,.docx' |
| multiple | boolean | Non | — | true | false | autoriser plusieurs fichiers |
| maxSize | number | Non | — | Nombre conforme aux contraintes décrites | taille max par fichier en octets (validation JS) |
| placeholder | string | Non | '' | Texte libre ou valeur conforme au format décrit | texte cliquable de la zone (défaut: 'Choisir un/des fichier(s)') |
| subtext | string | Non | — | Texte libre ou valeur conforme au format décrit | texte secondaire sous le placeholder (défaut: auto selon accept) |
| hint | string | Non | — | Texte libre ou valeur conforme au format décrit | texte de format ex: 'PNG, JPG jusqu\'à 5 Mo' |
| preview | boolean | Non | — | true | false | afficher une miniature pour les images |
| existingFiles | array | Non | — | Tableau conforme à la structure décrite | fichiers déjà uploadés : [{ name, size, url, type? }] |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on field root |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d’aide affiché sous le contrôle. |
| errorText | string | Non | — | Texte libre ou valeur conforme au format décrit | Message d’erreur SSR, prioritaire sur le texte d’aide. |
| required | boolean | Non | false | true | false | Marque la valeur comme obligatoire. |
| disabled | boolean | Non | false | true | false | Désactive les interactions du composant. |
API JavaScript
Point d’accès : Initialisation automatique par /ui/loader.js
| Événement | Détail | Description |
|---|---|---|
| upload:change | { files: FileList, existingFiles: Array<{ name, url }> } | Émis après ajout ou suppression de fichiers. |
Signature
Voir la démoZone de signature canvas synchronisée avec un champ de formulaire.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/signature', {
value: '',
height: 180,
strokeColor: '#111827',
strokeWidth: 2.5,
backgroundColor: '#ffffff',
outputType: 'image/png',
id: 'example-signature',
name: 'signature',
label: 'Libellé',
placeholder: 'Sélectionner…',
clearLabel: "Effacer",
emptyMessage: "Signature requise.",
helpText: 'Texte d’aide',
errorText: '',
required: true,
disabled: false,
readonly: false,
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| value | string | Non | '' | Texte libre ou valeur conforme au format décrit | Data URL initiale, utile en mode édition |
| height | number|string | Non | 180 | Nombre conforme aux contraintes décrites | Hauteur du canvas en px ou valeur CSS |
| strokeColor | string | Non | currentColor | Texte libre ou valeur conforme au format décrit | Couleur du trait. Accepte toute couleur CSS (#111827, rgb(...), hsl(...), var(...), currentColor) |
| strokeWidth | number | Non | 2.5 | Nombre conforme aux contraintes décrites | Épaisseur du trait en pixels CSS |
| backgroundColor | string | Non | transparent | Texte libre ou valeur conforme au format décrit | Fond du canvas |
| outputType | string | Non | image/png | image/png | image/jpeg | image/webp | Format exporté dans le hidden |
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | Base des ids du wrapper, du canvas et du champ caché |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | Attribut name du champ caché soumis |
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | Libellé visible au-dessus de la zone |
| placeholder | string | Non | Signer ici | Texte libre ou valeur conforme au format décrit | Texte affiché tant que la zone est vide |
| clearLabel | string | Non | Effacer | Texte libre ou valeur conforme au format décrit | Libellé du bouton d'effacement, par exemple Recommencer |
| emptyMessage | string | Non | Signature requise. | Texte libre ou valeur conforme au format décrit | Message de validation JS |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d'aide |
| errorText | string | Non | — | Texte libre ou valeur conforme au format décrit | Message d'erreur SSR |
| required | boolean | Non | false | true | false | Bloque le submit si la signature est vide |
| disabled | boolean | Non | false | true | false | Désactive le dessin et l'effacement |
| readonly | boolean | Non | false | true | false | Affiche la valeur sans permettre de modification |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | Classes additionnelles sur le wrapper |
API JavaScript
Point d’accès : root.__uiSignature
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| clear(options?) |
|
void | Efface la signature. |
| fromDataURL(value, options?) |
|
void | Charge une image encodée. |
| isEmpty() | — | boolean | Indique si la zone est vide. |
| resize() | — | void | Recalcule le canvas sans perdre le tracé. |
| toDataURL(type?) |
|
string | Retourne la signature encodée. |
| validate() | — | boolean | Valide la contrainte required. |
| Événement | Détail | Description |
|---|---|---|
| signature:change | { value, empty } | Émis après modification ou effacement. |
Timeline
Voir la démoFrise verticale, alternée ou horizontale, en mode données ou markup libre.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/timeline', {
items: [
{ date: '21 juillet', title: 'Création', body: '<p>Dossier créé.</p>', nodeIcon: 'check', nodeStep: 1, status: 'success', active: true },
],
body: include('../ui/timeline-item', { title: 'Markup libre', body: '<strong>HTML</strong>' }),
layout: "vertical",
step: 'step',
class: 'w-full',
}) %>
<%# Sous-composants associés %>
<%- include('../ui/timeline-item', {
date: 'date',
title: 'Titre du composant',
body: include('../ui/timeline-item', { title: 'Markup libre', body: '<strong>HTML</strong>' }),
nodeIcon: 'check',
nodeStep: 1,
status: 'success',
active: true,
class: 'w-full',
}) %>
Paramètres
| Paramètre | Partial | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|---|
| items | timeline | array | Non | [] | Tableau conforme à la structure décrite | data-driven mode: [{ date, title, body, nodeIcon, nodeStep, status, active }] |
| body | timeline | string | Non | — | Texte libre ou valeur conforme au format décrit | markup-libre mode: pre-rendered HTML (use timeline-item includes) |
| layout | timeline | string | Non | 'vertical' | vertical | alternating | horizontal | vertical | alternating | horizontal |
| step | timeline | string | Non | — | 'asc' | 'desc' — auto-number nodes (data-driven mode only); | 'asc' | 'desc' — auto-number nodes (data-driven mode only); |
| class | timeline | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on root |
| date | timeline-item | string | Non | — | Texte libre ou valeur conforme au format décrit | date or label displayed above the title |
| title | timeline-item | string | Non | — | Texte libre ou valeur conforme au format décrit | item title |
| body | timeline-item | string | Non | — | Texte libre ou valeur conforme au format décrit | HTML body content |
| nodeIcon | timeline-item | string | Non | — | Texte libre ou valeur conforme au format décrit | Lucide icon name (replaces the default pip); takes priority over nodeStep |
| nodeStep | timeline-item | string|number | Non | — | Nombre conforme aux contraintes décrites | number or short text displayed inside the node |
| status | timeline-item | string | Non | 'default' | default | success | warning | error | info | muted | default | success | warning | error | info | muted |
| active | timeline-item | boolean | Non | — | true | false | marks this item as the current step (primary color + ring) |
| class | timeline-item | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on item root |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Progress Bar
Voir la démoBarre de progression déterminée ou indéterminée avec labels et variantes.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/progress', {
value: 65,
size: "md",
color: "primary",
label: 'Libellé',
showValue: true,
textPosition: 'top-left',
striped: true,
animated: true,
indeterminate: true,
class: 'w-full',
attrs: { 'data-task-id': '42' },
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| value | number | Non | 0 | 0 to 100, clamped | 0–100 |
| size | string | Non | md | sm md lg | sm | md | lg |
| color | string | Non | primary | primary secondary success warning danger info muted | primary | secondary | success | warning | danger | info | muted |
| label | string | Non | — | visible label and fallback aria-label | texte libre affiché selon textPosition |
| showValue | boolean | Non | false | shows the percentage when not indeterminate | affiche le pourcentage |
| textPosition | string | Non | — | top-left top-center top-right bottom-left bottom-center bottom-right inside-left inside-center inside-right | top-left | top-center | top-right |
| striped | boolean | Non | false | diagonal stripe texture on the fill | motif rayé diagonal |
| animated | boolean | Non | false | animates stripes when striped is true | anime les rayures, combo avec striped |
| indeterminate | boolean | Non | false | animated loading state for unknown duration | barre défilante pour durée inconnue |
| class | string | Non | '' | Extra classes on the wrapper | classes supplémentaires sur le wrapper |
| attrs | object | Non | {} | Extra attributes on the progressbar track | attributs HTML supplémentaires sur le track |
API JavaScript
Point d’accès : Aucune API JavaScript publique
Chart
Voir la démoAdaptateur Chart.js lazy avec presets et API de mise à jour.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/chart', {
id: 'example-chart',
type: "line",
data: { labels: ['Jan', 'Fév'], datasets: [{ label: 'Ventes', data: [12, 19], gaugeMax: 100 }] },
options: { responsive: true, plugins: { legend: { display: true } } },
preset: 'preset',
height: 240,
emptyText: "No data",
ariaLabel: "Chart",
lazy: true,
class: 'w-full',
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | optional, auto-generated if omitted |
| type | string | Non | line | chart type (line | bar | doughnut) | line, bar, doughnut |
| data | object | Non | — | Objet conforme à la structure décrite | Chart.js data object |
| options | object | Non | [] | Objet conforme à la structure décrite | Chart.js options object |
| preset | string | Non | — | area | stacked | horizontal | area, stacked, stacked-100, horizontal, gauge, combo |
| height | number | Non | 240 | Nombre conforme aux contraintes décrites | canvas height in px |
| emptyText | string | Non | No data | Texte libre ou valeur conforme au format décrit | empty state label |
| ariaLabel | string | Non | Chart | Texte libre ou valeur conforme au format décrit | canvas aria-label |
| lazy | boolean | Non | true | true | false | true loads near viewport; false initializes immediately |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on the root |
API JavaScript
Point d’accès : root.__uiChart
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| getInstance() | — | Chart|null | Retourne l’instance Chart.js après initialisation. |
| setData(data) |
|
void | Remplace les données, y compris avant le chargement de Chart.js. |
| setOptions(options) |
|
void | Fusionne les options du graphique. |
| update() | — | void | Redessine le graphique. |
| destroy() | — | void | Détruit l’instance et libère ses ressources. |
| await ready | — | Promise<object|null> | Attend l’API réelle après le chargement lazy. |
Editor
Voir la démoÉditeur riche Quill chargé à la demande et synchronisé avec un champ caché.
Configuration EJS complète
Toutes les propriétés publiques sont renseignées. Adaptez ou retirez les options selon le cas d’usage.
<%- include('../ui/editor', {
id: 'example-editor',
name: 'editor',
label: 'Libellé',
value: '',
toolbar: 'full',
height: 220,
resizable: true,
lazy: true,
labels: { tooltipVisit: 'URL :', tooltipEnterLink: 'Lien :', tooltipEdit: 'Modifier', tooltipSave: 'Appliquer', tooltipRemove: 'Retirer' },
class: 'w-full',
placeholder: 'Sélectionner…',
helpText: 'Texte d’aide',
errorText: '',
required: true,
disabled: false,
}) %>
Paramètres
| Paramètre | Type | Requis | Défaut | Valeurs possibles | Description |
|---|---|---|---|---|---|
| id | string | Non | auto | Texte libre ou valeur conforme au format décrit | HTML id du conteneur Quill (et base pour l'input hidden {id}-value) |
| name | string | Non | id | Texte libre ou valeur conforme au format décrit | Attribut name de l'input hidden soumis avec le formulaire |
| label | string | Non | — | Texte libre ou valeur conforme au format décrit | Libellé visible au-dessus de l'éditeur |
| value | string | Non | '' | Texte libre ou valeur conforme au format décrit | Contenu HTML initial |
| toolbar | string | Non | 'full' | 'minimal' | 'full' | 'full' (en-têtes, formatage, listes, liens, images…) ou 'minimal' (gras, italique, liste, lien) |
| height | number | Non | 200 | Nombre conforme aux contraintes décrites | Hauteur du corps de l'éditeur en pixels |
| resizable | boolean | Non | false | true | false | allow vertical resize |
| lazy | boolean | Non | true | true | false | Charge Quill proche du viewport ou à la première interaction; false initialise immédiatement |
| labels | object | Non | — | Objet conforme à la structure décrite | optional Quill toolbar/link tooltip labels |
| class | string | Non | '' | Texte libre ou valeur conforme au format décrit | extra classes on field root |
| placeholder | string | Non | '' | Texte libre ou valeur conforme au format décrit | Placeholder affiché dans l'éditeur vide |
| helpText | string | Non | — | Texte libre ou valeur conforme au format décrit | Texte d'aide sous l'éditeur |
| errorText | string | Non | — | Texte libre ou valeur conforme au format décrit | Message d'erreur (active la bordure rouge) |
| required | boolean | Non | false | true | false | Ajoute * rouge au label et required sur l'input hidden |
| disabled | boolean | Non | false | true | false | Lecture seule — toolbar masquée, saisie désactivée |
API JavaScript
Point d’accès : root.__uiEditor
| Méthode ou interaction | Paramètres attendus | Retour | Description |
|---|---|---|---|
| await ready | — | Promise<Quill|null> | Attend l’initialisation lazy de Quill. |
| getInstance() | — | Quill|null | Retourne l’instance Quill lorsqu’elle est initialisée. |
| getValue() | — | string | Retourne le HTML normalisé de l’éditeur. |
| setValue(value) |
|
void | Remplace le HTML, avant ou après l’initialisation. |
| focus() | — | Promise<Quill|null> | Initialise si nécessaire puis donne le focus à l’éditeur. |
| setEnabled(enabled?) |
|
void | Active ou désactive l’édition. |
| Événement | Détail | Description |
|---|---|---|
| editor:change | { value, source } | Émis après chaque modification du contenu. |