• Go to main content

Thème Paris.fr

Thème Paris.fr

    • Quick start
    • Configurer
    • Versions
    • Mettre à jour le thème
    • Plugins
    • Support
    • Grille
    • Ombres
    • Navigation
    • Couleurs
    • Typographie
    • Iconographie
  • Composants
    • Pages
    • Code
    • Mail
    • Connect

Thème Paris.fr

Thème Paris.fr

  1. Home
  2. Composants
Chargement...

Accordéon

macro @cAccordion

Doc Bootstrap Accordéon

@cAccordion peut être utilisé pour générer des éléments d'accordéon avec des titres, sous-titres et contenu collapsible

Exemple

Contenu de l'accordéon

Contenu de l'accordéon

Contenu de l'accordéon type "Info"

Contenu de l'accordéon type "Info"

Contenu de l'accordéon type "Déplié"

Contenu de l'accordéon type "Info"

Contenu de l'accordéon type "Info"

Contenu de l'accordéon type "Info"

Contenu de l'accordéon type "Info"

Contenu de l'accordéon

<@cAccordion id='acc1' title='Titre de l\'accordéon' subTitle='...et son sous-titre'>
Contenu de l'accordéon
</@cAccordion>
<@cAccordion id='acc2' title='accordéon avec titleClass et header...' class='primary' titleClass='main-info-color' header='<p class="ms-auto text-danger fw-bold">Header</p>'>
Contenu de l'accordéon
</@cAccordion>
<@cAccordion id='acc3' title='accordéon avec bouton action' subTitle='Sous titre' subTitleClass='text-muted' btnClass='btn-secondary'>
Contenu de l'accordéon type "Info"
</@cAccordion>
<@cAccordion id='acc31' title='accordéon avec outline' class='outline' >
Contenu de l'accordéon type "Info"
</@cAccordion>
<@cAccordion id='accCollapse' title='accordéon collapse' class='unfold' >
Contenu de l'accordéon type "Déplié"
</@cAccordion>
<@cAccordion id='acc32' title='accordéon avec alert primary outline' class='alert alert-outline alert-primary' state=false>
Contenu de l'accordéon type "Info"
</@cAccordion>
<@cAccordion id='acc33' title='accordéon avec alert primary outline' class='alert alert-outline alert-warning' btnTitle='Voir le détail'>
Contenu de l'accordéon type "Info"
</@cAccordion>
<@cAccordion id='acc34' title='accordéon avec alert primary outline' class='alert alert-outline alert-success' btnTitle='Voir le détail'>
Contenu de l'accordéon type "Info"
</@cAccordion>
<@cAccordion id='acc35' title='accordéon avec alert primary outline' class='alert alert-outline alert-danger' btnTitle='Voir le détail'>
Contenu de l'accordéon type "Info"
</@cAccordion>
<@cAccordion id='acc6' title='Exemple avec bordure' subTitle='...et son sous-titre' border=true state=false>
Contenu de l'accordéon
</@cAccordion>

<div class="accordion " id="accacc1" >
<div class="card with-subtitle" >
<h3 class="card-header m-0" data-bs-toggle="collapse" data-bs-target="#collapseAccacc1" aria-expanded="true" aria-controls="collapseAccacc1">
<button class="btn btn-link btn-header-accordion w-100" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccacc1" aria-expanded="true" aria-controls="collapseAccacc1">
<span class="d-flex flex-column flex-1">
<span class="card-title d-block" id="headingAccacc1">Titre de l'accordéon</span>
<span class="card-subtitle w-100">...et son sous-titre</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccacc1" class="m-0 collapse show" role="region" aria-labelledby="headingAccacc1" data-parent="#accacc1">
<div class="card-body">
Contenu de l'accordéon
</div>
</div>
<div class="card-footer d-block d-sm-none text-center">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccacc1" aria-expanded="true" aria-controls="collapseAccacc1">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
<div class="accordion " id="accacc2" >
<div class="card primary" >
<h3 class="card-header m-0" data-bs-toggle="collapse" data-bs-target="#collapseAccacc2" aria-expanded="true" aria-controls="collapseAccacc2">
<button class="btn btn-link btn-header-accordion w-100" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccacc2" aria-expanded="true" aria-controls="collapseAccacc2">
<span class="d-flex align-items-center flex-1">
<span class="card-title d-block main-info-color" id="headingAccacc2">accordéon avec titleClass et header...</span>
<p class="ms-auto text-danger fw-bold">Header</p>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccacc2" class="m-0 collapse show" role="region" aria-labelledby="headingAccacc2" data-parent="#accacc2">
<div class="card-body">
Contenu de l'accordéon
</div>
</div>
<div class="card-footer d-block d-sm-none text-center">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccacc2" aria-expanded="true" aria-controls="collapseAccacc2">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
<div class="accordion " id="accacc3" >
<div class="card with-subtitle" >
<h3 class="card-header m-0" data-bs-toggle="collapse" data-bs-target="#collapseAccacc3" aria-expanded="true" aria-controls="collapseAccacc3">
<button class="btn btn-link btn-header-accordion w-100" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccacc3" aria-expanded="true" aria-controls="collapseAccacc3">
<span class="d-flex flex-column flex-1">
<span class="card-title d-block" id="headingAccacc3">accordéon avec bouton action</span>
<span class="card-subtitle w-100 text-muted">Sous titre</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion btn-secondary">
<svg class="paris-icon paris-icon-arrow-bottom btn-secondary"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccacc3" class="m-0 collapse show" role="region" aria-labelledby="headingAccacc3" data-parent="#accacc3">
<div class="card-body">
Contenu de l'accordéon type "Info"
</div>
</div>
<div class="card-footer d-block d-sm-none text-center">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccacc3" aria-expanded="true" aria-controls="collapseAccacc3">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
<div class="accordion " id="accacc31" role="status" >
<div class="card outline" >
<h3 class="card-header m-0" data-bs-toggle="collapse" data-bs-target="#collapseAccacc31" aria-expanded="true" aria-controls="collapseAccacc31">
<button class="btn btn-link btn-header-accordion w-100" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccacc31" aria-expanded="true" aria-controls="collapseAccacc31">
<span class="d-flex align-items-center flex-1">
<span class="card-header-prepend">
<svg class="paris-icon paris-icon-alert-info"data-mce-svg="paris-icon paris-icon-alert-info" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-info"></use>
</svg> </span>
<span id="headingAccacc31">accordéon avec outline</span>
<span class="card-header-separator"></span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccacc31" class="m-0 collapse show" role="region" aria-labelledby="headingAccacc31" data-parent="#accacc31">
<div class="card-body">
Contenu de l'accordéon type "Info"
</div>
</div>
<div class="card-footer d-block d-sm-none text-center">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccacc31" aria-expanded="true" aria-controls="collapseAccacc31">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
<div class="accordion " id="accaccCollapse" >
<div class="card unfold" >
<h3 class="card-header m-0" data-bs-toggle="collapse" data-bs-target="#collapseAccaccCollapse" aria-expanded="true" aria-controls="collapseAccaccCollapse">
<button class="btn btn-link btn-header-accordion w-100" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccaccCollapse" aria-expanded="true" aria-controls="collapseAccaccCollapse">
<span class="d-flex flex-column flex-1">
<span class="card-title d-block" id="headingAccaccCollapse">accordéon collapse</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccaccCollapse" class="m-0 collapse show" role="region" aria-labelledby="headingAccaccCollapse" data-parent="#accaccCollapse">
<div class="card-body">
Contenu de l'accordéon type "Déplié"
</div>
</div>
<div class="card-footer d-block d-sm-none text-center">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccaccCollapse" aria-expanded="true" aria-controls="collapseAccaccCollapse">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
<div class="accordion " id="accacc32" role="status" >
<div class="card alert alert-outline alert-primary" >
<h3 class="card-header m-0 collapsed" data-bs-toggle="collapse" data-bs-target="#collapseAccacc32" aria-expanded="false" aria-controls="collapseAccacc32">
<button class="btn btn-link btn-header-accordion w-100" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccacc32" aria-expanded="false" aria-controls="collapseAccacc32">
<span class="d-flex align-items-center flex-1">
<span class="card-header-prepend">
<svg class="paris-icon paris-icon-alert-info"data-mce-svg="paris-icon paris-icon-alert-info" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-info"></use>
</svg> </span>
<span id="headingAccacc32">accordéon avec alert primary outline</span>
<span class="card-header-separator"></span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccacc32" class="m-0 collapse " role="region" aria-labelledby="headingAccacc32" data-parent="#accacc32">
<div class="card-body">
Contenu de l'accordéon type "Info"
</div>
</div>
<div class="card-footer d-block d-sm-none text-center bg-transparent">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccacc32" aria-expanded="false" aria-controls="collapseAccacc32">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
<div class="accordion " id="accacc33" role="alert" >
<div class="card alert alert-outline alert-warning" >
<h3 class="card-header m-0" data-bs-toggle="collapse" data-bs-target="#collapseAccacc33" aria-expanded="true" aria-controls="collapseAccacc33">
<button class="btn btn-link btn-header-accordion w-100 main-warning-color-text" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccacc33" aria-expanded="true" aria-controls="collapseAccacc33">
<span class="d-flex align-items-center flex-1">
<span class="card-header-prepend">
<svg class="paris-icon paris-icon-alert-warning"data-mce-svg="paris-icon paris-icon-alert-warning" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-warning"></use>
</svg> </span>
<span id="headingAccacc33">accordéon avec alert primary outline</span>
<span class="card-header-separator"></span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-label-accordion d-none d-md-inline-block main-warning-color-text">Voir le détail</span>
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom main-warning-color-text"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccacc33" class="m-0 collapse show" role="region" aria-labelledby="headingAccacc33" data-parent="#accacc33">
<div class="card-body" style="border-color:var(--main-warning-color-text)">
Contenu de l'accordéon type "Info"
</div>
</div>
<div class="card-footer d-block d-sm-none text-center bg-transparent">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccacc33" aria-expanded="true" aria-controls="collapseAccacc33">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
<div class="accordion " id="accacc34" role="status" >
<div class="card alert alert-outline alert-success" >
<h3 class="card-header m-0" data-bs-toggle="collapse" data-bs-target="#collapseAccacc34" aria-expanded="true" aria-controls="collapseAccacc34">
<button class="btn btn-link btn-header-accordion w-100 main-success-color-text" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccacc34" aria-expanded="true" aria-controls="collapseAccacc34">
<span class="d-flex align-items-center flex-1">
<span class="card-header-prepend">
<svg class="paris-icon paris-icon-alert-success"data-mce-svg="paris-icon paris-icon-alert-success" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-success"></use>
</svg> </span>
<span id="headingAccacc34">accordéon avec alert primary outline</span>
<span class="card-header-separator"></span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-label-accordion d-none d-md-inline-block main-success-color-text">Voir le détail</span>
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom main-success-color-text"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccacc34" class="m-0 collapse show" role="region" aria-labelledby="headingAccacc34" data-parent="#accacc34">
<div class="card-body" style="border-color:var(--main-success-color-text)">
Contenu de l'accordéon type "Info"
</div>
</div>
<div class="card-footer d-block d-sm-none text-center bg-transparent">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccacc34" aria-expanded="true" aria-controls="collapseAccacc34">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
<div class="accordion " id="accacc35" role="alert" >
<div class="card alert alert-outline alert-danger" >
<h3 class="card-header m-0" data-bs-toggle="collapse" data-bs-target="#collapseAccacc35" aria-expanded="true" aria-controls="collapseAccacc35">
<button class="btn btn-link btn-header-accordion w-100 main-danger-color-text" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccacc35" aria-expanded="true" aria-controls="collapseAccacc35">
<span class="d-flex align-items-center flex-1">
<span class="card-header-prepend">
<svg class="paris-icon paris-icon-alert-danger"data-mce-svg="paris-icon paris-icon-alert-danger" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-danger"></use>
</svg> </span>
<span id="headingAccacc35">accordéon avec alert primary outline</span>
<span class="card-header-separator"></span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-label-accordion d-none d-md-inline-block main-danger-color-text">Voir le détail</span>
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom main-danger-color-text"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccacc35" class="m-0 collapse show" role="region" aria-labelledby="headingAccacc35" data-parent="#accacc35">
<div class="card-body" style="border-color:var(--main-danger-color-text)">
Contenu de l'accordéon type "Info"
</div>
</div>
<div class="card-footer d-block d-sm-none text-center bg-transparent">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccacc35" aria-expanded="true" aria-controls="collapseAccacc35">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
<div class="accordion " id="accacc6" >
<div class="card with-border with-subtitle" >
<h3 class="card-header m-0 collapsed" data-bs-toggle="collapse" data-bs-target="#collapseAccacc6" aria-expanded="false" aria-controls="collapseAccacc6">
<button class="btn btn-link btn-header-accordion w-100" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccacc6" aria-expanded="false" aria-controls="collapseAccacc6">
<span class="d-flex flex-column flex-1">
<span class="card-title d-block" id="headingAccacc6">Exemple avec bordure</span>
<span class="card-subtitle w-100">...et son sous-titre</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccacc6" class="m-0 collapse " role="region" aria-labelledby="headingAccacc6" data-parent="#accacc6">
<div class="card-body">
Contenu de l'accordéon
</div>
</div>
<div class="card-footer d-block d-sm-none text-center">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccacc6" aria-expanded="false" aria-controls="collapseAccacc6">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>

Paramètres

Generates a collapsible accordion panel that reveals or hides associated content when a stacked title is clicked or activated via keyboard or screen reader.

  • id (string)
    required
    - The unique identifier for the accordion
  • title (string)
    required
    - The title text displayed in the accordion header
  • btnTitle (string)
    optional
    - The label for the accordion toggle button. Default: ‘'
  • class (string)
    optional
    - Additional CSS class(es) for the accordion container. Default: ‘'
  • titleClass (string)
    optional
    - CSS class(es) applied to the accordion title. Default: ‘'
  • titleLevel (number)
    optional
    - The heading level for the accordion title. Default: 3
  • subTitle (string)
    optional
    - Subtitle text displayed below the title. Default: ‘'
  • subTitleClass (string)
    optional
    - CSS class(es) for the subtitle. Default: ‘'
  • btnClass (string)
    optional
    - CSS class(es) for the collapse toggle icon. Default: ‘'
  • btnShowLabel (string)
    optional
    - Text for the data-show-label attribute. Default: ‘'
  • btnHideLabel (string)
    optional
    - Text for the data-hide-label attribute. Default: ‘'
  • header (string)
    optional
    - HTML content added alongside the title. Default: ‘'
  • border (boolean)
    optional
    - If true, a border is added to the accordion. Default: false
  • state (boolean)
    optional
    - If true, the accordion is expanded by default. Default: true
  • hasCollapse (boolean)
    optional
    - If true, shows the collapse toggle icon. Default: true
  • params (string)
    optional
    - Additional HTML attributes for the accordion. Default: ‘'

Alert

macro @cAlert

Doc Bootstrap Alert

@cAlert peut être utilisé pour générer des éléments d'alerte avec des titres, des messages et des boutons de fermeture optionnels

Exemple

Information

Titre de l'alerte

Error

Message erreur

Error

Message d'erreur

Contenu de l'erreur
Error

Message d'erreur

Message d'erreur et bouton de fermeture
Warning

Message attention...

Warning

Message attention...

Contenu du message "warning"
Success

Message validation...

Confirmation...
Success

Message validation...

Confirmation...
Warning

Message validation...

Confirmation...
Warning

Message avec titre HTML de niveau 3

  • Contenu du message avec un titre HTML personnalisé
  • Le titre est de niveau 3 grâce au paramètre htmlTitleLevel
  • Le paramètre isHtmlTitle doit être à true pour que le titre soit interprété comme du HTML

<@cAlert title='Titre de l\'alerte' />
<@cAlert class='danger' title='Message erreur' />
<@cAlert class='danger' title='Message d\'erreur'>Contenu de l'erreur</@cAlert>
<@cAlert class='danger' dismissible=true title='Message d\'erreur'>Message d'erreur et bouton de fermeture</@cAlert>
<@cAlert class='warning' title='Message attention...' />
<@cAlert class='warning' dismissible=true title='Message attention...'>Contenu du message "warning"</@cAlert>
<@cAlert class='success' title='Message validation...'>Confirmation...</@cAlert>
<@cAlert class='success' dismissible=true title='Message validation...'>Confirmation...</@cAlert>
<!-- Avec nouveau paramètre type -->
<@cAlert type='warning' class='mt-xxl' dismissible=true title='Message validation...'>Confirmation...</@cAlert>
<!-- Avec nouveau paramètre isHtmlTitle -->
<@cAlert type='warning' isHtmlTitle=true htmlTitleLevel=3 dismissible=true title='Message avec titre HTML de niveau 3'>
<@chList>
	<@chItem>Contenu du message avec un titre HTML personnalisé</@chItem>
	<@chItem>Le titre est de niveau 3 grâce au paramètre htmlTitleLevel</@chItem>
	<@chItem>Le paramètre isHtmlTitle doit être à true pour que le titre soit interprété comme du HTML</@chItem>
</@chList>
</@cAlert>

<div class="alert alert-outline alert-primary " role="status" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-info"data-mce-svg="paris-icon paris-icon-alert-info" aria-labelledby="paris-icon-alert-info-paris-title-254581707349421" focusable="false" role="img">
<title id="paris-icon-alert-info-paris-title-254581707349421">Information</title>
<use href="#paris-icon-alert-info"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Titre de l'alerte</p>
</div>
</div>
</div>
<div class="alert alert-outline alert-danger danger" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-danger"data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-257920657509191" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-257920657509191">Error</title>
<use href="#paris-icon-alert-danger"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Message erreur</p>
</div>
</div>
</div>
<div class="alert alert-outline alert-danger danger" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-danger"data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-261259607668961" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-261259607668961">Error</title>
<use href="#paris-icon-alert-danger"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Message d'erreur</p>
</div>
</div>
<div class="alert-content">
Contenu de l'erreur</div>
</div>
<div class="alert alert-outline alert-danger dismissible fade show danger" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-danger"data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-264598557828731" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-264598557828731">Error</title>
<use href="#paris-icon-alert-danger"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Message d'erreur</p>
</div>
<div class="alert-dismiss">
<button class="btn btn-close py-xs px-xs" type="button"data-bs-dismiss="alert" aria-label="Close">
</button>
</div>
</div>
<div class="alert-content">
Message d'erreur et bouton de fermeture</div>
</div>
<div class="alert alert-outline alert-warning warning" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-warning"data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-267937507988501" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-267937507988501">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Message attention...</p>
</div>
</div>
</div>
<div class="alert alert-outline alert-warning dismissible fade show warning" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-warning"data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-271276458148271" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-271276458148271">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Message attention...</p>
</div>
<div class="alert-dismiss">
<button class="btn btn-close py-xs px-xs" type="button"data-bs-dismiss="alert" aria-label="Close">
</button>
</div>
</div>
<div class="alert-content">
Contenu du message "warning"</div>
</div>
<div class="alert alert-outline alert-success success" role="status" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-check"data-mce-svg="paris-icon paris-icon-alert-check" aria-labelledby="paris-icon-alert-check-paris-title-274615408308041" focusable="false" role="img">
<title id="paris-icon-alert-check-paris-title-274615408308041">Success</title>
<use href="#paris-icon-alert-check"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Message validation...</p>
</div>
</div>
<div class="alert-content">
Confirmation...</div>
</div>
<div class="alert alert-outline alert-success dismissible fade show success" role="status" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-check"data-mce-svg="paris-icon paris-icon-alert-check" aria-labelledby="paris-icon-alert-check-paris-title-277954358467811" focusable="false" role="img">
<title id="paris-icon-alert-check-paris-title-277954358467811">Success</title>
<use href="#paris-icon-alert-check"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Message validation...</p>
</div>
<div class="alert-dismiss">
<button class="btn btn-close py-xs px-xs" type="button"data-bs-dismiss="alert" aria-label="Close">
</button>
</div>
</div>
<div class="alert-content">
Confirmation...</div>
</div>
<!-- Avec nouveau paramètre type -->
<div class="alert alert-outline alert-warning dismissible fade show mt-xxl" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-warning"data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-281293308627581" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-281293308627581">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Message validation...</p>
</div>
<div class="alert-dismiss">
<button class="btn btn-close py-xs px-xs" type="button"data-bs-dismiss="alert" aria-label="Close">
</button>
</div>
</div>
<div class="alert-content">
Confirmation...</div>
</div>
<!-- Avec nouveau paramètre isHtmlTitle -->
<div class="alert alert-outline alert-warning dismissible fade show " role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-warning"data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-285632258787351" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-285632258787351">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<h3 class="alert-title mt-0">
Message avec titre HTML de niveau 3</h3>
</div>
<div class="alert-dismiss">
<button class="btn btn-close py-xs px-xs" type="button"data-bs-dismiss="alert" aria-label="Close">
</button>
</div>
</div>
<div class="alert-content">
<ul >
<li>
Contenu du message avec un titre HTML personnalisé</li>
<li>
Le titre est de niveau 3 grâce au paramètre htmlTitleLevel</li>
<li>
Le paramètre isHtmlTitle doit être à true pour que le titre soit interprété comme du HTML</li>
</ul>
</div>
</div>

Paramètres

Generates an alert banner with icon, optional title, and dismissible close button.

  • id (string)
    optional
    - The unique identifier for the alert. Default: ''
  • title (string)
    optional
    - The title text for the alert. Default: ''
  • isHtmlTitle (boolean)
    optional
    new
    - Indicates if the title contains HTML. Default: false
  • htmlTitleLevel (number)
    optional
    new
    - The heading level for the title if isHtmlTitle is true. Default: 3
  • type (string)
    optional
    - The alert type controlling color and icon ('primary', 'warning', 'danger', 'success'). Default: 'primary'
  • class (string)
    optional
    - Additional CSS class(es) for the alert container. Default: ''
  • classText (string)
    optional
    - CSS class(es) applied to the alert text. Default: ''
  • dismissible (boolean)
    optional
    - If true, a close button is displayed. Default: false
  • params (string)
    optional
    - Additional HTML attributes for the alert. Default: ''

Ancre

macro @cAnchor

Generates an anchor navigation list for in-page linking

Exemple

  • Item 1
  • Item 2
  • Item 3
  • Item 4
  • Item 5

Item 1

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Item 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Item 3

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Item 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Item 5

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

<#assign anchors = [
	{"label":"Item 1", "href":"jsp/site/Portal.jsp?page_id=6#anchor-list-item-xxs"},
	{"label":"Item 2", "href":"jsp/site/Portal.jsp?page_id=6#anchor-list-item-2"},
	{"label":"Item 3", "href":"jsp/site/Portal.jsp?page_id=6#anchor-list-item-3"},
	{"label":"Item 4", "href":"jsp/site/Portal.jsp?page_id=6#anchor-list-item-4"},
	{"label":"Item 5", "href":"jsp/site/Portal.jsp?page_id=6#anchor-list-item-5"}
]>
<@cRow>
	<@cCol cols="12 col-sm-3">
		<@cAnchor anchors=anchors />
	</@cCol>
	<@cCol>
		<@cTitle level=4 id="anchor-list-item-xxs" class="mt-0">Item 1</@cTitle>
		<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
		<@cTitle level=4 id="anchor-list-item-2" class="mt-m">Item 2</@cTitle>
		<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
		<@cTitle level=4 id="anchor-list-item-3" class="mt-m">Item 3</@cTitle>
		<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
		<@cTitle level=4 id="anchor-list-item-4" class="mt-m">Item 4</@cTitle>
		<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
		<@cTitle level=4 id="anchor-list-item-5" class="mt-m">Item 5</@cTitle>
		<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
	</@cCol>
</@cRow>

<div class="row ">
<div class="col-12 col-sm-3 ">
<div class="anchors ">
<ul >
<li>
<a href="jsp/site/Portal.jsp?page_id=6#anchor-list-item-xxs" >
<span class="link-label">Item 1</span>
</a>
</li>
<li>
<a href="jsp/site/Portal.jsp?page_id=6#anchor-list-item-2" >
<span class="link-label">Item 2</span>
</a>
</li>
<li>
<a href="jsp/site/Portal.jsp?page_id=6#anchor-list-item-3" >
<span class="link-label">Item 3</span>
</a>
</li>
<li>
<a href="jsp/site/Portal.jsp?page_id=6#anchor-list-item-4" >
<span class="link-label">Item 4</span>
</a>
</li>
<li>
<a href="jsp/site/Portal.jsp?page_id=6#anchor-list-item-5" >
<span class="link-label">Item 5</span>
</a>
</li>
</ul>
</div>
</div>
<div class="col ">
<h4 class="mt-0" id="anchor-list-item-xxs">
Item 1</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<h4 class="mt-m" id="anchor-list-item-2">
Item 2</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<h4 class="mt-m" id="anchor-list-item-3">
Item 3</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<h4 class="mt-m" id="anchor-list-item-4">
Item 4</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<h4 class="mt-m" id="anchor-list-item-5">
Item 5</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</div>

Paramètres

Generates an anchor navigation list for in-page linking, built from a list of anchor objects.

  • anchors (object)
    required
    - List of anchor items, each containing 'href' and 'label' attributes
  • id (string)
    optional
    - The unique identifier for the anchor container. Default: ''
  • class (string)
    optional
    - CSS class(es) for the outer container. Default: ''
  • listClass (string)
    optional
    - CSS class(es) for the list element. Default: ''
  • listItemClass (string)
    optional
    - CSS class(es) for each list item. Default: ''
  • anchorsClass (string)
    optional
    - CSS class(es) for each anchor link. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the anchor container. Default: ''

Badge

macro @cBadge

Doc Bootstrap Badge

Generates a badge or tag element with an optional dismissible close button

Exemple

Badge example

Badge example

Badge example

<@cBadge label='Badge example' />
<@cBadge label='Badge example' dismissible=true />
<@cBadge label='Badge example' class='badge-secondary' />

<div class="badge ">
<p class="badge-label">Badge example</p>
</div>
<div class="badge dismissible">
<div class="badge-content">
<p class="badge-label">Badge example</p>
<button type="button" class="btn-close" onclick="this.parentElement.parentElement.remove();" aria-label="Close"></button>
</div>
</div>
<div class="badge badge-secondary">
<p class="badge-label">Badge example</p>
</div>

Paramètres

Generates a badge or tag element with an optional dismissible close button.

  • label (string)
    optional
    - The text displayed in the badge. Default: ''
  • class (string)
    optional
    - Additional CSS class(es) for the badge. Default: ''
  • hasp (boolean)
    optional
    - If true, wraps the label in a paragraph element. Default: true
  • dismissible (boolean)
    optional
    - If true, displays a close button to dismiss the badge. Default: false
  • id (string)
    optional
    - The unique identifier for the badge. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the badge. Default: ''

Boutons

macro @cBtn

Doc Bootstrap Boutons

Generates an interactive button element, rendered as a link when an href is provided.

Exemple

btn-primary href

Exemple de bouton flottant

<@cBlock>
    <@cBtn label='btn-primary' class='primary m-xxs' />
    <@cBtn label='btn-primary disabled' class='primary m-xxs' disabled=true />
    <@cBtn label='btn-secondary' class='secondary m-xxs' />
    <@cBtn label='btn-secondary disabled' class='secondary m-xxs' disabled=true />
    <@cBtn label='btn-tertiary' class='tertiary m-xxs' />
    <@cBtn label='btn-tertiary disabled' class='tertiary m-xxs' disabled=true />
    <@cBtn label='btn-danger' class='danger m-xxs' />
    <@cBtn label='btn-danger disabled' class='danger m-xxs' disabled=true />
</@cBlock>
<@cBlock>
    <@cBtn label='btn-expand' class='expand m-xxs' />
    <@cBtn label='btn-expand disabled' class='expand m-xxs' disabled=true />
</@cBlock>
<@cBlock>
    <@cBtn label='btn-primary' class='primary m-xxs' size="mini" />
    <@cBtn label='btn-primary disabled' class='primary m-xxs' size="mini" disabled=true />
    <@cBtn label='btn-secondary' class='secondary m-xxs' size="mini" />
    <@cBtn label='btn-secondary disabled' class='secondary m-xxs' size="mini" disabled=true />
    <@cBtn label='btn-tertiary' class='tertiary m-xxs' size="mini" />
    <@cBtn label='btn-tertiary disabled' class='tertiary m-xxs' size="mini" disabled=true />
    <@cBtn label='btn-danger' class='danger m-xxs' size="mini" />
    <@cBtn label='btn-danger disabled' class='danger m-xxs' size="mini" disabled=true />
</@cBlock>
<@cBlock>
    <@cBtn label='btn-primary btnClass' class='primary m-xxs' btnClass="custom-class" />
    <@cBtn label='btn-primary noClass' class='btn btn-primary m-xxs' noclass=true />
    <@cBtn label='btn-primary href' class='primary m-xxs' href="#" />
    <@cBtn label='btn-primary nestedPos-before' class='primary m-xxs' nestedPos="before">Before : </@cBtn>
    <@cBtn label='btn-primary nestedPos-after : ' class='primary m-xxs' nestedPos="after"> After</@cBtn>
</@cBlock>
<@cBlock>
    <@cTitle level=4>Exemple de bouton flottant</@cTitle>
    <@cBlock class='btn-floating-toolbar'>
        <@cBtn label='Bouton flottant Primary' class='btn btn-primary btn-floating' noclass=true />
    </@cBlock>
</@cBlock>

<div>
<button class="btn btn-primary m-xxs" type="submit">
<span class="btn-label ">btn-primary</span>
</button>
<button class="btn btn-primary m-xxs" type="submit" disabled>
<span class="btn-label ">btn-primary disabled</span>
</button>
<button class="btn btn-secondary m-xxs" type="submit">
<span class="btn-label ">btn-secondary</span>
</button>
<button class="btn btn-secondary m-xxs" type="submit" disabled>
<span class="btn-label ">btn-secondary disabled</span>
</button>
<button class="btn btn-tertiary m-xxs" type="submit">
<span class="btn-label ">btn-tertiary</span>
</button>
<button class="btn btn-tertiary m-xxs" type="submit" disabled>
<span class="btn-label ">btn-tertiary disabled</span>
</button>
<button class="btn btn-danger m-xxs" type="submit">
<span class="btn-label ">btn-danger</span>
</button>
<button class="btn btn-danger m-xxs" type="submit" disabled>
<span class="btn-label ">btn-danger disabled</span>
</button>
</div>
<div>
<button class="btn btn-expand m-xxs" type="submit">
<span class="btn-label ">btn-expand</span>
</button>
<button class="btn btn-expand m-xxs" type="submit" disabled>
<span class="btn-label ">btn-expand disabled</span>
</button>
</div>
<div>
<button class="btn btn-primary m-xxs btn-mini" type="submit">
<span class="btn-label ">btn-primary</span>
</button>
<button class="btn btn-primary m-xxs btn-mini" type="submit" disabled>
<span class="btn-label ">btn-primary disabled</span>
</button>
<button class="btn btn-secondary m-xxs btn-mini" type="submit">
<span class="btn-label ">btn-secondary</span>
</button>
<button class="btn btn-secondary m-xxs btn-mini" type="submit" disabled>
<span class="btn-label ">btn-secondary disabled</span>
</button>
<button class="btn btn-tertiary m-xxs btn-mini" type="submit">
<span class="btn-label ">btn-tertiary</span>
</button>
<button class="btn btn-tertiary m-xxs btn-mini" type="submit" disabled>
<span class="btn-label ">btn-tertiary disabled</span>
</button>
<button class="btn btn-danger m-xxs btn-mini" type="submit">
<span class="btn-label ">btn-danger</span>
</button>
<button class="btn btn-danger m-xxs btn-mini" type="submit" disabled>
<span class="btn-label ">btn-danger disabled</span>
</button>
</div>
<div>
<!-- Warning : wrong or deprecated argument(s) : btnClass, ... -->
<button class="btn btn-primary m-xxs" type="submit">
<span class="btn-label ">btn-primary btnClass</span>
</button>
<button class="btn btn-primary m-xxs" type="submit">
<span class="btn-label ">btn-primary noClass</span>
</button>
<a href="#" class="btn btn-primary m-xxs" >
<span class="btn-label ">btn-primary href</span>
</a>
<button class="btn btn-primary m-xxs" type="submit">
Before : <span class="btn-label ">btn-primary nestedPos-before</span>
</button>
<button class="btn btn-primary m-xxs" type="submit">
<span class="btn-label ">btn-primary nestedPos-after : </span> After
</button>
</div>
<div>
<h4>
Exemple de bouton flottant</h4>
<div class="btn-floating-toolbar">
<button class="btn btn-primary btn-floating" type="submit">
<span class="btn-label ">Bouton flottant Primary</span>
</button>
</div>
</div>

Paramètres

Generates an interactive button element, rendered as a link when an href is provided.

  • label (string)
    required
    - The button text
  • class (string)
    optional
    - CSS class(es) for the button ('primary', 'secondary', 'tertiary', 'danger', 'expand'). Default: 'primary'
  • btnClass (string)
    optional
    - CSS class(es) applied to the label span. Default: ''
  • noclass (boolean)
    optional
    - If true, removes the 'btn-' prefix classes when no href. Default: false
  • href (string)
    optional
    - If set, renders the button as an anchor link. Default: ''
  • id (string)
    optional
    - The unique identifier for the button. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the button. Default: ''
  • type (string)
    optional
    - The button type attribute. Default: 'submit'
  • nestedPos (string)
    optional
    - Position of nested content relative to the label ('before', 'after'). Default: 'before'
  • disabled (boolean)
    optional
    - If true, disables the button. Default: false
  • size (string)
    optional
    - Button size ('mini' for smaller). Default: ''

Boutons image

macro @cBtnImg

Generates a button with an embedded image or SVG, and a text label from nested content.

Exemple

<@cBlock class='mt-xs'>
   <@cBtnImg src='images/feed.png' title='France Connect'  imgPos='after'>
       Actualités - Flux RSS
   </@cBtnImg>
</@cBlock>
<@cBlock class='mt-xs'>
   <@cBtnImg src='images/feed.png' title='France Connect' class='secondary' imgPos='before'>
       Actualités - Flux RSS
   </@cBtnImg>
</@cBlock>
<@cBlock class='d-flex mt-xs'>
   <@cBtnImg src='images/feed.png' title='France Connect' class='tertiary'  imgPos='before'>
       Actualités - Flux RSS
   </@cBtnImg> 
   <@cBtnImg src='images/feed.png' title='France Connect' class='tertiary' disabled=true imgPos='before'>
       Actualités - Flux RSS
   </@cBtnImg>
</@cBlock>

<div class="mt-xs">
<!-- Warning : wrong or deprecated argument(s) : title, ... -->
<button class="btn btn-primary btn-img" type="submit">
<span>
Actualités - Flux RSS
</span>
<img src="images/feed.png" alt="" title="" class="after">
</button>
</div>
<div class="mt-xs">
<!-- Warning : wrong or deprecated argument(s) : title, ... -->
<button class="btn btn-secondary btn-img" type="submit">
<img src="images/feed.png" alt="" title="" class="img-fluid">
<span>
Actualités - Flux RSS
</span>
</button>
</div>
<div class="d-flex mt-xs">
<!-- Warning : wrong or deprecated argument(s) : title, ... -->
<button class="btn btn-tertiary btn-img" type="submit">
<img src="images/feed.png" alt="" title="" class="img-fluid">
<span>
Actualités - Flux RSS
</span>
</button>
<!-- Warning : wrong or deprecated argument(s) : title, ... -->
<button class="btn btn-tertiary btn-img" type="submit" disabled>
<img src="images/feed.png" alt="" title="" class="img-fluid">
<span>
Actualités - Flux RSS
</span>
</button>
</div>

Paramètres

Generates a button with an embedded image or SVG, and a text label from nested content.

  • src (string)
    required
    - The image source URL or SVG markup for the button
  • class (string)
    optional
    - CSS class(es) for the button. Default: 'primary'
  • id (string)
    optional
    - The unique identifier for the button. Default: ''
  • type (string)
    optional
    - The button type ('submit' or 'svg' for inline SVG). Default: 'submit'
  • params (string)
    optional
    - Additional HTML attributes for the button. Default: ''
  • imgPos (string)
    optional
    - Position of the image relative to the label ('before', 'after'). Default: 'before'
  • disabled (boolean)
    optional
    - If true, disables the button. Default: false

Groupes de boutons

macro @cBtnGroup

Doc Bootstrap Groupes de boutons

Generates a group of buttons, either from a list of button objects or from nested content.

Exemple

Example 1

Example 2

<@cTitle level=4>Example 1</@cTitle>
<#assign buttons1 = [
{"label":"A", "class":"primary"},
{"label":"B", "class":"secondary"},
{"label":"C", "class":"tertiary"}
]>
<@cBlock>
    <@cBtnGroup label='Menu Accueil' buttonList=buttons1 />
</@cBlock>
<@cTitle level=4>Example 2</@cTitle>
<#assign buttons2 = [
{"label":"Off", "class":"danger"},
{"label":"On", "class":"success active"}
]>
<@cBlock>
	<@cBtnGroup label='Menu Accueil' type='vertical' buttonList=buttons2 />
</@cBlock>

<h4>
Example 1</h4>
<div>
<div class="btn-group" role="group" aria-label="Menu Accueil">
<ul class="list-unstyled d-flex flex-wrap m-0" >
<li class="me-xs d-flex">
<button class="btn btn-primary" type="submit">
<span class="btn-label ">A</span>
</button>
</li>
<li class="me-xs d-flex">
<button class="btn btn-secondary" type="submit">
<span class="btn-label ">B</span>
</button>
</li>
<li class="me-xs d-flex">
<button class="btn btn-tertiary" type="submit">
<span class="btn-label ">C</span>
</button>
</li>
</ul>
</div>
</div>
<h4>
Example 2</h4>
<div>
<div class="btn-group btn-group-vertical" role="group" aria-label="Menu Accueil">
<ul class="list-unstyled d-flex flex-column m-0" >
<li class="me-xs d-flex">
<button class="btn btn-danger w-100" type="submit">
<span class="btn-label ">Off</span>
</button>
</li>
<li class="me-xs d-flex">
<button class="btn btn-success active w-100" type="submit">
<span class="btn-label ">On</span>
</button>
</li>
</ul>
</div>
</div>

Paramètres

Generates a group of buttons, either from a list of button objects or from nested content.

  • label (string)
    required
    - The aria-label for the button group
  • buttonList (object)
    optional
    - List of button items, each with 'label', 'class', and optional 'disabled' attributes. Default: {}
  • class (string)
    optional
    - Additional CSS class(es) for the button group. Default: ''
  • id (string)
    optional
    - The unique identifier for the button group. Default: ''
  • type (string)
    optional
    - Layout type for the group ('vertical' for stacked). Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the button group. Default: ''

Barre d'outils

macro @cBtnToolbar

Doc Bootstrap Barre d'outils

Generates a toolbar container for grouping multiple button groups together.

Exemple

<@cBtnToolbar label='Document actions'>
    <@cBtnGroup label='Editing'>
        <@cBtn label='Cut' class='secondary' />
        <@cBtn label='Copy' class='secondary' />
        <@cBtn label='Paste' class='secondary' />
    </@cBtnGroup>
    <@cBtnGroup label='Formatting'>
        <@cBtn label='Bold' class='secondary' />
        <@cBtn label='Italic' class='secondary' />
    </@cBtnGroup>
</@cBtnToolbar>

<div class="btn-toolbar" role="toolbar" aria-label="Document actions">
<div class="btn-group" role="group" aria-label="Editing">
<button class="btn btn-secondary" type="submit">
<span class="btn-label ">Cut</span>
</button>
<button class="btn btn-secondary" type="submit">
<span class="btn-label ">Copy</span>
</button>
<button class="btn btn-secondary" type="submit">
<span class="btn-label ">Paste</span>
</button>
</div>
<div class="btn-group" role="group" aria-label="Formatting">
<button class="btn btn-secondary" type="submit">
<span class="btn-label ">Bold</span>
</button>
<button class="btn btn-secondary" type="submit">
<span class="btn-label ">Italic</span>
</button>
</div>
</div>

Paramètres

Generates a toolbar container for grouping multiple button groups together.

  • label (string)
    required
    - The aria-label for the toolbar
  • type (string)
    optional
    - Layout type ('vertical' for stacked). Default: ''
  • class (string)
    optional
    - Additional CSS class(es) for the toolbar. Default: ''
  • id (string)
    optional
    - The unique identifier for the toolbar. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the toolbar. Default: ''

Carte

macro @cCard

Doc Bootstrap Carte

Generates a card component with optional header, image, content, and footer sections.

Exemple

Vertical

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

  • Title example

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Vertical Secondary

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

  • Title example

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Horizontal

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Horizontal Secondary

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

  • Title example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Cartes depliantes

  • Title example

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

  • Title example

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

    Text example

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

<@cTitle level=4>Vertical</@cTitle>
<@chList class='list-unstyled'>
	<@chItem>
		<@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' >
			<@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			<@cText class='text-end'><@cBtn label='Text example' class='primary mt-m' /></@cText>
		</@cCard>
	</@chItem>
	<@chItem>
		<@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' >
			<@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
		</@cCard>
	</@chItem>
	<@chItem>
		<@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' />
	</@chItem>
	<@chItem>
		<@cCard title='Title example'>
			<@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			<@cText class='text-end'><@cBtn label='Text example' class='primary mt-m' /></@cText>
		</@cCard>
	</@chItem>
</@chList>
<@cTitle level=4>Vertical Secondary</@cTitle>
<@chList class='list-unstyled'>
	<@chItem>
		<@cCard class='secondary' title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' >
			<@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			<@cText class='text-end'><@cBtn label='Text example' class='primary mt-m' /></@cText>
		</@cCard>
	</@chItem>
	<@chItem>
		<@cCard class='secondary' title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' >
			<@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
		</@cCard>
	</@chItem>
	<@chItem>
		<@cCard class='secondary' title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' />
	</@chItem>
	<@chItem>
		<@cCard class='secondary' title='Title example'>
			<@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			<@cText class='text-end'><@cBtn label='Text example' class='primary mt-m' /></@cText>
		</@cCard>
	</@chItem>
</@chList>
<@cTitle level=4>Horizontal</@cTitle>
<@chList class='list-unstyled'>
	<@chItem>
		<@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' orientation='h'>
			<@cBlock class='d-md-flex justify-content-between align-items-end text-end'>
				<@cText class="card-text text-start me-l">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
				<@cBtn label='Text example' class='primary text-end' />
			</@cBlock >
		</@cCard>
	</@chItem>
	<@chItem>
		<@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' orientation='h'>
			<@cBlock class='d-md-flex justify-content-between align-items-end text-end'>
				<@cText class="card-text text-start me-l">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cBlock >
		</@cCard>
	</@chItem>
	<@chItem>
		<@cCard title='Title example' orientation='h'>
			<@cBlock class='d-md-flex justify-content-between align-items-end text-end'>
				<@cText class="card-text text-start me-l">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
				<@cBtn label='Text example' class='primary text-end' />
			</@cBlock >
		</@cCard>
	</@chItem>
</@chList>
<@cTitle level=4>Horizontal Secondary</@cTitle>
<@chList class='list-unstyled'>
	<@chItem>
		<@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' orientation='h' class='secondary'>
			<@cBlock class='d-md-flex justify-content-between align-items-end text-end'>
				<@cText class="card-text text-start me-l">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
				<@cBtn label='Text example' class='primary text-end' />
			</@cBlock>
		</@cCard>
	</@chItem>
	<@chItem>
		<@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' orientation='h' class='secondary'>
			<@cBlock class='d-md-flex justify-content-between align-items-end text-end'>
				<@cText class="card-text text-start me-l">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cBlock >
		</@cCard>
	</@chItem>
	<@chItem>
		<@cCard title='Title example' orientation='h' class='secondary'>
			<@cBlock class='d-md-flex justify-content-between align-items-end text-end'>
				<@cText class="card-text text-start me-l">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
				<@cBtn label='Text example' class='primary text-end' />
			</@cBlock >
		</@cCard>
	</@chItem>
</@chList>
<@cTitle level=4>Cartes depliantes</@cTitle>
<@chList class='list-unstyled'>
	<@chItem>
		<@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' >
			<@cCascading id='cascadSolo1' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo2' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo3' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo4' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo5' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo6' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo7' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo8' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cText class="mt-m"><@cBtn label='Text example' class='primary' /></@cText>
		</@cCard>
	</@chItem>
	<@chItem>
		<@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' class='secondary' >
			<@cCascading id='cascadSolo9' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo10' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo11' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo12' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo13' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo14' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo15' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cCascading id='cascadSolo16' title='Text example'>
				<@cText>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
			</@cCascading>
			<@cText class="mt-m"><@cBtn label='Text example' class='expand' /></@cText>
		</@cCard>
	</@chItem>
</@chList>

<h4>
Vertical</h4>
<ul class="list-unstyled" >
<li>
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p class="text-end">
<button class="btn btn-primary mt-m" type="submit">
<span class="btn-label ">Text example</span>
</button>
</p>
</div>
</div>
</li>
<li>
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</div>
</li>
<li>
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
</div>
</div>
</li>
<li>
<div class="card ">
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p class="text-end">
<button class="btn btn-primary mt-m" type="submit">
<span class="btn-label ">Text example</span>
</button>
</p>
</div>
</div>
</li>
</ul>
<h4>
Vertical Secondary</h4>
<ul class="list-unstyled" >
<li>
<div class="card secondary">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p class="text-end">
<button class="btn btn-primary mt-m" type="submit">
<span class="btn-label ">Text example</span>
</button>
</p>
</div>
</div>
</li>
<li>
<div class="card secondary">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</div>
</li>
<li>
<div class="card secondary">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
</div>
</div>
</li>
<li>
<div class="card secondary">
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p class="text-end">
<button class="btn btn-primary mt-m" type="submit">
<span class="btn-label ">Text example</span>
</button>
</p>
</div>
</div>
</li>
</ul>
<h4>
Horizontal</h4>
<ul class="list-unstyled" >
<li>
<div class="card ">
<div class="row m-0">
<div class="col-12 col-md-4 p-0">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
</div>
<div class="col-12 col-md-8 p-0">
<div class="card-body">
<h3 class="card-title">
Title example
</h3>
<div class="d-md-flex justify-content-between align-items-end text-end">
<p class="card-text text-start me-l">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<button class="btn btn-primary text-end" type="submit">
<span class="btn-label ">Text example</span>
</button>
</div>
</div>
</div>
</div>
</div>
</li>
<li>
<div class="card ">
<div class="row m-0">
<div class="col-12 col-md-4 p-0">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
</div>
<div class="col-12 col-md-8 p-0">
<div class="card-body">
<h3 class="card-title">
Title example
</h3>
<div class="d-md-flex justify-content-between align-items-end text-end">
<p class="card-text text-start me-l">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</div>
</div>
</div>
</div>
</li>
<li>
<div class="card ">
<div class="row m-0">
<div class="col p-0">
<div class="card-body">
<h3 class="card-title">
Title example
</h3>
<div class="d-md-flex justify-content-between align-items-end text-end">
<p class="card-text text-start me-l">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<button class="btn btn-primary text-end" type="submit">
<span class="btn-label ">Text example</span>
</button>
</div>
</div>
</div>
</div>
</div>
</li>
</ul>
<h4>
Horizontal Secondary</h4>
<ul class="list-unstyled" >
<li>
<div class="card secondary">
<div class="row m-0">
<div class="col-12 col-md-4 p-0">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
</div>
<div class="col-12 col-md-8 p-0">
<div class="card-body">
<h3 class="card-title">
Title example
</h3>
<div class="d-md-flex justify-content-between align-items-end text-end">
<p class="card-text text-start me-l">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<button class="btn btn-primary text-end" type="submit">
<span class="btn-label ">Text example</span>
</button>
</div>
</div>
</div>
</div>
</div>
</li>
<li>
<div class="card secondary">
<div class="row m-0">
<div class="col-12 col-md-4 p-0">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
</div>
<div class="col-12 col-md-8 p-0">
<div class="card-body">
<h3 class="card-title">
Title example
</h3>
<div class="d-md-flex justify-content-between align-items-end text-end">
<p class="card-text text-start me-l">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</div>
</div>
</div>
</div>
</li>
<li>
<div class="card secondary">
<div class="row m-0">
<div class="col p-0">
<div class="card-body">
<h3 class="card-title">
Title example
</h3>
<div class="d-md-flex justify-content-between align-items-end text-end">
<p class="card-text text-start me-l">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<button class="btn btn-primary text-end" type="submit">
<span class="btn-label ">Text example</span>
</button>
</div>
</div>
</div>
</div>
</div>
</li>
</ul>
<h4>
Cartes depliantes</h4>
<ul class="list-unstyled" >
<li>
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<details id='cascadSolo1' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo2' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo3' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo4' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo5' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo6' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo7' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo8' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<p class="mt-m">
<button class="btn btn-primary" type="submit">
<span class="btn-label ">Text example</span>
</button>
</p>
</div>
</div>
</li>
<li>
<div class="card secondary">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<details id='cascadSolo9' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo10' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo11' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo12' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo13' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo14' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo15' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<details id='cascadSolo16' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">Text example</span></summary>
<div class="cascading-content">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</details>
<p class="mt-m">
<button class="btn btn-expand" type="submit">
<span class="btn-label ">Text example</span>
</button>
</p>
</div>
</div>
</li>
</ul>

Paramètres

Generates a card component with optional image, title, subtitle, header, footer, and support for vertical or horizontal orientation.

  • title (string)
    optional
    - The card title text. Default: ''
  • titleClass (string)
    optional
    - CSS class(es) for the card title. Default: ''
  • titleLevel (number)
    optional
    - Heading level for the title. Default: 3
  • titleUrl (string)
    optional
    - URL to make the title a link. Default: ''
  • titleUrlTitle (string)
    optional
    - Title attribute for the title link. Default: ''
  • subtitle (string)
    optional
    - Subtitle text for the card. Default: ''
  • subtitleClass (string)
    optional
    - CSS class(es) for the subtitle. Default: ''
  • subtitleLevel (number)
    optional
    - Heading level for the subtitle. Default: 4
  • class (string)
    optional
    - Additional CSS class(es) for the card container. Default: ''
  • id (string)
    optional
    - The unique identifier for the card. Default: ''
  • img (string)
    optional
    - Image source URL for the card. Default: ''
  • imgType (string)
    optional
    - Image type ('svg' for inline SVG). Default: ''
  • imgClass (string)
    optional
    - CSS class(es) for the image container. Default: ''
  • imgAlt (string)
    optional
    - Alt text for the card image. Default: ''
  • header (string)
    optional
    - Header text displayed above the image. Default: ''
  • headerLevel (number)
    optional
    - Heading level for the header. Default: 0
  • headerClass (string)
    optional
    - CSS class(es) for the header container. Default: ''
  • headerLabelClass (string)
    optional
    - CSS class(es) for the header text. Default: ''
  • headerImg (string)
    optional
    - Background image URL for the header. Default: ''
  • subHeader (string)
    optional
    - Sub-header text for the card. Default: ''
  • subHeaderClass (string)
    optional
    - CSS class(es) for the sub-header. Default: ''
  • footer (string)
    optional
    - Footer text for the card. Default: ''
  • footerClass (string)
    optional
    - CSS class(es) for the footer. Default: ''
  • orientation (string)
    optional
    - Card layout orientation ('v' for vertical, other for horizontal). Default: 'v'
  • vcolsInit (number)
    optional
    - Initial column size for smallest screens (0 disables responsive). Default: 12
  • vcols (object)
    optional
    - Column ratio between image and content for horizontal layout. Default: [4,8]
  • hoverEffect (boolean)
    optional
    - If true, adds a hover effect on the card image. Default: true
  • params (string)
    optional
    - Additional HTML attributes for the card. Default: ''

Carte flottante

macro @cCardFloating

Doc Bootstrap Carte flottante

Generates a floating card overlay with an optional close button, suitable for contextual information panels.

Exemple

Carte Flotante

  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Carte Flotante

  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Votre sélection

  • 3 x Entrée plein tarif à 3,50 €

    10,50 €

  • 2 x Entrée plein tarif à 28,00 €

    56,00 €

  • Total : 67,00 €

Carte Flotante Secondary

  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  • Lorem ipsum dolor sit amet, consectetur adipiscing elit.

Votre sélection

  • 3 x Entrée plein tarif à 3,50 €

    10,50 €

  • 2 x Entrée plein tarif à 28,00 €

    56,00 €

  • Total : 67,00 €

<#assign ls = [
{"title":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "url":"https://paris.fr", "target":"_blank"},
{"title":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "url":"https://paris.fr", "target":"_blank"},
{"title":"Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "url":"https://paris.fr", "target":"_blank"}
]>
<@cRow>
    <@cCol>
        <@cBlock params='style="height: 450px; position: relative;"'>
            <@cCardFloating id='float' title='Carte Flotante' class='d-block'>
                <@cList items=ls class='list-highlight-secondary'/>
            </@cCardFloating>
        </@cBlock>
    </@cCol>
    <@cCol>
        <@cBlock params='style="height: 450px; position: relative;"'>
            <@cCardFloating id='float' dismissible=false title='Carte Flotante' class='d-block'>
                <@cList items=ls class='list-highlight-secondary'/>
            </@cCardFloating>
        </@cBlock>
    </@cCol>
    <@cCol>
        <@cBlock params='style="height: 450px; position: relative;"'>
            <@cCardFloating id='float' dismissible=false title='Votre sélection' class='d-block'>
                <@chList class='list-unstyled'>
                    <@chItem>
                        <@cText class='d-flex align-items-start'>3 x Entrée plein tarif à 3,50 €<@cBtn class='link p-0 ms-auto' label=''><@parisIcon class='main-danger-color pe-0' name='close' /></@cBtn></@cText>
                        <@cText class='mt-0 fw-bold'>10,50 €</@cText>
                    </@chItem>
                    <@chItem>
                        <@cText class='d-flex align-items-start'>2 x Entrée plein tarif à 28,00 €<@cBtn class='link p-0 ms-auto' label=''><@parisIcon class='main-danger-color pe-0' name='close' /></@cBtn></@cText>
                        <@cText class='mt-0 fw-bold'>56,00 €</@cText>
                    </@chItem>
                    <@chItem><@cText>Total : <@cInline type='strong'>67,00 €</@cInline></@cText></@chItem>
                </@chList>
            </@cCardFloating>
        </@cBlock>
    </@cCol>
</@cRow>
<@cRow>
    <@cCol>
        <@cBlock params='style="height: 450px; position: relative;"'>
            <@cCardFloating id='float2' title='Carte Flotante Secondary' class='d-block secondary'>
                <@cList items=ls class='list-highlight-secondary'/>
            </@cCardFloating>
        </@cBlock>
    </@cCol>
    <@cCol>
        <@cBlock params='style="height: 450px; position: relative;"'>
            <@cCardFloating id='float2' title='Votre sélection' class='d-block secondary' dismissible=false >
                <@chList class='list-unstyled'>
                    <@chItem>
                        <@cText class='d-flex align-items-start'>3 x Entrée plein tarif à 3,50 €<@cBtn class='link p-0 ms-auto' label=''><@parisIcon class='main-danger-color pe-0' name='close' /></@cBtn></@cText>
                        <@cText class='mt-0 fw-bold'>10,50 €</@cText>
                    </@chItem>
                    <@chItem>
                        <@cText class='d-flex align-items-start'>2 x Entrée plein tarif à 28,00 €<@cBtn class='link p-0 ms-auto' label=''><@parisIcon class='main-danger-color pe-0' name='close' /></@cBtn></@cText>
                        <@cText class='mt-0 fw-bold'>56,00 €</@cText>
                    </@chItem>
                    <@chItem><@cText>Total : <@cInline type='strong'>67,00 €</@cInline></@cText></@chItem>
                </@chList>
            </@cCardFloating>
        </@cBlock>
    </@cCol>
</@cRow>

<div class="row ">
<div class="col ">
<div style="height: 450px; position: relative;">
<div class="card card-floating d-block" id="float-card" >
<div class="card-title-container">
<h3 class="card-title">
Carte Flotante</h3>
<button type="button" class="btn-close" aria-label="Close" data-bs-target="#float-card" data-bs-dismiss="alert" title="Close"></button>
</div>
<div class="card-body">
<ul class="custom-list list-default list-highlight-secondary" >
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." target="_blank">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." target="_blank">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." target="_blank">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="col ">
<div style="height: 450px; position: relative;">
<div class="card card-floating d-block" id="float-card" >
<div class="card-title-container">
<h3 class="card-title">
Carte Flotante</h3>
</div>
<div class="card-body">
<ul class="custom-list list-default list-highlight-secondary" >
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." target="_blank">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." target="_blank">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." target="_blank">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="col ">
<div style="height: 450px; position: relative;">
<div class="card card-floating d-block" id="float-card" >
<div class="card-title-container">
<h3 class="card-title">
Votre sélection</h3>
</div>
<div class="card-body">
<ul class="list-unstyled" >
<li>
<p class="d-flex align-items-start">
3 x Entrée plein tarif à 3,50 €
<button class="btn btn-link p-0 ms-auto" type="submit">
<svg class="paris-icon paris-icon-close main-danger-color pe-0"data-mce-svg="paris-icon paris-icon-close" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-close"></use>
</svg>
</button>
</p>
<p class="mt-0 fw-bold">
10,50 €</p>
</li>
<li>
<p class="d-flex align-items-start">
2 x Entrée plein tarif à 28,00 €
<button class="btn btn-link p-0 ms-auto" type="submit">
<svg class="paris-icon paris-icon-close main-danger-color pe-0"data-mce-svg="paris-icon paris-icon-close" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-close"></use>
</svg>
</button>
</p>
<p class="mt-0 fw-bold">
56,00 €</p>
</li>
<li>
<p>
Total :
<strong>
67,00 €</strong>
</p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="row ">
<div class="col ">
<div style="height: 450px; position: relative;">
<div class="card card-floating d-block secondary" id="float2-card" >
<div class="card-title-container">
<h3 class="card-title">
Carte Flotante Secondary</h3>
<button type="button" class="btn-close" aria-label="Close" data-bs-target="#float2-card" data-bs-dismiss="alert" title="Close"></button>
</div>
<div class="card-body">
<ul class="custom-list list-default list-highlight-secondary" >
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." target="_blank">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." target="_blank">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Lorem ipsum dolor sit amet, consectetur adipiscing elit." target="_blank">
<span>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </span>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="col ">
<div style="height: 450px; position: relative;">
<div class="card card-floating d-block secondary" id="float2-card" >
<div class="card-title-container">
<h3 class="card-title">
Votre sélection</h3>
</div>
<div class="card-body">
<ul class="list-unstyled" >
<li>
<p class="d-flex align-items-start">
3 x Entrée plein tarif à 3,50 €
<button class="btn btn-link p-0 ms-auto" type="submit">
<svg class="paris-icon paris-icon-close main-danger-color pe-0"data-mce-svg="paris-icon paris-icon-close" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-close"></use>
</svg>
</button>
</p>
<p class="mt-0 fw-bold">
10,50 €</p>
</li>
<li>
<p class="d-flex align-items-start">
2 x Entrée plein tarif à 28,00 €
<button class="btn btn-link p-0 ms-auto" type="submit">
<svg class="paris-icon paris-icon-close main-danger-color pe-0"data-mce-svg="paris-icon paris-icon-close" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-close"></use>
</svg>
</button>
</p>
<p class="mt-0 fw-bold">
56,00 €</p>
</li>
<li>
<p>
Total :
<strong>
67,00 €</strong>
</p>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>

Paramètres

Generates a floating card overlay with an optional close button, suitable for contextual information panels.

  • id (string)
    required
    - The unique identifier for the floating card
  • title (string)
    optional
    - The card title text. Default: ''
  • titleLevel (number)
    optional
    - Heading level for the title. Default: 3
  • class (string)
    optional
    - Additional CSS class(es) for the floating card. Default: ''
  • dismissible (boolean)
    optional
    - If true, displays a close button. Default: true
  • params (string)
    optional
    - Additional HTML attributes for the floating card. Default: ''

Layout des cartes

macro @cCardLayout

Doc Bootstrap Layout des cartes

Exemple

Example défaut

Title example

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Title example

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Title example

Title example

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Example avec 3 col pour le breakpoint "md" ou 4 pour le breakpoint "lg"

Title example

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Title example

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Title example

Title example

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

<@cTitle level=4 class='ml-l'>Example défaut</@cTitle>
<@cCardLayout class='mt-0'>
    <@cCol>
        <@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' >
            <@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
            <@cBlock class='text-end'><@cBtn label='Text example' class='primary mt-m' /></@cBlock>
        </@cCard>
    </@cCol>
    <@cCol>
        <@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' >
            <@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
        </@cCard>
    </@cCol>
    <@cCol>
        <@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' />
    </@cCol>
    <@cCol>
        <@cCard title='Title example'>
            <@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
            <@cBlock class='text-end'><@cBtn label='Text example' class='primary mt-m' /></@cBlock>
        </@cCard>
    </@cCol>
</@cCardLayout>
<@cTitle level=4 class='ml-l'>Example avec 3 col pour le breakpoint "md" ou 4 pour le breakpoint "lg"</@cTitle>
<@cCardLayout class='mt-0' rowCols='md-3 row-lg-4'>
    <@cCol>
        <@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' >
            <@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
            <@cBlock class='text-end'><@cBtn label='Text example' class='primary mt-m' /></@cBlock>
        </@cCard>
    </@cCol>
    <@cCol>
        <@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' >
            <@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
        </@cCard>
    </@cCol>
    <@cCol>
        <@cCard title='Title example' img='images/paul-dufour-5XndD3FhH-w-unsplash.png' />
    </@cCol>
    <@cCol>
        <@cCard title='Title example'>
            <@cText class="card-text">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
            <@cBlock class='text-end'><@cBtn label='Text example' class='primary mt-m' /></@cBlock>
        </@cCard>
    </@cCol>
</@cCardLayout>

<h4 class="ml-l">
Example défaut</h4>
<div class="row g-4 row-cols-1 row-cols-md-3 mt-0">
<div class="col ">
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<div class="text-end">
<button class="btn btn-primary mt-m" type="submit">
<span class="btn-label ">Text example</span>
</button>
</div>
</div>
</div>
</div>
<div class="col ">
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</div>
</div>
<div class="col ">
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
</div>
</div>
</div>
<div class="col ">
<div class="card ">
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<div class="text-end">
<button class="btn btn-primary mt-m" type="submit">
<span class="btn-label ">Text example</span>
</button>
</div>
</div>
</div>
</div>
</div>
<h4 class="ml-l">
Example avec 3 col pour le breakpoint "md" ou 4 pour le breakpoint "lg"</h4>
<div class="row g-4 row-cols-1 row-cols-md-3 row-lg-4 mt-0">
<div class="col ">
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<div class="text-end">
<button class="btn btn-primary mt-m" type="submit">
<span class="btn-label ">Text example</span>
</button>
</div>
</div>
</div>
</div>
<div class="col ">
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</div>
</div>
</div>
<div class="col ">
<div class="card ">
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title example</h3>
</div>
</div>
</div>
<div class="col ">
<div class="card ">
<div class="card-body">
<h3 class="card-title">
Title example</h3>
<p class="card-text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<div class="text-end">
<button class="btn btn-primary mt-m" type="submit">
<span class="btn-label ">Text example</span>
</button>
</div>
</div>
</div>
</div>
</div>

Paramètres

Generates a grid layout container for organizing multiple cards in group, deck, or masonry column modes.

  • type (string)
    optional
    - Layout type ('group', 'deck', 'columns'). Default: 'group'
  • rowCols (string)
    optional
    - Number of columns per row for deck layout. Default: ''
  • class (string)
    optional
    - Additional CSS class(es) for the grid container. Default: ''
  • id (string)
    optional
    - The unique identifier for the card layout. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the card layout. Default: ''

Carrousel

macro @cCarousel

Doc Bootstrap Carrousel

La Macro cCarousel permet de générer un carrousel d'images ou de vidéos avec des contrôles de navigation, une pagination et des boutons de lecture/pause optionnels.

Exemple

Example 1

Le hasard

Fait bien

Mais pas que...

Les choses

Example 2

Le hasard

Fait bien

Mais pas que...

Les choses

Example 3

  1. 1
  2. 2
  3. 3

Le hasard

Fait bien

Mais pas que...

Les choses

Example 4

Le hasard

Fait bien

Mais pas que...

Les choses

<@cTitle level=4>Example 1</@cTitle>
<@cCarousel id='manege1' items='' labelPrev='' labelNext=''>
  <@cCarouselItem img='images/alexander-kagan-t9Td0zfDTwI-unsplash.png' active=true title='Le hasard' />
  <@cCarouselItem img='images/adrien-xplr-wAScP0OY-yM-unsplash.png' title='Fait bien' subtitle='Mais pas que...' />
  <@cCarouselItem img='images/paul-dufour-5XndD3FhH-w-unsplash.png' title='Les choses' />
</@cCarousel>
<@cTitle level=4>Example 2</@cTitle>
<@cCarousel id='manege2' items='' controls=true labelPrev='' labelNext=''>
  <@cCarouselItem img='images/paul-dufour-5XndD3FhH-w-unsplash.png' active=true title='Le hasard' />
  <@cCarouselItem img='images/adrien-xplr-wAScP0OY-yM-unsplash.png' title='Fait bien' subtitle='Mais pas que...' />
  <@cCarouselItem img='images/alexander-kagan-t9Td0zfDTwI-unsplash.png' title='Les choses' />
</@cCarousel>
<@cTitle level=4>Example 3</@cTitle>
<@cCarousel id='manege3' items='' controls=true pagination=true indicatorSize=3 labelPrev='' labelNext=''>
  <@cCarouselItem img='images/adrien-xplr-wAScP0OY-yM-unsplash.png' active=true title='Le hasard' />
  <@cCarouselItem img='images/alexander-kagan-t9Td0zfDTwI-unsplash.png' title='Fait bien' subtitle='Mais pas que...' />
  <@cCarouselItem img='images/paul-dufour-5XndD3FhH-w-unsplash.png' title='Les choses' />
</@cCarousel>
<@cTitle level=4>Example 4</@cTitle>
<@cCarousel id='manege4' items='' slideControls=true labelPrev='' labelNext=''>
  <@cCarouselItem img='images/adrien-xplr-wAScP0OY-yM-unsplash.png' active=true title='Le hasard' />
  <@cCarouselItem img='images/paul-dufour-5XndD3FhH-w-unsplash.png' title='Fait bien' subtitle='Mais pas que...' />
  <@cCarouselItem img='images/alexander-kagan-t9Td0zfDTwI-unsplash.png' title='Les choses' />
</@cCarousel>

<h4>
Example 1</h4>
<div id="manege1" class="carousel slide carousel-themed show-neighbors" data-bs-ride="carousel" aria-roledescription="carousel" aria-label="Carousel">
<div class="carousel-inner">
<div class="carousel-item active" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/alexander-kagan-t9Td0zfDTwI-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Le hasard</h3>
<p></p>
</div>
</div>
</div>
<div class="carousel-item" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/adrien-xplr-wAScP0OY-yM-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Fait bien</h3>
<p>Mais pas que...</p>
</div>
</div>
</div>
<div class="carousel-item" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Les choses</h3>
<p></p>
</div>
</div>
</div>
</div>
</div>
<script type="module" src="themes/skin/parisfr/js//modules/theme-carousel.js"></script>
<h4>
Example 2</h4>
<div id="manege2" class="carousel slide carousel-themed show-neighbors" data-bs-ride="carousel" aria-roledescription="carousel" aria-label="Carousel">
<div class="carousel-inner">
<div class="carousel-item active" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Le hasard</h3>
<p></p>
</div>
</div>
</div>
<div class="carousel-item" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/adrien-xplr-wAScP0OY-yM-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Fait bien</h3>
<p>Mais pas que...</p>
</div>
</div>
</div>
<div class="carousel-item" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/alexander-kagan-t9Td0zfDTwI-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Les choses</h3>
<p></p>
</div>
</div>
</div>
</div>
<button class="carousel-control-prev" data-bs-target="#manege2" data-bs-slide="prev" aria-label="élément précédent">
<span class="carousel-bg-control">
<svg class="paris-icon paris-icon-arrow-left"data-mce-svg="paris-icon paris-icon-arrow-left" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-left"></use>
</svg> <span class="visually-hidden"></span>
</span>
</button>
<button class="carousel-control-next" data-bs-target="#manege2" data-bs-slide="next" aria-label="élément suivant">
<span class="carousel-bg-control">
<svg class="paris-icon paris-icon-arrow-right"data-mce-svg="paris-icon paris-icon-arrow-right" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-right"></use>
</svg> <span class="visually-hidden"></span>
</span>
</button>
</div>
<script type="module" src="themes/skin/parisfr/js//modules/theme-carousel.js"></script>
<h4>
Example 3</h4>
<div id="manege3" class="carousel slide carousel-themed show-neighbors" data-bs-ride="carousel" aria-roledescription="carousel" aria-label="Carousel">
<ol class="carousel-indicators pagination">
<li class="page-item active" data-bs-target="#manege3" data-bs-slide-to="0" aria-label="Slide 0" aria-selected="false" aria-controls="carousel-item-0" tabindex="0"><span class="page-link">1</span></li>
<li class="page-item" data-bs-target="#manege3" data-bs-slide-to="1" aria-label="Slide 1" aria-selected="false" aria-controls="carousel-item-1" tabindex="0"><span class="page-link">2</span></li>
<li class="page-item" data-bs-target="#manege3" data-bs-slide-to="2" aria-label="Slide 2" aria-selected="false" aria-controls="carousel-item-2" tabindex="0"><span class="page-link">3</span></li>
</ol>
<div class="carousel-inner">
<div class="carousel-item active" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/adrien-xplr-wAScP0OY-yM-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Le hasard</h3>
<p></p>
</div>
</div>
</div>
<div class="carousel-item" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/alexander-kagan-t9Td0zfDTwI-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Fait bien</h3>
<p>Mais pas que...</p>
</div>
</div>
</div>
<div class="carousel-item" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Les choses</h3>
<p></p>
</div>
</div>
</div>
</div>
<button class="carousel-control-prev" data-bs-target="#manege3" data-bs-slide="prev" aria-label="élément précédent">
<span class="carousel-bg-control">
<svg class="paris-icon paris-icon-arrow-left"data-mce-svg="paris-icon paris-icon-arrow-left" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-left"></use>
</svg> <span class="visually-hidden"></span>
</span>
</button>
<button class="carousel-control-next" data-bs-target="#manege3" data-bs-slide="next" aria-label="élément suivant">
<span class="carousel-bg-control">
<svg class="paris-icon paris-icon-arrow-right"data-mce-svg="paris-icon paris-icon-arrow-right" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-right"></use>
</svg> <span class="visually-hidden"></span>
</span>
</button>
</div>
<script type="module" src="themes/skin/parisfr/js//modules/theme-carousel.js"></script>
<h4>
Example 4</h4>
<div id="carouselButtons-manege4" class="d-flex justify-content-center py-2">
<button id="playButton-manege4" type="button" class="btn btn-tertiary" size="mini" aria-label="Démarrer la lecture du carrousel">
<svg class="paris-icon paris-icon-play"data-mce-svg="paris-icon paris-icon-play" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-play"></use>
</svg> </button>
<button id="pauseButton-manege4" type="button" class="btn btn-tertiary" size="mini" aria-label="Mettre le carrousel en pause">
<svg class="paris-icon paris-icon-refresh"data-mce-svg="paris-icon paris-icon-refresh" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-refresh"></use>
</svg> </button>
<button id="stopButton-manege4" type="button" class="btn btn-tertiary" size="mini" aria-label="Arrêter le carrousel et revenir à la première diapositive">
<svg class="paris-icon paris-icon-close"data-mce-svg="paris-icon paris-icon-close" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-close"></use>
</svg> </button>
</div>
<div id="manege4" class="carousel slide carousel-themed show-neighbors" data-bs-ride="carousel" aria-roledescription="carousel" aria-label="Carousel">
<div class="carousel-inner">
<div class="carousel-item active" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/adrien-xplr-wAScP0OY-yM-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Le hasard</h3>
<p></p>
</div>
</div>
</div>
<div class="carousel-item" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Fait bien</h3>
<p>Mais pas que...</p>
</div>
</div>
</div>
<div class="carousel-item" id="manege-item-1" role="group" aria-roledescription="slide" aria-label="1 of 1">
<div class="item__third">
<img src="images/alexander-kagan-t9Td0zfDTwI-unsplash.png" class="d-block w-100" alt="">
<div class="carousel-caption">
<h3>
Les choses</h3>
<p></p>
</div>
</div>
</div>
</div>
</div>
<script type="module" src="themes/skin/parisfr/js//modules/theme-carousel.js"></script>
<script>
document.addEventListener("DOMContentLoaded", function (event) {
var carouselElement = document.getElementById('manege4');
var carousel = bootstrap.Carousel.getOrCreateInstance(carouselElement);
document.getElementById('playButton-manege4').addEventListener('click', function () {
carousel.cycle();
});
document.getElementById('pauseButton-manege4').addEventListener('click', function () {
carousel.pause();
});
document.getElementById('stopButton-manege4').addEventListener('click', function () {
carousel.pause();
carousel.to(0);
});
});
</script>

Paramètres

Generates an image or video carousel with optional navigation controls, pagination, and play/pause buttons.

  • id (string)
    optional
    - The unique identifier for the carousel. Default: 'manege'
  • items (object)
    optional
    - List of carousel item objects (with 'img', 'alt', 'title', 'subTitle', 'class'). If empty, nested content is used. Default: ''
  • indicatorSize (number)
    optional
    - Number of pagination indicators (auto-calculated from items if provided). Default: 1
  • controls (boolean)
    optional
    - If true, shows previous/next navigation arrows. Default: false
  • slideControls (boolean)
    optional
    - If true, shows play/pause/stop buttons. Default: false
  • pagination (boolean)
    optional
    - If true, shows numbered pagination indicators. Default: false
  • label (string)
    optional
    - The aria-label for the carousel. Default: 'Carousel'
  • labelPrev (string)
    optional
    - Label for the previous button. Default: ''
  • labelNext (string)
    optional
    - Label for the next button. Default: ''
  • class (string)
    optional
    - Additional CSS class(es) for the carousel. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the carousel. Default: ''

Cascading

macro @cCascading

La Macro cCascading permet de générer un élément details/summary rétractable qui affiche ou masque le contenu au clic.

Exemple

nested 1
nested 2

Contenu

nested 3

Titre

Contenu

nested 4

Contenu

nested 1

contenu

Aménagements piétonniers végétalisés

Contenu

Passage piétonnier sous porche à conserver

Contenu

Plafonnement des hauteurs : 31m

Contenu

Secteur de dispositions particulières : Site Miollis

UG 3.1.3 Implantation des constructions en vis-à-vis sur un même terrain

UG.3.2.6 Gabarit-enveloppe* des constructions en vis-à-vis sur un même terrain*

<@cCascading id='cascad1' title='nested 1' state=true>
    <@cCascading id='cascad2' title='nested 2'><@cText>Contenu</@cText></@cCascading>
    <@cCascading id='cascad3' title='nested 3'><@cTitle level=3>Titre</@cTitle><@cText>Contenu</@cText></@cCascading>
    <@cCascading id='cascad4' title='nested 4'><@cText>Contenu</@cText></@cCascading>
</@cCascading>
<@cCascading id='cascadSolo1' title='nested 1'><@cText>contenu</@cText></@cCascading>
<@cCascading id='cascadFile1' class='cascading-files' title='Aménagements piétonniers végétalisés'><@cText>Contenu</@cText></@cCascading>
<@cCascading id='cascadFile2' class='cascading-files' title='Passage piétonnier sous porche à conserver'><@cText>Contenu</@cText></@cCascading>
<@cCascading id='cascadFile3' class='cascading-files' title='Plafonnement des hauteurs : 31m'><@cText>Contenu</@cText></@cCascading>
<@cCascading id='cascadFile4' class='cascading-files' title='Secteur de dispositions particulières : Site Miollis' state=true>
    <@cText>UG 3.1.3 Implantation des constructions en vis-à-vis sur un même terrain</@cText>
    <@cText>UG.3.2.6 Gabarit-enveloppe* des constructions en vis-à-vis sur un même terrain*</@cText>
</@cCascading>

<details id='cascad1' class="cascading " open aria-expanded="true" >
<summary><span class="cascading-label ">nested 1</span></summary>
<div class="cascading-content"> <details id='cascad2' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">nested 2</span></summary>
<div class="cascading-content">
<p>
Contenu</p>
</div>
</details>
<details id='cascad3' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">nested 3</span></summary>
<div class="cascading-content">
<h3>
Titre</h3>
<p>
Contenu</p>
</div>
</details>
<details id='cascad4' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">nested 4</span></summary>
<div class="cascading-content">
<p>
Contenu</p>
</div>
</details>
</div>
</details>
<details id='cascadSolo1' class="cascading " aria-expanded="false" >
<summary><span class="cascading-label ">nested 1</span></summary>
<div class="cascading-content">
<p>
contenu</p>
</div>
</details>
<details id='cascadFile1' class="cascading cascading-files" aria-expanded="false" >
<summary><span class="cascading-label ">Aménagements piétonniers végétalisés</span></summary>
<div class="cascading-content">
<p>
Contenu</p>
</div>
</details>
<details id='cascadFile2' class="cascading cascading-files" aria-expanded="false" >
<summary><span class="cascading-label ">Passage piétonnier sous porche à conserver</span></summary>
<div class="cascading-content">
<p>
Contenu</p>
</div>
</details>
<details id='cascadFile3' class="cascading cascading-files" aria-expanded="false" >
<summary><span class="cascading-label ">Plafonnement des hauteurs : 31m</span></summary>
<div class="cascading-content">
<p>
Contenu</p>
</div>
</details>
<details id='cascadFile4' class="cascading cascading-files" open aria-expanded="true" >
<summary><span class="cascading-label ">Secteur de dispositions particulières : Site Miollis</span></summary>
<div class="cascading-content">
<p>
UG 3.1.3 Implantation des constructions en vis-à-vis sur un même terrain</p>
<p>
UG.3.2.6 Gabarit-enveloppe* des constructions en vis-à-vis sur un même terrain*</p>
</div>
</details>

Paramètres

Generates a collapsible details/summary element that reveals or hides content on click.

  • title (string)
    required
    - The label displayed in the summary toggle
  • id (string)
    optional
    - The unique identifier for the cascading element. Default: ''
  • class (string)
    optional
    - Additional CSS class(es) for the cascading container. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the cascading element. Default: ''
  • state (boolean)
    optional
    - If true, the element is open on page load. Default: false

Gestion du consentement

macro @cConsentTac

La Macro cConsentTac permet la gestion du consentement en utilisant la librairie TarteAuCitron.

Exemple

La Macro cConsentTac permet la gestion du consentement en utilisant la librairie TarteAuCitron .

Vous pouvez cliquer sur le bouton "Cookie" situé en bas à droite de cet écran pour visualiser la fenêtre de gestion des cookies.

<@cConsentTac title=favourite />
<#-- Tarte au Citron Service : MonParis -default- -->
<@cConsentTacService />
<#-- Tarte au Citron Service : Matomo  -->
<@cConsentTacService code='matomohightrack'>
${matomo!}
 </@cConsentTacService>
</@cConsentTac>

<p class="lead">
La Macro cConsentTac permet la gestion du consentement en utilisant la librairie
<a href="https://tarteaucitron.io/fr/install/" class="" target="_blank" >
<span class="link-label">TarteAuCitron</span>
</a>
.</p>
<p class="lead">
Vous pouvez cliquer sur le bouton "Cookie" situé en bas à droite de cet écran pour visualiser la fenêtre de gestion des cookies.</p>

Paramètres

Generates a CNIL-compliant cookie consent banner using the TarteAuCitron library (https://tarteaucitron.io).

  • title (string)
    optional
    - The consent banner title. Default: 'Ce site'
  • privacyLink (string)
    optional
    - URL to the privacy policy page. Default: ''
  • denyAll (boolean)
    optional
    - If true, shows a "Deny all" button. Default: false
  • cookieMenu (string)
    optional
    - Label for the cookie management footer link. Default: 'Gestion des cookies'
  • cookiePolicyLink (string)
    optional
    - URL to the cookie policy page. Default: ''
  • hashtag (string)
    optional
    - Hashtag identifier for the consent management modal. Default: 'cookiepolicy'
  • cookiename (string)
    optional
    - Name of the consent cookie. Default: 'cookiepageId'
  • nocredit (boolean)
    optional
    - If true, hides the TarteAuCitron credits. Default: false

Menu déroulant

Doc Bootstrap Menu déroulant

Generates a dropdown button with a toggleable menu, populated from an items list or nested content.

Exemple

  • Edit
  • Archive

  • Profile

  • Logout

<@cDropdown label='Actions' items=[
    {'label': 'Edit', 'action': 'jsp/site/Portal.jsp?page=edit', 'active': 'false', 'disabled': 'false'},
    {'label': 'Archive', 'action': 'jsp/site/Portal.jsp?page=archive', 'active': 'false', 'disabled': 'false'}
] />

<@cDropdown label='More options' btnClass='primary'>
    <@cDropdownItem label='Profile' action='jsp/site/Portal.jsp?page=profile' />
    <@cDropdownItemDivider />
    <@cDropdownItem label='Logout' action='jsp/site/Portal.jsp?page=logout' />
</@cDropdown>

<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
Actions
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="jsp/site/Portal.jsp?page=edit">Edit</a></li>
<li><a class="dropdown-item" href="jsp/site/Portal.jsp?page=archive">Archive</a></li>
</ul>
</div>
<br />
<div class="dropdown">
<button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
More options
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="">
Profile
</a>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" href="">
Logout
</a>
</li>
</ul>
</div>

Paramètres

Generates a dropdown button with a toggleable menu, populated from an items list or nested content.

  • label (string)
    required
    - The button label text
  • items (object)
    optional
    - List of menu items with 'label', 'action', 'active', and 'disabled' attributes. Default: []
  • itemType (string)
    optional
    - Item rendering type ('link' for anchors, other for buttons). Default: 'link'
  • type (string)
    optional
    - Dropdown type ('split' for split button). Default: ''
  • centered (boolean)
    optional
    - If true, centers the dropdown in a button group. Default: false
  • dropup (boolean)
    optional
    - If true, opens the menu upward. Default: false
  • autoclose (string)
    optional
    - Auto-close behavior ('inside', 'outside', 'true', 'false'). Default: ''
  • nobutton (boolean)
    optional
    - If true, hides the toggle button. Default: false
  • header (string)
    optional
    - Header text for the dropdown menu. Default: ''
  • dark (boolean)
    optional
    - If true, uses a dark-themed menu. Default: false
  • dropDownMenuType (string)
    optional
    - HTML element type for the menu ('ul' or 'div'). Default: 'ul'
  • class (string)
    optional
    - Additional CSS class(es) for the dropdown container. Default: ''
  • btnClass (string)
    optional
    - CSS class for the button style ('primary', 'secondary', 'tertiary', 'danger'). Default: 'secondary'
  • noclass (boolean)
    optional
    - If true, removes default button classes. Default: false
  • id (string)
    optional
    - The unique identifier for the dropdown. Default: ''
  • disabled (boolean)
    optional
    - If true, disables the dropdown button. Default: false
  • params (string)
    optional
    - Additional HTML attributes for the dropdown. Default: ''

Message d'erreur

macro @cErrorMessage

Generates a full-page error message with a danger alert, optional navigation links, and a home button.

Exemple

Error

Page not found

The page you are looking for does not exist.

Home

Error

Access denied

You do not have permission to view this page.

  • Home
  • Sign in

<@cErrorMessage title='Page not found' text='The page you are looking for does not exist.' />

<@cErrorMessage title='Access denied' text='You do not have permission to view this page.' linkUrl='jsp/site/Portal.jsp?page=login' linkLabelUrl='Sign in' />

<div class="container d-flex align-items-center justify-content-center vh-50">
<div class="row ">
<div class="col ">
<div class="alert alert-outline alert-danger danger" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-danger"data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-510266617255161" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-510266617255161">Error</title>
<use href="#paris-icon-alert-danger"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Page not found</p>
</div>
</div>
<div class="alert-content">
<p>
The page you are looking for does not exist.</p>
</div>
</div>
<p class="text-center mt-l">
<a href="." class="btn btn-secondary" >
<span class="link-label">Home</span>
</a>
</p>
</div>
</div>
</div>
<div class="container d-flex align-items-center justify-content-center vh-50">
<div class="row ">
<div class="col ">
<div class="alert alert-outline alert-danger danger" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-danger"data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-519415567414931" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-519415567414931">Error</title>
<use href="#paris-icon-alert-danger"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Access denied</p>
</div>
</div>
<div class="alert-content">
<p>
You do not have permission to view this page.</p>
</div>
</div>
<ul class="list-unstyled d-flex justify-content-center gap-2 mt-l" >
<li>
<a href="." class="btn btn-secondary" >
<span class="link-label">Home</span>
</a>
</li>
<li>
<a href="jsp/site/Portal.jsp?page=login" class="btn btn-primary" >
<span class="link-label">Sign in</span>
</a>
</li>
</ul>
</div>
</div>
</div>

Paramètres

Generates a full-page error message with a danger alert, optional navigation links, and a home button.

  • title (string)
    required
    - The error title displayed in the alert
  • text (string)
    required
    - The error description text
  • linkUrl (string)
    optional
    - URL for an additional navigation link. Default: ''
  • linkLabelUrl (string)
    optional
    - Label text for the navigation link. Default: ''
  • id (string)
    optional
    - The unique identifier for the error container. Default: ''
  • class (string)
    optional
    - Additional CSS class(es) for the error container. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the error container. Default: ''

Filtre

macro @cFilter

Generates a toggleable filter panel with checkbox filters, search and clear buttons, and a result count display.

Exemple

12 results found
Filter's list

<@cFilter checkboxes=[
    {'id': 'filter-parks', 'title': 'Parks'},
    {'id': 'filter-libraries', 'title': 'Libraries'},
    {'id': 'filter-pools', 'title': 'Swimming pools'}
] result='12 results found' />

<div class="container filter-wrapper">
<div class="row justify-content-between align-items-center">
<span class="filter-result">
12 results found</span>
<button class="btn btn-secondary m-1 d-flex align-items-center w-auto filter-toggle-button" type="submit">
<svg class="paris-icon paris-icon-filter main-info-color me-3"data-mce-svg="paris-icon paris-icon-filter" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-filter"></use>
</svg><span class="btn-label ">Hide filters</span>
</button>
</div>
<div class="row filters-container ">
<fieldset class="d-flex m-0 px-0 flex-wrap w-auto" id="fieldset-id-532309268373551" role="group" aria-labelledby="legend-id-532309268373551">
<legend class="visually-hidden" id="legend-id-532309268373551" >Filter's list</legend>
<div class=" form-check btn-filter btn-selection">
<div class="selection-check">
<input type="checkbox" id="filter-parks" name="selectCheckbox" class="form-check-input" value="filter">
<label class="form-label form-check-label" for="filter-parks">
Parks
</label>
</div>
</div>
<div class=" form-check btn-filter btn-selection">
<div class="selection-check">
<input type="checkbox" id="filter-libraries" name="selectCheckbox" class="form-check-input" value="filter">
<label class="form-label form-check-label" for="filter-libraries">
Libraries
</label>
</div>
</div>
<div class=" form-check btn-filter btn-selection">
<div class="selection-check">
<input type="checkbox" id="filter-pools" name="selectCheckbox" class="form-check-input" value="filter">
<label class="form-label form-check-label" for="filter-pools">
Swimming pools
</label>
</div>
</div>
</fieldset>
<button class="btn btn-primary w-auto" type="submit">
<span class="btn-label ">Search</span>
</button>
<button class="btn btn-tertiary w-auto filter-erase-button" type="submit">
<span class="btn-label ">Clear all</span>
</button>
</div>
</div>
<script type="module">
import { themeFilter} from './themes/skin/parisfr/js/modules/theme-filter.js';
new themeFilter( null, {
labelShowFilter: 'Show filters',
labelHideFilter: 'Hide filters',
} );
</script>

Paramètres

Generates a toggleable filter panel with checkbox filters, search and clear buttons, and a result count display.

  • checkboxes (object)
    required
    - List of filter items, each with 'title' and 'id' attributes
  • id (string)
    optional
    - The unique identifier for the filter container. Default: ''
  • result (string)
    optional
    - Text displaying the filter result count. Default: ''
  • fieldSetLabel (string)
    optional
    - The legend text for the filter fieldset. Default: 'Liste de filtres'
  • showLegend (boolean)
    optional
    - If true, the fieldset legend is visible. Default: false
  • class (string)
    optional
    - Additional CSS class(es) for the filter container. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the filter container. Default: ''

Formulaire

macro @cForm

Doc Bootstrap Formulaire

Generates an HTML form container with configurable action, method, and ARIA attributes for front-office pages.

Exemple

<@cForm action='jsp/site/Portal.jsp'>
    <@cField label='Email' for='email' required=true>
        <@cInput name='email' id='email' type='email' />
    </@cField>
    <@cBtn type='submit' class='btn btn-primary' label='Submit' />
</@cForm>

<@cForm name='contact_form' role='Contact form' action='jsp/site/Portal.jsp' params='enctype="multipart/form-data"'>
    <@cField label='Message' for='message'>
        <@cTextArea name='message' id='message' rows=4 />
    </@cField>
    <@cBtn type='submit' class='btn btn-primary' label='Send' />
</@cForm>

<form action="jsp/site/Portal.jsp" method="post">
<label class="form-label" for="email">
Email <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="email" class=" form-control" name="email" id="email" value="" required aria-required="true">
<button class="btn btn-btn btn-primary" type="submit">
<span class="btn-label ">Submit</span>
</button>
</form>
<form action="jsp/site/Portal.jsp" method="post" name="contact_form" aria-label="Contact form" enctype="multipart/form-data">
<label class="form-label" for="message">
Message
</label>
<textarea class=" form-control" name="message" id="message" rows="4">
</textarea>
<button class="btn btn-btn btn-primary" type="submit">
<span class="btn-label ">Send</span>
</button>
</form>

Paramètres

Generates an HTML form container with configurable action, method, and ARIA attributes for front-office pages.

  • class (string)
    optional
    - CSS class for the form. Default: ''
  • id (string)
    optional
    - the ID of the form. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''
  • name (string)
    optional
    - the name attribute of the form. Default: ''
  • method (string)
    optional
    - the HTTP method. Default: 'post'
  • role (string)
    optional
    - ARIA label for the form. Default: ''
  • action (string)
    optional
    - the form action URL. Default: 'jsp/site/Portal.jsp'

Fieldset

macro @cFieldSet

Generates a fieldset with a legend and nested form fields.

Exemple

Etat-civil
Etat-civil 2
Etat-civil 3

<@cForm>
<@cFieldset legend='Etat-civil'>
<@cRow>
    <@cCol cols="12 col-sm-6">
        <@cField label='Prénom' for='firstNameF1' required=true>
            <@cInput name='firstNameF1' placeholder='Entrez le prénom' value='Martine' />
        </@cField>
    </@cCol>
    <@cCol cols="12 col-sm-6">
        <@cField label='Nom' for='lastNameF1' required=true>
            <@cInput name='lastNameF1' placeholder='Entrez le nom' value='DUPONTEL' />
        </@cField>
    </@cCol>
</@cRow>
</@cFieldset>
<@cFieldset legend='Etat-civil 2' showLabel=false>
<@cRow>
    <@cCol cols="12 col-sm-6">
        <@cField label='Prénom' for='firstNameF2' required=true>
            <@cInput name='firstNameF2' placeholder='Entrez le prénom' value='Martine' />
        </@cField>
    </@cCol>
    <@cCol cols="12 col-sm-6">
        <@cField label='Nom' for='lastNameF2' required=true>
            <@cInput name='lastNameF2' placeholder='Entrez le nom' value='DUPONTEL' />
        </@cField>
    </@cCol>
</@cRow>
</@cFieldset>
<@cFieldset legend='Etat-civil 3' legendClass='is-invalide' >
<@cRow>
    <@cCol cols="12 col-sm-6">
        <@cField label='Prénom' for='firstNameF3' required=true>
            <@cInput name='firstNameF3' placeholder='Entrez le prénom' value='Martine' />
        </@cField>
    </@cCol>
    <@cCol cols="12 col-sm-6">
        <@cField label='Nom' for='lastNameF3' required=true>
            <@cInput name='lastNameF3' placeholder='Entrez le nom' value='DUPONTEL' />
        </@cField>
    </@cCol>
</@cRow>
</@cFieldset>
</@cForm>

<form method="post">
<fieldset id="fieldset-fs1" role="group" aria-labelledby="legend-fs1">
<legend id="legend-fs1" >Etat-civil</legend>
<div class="row ">
<div class="col-12 col-sm-6 ">
<label class="form-label" for="firstNameF1">
Prénom <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="text" class=" form-control" name="firstNameF1" id="firstNameF1" value="Martine" placeholder="Entrez le prénom" aria-label="Entrez le prénom" required aria-required="true">
</div>
<div class="col-12 col-sm-6 ">
<label class="form-label" for="lastNameF1">
Nom <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="text" class=" form-control" name="lastNameF1" id="lastNameF1" value="DUPONTEL" placeholder="Entrez le nom" aria-label="Entrez le nom" required aria-required="true">
</div>
</div>
</fieldset>
<fieldset id="fieldset-fs2" role="group" aria-labelledby="legend-fs2">
<legend class=" visually-hidden" id="legend-fs2" >Etat-civil 2</legend>
<div class="row ">
<div class="col-12 col-sm-6 ">
<label class="form-label" for="firstNameF2">
Prénom <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="text" class=" form-control" name="firstNameF2" id="firstNameF2" value="Martine" placeholder="Entrez le prénom" aria-label="Entrez le prénom" required aria-required="true">
</div>
<div class="col-12 col-sm-6 ">
<label class="form-label" for="lastNameF2">
Nom <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="text" class=" form-control" name="lastNameF2" id="lastNameF2" value="DUPONTEL" placeholder="Entrez le nom" aria-label="Entrez le nom" required aria-required="true">
</div>
</div>
</fieldset>
<fieldset id="fieldset-fs3" role="group" aria-labelledby="legend-fs3">
<legend class="is-invalide" id="legend-fs3" >Etat-civil 3</legend>
<div class="row ">
<div class="col-12 col-sm-6 ">
<label class="form-label" for="firstNameF3">
Prénom <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="text" class=" form-control" name="firstNameF3" id="firstNameF3" value="Martine" placeholder="Entrez le prénom" aria-label="Entrez le prénom" required aria-required="true">
</div>
<div class="col-12 col-sm-6 ">
<label class="form-label" for="lastName">
Nom <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="text" class=" form-control" name="lastName" id="lastName" value="DUPONTEL" placeholder="Entrez le nom" aria-label="Entrez le nom" required aria-required="true">
</div>
</div>
</fieldset>
</form>

Paramètres

Voici la liste des différents paramètres de la macro :

  • legend (string)
    optionnal
    - définit le libellé de la légende du fieldset
  • legendClass (string)
    optionnal
    - permet d'ajouter une classe CSS à la légende du fieldset
  • role (string)
    optionnal
    - permet de définir la valeur de l'attribut 'role' du fieldset (par défaut: 'group')
  • helpMsg (string)
    optionnal
    - permet de définir le message d'aide sur le fieldset
  • helpPos (string)
    optionnal
    - par défaut "top" sinon "after" permet de définir la position le message d'aide sur le fieldset, par défaut au dessus du contenu après la légende
  • id (string)
    optionnal
    - l'ID du fieldset
  • class (string)
    optionnal
    - ajoute une classe CSS au fieldset
  • for (string)
    optionnal
    - permet de définir le lien entre le fieldset et l'ID précisé
  • showLabel (boolean)
    optionnal
    - permet d'afficher la légende (par défaut: true)
  • required (boolean)
    optionnal
    - permet d'indiquer si le ou les champs contenu dans le fieldset sont obligatoires.
  • params (string)
    optionnal
    - permet d'ajouter des parametres HTML au fieldset

Macro @cLegend

La macro cLegend est utilisée pour l'affichage de la légende dans la macro cFieldSet

Voici la liste des différents paramètres de la macro cLegend :

  • label (string)
    optionnal
    - définit le libellé de la légende du fieldset
  • id (string)
    optionnal
    - l'ID du fieldset
  • class (string)
    optionnal
    - ajoute une classe CSS au fieldset
  • showLabel (boolean)
    optionnal
    - permet de définir si le label est affichée ou pas sinon c'est le contenu de la macro "#nested" qui sera affiché. Par défaut true.
  • required (boolean)
    optionnal
    - permet d'indiquer si le ou les champs contenu du fieldset sont obligatoires.
  • params (string)
    optionnal
    - permet d'ajouter des parametres HTML à la légende

Checkbox, radio, ou toggle button

macro @cFormCheck

Doc Bootstrap Checkbox, radio, ou toggle button

Generates a form check element, which can be a checkbox, radio button, or button with optional selection box and nested content.

Exemple

<@cFormCheck name='accept_terms' label='I accept the terms and conditions' type='checkbox' />

<@cFormCheck name='gender' label='Male' type='radio' value='male' />
<@cFormCheck name='gender' label='Female' type='radio' value='female' />

<@cFormCheck name='newsletter' label='Subscribe to newsletter' type='button' btnClass='btn btn-outline-primary' />

<@cFormCheck name='plan' label='Premium plan' type='checkbox' selectionButton=true selectionLabel='Recommended'>
    <@cText>Includes all features</@cText>
</@cFormCheck>

<div class="form-check">
<input type="checkbox" id="accept_terms-562296670290791" name="accept_terms" class="form-check-input" >
<label class="form-label form-check-label" for="accept_terms-562296670290791">
I accept the terms and conditions
</label>
</div>
<div class="form-check">
<input type="radio" id="gender-563745620450561" name="gender" class="form-check-input" value="male">
<label class="form-label form-check-label" for="gender-563745620450561">
Male
</label>
</div>
<div class="form-check">
<input type="radio" id="gender-565194570610331" name="gender" class="form-check-input" value="female">
<label class="form-label form-check-label" for="gender-565194570610331">
Female
</label>
</div>
<input type="checkbox" name="newsletter" class="btn-check form-check" id="newsletter-566643520770101" autocomplete="off">
<label class="form-label btn btn-outline-primary" for="newsletter-566643520770101">
Subscribe to newsletter
</label>
<div class="form-check btn-selection">
<div class="selection-check">
<input type="checkbox" id="plan-568092470929871" name="plan" class="form-check-input" >
<label class="form-label form-check-label" for="plan-568092470929871">
Premium plan
<p>
Includes all features</p>
<p class="selection-subtitle my-sm">Recommended</p>
</label>
</div>
</div>

Paramètres

Generates a form check element (checkbox, radio, or toggle button) with label, validation, and optional selection box styling.

  • name (string)
    required
    - the name of the element
  • label (string)
    required
    - the label associated to the input
  • type (string)
    required
    - the type of check, can be 'checkbox', 'radio' or 'button'
  • class (string)
    optional
    - the CSS class of the element. Default: 'form-check'
  • id (string)
    optional
    - the ID of the element. Default: ''
  • value (string)
    optional
    - the value of the element. Default: ''
  • btnClass (string)
    optional
    - CSS class for the button label, only used if type is 'button'. Default: ''
  • labelClass (string)
    optional
    - the CSS class of the label. Default: ''
  • selectionButton (boolean)
    optional
    - adds a selection box around the checkbox. Default: false
  • selectionLabel (string)
    optional
    - label for the selection box. Default: ''
  • nestedContent (string)
    optional
    - additional content to display inside the selection box. Default: ''
  • textCenter (boolean)
    optional
    - centers text on all selections. Default: false
  • errorMsg (string)
    optional
    - content of the error message. Default: ''
  • helpMsg (string)
    optional
    - content of the help message. Default: ''
  • inline (boolean)
    optional
    - sets inline display. Default: false
  • disabled (boolean)
    optional
    - disables the element. Default: false
  • readonly (boolean)
    optional
    - sets the element as readonly. Default: false
  • checked (boolean)
    optional
    - checks the element. Default: false
  • required (boolean)
    optional
    - sets element as required. Default: false
  • html5Required (boolean)
    optional
    - uses the HTML5 required attribute. Default: true
  • showRequiredLabel (boolean)
    optional
    - shows the required asterisk on the wrapping label (true) or on the input label (false). Default: true
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Groupe de checkbox ou radio bouton

macro @cFormCheckGroup

Generates a group of checkboxes or radio buttons within a fieldset.

Exemple

Horaires

Choisir un horaire

<@cForm>
<@cRow>
    <@cCol>
		<@cFormCheckGroup legend='Horaires' >
            <@cFormHelp id='formcheck1' label='Choisir un horaire' />
            <@cFormCheck type='checkbox' name='sport' id='football31' label='Football' value='foot' />
            <@cFormCheck type='checkbox' name='sport' id='natation31' label='Natation' value='nata' />
		</@cFormCheckGroup>
    </@cCol>
</@cRow>
</@cForm>

<form method="post">
<div class="row ">
<div class="col ">
<fieldset class="form-check-group " id="fieldset-form-check-group-592337221728721" role="group" aria-labelledby="legend-form-check-group-592337221728721">
<legend id="legend-form-check-group-592337221728721" >Horaires</legend>
<p class="form-text " id="help_formcheck1">
Choisir un horaire</p>
<div class="form-check">
<input type="checkbox" id="football31" name="sport" class="form-check-input" value="foot">
<label class="form-label form-check-label" for="football31">
Football
</label>
</div>
<div class="form-check">
<input type="checkbox" id="natation31" name="sport" class="form-check-input" value="nata">
<label class="form-label form-check-label" for="natation31">
Natation
</label>
</div>
</fieldset>
</div>
</div>
</form>

Paramètres

Voici la liste des différents paramètres de la macro :

  • legend (string)
    optionnal
    - définit le libellé de la légende du fieldset
  • legendClass (string)
    optionnal
    - permet d'ajouter une classe CSS à la légende du fieldset
  • helpMsg (string)
    optionnal
    - permet de définir le message d'aide sur le fieldset
  • id (string)
    optionnal
    - l'ID du fieldset
  • class (string)
    optionnal
    - ajoute une classe CSS au fieldset
  • required (boolean)
    optionnal
    - permet d'indiquer si le ou les champs contenu dans le fieldset sont obligatoires.
  • params (string) (default :'')
    optionnal
    - Tout autre attribut HTML
Information

Il est possible d'utiliser une macro cFieldset avec la classe css ".form-check-group", le code généré sera identique

Case à cocher

macro @cCheckbox

Doc Bootstrap Case à cocher

Generates a checkbox input element with various options and configurations.

Exemple

Choisir un horaire

Choisir un horaire

Erreur dans le sport !

Faites votre choix

<@cForm>
<@cRow>
    <@cCol >
		<@cFieldset params='aria-describedby="help_checkboxHelp1"'>
			<@cField label='Horaire'>
				<@cFormHelp id='checkboxHelp1' label='Choisir un horaire' />
				<@cCheckbox name='sport' id='football' label='Football' value='foot' />
				<@cCheckbox name='sport' id='natation' label='Natation' value='nata' />
				<@cCheckbox name='sport' id='tennis' label='Tennis (Disabled)' value='tenn' disabled=true />
			</@cField>
		</@cFieldset>
    </@cCol>
</@cRow>
<@cRow>
    <@cCol>
		<@cFieldset params='aria-describedby="help_checkboxHelp2"'>
			<@cField label='Horaire'>
				<@cFormHelp id='checkboxHelp2' label='Choisir un horaire' />
				<@cCheckbox name='sport' id='judo2' label='Judo' value='judo' />
				<@cCheckbox errorMsg='Erreur dans le sport !' name='sport' id='football2' label='Football' value='foot' />
			</@cField>
		</@cFieldset>
    </@cCol>
</@cRow>
<@cRow>
    <@cCol>
		<@cFieldset params='aria-describedby="help_selectHelp"'>
			<@cField label='Quel choix ?'>
				<@cFormHelp id='selectHelp' label='Faites votre choix' />
				<@cCheckbox name='selectCheckbox' id='selectFootball' label='Football' value='foot' selectionButton=true selectionLabel='Sport avec un ballon.' />
				<@cCheckbox name='selectCheckbox' id='selectJudo' label='Judo' value='judo' selectionButton=true selectionLabel='Sport de combat.' />
				<@cCheckbox name='selectCheckbox' id='selectNatation' label='Natation' value='nata' selectionButton=true selectionLabel='Sport dans l&apos;eau.' />
				<@cCheckbox name='selectCheckbox' id='selectTennis' label='Tennis' value='tenn' selectionButton=true selectionLabel='Sport de raquette.' disabled=true />
			</@cField>
		</@cFieldset>
    </@cCol>
</@cRow>
</@cForm>

<form method="post">
<div class="row ">
<div class="col ">
<fieldset id="fieldset-id-613979872847111" aria-describedby="help_checkboxHelp1" role="group" aria-labelledby="legend-id-613979872847111">
<label class="form-label">
Horaire
</label>
<p class="form-text " id="help_checkboxHelp1">
Choisir un horaire</p>
<div class="form-check">
<input type="checkbox" id="football" name="sport" class="form-check-input" value="foot">
<label class="form-label form-check-label" for="football">
Football
</label>
</div>
<div class="form-check">
<input type="checkbox" id="natation" name="sport" class="form-check-input" value="nata">
<label class="form-label form-check-label" for="natation">
Natation
</label>
</div>
<div class="form-check">
<input type="checkbox" id="tennis" name="sport" class="form-check-input" value="tenn" disabled>
<label class="form-label form-check-label" for="tennis">
Tennis (Disabled)
</label>
</div>
</fieldset>
</div>
</div>
<div class="row ">
<div class="col ">
<fieldset id="fieldset-id-615528823006881" aria-describedby="help_checkboxHelp2" role="group" aria-labelledby="legend-id-615528823006881">
<label class="form-label">
Horaire
</label>
<p class="form-text " id="help_checkboxHelp2">
Choisir un horaire</p>
<div class="form-check">
<input type="checkbox" id="judo2" name="sport" class="form-check-input" value="judo">
<label class="form-label form-check-label" for="judo2">
Judo
</label>
</div>
<p class="invalid-feedback" id="error_football2">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Erreur dans le sport !</p>
<div class="form-check is-invalid">
<input type="checkbox" id="football2" name="sport" class="form-check-input" value="foot" aria-invalid="true">
<label class="form-label form-check-label" for="football2">
Football
</label>
</div>
</fieldset>
</div>
</div>
<div class="row ">
<div class="col ">
<fieldset id="fieldset-id-618626723326421" aria-describedby="help_selectHelp" role="group" aria-labelledby="legend-id-618626723326421">
<label class="form-label">
Quel choix ?
</label>
<p class="form-text " id="help_selectHelp">
Faites votre choix</p>
<div class="form-check btn-selection">
<div class="selection-check">
<input type="checkbox" id="selectFootball" name="selectCheckbox" class="form-check-input" value="foot">
<label class="form-label form-check-label" for="selectFootball">
Football
<p class="selection-subtitle my-sm">Sport avec un ballon.</p>
</label>
</div>
</div>
<div class="form-check btn-selection">
<div class="selection-check">
<input type="checkbox" id="selectJudo" name="selectCheckbox" class="form-check-input" value="judo">
<label class="form-label form-check-label" for="selectJudo">
Judo
<p class="selection-subtitle my-sm">Sport de combat.</p>
</label>
</div>
</div>
<div class="form-check btn-selection">
<div class="selection-check">
<input type="checkbox" id="selectNatation" name="selectCheckbox" class="form-check-input" value="nata">
<label class="form-label form-check-label" for="selectNatation">
Natation
<p class="selection-subtitle my-sm">Sport dans l&apos;eau.</p>
</label>
</div>
</div>
<div class="form-check btn-selection">
<div class="selection-check">
<input type="checkbox" id="selectTennis" name="selectCheckbox" class="form-check-input" value="tenn" disabled>
<label class="form-label form-check-label" for="selectTennis">
Tennis
<p class="selection-subtitle my-sm">Sport de raquette.</p>
</label>
</div>
</div>
</fieldset>
</div>
</div>
</form>

Paramètres

Generates a checkbox input element. Wraps cFormCheck with type 'checkbox' by default.

  • name (string)
    required
    - the name of the element
  • label (string)
    required
    - the label associated to the input
  • type (string)
    optional
    - the type, 'checkbox' or 'button'. Default: 'checkbox'
  • class (string)
    optional
    - the CSS class of the element. Default: 'form-check'
  • id (string)
    optional
    - the ID of the element. Default: ''
  • value (string)
    optional
    - the value of the element. Default: ''
  • btnClass (string)
    optional
    - CSS class for button label, only used if type is 'button'. Default: ''
  • labelClass (string)
    optional
    - the CSS class of the label. Default: ''
  • selectionButton (boolean)
    optional
    - adds a selection box around the checkbox. Default: false
  • selectionLabel (string)
    optional
    - label for the selection box. Default: ''
  • textCenter (boolean)
    optional
    - centers text on all selections. Default: false
  • errorMsg (string)
    optional
    - content of the error message. Default: ''
  • helpMsg (string)
    optional
    - content of the help message. Default: ''
  • inline (boolean)
    optional
    - sets inline display. Default: false
  • disabled (boolean)
    optional
    - disables the element. Default: false
  • readonly (boolean)
    optional
    - sets the element as readonly. Default: false
  • checked (boolean)
    optional
    - checks the element. Default: false
  • required (boolean)
    optional
    - sets element as required. Default: false
  • html5Required (boolean)
    optional
    - uses the HTML5 required attribute. Default: true
  • showRequiredLabel (boolean)
    optional
    - shows the required asterisk on the wrapping label (true) or on the checkbox label (false). Default: true
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Bouton radio

macro @cRadio

Doc Bootstrap Bouton radio

Generates a radio button component with various options for inline display, selection buttons, and more.

Exemple

Fast shipping option

<@cRadio name='gender' label='Male' value='male' />
<@cRadio name='gender' label='Female' value='female' />
<@cRadio name='gender' label='Other' value='other' />

<@cRadio name='size' label='Small' value='S' inline=true />
<@cRadio name='size' label='Medium' value='M' inline=true />
<@cRadio name='size' label='Large' value='L' inline=true />

<@cRadio name='plan' label='Monthly' value='monthly' type='button' btnClass='btn btn-outline-primary' />
<@cRadio name='plan' label='Yearly' value='yearly' type='button' btnClass='btn btn-outline-primary' />

<@cRadio name='delivery' label='Express delivery' value='express' selectionButton=true selectionLabel='2-3 business days'>
    <@cText>Fast shipping option</@cText>
</@cRadio>

<div class="form-check">
<input type="radio" id="gender-678214125243661" name="gender" class="form-check-input" value="male">
<label class="form-label form-check-label" for="gender-678214125243661">
Male
</label>
</div>
<div class="form-check">
<input type="radio" id="gender-683763075403431" name="gender" class="form-check-input" value="female">
<label class="form-label form-check-label" for="gender-683763075403431">
Female
</label>
</div>
<div class="form-check">
<input type="radio" id="gender-689312025563201" name="gender" class="form-check-input" value="other">
<label class="form-label form-check-label" for="gender-689312025563201">
Other
</label>
</div>
<div class="form-check form-check-inline">
<input type="radio" id="size-694860975722971" name="size" class="form-check-input" value="S">
<label class="form-label form-check-label" for="size-694860975722971">
Small
</label>
</div>
<div class="form-check form-check-inline">
<input type="radio" id="size-700409925882741" name="size" class="form-check-input" value="M">
<label class="form-label form-check-label" for="size-700409925882741">
Medium
</label>
</div>
<div class="form-check form-check-inline">
<input type="radio" id="size-705958876042511" name="size" class="form-check-input" value="L">
<label class="form-label form-check-label" for="size-705958876042511">
Large
</label>
</div>
<input type="checkbox" name="plan" class="btn-check form-check" id="plan-711507826202281" autocomplete="off" value="monthly">
<label class="form-label btn btn-outline-primary" for="plan-711507826202281">
Monthly
</label>
<input type="checkbox" name="plan" class="btn-check form-check" id="plan-717056776362051" autocomplete="off" value="yearly">
<label class="form-label btn btn-outline-primary" for="plan-717056776362051">
Yearly
</label>
<div class="form-check btn-selection">
<div class="selection-check">
<input type="radio" id="delivery-722605726521821" name="delivery" class="form-check-input" value="express">
<label class="form-label form-check-label" for="delivery-722605726521821">
Express delivery
<p class="selection-subtitle my-sm">2-3 business days</p>
</label>
</div>
<div class="selection-content">
<p>
Fast shipping option</p>
</div>
</div>

Paramètres

Generates a radio button input element. Wraps cFormCheck with type 'radio' by default.

  • name (string)
    required
    - the name of the element
  • label (string)
    required
    - the label associated to the input
  • type (string)
    optional
    - the type, 'radio' or 'button'. Default: 'radio'
  • class (string)
    optional
    - the CSS class of the element. Default: 'form-check'
  • labelClass (string)
    optional
    - the CSS class of the label, can be 'visually-hidden' to hide it. Default: ''
  • btnClass (string)
    optional
    - CSS class for button label, only used if type is 'button'. Default: ''
  • id (string)
    optional
    - the ID of the element. Default: ''
  • value (string)
    optional
    - the value of the element. Default: ''
  • errorMsg (string)
    optional
    - content of the error message. Default: ''
  • helpMsg (string)
    optional
    - content of the help message. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''
  • inline (boolean)
    optional
    - sets inline display. Default: false
  • selectionButton (boolean)
    optional
    - adds a selection box around the radio. Default: false
  • selectionLabel (string)
    optional
    - label for the selection box. Default: ''
  • textCenter (boolean)
    optional
    - centers text on all selections. Default: false
  • disabled (boolean)
    optional
    - disables the element. Default: false
  • readonly (boolean)
    optional
    - sets the element as readonly. Default: false
  • checked (boolean)
    optional
    - checks the element. Default: false
  • required (boolean)
    optional
    - sets element as required. Default: false
  • html5Required (boolean)
    optional
    - uses the HTML5 required attribute. Default: true
  • showRequiredLabel (boolean)
    optional
    - shows the required asterisk on the wrapping label (true) or on the radio label (false). Default: true

Aide de formulaire

macro @cFormHelp

Generates a help text message associated with a form field, rendered as a form-text element linked via aria-describedby.

Exemple

We will never share your email with anyone.

or

We will never share your email with anyone.

<@cField label='Email' for='email'>
	<@cInput name='email' id='email' type='email' helpMsg='We will never share your email with anyone.' />
</@cField>	
<@cDivider />
<@cField label='Email' for='email2'>
	<@cFormHelp id='email2' label='We will never share your email with anyone.' />
	<@cInput name='email' id='email2' type='email' />
</@cField>

<label class="form-label" for="email">
Email
</label>
<p class="form-text " id="help_email">
We will never share your email with anyone.</p>
<input type="email" class=" form-control" name="email" id="email" value="" aria-describedby="help_email">
<p class="divider">or</p>
<label class="form-label" for="email2">
Email
</label>
<p class="form-text " id="help_email2">
We will never share your email with anyone.</p>
<input type="email" class=" form-control" name="email" id="email2" value="">

Paramètres

Generates a help text message associated with a form field, rendered as a form-text element linked via aria-describedby.

  • id (string)
    required
    - the ID of the related field, used to generate the help element ID (help_{id})
  • label (string)
    required
    - the help message content
  • class (string)
    optional
    - adds a CSS class to the help text. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Erreur de formulaire

macro @cFormError

Doc Bootstrap Erreur de formulaire

Generates an error message element for a form field, displayed with an alert icon and linked via aria-describedby for accessibility.

Exemple

Please enter a valid email address.

or

Please enter a valid email address.

<@cField label='Email' for='email'>
	<@cInput name='email' id='email' type='email' errorMsg='Please enter a valid email address.' />
</@cField>	
<@cDivider />
<@cField label='Email' for='email2'>
	<@cFormError id='email2' label='Please enter a valid email address.' />
	<@cInput name='email' id='email2' type='email' />
</@cField>

<label class="form-label" for="email">
Email
</label>
<p class="invalid-feedback" id="error_email">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Please enter a valid email address.</p>
<input type="email" class=" form-control is-invalid" name="email" id="email" value="" aria-invalid="true" aria-describedby="error_email">
<p class="divider">or</p>
<label class="form-label" for="email2">
Email
</label>
<p class="invalid-feedback" id="error_email2">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Please enter a valid email address.</p>
<input type="email" class=" form-control" name="email" id="email2" value="">

Paramètres

Generates an error message element for a form field, displayed with an alert icon and linked via aria-describedby for accessibility.

  • id (string)
    required
    - the ID of the related field, used to generate the error element ID (error_{id})
  • label (string)
    required
    - the error message content
  • class (string)
    optional
    - adds a CSS class to the error message. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Ligne de formulaire

macro @cFormRow

DEPRECATED : Generates a form row container (wraps cRow) to organize form fields horizontally in a grid layout.

Exemple

<#-- DEPRECATED - use @cRow with class 'row' instead -->
<@cFormRow>
    <@cCol cols='6'>
        <@cField label='First name' for='firstname'>
            <@cInput name='firstname' id='firstname' />
        </@cField>
    </@cCol>
    <@cCol cols='6'>
        <@cField label='Last name' for='lastname'>
            <@cInput name='lastname' id='lastname' />
        </@cField>
    </@cCol>
</@cFormRow>

<div class="row ">
<div class="col-6 ">
<label class="form-label" for="firstname">
First name
</label>
<input type="text" class=" form-control" name="firstname" id="firstname" value="">
</div>
<div class="col-6 ">
<label class="form-label" for="lastname">
Last name
</label>
<input type="text" class=" form-control" name="lastname" id="lastname" value="">
</div>
</div>

Paramètres

DEPRECATED : Generates a form row container (wraps cRow) to organize form fields horizontally in a grid layout.

  • class (string)
    optional
    - CSS class for the row. Default: ''
  • id (string)
    optional
    - the ID of the row. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Label

macro @cLabel

Doc Bootstrap Label

Generates a form label element with optional required asterisk indicator and visibility control.

Exemple

<@cLabel label='Email address' for='email' />
<@cInput name='email' id='email' type='email' />

<@cLabel label='Last name' for='lastname' required=true />
<@cInput name='lastname' id='lastname' required=true />

<@cLabel label='Search' for='search' showLabel=false />
<@cInput name='search' id='search' placeholder='Search...' />

<label class="form-label" for="email">
Email address
</label>
<input type="email" class=" form-control" name="email" id="email" value="">
<label class="form-label" for="lastname">
Last name<span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="text" class=" form-control" name="lastname" id="lastname" value="" required aria-required="true">
<label class="form-label visually-hidden" for="search">
Search
</label>
<input type="text" class=" form-control" name="search" id="search" value="" placeholder="Search..." aria-label="Search...">

Paramètres

Generates a form label element with optional required asterisk indicator and visibility control.

  • label (string)
    required
    - the label text
  • class (string)
    optional
    - CSS class for the label. Default: ''
  • id (string)
    optional
    - the ID of the label. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''
  • for (string)
    optional
    - the ID of the associated form element. Default: ''
  • showLabel (boolean)
    optional
    - displays or hides the label (uses visually-hidden class). Default: true
  • required (boolean)
    optional
    - displays a required asterisk (*) after the label. Default: false

macro @cInput

Doc Bootstrap

Generates an input field with various attributes and validation options.

Exemple

We will never share your email.

Please enter a valid email address.

<@cInput name='firstname' placeholder='Enter your first name' />

<@cInput name='email' type='email' required=true helpMsg='We will never share your email.' errorMsg='Please enter a valid email address.' />

<@cInput name='phone' type='tel' phoneCountry='FR' placeholder='06 12 34 56 78' />

<@cInput name='quantity' type='number' min=1 max=100 value='1' />

<form method="post">
<input type="text" class=" form-control" name="firstname" id="firstname" value="" placeholder="Enter your first name" aria-label="Enter your first name">
<p class="form-text " id="help_email">
We will never share your email.</p>
<p class="invalid-feedback" id="error_email">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Please enter a valid email address.</p>
<input type="email" class=" form-control is-invalid" name="email" id="email" value="" required aria-required="true" aria-invalid="true" aria-describedby="error_email">
<input type="tel" class=" form-control fr-number" name="phone" id="phone" value="" placeholder="06 12 34 56 78" aria-label="06 12 34 56 78">
<script>
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.fr-number').forEach(function(element) {
element.addEventListener('blur', function() {
var num = element.value;
var numFormatte = num
.replace(/^0(\d)(\s?)(\d{2})(\s?)(\d{2})(\s?)(\d{2})(\s?)(\d{2})$/, '+33 $1 $3 $5 $7 $9')
.replace(/^\+33(\d{9})$/, function(match, p1) {
return '+33 ' + p1.replace(/(\d)(\d{2})(\d{2})(\d{2})(\d{2})/, '$1 $2 $3 $4 $5');
});
element.value = numFormatte;
});
});
});
</script>
<input type="number" class=" form-control" name="quantity" id="quantity" value="1" min="1" max="100">
<script>
function setInvalidMaxMinMessage( input ) {
const value = parseFloat(input.value);
const min = input.hasAttribute('min') ? parseFloat(input.getAttribute('min')) : -Infinity;
const max = input.hasAttribute('max') ? parseFloat(input.getAttribute('max')) : Infinity;
if ( value <= min || value >= max ) {
if ( !input.classList.contains('is-invalid') ) {
input.classList.add('is-invalid');
if( input.parentNode.classList.contains('input-group') ) {
input.parentNode.insertAdjacentHTML('beforebegin', '<p class="invalid-feedback"><svg class="paris-icon paris-icon-alert-error main-danger-color" data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img"><use href="#paris-icon-alert-error"></use></svg>La valeur doit être comprise entre ' + input.min + ' et ' + input.max + '</p>' );
} else {
input.insertAdjacentHTML('beforebegin', '<p class="invalid-feedback"><svg class="paris-icon paris-icon-alert-error main-danger-color" data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img"><use href="#paris-icon-alert-error"></use></svg>La valeur doit être comprise entre ' + input.min + ' et ' + input.max + '</p>' );
}
input.setAttribute('aria-invalid', 'true');
input.setAttribute('aria-describedby', 'error_' + input.id);
}
return false;
} else {
if ( input.classList.contains('is-invalid') ) {
input.classList.remove('is-invalid');
input.removeAttribute('aria-invalid');
input.removeAttribute('aria-describedby');
// Remove the error message if it exists
const errorMsg = input.closest('.col').querySelector('.invalid-feedback');
if (errorMsg) {
errorMsg.remove();
}
}
return true;
}
}
document.addEventListener('DOMContentLoaded', function() {
const inputquantity = document.getElementById('quantity');
if ( inputquantity ) {
inputquantity.addEventListener('blur', function() {
setInvalidMaxMinMessage( inputquantity );
});
inputquantity.closest('form').addEventListener('submit', function(e) {
const value = parseFloat(inputquantity.value);
if ( inputquantity && inputquantity.closest('.col').style.display !== 'none' && inputquantity.value !== '' ) {
if( !setInvalidMaxMinMessage( inputquantity ) ) {
inputquantity.focus();
e.preventDefault();
}
}
});
}
});
</script>
</form>

Paramètres

Generates a form input field with support for various types, validation, help/error messages, datalist, and phone number formatting.

  • name (string)
    required
    - the name attribute of the input
  • class (string)
    optional
    - CSS class for the input. Default: 'form-control'
  • id (string)
    optional
    - the ID of the input. Default: ''
  • type (string)
    optional
    - the input type (text, email, tel, number, etc.). Default: 'text'
  • size (string)
    optional
    - adds a size suffix to form-control class, 'lg' or 'sm'. Default: ''
  • value (string)
    optional
    - the default value. Default: ''
  • placeholder (string)
    optional
    - the placeholder text. Default: ''
  • phoneCountry (string)
    optional
    - formats phone number for the given country when type is 'tel'. Default: 'FR'
  • required (boolean)
    optional
    - marks the field as required. Default: false
  • html5Required (boolean)
    optional
    - uses the HTML5 required attribute. Default: true
  • disabled (boolean)
    optional
    - disables the input. Default: false
  • readonly (boolean)
    optional
    - sets the input as readonly. Default: false
  • pattern (string)
    optional
    - a regular expression for input validation. Default: ''
  • autocomplete (string)
    optional
    - the autocomplete attribute value. Default: ''
  • accept (string)
    optional
    - accepted file types for file inputs. Default: ''
  • title (string)
    optional
    - the title attribute. Default: ''
  • maxlength (number)
    optional
    - maximum character length. Default: 0
  • min (number)
    optional
    - minimum value for number inputs. Default: 0
  • max (number)
    optional
    - maximum value for number inputs. Default: 0
  • datalistId (string)
    optional
    - ID for the associated datalist element. Default: ''
  • datalist (string)
    optional
    - list of objects with id and label for datalist options. Default: ''
  • helpMsg (string)
    optional
    - help message displayed below the input. Default: ''
  • errorMsg (string)
    optional
    - error message displayed on validation failure. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Champs avec icone, bouton ou texte

macro @cInputGroup

Doc Bootstrap Champs avec icone, bouton ou texte

Generates an input group container that wraps inputs and addons together for combined form controls.

Exemple

@
Go

<@cInputGroup>
    <@cInputGroupAddonText>@</@cInputGroupAddonText>
    <@cInput name='email' placeholder='Email address' />
</@cInputGroup>

<@cInputGroup size='lg'>
    <@cInput name='search' placeholder='Search...' />
    <@cInputGroupAddon addonText='Go' />
</@cInputGroup>

<div class="input-group">
<span class="input-group-text">
@</span>
<input type="text" class=" form-control" name="email" id="email" value="" placeholder="Email address" aria-label="Email address">
</div>
<div class="input-group input-group-lg">
<input type="text" class=" form-control" name="search" id="search" value="" placeholder="Search..." aria-label="Search...">
<span class="input-group-text">
Go</span>
</div>

Paramètres

Generates an input group container that wraps inputs and addons together for combined form controls.

  • class (string)
    optional
    - adds a CSS class to the group. Default: ''
  • size (string)
    optional
    - adds a size suffix to the input-group class, possible values 'lg' or 'sm'. Default: ''
  • id (string)
    optional
    - the ID of the group. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Zone de texte long

macro @cTextArea

Doc Bootstrap Zone de texte long

Generates a textarea form field with support for validation, help/error messages, and character limits

Exemple

Maximum 50 characters.

This field is required.

<@cTextArea name='message' placeholder='Enter your message...' rows=5 />

<@cTextArea name='comment' required=true maxlength=500 helpMsg='Maximum 500 characters.' rows=4 />

<@cTextArea name='description' rows=3 errorMsg='This field is required.' />

<@cTextArea name='notes' rows=6>
    Default content goes here.
</@cTextArea>

<textarea class=" form-control" name="message" id="message" placeholder="Enter your message..."rows="5">
</textarea>
<p class="form-text " id="help_comment">
Maximum 50 characters.</p>
<textarea class=" form-control counter" name="comment" id="comment" maxlength="50"rows="4" required aria-required="true" aria-describedby="help_comment">
</textarea>
<p class="invalid-feedback" id="error_description">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>This field is required.</p>
<textarea class=" form-control is-invalid" name="description" id="description" rows="3" is-invalid aria-invalid="true" aria-describedby="error_description">
</textarea>
<textarea class=" form-control" name="notes" id="notes" rows="6">
Default content goes here.
</textarea>

Paramètres

Generates a textarea form field with support for validation, help/error messages, and character limits.

  • name (string)
    required
    - the name attribute of the textarea
  • class (string)
    optional
    - CSS class for the textarea. Default: 'form-control'
  • id (string)
    optional
    - the ID of the textarea. Default: ''
  • placeholder (string)
    optional
    - the placeholder text. Default: ''
  • required (boolean)
    optional
    - marks the field as required. Default: false
  • html5Required (boolean)
    optional
    - uses the HTML5 required attribute. Default: true
  • disabled (boolean)
    optional
    - disables the textarea. Default: false
  • readonly (boolean)
    optional
    - sets the textarea as readonly. Default: false
  • title (string)
    optional
    - the title attribute. Default: ''
  • autocomplete (string)
    optional
    - the autocomplete attribute value (on/off). Default: ''
  • maxlength (number)
    optional
    - maximum character length. Default: 0
  • counter (boolean)
    optional
    new
    - whether to show a character counter. Default: false
  • helpMsg (string)
    optional
    - help message displayed below the textarea. Default: ''
  • rows (number)
    optional
    - number of visible text lines. Default: 0
  • errorMsg (string)
    optional
    - error message displayed on validation failure. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Champ de formulaire

macro @cField

Generates a form field wrapper with a label, combining a label and nested input elements within a block container.

Exemple

<@cField label='Last name' for='lastname' required=true>
    <@cInput name='lastname' id='lastname' />
</@cField>

<@cField label='Email' labelData='(professional)' for='email'>
    <@cInput name='email' id='email' type='email' placeholder='you@example.com' />
</@cField>

<@cField label='Search' for='search' showLabel=false>
    <@cInput name='search' id='search' placeholder='Search...' />
</@cField>

<label class="form-label" for="lastname">
Last name <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="text" class=" form-control" name="lastname" id="lastname" value="" required aria-required="true">
<label class="form-label" for="email">
Email (professional)
</label>
<input type="email" class=" form-control" name="email" id="email" value="" placeholder="you@example.com" aria-label="you@example.com">
<label class="form-label visually-hidden" for="search">
Search
</label>
<input type="text" class=" form-control" name="search" id="search" value="" placeholder="Search..." aria-label="Search...">

Paramètres

Generates a form field wrapper with a label, combining a label and nested input elements within a block container.

  • label (string)
    optional
    - the label text for the field. Default: ''
  • labelClass (string)
    optional
    - adds a CSS class to the label. Default: ''
  • labelData (string)
    optional
    - additional text appended to the label. Default: ''
  • for (string)
    optional
    - links the label to the input via the for attribute. Default: ''
  • showLabel (boolean)
    optional
    - displays or hides the label. Default: true
  • required (boolean)
    optional
    - marks the field as required with an asterisk. Default: false
  • class (string)
    optional
    - adds a CSS class to the field container. Default: 'mb-3'
  • id (string)
    optional
    - the ID of the field container. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Liste déroulante

macro @cSelect

Doc Bootstrap Liste déroulante

Generates a select dropdown element with support for validation, help/error messages, multiple selection, and accessibility attributes.

Exemple

Please select a category.

<@cSelect name='country' id='country'>
    <@cOption label='-- Select a country --' value='' />
    <@cOption label='France' value='FR' />
    <@cOption label='Germany' value='DE' />
    <@cOption label='Spain' value='ES' />
</@cSelect>

<@cSelect name='category' id='category' required=true errorMsg='Please select a category.'>
    <@cOption label='-- Choose --' value='' />
    <@cOption label='Culture' value='culture' />
    <@cOption label='Sport' value='sport' />
</@cSelect>

<@cSelect name='languages' id='languages' multiple=true>
    <@cOption label='French' value='fr' />
    <@cOption label='English' value='en' />
    <@cOption label='Spanish' value='es' />
</@cSelect>

<select name="country" class="form-select" id="country">
<option value="">-- Select a country --</option>
<option value="FR">France</option>
<option value="DE">Germany</option>
<option value="ES">Spain</option>
</select>
<p class="invalid-feedback" id="error_category">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Please select a category.</p>
<select name="category" class="form-select is-invalid" id="category" required aria-required="true" aria-invalid="true" aria-describedby="error_category">
<option value="">-- Choose --</option>
<option value="culture">Culture</option>
<option value="sport">Sport</option>
</select>
<select name="languages" class="form-select" id="languages" multiple>
<option value="fr">French</option>
<option value="en">English</option>
<option value="es">Spanish</option>
</select>

Paramètres

Generates a select dropdown element with support for validation, help/error messages, multiple selection, and accessibility attributes.

  • name (string)
    required
    - the name attribute of the select
  • class (string)
    optional
    - CSS class for the select. Default: 'form-select'
  • size (string)
    optional
    - adds a size suffix to form-select class, 'lg' or 'sm'. Default: ''
  • id (string)
    optional
    - the ID of the element. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''
  • multiple (boolean)
    optional
    - enables multiple selection. Default: false
  • disabled (boolean)
    optional
    - disables the select. Default: false
  • autocomplete (string)
    optional
    - the autocomplete attribute value. Default: ''
  • readonly (boolean)
    optional
    - sets the select as readonly. Default: false
  • required (boolean)
    optional
    - marks the field as required. Default: false
  • html5Required (boolean)
    optional
    - uses the HTML5 required attribute. Default: true
  • helpMsg (string)
    optional
    - help message displayed below the select. Default: ''
  • errorMsg (string)
    optional
    - error message displayed on validation failure. Default: ''

Sélection multiple

macro @cMultiselect

Generates a multiselect dropdown component with tag-based selection, supporting a maximum number of options and custom labels.

Exemple

<@cMultiselect>
    <@cMultiselectOption name='categories' label='Sport' value='sport' />
    <@cMultiselectOption name='categories' label='Culture' value='culture' />
    <@cMultiselectOption name='categories' label='Education' value='education' />
</@cMultiselect>

<@cMultiselect id='interests' maxSelectedOptions=3>
    <@cMultiselectOption name='interests' label='Music' value='music' />
    <@cMultiselectOption name='interests' label='Travel' value='travel' />
    <@cMultiselectOption name='interests' label='Food' value='food' />
    <@cMultiselectOption name='interests' label='Art' value='art' />
</@cMultiselect>

<div class="multiselect " id="msg-1017114782752851" data-maxoptions="0">
<div class="tags-container mt-s"></div>
<div class="dropdown">
<button class="form-select multi-select " type="button" id='btn-msg-1017114782752851' data-bs-toggle="dropdown" aria-expanded="false" params=>
Select options
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<li>
<input type="checkbox" name="categories" class="btn-check" id="categories-1025963732912621" autocomplete="off" value="sport">
<label class="form-label btn btn-outline-primary my-0" for="categories-1025963732912621">
Sport
</label>
</li>
<li>
<input type="checkbox" name="categories" class="btn-check" id="categories-1034812683072391" autocomplete="off" value="culture">
<label class="form-label btn btn-outline-primary my-0" for="categories-1034812683072391">
Culture
</label>
</li>
<li>
<input type="checkbox" name="categories" class="btn-check" id="categories-1043661633232161" autocomplete="off" value="education">
<label class="form-label btn btn-outline-primary my-0" for="categories-1043661633232161">
Education
</label>
</li>
</ul>
</div>
</div>
<div class="multiselect " id="interests" data-maxoptions="3">
<div class="tags-container mt-s"></div>
<div class="dropdown">
<button class="form-select multi-select " type="button" id='btn-interests' data-bs-toggle="dropdown" aria-expanded="false" params=>
Select options
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<li>
<input type="checkbox" name="interests" class="btn-check" id="interests-1052510583391931" autocomplete="off" value="music">
<label class="form-label btn btn-outline-primary my-0" for="interests-1052510583391931">
Music
</label>
</li>
<li>
<input type="checkbox" name="interests" class="btn-check" id="interests-1061359533551701" autocomplete="off" value="travel">
<label class="form-label btn btn-outline-primary my-0" for="interests-1061359533551701">
Travel
</label>
</li>
<li>
<input type="checkbox" name="interests" class="btn-check" id="interests-1070208483711471" autocomplete="off" value="food">
<label class="form-label btn btn-outline-primary my-0" for="interests-1070208483711471">
Food
</label>
</li>
<li>
<input type="checkbox" name="interests" class="btn-check" id="interests-1079057433871241" autocomplete="off" value="art">
<label class="form-label btn btn-outline-primary my-0" for="interests-1079057433871241">
Art
</label>
</li>
</ul>
</div>
</div>

Paramètres

Generates a multiselect dropdown component with tag-based selection, supporting a maximum number of options and custom labels.

  • class (string)
    optional
    - CSS class for the multiselect container. Default: ''
  • labelOptionSelection (string)
    optional
    - label for the dropdown toggle button. Default: ''
  • maxSelectedOptions (number)
    optional
    - maximum number of items that can be selected, 0 for unlimited. Default: 0
  • id (string)
    optional
    - the ID of the element. Default: ''
  • helpMsg (string)
    optional
    - content of the help message. Default: ''
  • errorMsg (string)
    optional
    - content of the error message. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''
  • disabled (boolean)
    optional
    - disables the multiselect. Default: false

Champ mot de passe

macro @cInputPassword

Doc Bootstrap Champ mot de passe

Generates a password input field with optional password meter and confirmation field synchronization.

Exemple

Security :

Please enter your new password. It must contain at least 8 characters, and consist of at least 1 lowercase, 1 uppercase, 1 number and 1 special character.


Saisissez votre mot de passe

<@cForm>
    <@cRow>
        <@cCol>
           <@cField label=''>
                <@cInputPassword label='Mot de passe ( avec suggestion )' name='password1' passwordMeter=true pmConfirmFieldId='passwordConfirm' helpMsg='' /> 
            </@cField>
           <@cField label=''>
                <@cInputPassword label='Confirmation de mot de passe' name='passwordConfirm' /> 
            </@cField>
            <hr>
            <@cField label=''>
                <@cInputPassword label='Mot de passe' name='password2' helpMsg='Saisissez votre mot de passe' /> 
            </@cField>
        </@cCol>
    </@cRow>
</@cForm>

<form method="post">
<div class="row ">
<div class="col ">
<label class="form-label" for="password1">
Mot de passe ( avec suggestion )<span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<div class="input-group password">
<input type="password" class=" form-control pwd form-control-lg" name="password1" id="password1" value="" maxlength="100" autocomplete="off" required aria-required="true">
<button class="btn btn-secondary toggle-password" type="button"data-bs-toggle="#password1" aria-pressed="false" title="Show password" tabindex="0">
<svg class="paris-icon paris-icon-eye-off main-info-color"data-mce-svg="paris-icon paris-icon-eye-off" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-eye-off"></use>
</svg>
</button>
</div>
<label class="form-label" for="passwordConfirm">
Confirmation de mot de passe<span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<p class="form-text " id="help_passwordConfirm">
Please enter your new password. It must contain at least 8 characters, and consist of at least 1 lowercase, 1 uppercase, 1 number and 1 special character.</p>
<div class="input-group password">
<input type="password" class=" form-control pwd form-control-lg" name="passwordConfirm" id="passwordConfirm" value="" maxlength="100" autocomplete="off" required aria-required="true">
<button class="btn btn-secondary toggle-password" type="button"data-bs-toggle="#passwordConfirm" aria-pressed="false" title="Show password" tabindex="0">
<svg class="paris-icon paris-icon-eye-off main-info-color"data-mce-svg="paris-icon paris-icon-eye-off" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-eye-off"></use>
</svg>
</button>
</div>
<hr>
<label class="form-label" for="password2">
Mot de passe<span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<p class="form-text " id="help_password2">
Saisissez votre mot de passe</p>
<div class="input-group password">
<input type="password" class=" form-control pwd form-control-lg" name="password2" id="password2" value="" maxlength="100" autocomplete="off" required aria-required="true">
<button class="btn btn-secondary toggle-password" type="button"data-bs-toggle="#password2" aria-pressed="false" title="Show password" tabindex="0">
<svg class="paris-icon paris-icon-eye-off main-info-color"data-mce-svg="paris-icon paris-icon-eye-off" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-eye-off"></use>
</svg>
</button>
</div>
</div>
</div>
</form>

Paramètres

Generates a password input field with optional show/hide toggle button, password strength meter, and password generation support.

  • name (string)
    required
    - the name attribute of the input
  • label (string)
    optional
    - the label text. Default: ''
  • btnShowPassword (boolean)
    optional
    - displays a button to toggle password visibility. Default: true
  • passwordMeter (boolean)
    optional
    - displays password strength indicator. Default: false
  • pmLabel (string)
    optional
    - label for the password strength message. Default: ' '
  • pmUrl (string)
    optional
    - URL to generate a password via AJAX. Default: ''
  • pmConfirmFieldId (string)
    optional
    - ID of the confirmation password field to sync generated passwords. Default: ''
  • placeholder (string)
    optional
    - the placeholder text. Default: ''
  • autocomplete (string)
    optional
    - the autocomplete attribute value. Default: ''
  • class (string)
    optional
    - CSS class for the input. Default: ''
  • id (string)
    optional
    - the ID of the input. Default: ''
  • size (string)
    optional
    - size suffix for form-control class, 'sm' or 'lg'. Default: ''
  • value (string)
    optional
    - the default value. Default: ''
  • required (boolean)
    optional
    - marks the field as required. Default: true
  • disabled (boolean)
    optional
    - disables the input. Default: false
  • maxlength (number)
    optional
    - maximum character length. Default: 100
  • helpMsg (string)
    optional
    - help message displayed below the input. Default: ''
  • errorMsg (string)
    optional
    - error message displayed on validation failure. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Validation mot de passe

macro @cPasswordCheck

Generates a password requirements checklist (character length, uppercase, digit) displayed as help text below a password field.

Exemple

Please enter your new password. It must contain at least 8 characters, and consist of at least 1 lowercase, 1 uppercase, 1 number and 1 special character.

8 letters a capital letter a digit

<@cInputPassword name='new_password' id='new_password' />
<@cPasswordCheck id='new_password' />

<label class="form-label" for="new_password">
Mot de passe
</label>
<label class="form-label" for="new_password">
<span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<p class="form-text " id="help_new_password">
Please enter your new password. It must contain at least 8 characters, and consist of at least 1 lowercase, 1 uppercase, 1 number and 1 special character.</p>
<div class="input-group password">
<input type="password" class=" form-control pwd form-control-lg" name="new_password" id="new_password" value="" maxlength="100" autocomplete="off" required aria-required="true">
<button class="btn btn-secondary toggle-password" type="button"data-bs-toggle="#new_password" aria-pressed="false" title="Show password" tabindex="0">
<svg class="paris-icon paris-icon-eye-off main-info-color"data-mce-svg="paris-icon paris-icon-eye-off" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-eye-off"></use>
</svg>
</button>
</div>
<p class="form-text " id="help_new_password_checkpassword">
<span class="charlength">
<svg class="paris-icon paris-icon-check"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-check"></use>
</svg> 8 letters</span>
<span class="uppercase">
<svg class="paris-icon paris-icon-check"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-check"></use>
</svg> a capital letter </span>
<span class="digit">
<svg class="paris-icon paris-icon-check"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-check"></use>
</svg> a digit</span>
</p>
<script>
document.addEventListener('DOMContentLoaded', function() {
initPasswordCheck('new_password', [{ selector: ".charlength", test: function(v) { return v.length >= 8; } },{ selector: ".uppercase", test: function(v) { return /[A-Z]/.test(v); } },{ selector: ".digit",test: function(v) { return /\d/.test(v); } }]);
});
</script>
<script src='themes/skin/parisfr/js/themeparisfr.util.min.js'></script>

Paramètres

Generates a password requirements checklist (character length, uppercase, digit) displayed as help text below a password field. The initPasswordCheck JS function validates the input in real time and toggles text-success / text-danger classes on each criterion.

  • id (string)
    required
    - the ID of the associated password input field

Champs upload avec glisser-déposer

macro @cInputDropFiles

Generates a drag-and-drop file upload field with optional file size limits, accepted file types, and multiple file selection.

Exemple

Warning

Attention

Cette macro nécessite le plugin AsynchronousUpload pour fonctionner !
Attention
Pas d'upload possible sur la démo

Zone de drop de fichiers

Télécharger vos fichiers !

Drop your files here or Select

Zone + liste de fichiers upload

Drop your files here or Select

<@cForm>
<@cTitle level=4 class='main-info-color'>Zone de drop de fichiers</@cTitle>
<@cRow>
    <@cCol>
        <@cInputDropFiles name='files_domicile' required=true id='domicile' nbFiles=10 handler={"handlerName":"formsAsynchronousUploadHandler","uploadDeletePrefix":"_form_upload_delete_","uploadCheckboxPrefix":"_form_upload_checkbox_"} formSubmitButtonName='doSaveForm' helpMsg='Télécharger vos fichiers !' />
	</@cCol>
</@cRow>
<@cTitle level=4 class='main-info-color'>Zone + liste de fichiers upload</@cTitle>
<@cRow>
    <@cCol>
        <@cInputDropFiles name='files_domicile' id='domicile2' nbFiles=2 nbUplodadedFiles=2 handler={"handlerName":"formsAsynchronousUploadHandler","uploadDeletePrefix":"_form_upload_delete_","uploadCheckboxPrefix":"_form_upload_checkbox_"} hasFiles=true formSubmitButtonName='doSaveForm'>
            <@cInputDropFilesItem name='files_domicile2' label='Mon attestation.docx' idx=1 handler={"handlerName":"formsAsynchronousUploadHandler","uploadDeletePrefix":"_form_upload_delete_","uploadCheckboxPrefix":"_form_upload_checkbox_"} fileSize=3000 ext='DOCX' urlDl='javascript:return false;' urlRm='javascript:return false;' />
            <@cInputDropFilesItem name='files_domicile3' label='Justificatif.docx' idx=1 handler={"handlerName":"formsAsynchronousUploadHandler","uploadDeletePrefix":"_form_upload_delete_","uploadCheckboxPrefix":"_form_upload_checkbox_"} fileSize=60 ext='DOCX' urlDl='javascript:return false;' urlRm='javascript:return false;' />
        </@cInputDropFiles>
	</@cCol>
</@cRow>
<@cRow>
    <@cCol>
        <@cField>
            <@cBtn label='Valider' class='action' id="doSaveForm"/>
            <@cBtn label='Annuler' class='link-action'>
                <@parisIcon name='close' />
            </@cBtn>
        </@cField>
    </@cCol>
</@cRow>
</@cForm>

<div class="alert alert-outline alert-warning warning" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-warning"data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-1189502237705721" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-1189502237705721">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Attention</p>
</div>
</div>
<div class="alert-content">
Cette macro nécessite le plugin <a class="font-weight-bold mx-xs" href="https://github.com/lutece-platform/lutece-tech-plugin-asynchronousupload"><small><strong>AsynchronousUpload</strong></small></a> pour fonctionner !
<!-- Si vous utilisez une librairie autre que JQuery FileUpload inclue dans le plugin, il vous faudra modifier le HTML et ajouter le javascript nécessaire. -->
</div>
</div>
<script src="js/plugins/asynchronousupload/config.js"></script>
<script>
/* Maps to manage files field errors */
var mapFileErrors = new Map();
var mapFilesNumber = new Map();
var mapFilesNumber = new Map();
var labelFileSize = 'File size :';
</script>
<script src="jsp/site/plugins/asynchronousupload/GetMainUploadJs.jsp?handler=formsAsynchronousUploadHandler" ></script>
<div id="liveFileToastContainer" class="toast-container position-fixed p-3 top-0 end-0" style="position-fixed">
<div id="liveFileToast" class="toast" role="alert" data-autohide="true" data-delay="2000" aria-live="assertive" aria-atomic="true">
<div class="toast-header">
<strong class="me-auto">Attention</strong>
<button type="button" class="ms-auto btn-close" data-bs-dismiss="toast" aria-label="Close">&times;</button>
</div>
<div class="toast-body">
Pas d'upload possible sur la démo
</div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function() {
// Récupérer le conteneur spécifique par son identifiant
var container = document.getElementById('liveFileToastContainer');
var toastElList = [].slice.call(container.querySelectorAll('.toast'));
var option = { delay: 0, animation: true, autohide: false };
var toastList = toastElList.map(function(toastEl) {
return new bootstrap.Toast(toastEl, option);
});
});
</script>
<form method="post">
<h4 class="main-info-color">
Zone de drop de fichiers</h4>
<div class="row ">
<div class="col ">
<input type="hidden" class=" form-control" name="asynchronousupload.handler" id="asynchronousupload.handler" value="formsAsynchronousUploadHandler">
<div class="group-files dropzone ">
<div class="col">
<label id="lbdomicile" class="form-label" for="domicile">Upload files&nbsp;<span class="main-danger-color" tabindex="0" title="Mandatory">*</span></label>
<div id="_file_status_files_domicile" role="status" class="visually-hidden" aria-live="polite"></div>
<p class="form-text " id="help_domicile">
Télécharger vos fichiers !</p>
<div id="_file_error_box_domicile"></div>
<div id="group-domicile" class="d-flex align-items-center file-input">
<input type="file" class="form-control my-xs is-required formsAsynchronousUploadHandler"aria-required="true" aria-describedby="help_domicile" data-nbuploadedfiles="0" name="files_domicile" id="domicile" multiple="multiple" data-nof="10">
<svg class="paris-icon paris-icon-upload white-color" role="img" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-upload"></use>
</svg>
<p class="flex-1 text-start ms-xs my-0">Drop your files here or  <span class="main-info-color text-underline">Select</span></p>
</div>
<div id="progress_domicile" class="progress mt-s" style="display:none;">
<div id="progress-bar_domicile" class="progress-bar progress-bar-success progress-bar-striped"></div>
</div>
<div class="form-files-group" id="_file_deletion_label_domicile" style="display:none;">
<ul id="_file_deletion_domicile" class="files-group">
</ul>
</div>
</div>
</div>
</div>
</div>
<h4 class="main-info-color">
Zone + liste de fichiers upload</h4>
<div class="row ">
<div class="col ">
<input type="hidden" class=" form-control" name="asynchronousupload.handler" id="asynchronousupload.handler" value="formsAsynchronousUploadHandler">
<div class="group-files dropzone no-file">
<div class="col">
<label id="lbdomicile2" class="form-label" for="domicile2">Upload files</label>
<div id="_file_status_files_domicile" role="status" class="visually-hidden" aria-live="polite"></div>
<div id="_file_error_box_domicile2"></div>
<div id="group-domicile2" class="d-flex align-items-center file-input">
<input type="file" class="form-control my-xs formsAsynchronousUploadHandler" data-nbuploadedfiles="2" name="files_domicile" id="domicile2" multiple="multiple" data-nof="2">
<svg class="paris-icon paris-icon-upload white-color" role="img" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-upload"></use>
</svg>
<p class="flex-1 text-start ms-xs my-0">Drop your files here or  <span class="main-info-color text-underline">Select</span></p>
</div>
<div id="progress_domicile2" class="progress mt-s" style="display:none;">
<div id="progress-bar_domicile2" class="progress-bar progress-bar-success progress-bar-striped"></div>
</div>
<div class="form-files-group" id="_file_deletion_label_domicile2">
<ul id="_file_deletion_domicile2" class="files-group">
<li class="files-item" id="_file_uploaded_files_domicile21">
<label class="files-item-label" for="_form_upload_checkbox_files_domicile21">
<a href="jsp/site/plugins/asynchronousupload/DoDownloadFile.jsp?fieldname=files_domicile2&field_index=1&fileName=Mon attestation.docx&asynchronousupload.handler=formsAsynchronousUploadHandler" class="files-item-link" data-type="DOCX" data-img="">
<span class="file-item-label">Mon attestation.docx</span>
<span class="file-item-info">File size : 3 Ko</span>
</a>
</label>
<button type="button" class="btn btn-link main-color deleteSingleFile p-0" data-item="#_file_uploaded_files_domicile21" fieldName="files_domicile2" handlerName="formsAsynchronousUploadHandler" index="1" title="Delete Mon attestation.docx">
<svg class="paris-icon paris-icon-close" role="img" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-close"></use>
</svg>
</button>
</li>
<li class="files-item" id="_file_uploaded_files_domicile31">
<label class="files-item-label" for="_form_upload_checkbox_files_domicile31">
<a href="jsp/site/plugins/asynchronousupload/DoDownloadFile.jsp?fieldname=files_domicile3&field_index=1&fileName=Justificatif.docx&asynchronousupload.handler=formsAsynchronousUploadHandler" class="files-item-link" data-type="DOCX" data-img="">
<span class="file-item-label">Justificatif.docx</span>
<span class="file-item-info">File size : 60 o</span>
</a>
</label>
<button type="button" class="btn btn-link main-color deleteSingleFile p-0" data-item="#_file_uploaded_files_domicile31" fieldName="files_domicile3" handlerName="formsAsynchronousUploadHandler" index="1" title="Delete Justificatif.docx">
<svg class="paris-icon paris-icon-close" role="img" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-close"></use>
</svg>
</button>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="row ">
<div class="col ">
<button class="btn btn-action" type="submit" id="doSaveForm">
<span class="btn-label ">Valider</span>
</button>
<button class="btn btn-link-action" type="submit">
<svg class="paris-icon paris-icon-close"data-mce-svg="paris-icon paris-icon-close" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-close"></use>
</svg><span class="btn-label ">Annuler</span>
</button>
</div>
</div>
</form>
<script>
document.addEventListener( 'DOMContentLoaded', function(){
const filesSelector = document.querySelectorAll('[name="files_domicile"]');
filesSelector.forEach( f => f.addEventListener('click', function(event) {
event.preventDefault();
// Show toast using Bootstrap 5 vanilla JS
const toastElement = document.getElementById('liveFileToast');
if (toastElement) {
const toast = new bootstrap.Toast(toastElement);
toast.show();
}
})
)
});
</script>

Paramètres

Voici la liste des différents paramètres de la macro cInputDropFiles :

cInputDropFile name handler={"handlerName":"formsAsynchronousUploadHandler","uploadDeletePrefix":"_form_upload_delete_","uploadCheckboxPrefix":"_form_upload_checkbox_"} class='' id='' labelSelect='Sélectionner' labelSubmit='Transmettre' labelDelete='Supprimer' required=false disabled=false helpMsg='' errorMsg='' params=''

  • name (string)
    required
    - Attribut name du champs
  • handler (json/text)
    optionnal
    - Handler pour les champs
  • type (string) ('dropzone' / 'dropzone' | 'button')
    optionnal
    - Type d'upload par défaut 'dropzone', zone d'upload ou sinon 'button'.
  • nbFiles (number) (default : 0)
    optionnal
    - Modifie l'affichage en fonction du nombre de fichiers. Si supérieur à 1 affiche une zone a deux colonnes.
  • nbUplodadedFiles (number) (default : 0)
    optionnal
    - Nombre de fichiers déjà uploadé. New
  • maxFileSize (number) (default : 0)
    optionnal
    - Taille maximum des fichiers à uploader. Si 0 pas de limite spécifique sur le champs mais la limite par défaut du site sera appliquée.
  • unit (string) (default : '')
    optionnal
    - Unité de poids choisie par exemple "Mo"
  • accept ( liste text / default : '')
    optionnal
    - Format-s- de fichier accepté-s-.
  • label (string) (default : 'Upload files')
    optionnal
    - Titre de la zone d'upload des fichiers
  • showLabel (number) (default : '')
    optionnal
    - Affiche ou pas le titre de la zone d'upload
  • labelPos (number) (default : 1)
    optionnal
    - Zone d'affichage du label, par défaut dans la prémière colonne.
  • labelSelect (string) (default : 'Select')
    optionnal
    - "Supprimer" valeur définie dans le fichier "themeparisfr_messages_fr.properties".
  • labelSubmit (string) (default : 'Submit' )
    optionnal
    - "Sélectionner" valeur définie dans le fichier "themeparisfr_messages_fr.properties".
  • formSubmitButtonName (string) (default : 'action_doSaveStep' )
    optionnal
    - nom du bouton submit pour le form, utilisé dans le js pour associer les validation nécessaires avant la validation.
  • labelDelete (string) (default : 'Delete' )
    optionnal
    - "Transmettre" valeur définie dans le fichier "themeparisfr_messages_fr.properties".
  • required (boolean) (default : false)
    optionnal
    - Indique si le champs est obligatoire.
  • disabled (boolean) (default : false)
    optionnal
    - Indique si le champs est désactivé.
  • multiple (boolean) (default : true)
    optionnal
    - Ajoute l'attribut "multiple" au champs d'upload.
  • noJs (boolean) (default : false)
    optionnal
    - Ajoute l'attribut "nojs" au bouton de suppression multiple.
  • helpMsg (string) (default :'')
    optionnal
    - Message d'aide
  • hasFiles (boolean) (default : false)
    optionnal
    - Si true affiche la liste de fichiers.
  • errorMsg (string) (default :'')
    optionnal
    - Message d'erreur.
  • id (string) (default :'')
    optionnal
    - Identifiant unique, égal é l'attribut name si non renseigné
  • class (string) (default : '')
    optionnal
    - On peut ajouter une ou des classe-s- séparées par un espace.
  • params (string) (default :'')
    optionnal
    - Tout autre attribut HTML
Fichier uploadé New

Voici la liste des différents paramètres de la macro cInputDropFilesItem :

  • name (string)
    required
    - Attribut name du champs, si le handler ne porte pas le nom
  • idx (string)
    required
    - Index au champs.
  • label (string)
    required
    - label associé au champs.
  • handler (json/text)
    optionnal
    - Handler pour les champs
  • fileSize (number) (default : 0)
    optionnal
    - Taille du fichier uploadé, en octet.
  • ext (string) (default : '')
    optionnal
    - Extension du fihier
  • unit (string) (default : '')
    optionnal
    - Unité de poids choisie par exemple "Mo"
  • urlDl (string) (default : '')
    optionnal
    - Url de téléchargement du fichier, si le handler ne porte pas l'url
  • urlRm (string) (default : '')
    optionnal
    - Url de suppression du fichier, si le handler ne porte pas l'url
  • maxChars (number) (default : 24)
    optionnal
    - Nombre de caractères max pour afficher le nom du fichier
  • class (string) (default : '')
    optionnal
    - Nom d'une ou des classe-s- séparées par un espace.

Champ date

macro @cInputDate

Doc Bootstrap Champ date

Generates a date input field with optional Vanilla JS Datepicker integration, calendar icon, and HTML5 date fallback.

Exemple

<@cRow>
    <@cCol cols='4'>
        <@cLabel label='Date picker' for='datepicker' />
        <@cInputDate id='datepicker_1' label='' name='date1' value=.now?date?iso_utc />
    </@cCol>
    <@cCol cols='4'>
        <@cLabel label='Date picker sans icone' for='datepicker' />
        <@cInputDate id='datepicker_2' label='' name='date2' icon=false />
    </@cCol>
    <@cCol cols='4'>
        <@cLabel label='Date picker HTML' for='datepicker' />
        <@cInputDate id='datepicker_3' label='' name='date3' type='date' />
    </@cCol>
    <@cCol cols='4'>
        <@cLabel label='Date picker HTML' for='datepicker' />
        <@cInputDate id='datepicker_4' label='' name='date4' type='' separator=true />
    </@cCol>
</@cRow>

<div class="row ">
<div class="col-4 ">
<label class="form-label" for="datepicker">
Date picker
</label>
<div class="input-group">
<input type="text" class=" form-control" name="date1" id="datepicker_1" value="2026-05-23">
<span class="input-group-text">
<svg class="paris-icon paris-icon-agenda"data-mce-svg="paris-icon paris-icon-agenda" focusable="false" role="img">
<use href="#paris-icon-agenda"></use>
</svg></span>
</div>
<script>
document.addEventListener('DOMContentLoaded', (e) => {
const customOptions = { };
const themeOptions = {};
const dtLocale = navigator.language.split('-')[0] == 'en' ? 'en' : navigator.language.split('-')[0];
let showFormat=getDatePickerDateFormat( dtLocale );
let dataFormat='yyyy-m-d 00:00:00' // Default for most DB;
const defaultOptions = {
autohide: true,
buttonClass: 'btn',
dataFormat: dataFormat,
dateDelimiter: '|', // Delimiter for mutlidate
daysOfWeekDisabled: [],
defaultViewDate: 'today',
clearButton: true,
enableReadOnly: true,
format: showFormat,
language: `${navigator.language.split('-')[0]}`,
minDate: null,
maxDate: null,
maxNumberOfDate: 1,
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
orientation: 'auto',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
pickLevel: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
showDaysOfWeek: true,
showOnClick: true,
showOnFocus: true,
startView: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
title: '',
todayButton: false,
todayButtonMode: 0, // 0 - Focus , 1 - Select
todayHighlight: true,
updateOnBlur: true,
weekNumbers: 0, // 0 – None, 1 – ISO 8601, 2 – Western traditional, 3 – Middle Eastern, 4 – Guess from weekStart
weekStart: 1,
}
const elemdatepicker_1 = document.querySelector('#datepicker_1')
const dtOptionsdatepicker_1 = setDatePickerOptions( themeOptions, customOptions, defaultOptions )
let datepickerdatepicker_1 = new themeDatepicker( elemdatepicker_1, dtOptionsdatepicker_1 );
});
</script>
</div>
<div class="col-4 ">
<label class="form-label" for="datepicker">
Date picker sans icone<span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<div class="input-group">
<input type="text" class=" form-control" name="date2" id="datepicker_2" value="" placeholder="jj/mm/yyyy" aria-label="jj/mm/yyyy" aria-required="true">
</div>
<script>
document.addEventListener('DOMContentLoaded', (e) => {
const customOptions = { };
const themeOptions = {};
const dtLocale = navigator.language.split('-')[0] == 'en' ? 'en' : navigator.language.split('-')[0];
let showFormat=getDatePickerDateFormat( dtLocale );
let dataFormat='yyyy-m-d 00:00:00' // Default for most DB;
const defaultOptions = {
autohide: true,
buttonClass: 'btn',
dataFormat: dataFormat,
dateDelimiter: '|', // Delimiter for mutlidate
daysOfWeekDisabled: [],
defaultViewDate: 'today',
clearButton: true,
enableReadOnly: true,
format: showFormat,
language: `${navigator.language.split('-')[0]}`,
minDate: null,
maxDate: null,
maxNumberOfDate: 1,
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
orientation: 'auto',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
pickLevel: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
showDaysOfWeek: true,
showOnClick: true,
showOnFocus: true,
startView: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
title: '',
todayButton: false,
todayButtonMode: 0, // 0 - Focus , 1 - Select
todayHighlight: true,
updateOnBlur: true,
weekNumbers: 0, // 0 – None, 1 – ISO 8601, 2 – Western traditional, 3 – Middle Eastern, 4 – Guess from weekStart
weekStart: 1,
}
const elemdatepicker_2 = document.querySelector('#datepicker_2')
const dtOptionsdatepicker_2 = setDatePickerOptions( themeOptions, customOptions, defaultOptions )
let datepickerdatepicker_2 = new themeDatepicker( elemdatepicker_2, dtOptionsdatepicker_2 );
});
</script>
</div>
<div class="col-4 ">
<label class="form-label" for="datepicker">
Date picker HTML
</label>
<div class="input-group">
<input type="date" class=" form-control" name="date3" id="datepicker_3" value="">
</div>
</div>
<div class="col-4 ">
<label class="form-label" for="datepicker">
Date picker avec séparateur
</label>
<div class="input-group">
<input type="text" class=" form-control" name="date4" id="datepicker_4" value="">
</div>
<script>
(function() {
const el = document.getElementById('datepicker_4');
if (!el) return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const localeSample = new Date(yr, 11, 31).toLocaleDateString(document.documentElement.lang || navigator.language);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
if (el.placeholder === '') {
el.placeholder = localeSample.replace(/31/, 'jj').replace(/12/, 'mm').replace(String(yr), 'aaaa');
}
el.addEventListener('input', function(e) {
if (e.inputType === 'deleteContentBackward' || e.inputType === 'deleteContentForward') return;
const digits = el.value.replace(/[^0-9]/g, '');
let result = '', di = 0;
for (let i = 0; i < partLengths.length; i++) {
const chunk = digits.substring(di, di + partLengths[i]);
if (chunk.length === 0) break;
if (i > 0) result += sep;
result += chunk;
di += partLengths[i];
}
if (result !== el.value) {
el.value = result;
}
});
})();
</script>
</div>
</div>

Paramètres

La macro cInputDate permet de générer un champ avec un date picker. Il est possible d'utiliser un champ de type "date" HTML5 en modifiant le type par default 'datepicker' en "date"

La macro <@cInputDate /> initialise et affiche le date picker avec le chargement des fichiers nécessaires.

Configurable en BO

Les options peuvent être surchargée pour tous le site, dans les propriétés du site. Il s'agit de mettre les options dans le champs "Configuration par déaut du date picker".Une option de configurations du date picker doit être libellée sous forme de texte (clé : valeur) séparé par des virgules.

Par exemple: daysOfWeekDisabled: [0,6], etc...

DEPRECATED

Cette façon de faire est toujours possible mais il est conseillé d'utiliser la macro cInputDate décrite ci-dessus

Le champ avec date picker est l'utilisation de deux macro avec une macro "cInput" dans un input group, macro "cInputGroup".

Les macros

La macro <@initThemeDatePicker /> initialise le date picker avec le chargement des fichiers nécessaires.

La macro <@getThemeDatePicker idField='datepickerflat' /> va charger le datepicker avec l'input dont l'id est passé en paramètre -idField-

Les paramètres de <@getThemeDatePicker idField='datepickerflat' />
  • idField (string) (obligatoire) : Identifiant unique
  • showFormat (string) (default :'')
    optionnal
    - Format d'affichage de type 'dd/mm/yyyy' voir la doc vanillajs-datepicker
  • mindate (string) (default : '')
    optionnal
    - Date minimum sélectionnable le datepicker
  • maxdate (string) (default : '')
    optionnal
    - Date maximum sélectionnable le datepicker
  • defaultDate (string) (default : '')
    optionnal
    - Date sélectionnée par défaut dans le datepicker
  • mode (string) (default :'single')
    optionnal
    - Valeur par défaut
  • time (boolean) (default : false)
    optionnal
    - Indique si le champs est en lecture seule.
  • maxlength ( int / default : 0)
    optionnal
    - Permet de saisir une limitation de taille de valeur saisie
  • range (string) (default :'')
    optionnal
    - Message d'aide
  • rangeIdField (string)
    required
    - Identifiant unique, égal
  • customArrows ( Array ) ( default : ',' : Flèches en SVG )

Generates a date input field with optional Vanilla JS Datepicker integration, calendar icon, and HTML5 date fallback.

  • name (string)
    required
    - the name attribute of the input
  • label (string)
    required
    - the label associated to the input
  • id (string)
    optional
    - the ID of the input. Default: ''
  • class (string)
    optional
    - CSS class for the input. Default: ''
  • type (string)
    optional
    - the input type, 'datepicker' for JS datepicker or 'date' for HTML5 date. Default: 'datepicker'
  • icon (boolean)
    optional
    - displays a calendar icon to the right of the input. Default: true
  • options (object)
    optional
    - Vanilla JS Datepicker options (see https://mymth.github.io/vanillajs-datepicker/#/). Default: {}
  • value (string)
    optional
    - the default value. Default: ''
  • placeholder (string)
    optional
    - the placeholder text. Default: ''
  • autocomplete (string)
    optional
    - the autocomplete attribute value. Default: ''
  • required (boolean)
    optional
    - marks the field as required. Default: false
  • disabled (boolean)
    optional
    - disables the input. Default: false
  • readonly (boolean)
    optional
    - sets the input as readonly. Default: false
  • helpMsg (string)
    optional
    - help message displayed below the input. Default: ''
  • errorMsg (string)
    optional
    - error message displayed on validation failure. Default: ''
  • separator (boolean)
    optional
    - séparateur auto-inséré lors de la saisie en fonction du format de date. Si vrai, le séparateur est inséré automatiquement après le jour et le mois en fonction du format de date. Default: false
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Date range

macro @cInputDateRange

Generates a date range input field with optional Vanilla JS Datepicker integration, calendar icon, and HTML5 date fallback.

Exemple

Période donnée

Une erreur est survenue

<@cRow>
  <@cCol cols='12 col-lg-6'>
    <@cLabel label='Période (a11y range picker)' for='dtRangeA11y' />
    <@cInputDateRange id='dtRangeA11y' name='dateRangeA11y' />
  </@cCol>
  <@cCol cols='12 col-lg-6'>
    <@cLabel label='Période avec labels' for='dtRangeLabeled' />
    <@cInputDateRange id='dtRangeLabeled' label=['Début','Fin'] showLabel=[true,true] name='dateRangeLabeled' />
  </@cCol>
</@cRow>

<form method="post">
<div class="row ">
<div class="col-12 col-lg-6 ">
<label class="form-label" for="dtRangeA11y">
Période A
</label>
<div class="daterange " id="dtRangeA11yA">
<div class="row ">
<div class="col pe-0">
<label class="form-label visually-hidden" for="dtRangeA11yA_range_start">
#i8n{theme.labelDateStart}
</label>
</div>
<div class="col ps-0">
<label class="form-label visually-hidden" for="dtRangeA11yA_range_end">
#i8n{theme.labelDateEnd}
</label>
</div>
</div>
<div class="row ">
<div class="col pe-0">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeA11yA" id="dtRangeA11yA_range_start" value="">
</div>
</div>
<div class="col ps-0">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeA11yA_range_end" id="dtRangeA11yA_range_end" value="">
<div class="input-group-text">
<svg class="paris-icon paris-icon-agenda"data-mce-svg="paris-icon paris-icon-agenda" focusable="false" role="img">
<use href="#paris-icon-agenda"></use>
</svg></div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', (e) => {
const customOptions = { };
const themeOptions = {};
const dtLocale = navigator.language.split('-')[0] == 'en' ? 'en' : navigator.language.split('-')[0];
let showFormat=getDatePickerDateFormat( dtLocale );
let dataFormat='yyyy-m-d 00:00:00' // Default for most DB;
const defaultOptions = {
autohide: true,
buttonClass: 'btn',
dataFormat: dataFormat,
dateDelimiter: '|', // Delimiter for mutlidate
daysOfWeekDisabled: [],
defaultViewDate: 'today',
clearButton: true,
enableReadOnly: true,
format: showFormat,
language: `${navigator.language.split('-')[0]}`,
minDate: null,
maxDate: null,
maxNumberOfDate: 1,
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
orientation: 'auto',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
pickLevel: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
showDaysOfWeek: true,
showOnClick: true,
showOnFocus: true,
startView: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
title: '',
todayButton: false,
todayButtonMode: 0, // 0 - Focus , 1 - Select
todayHighlight: true,
updateOnBlur: true,
weekNumbers: 0, // 0 – None, 1 – ISO 8601, 2 – Western traditional, 3 – Middle Eastern, 4 – Guess from weekStart
weekStart: 1,
}
const dtRangeDefaultOptions = {
title: '',
format: showFormat,
dateDelimiter: '|',
language: `${navigator.language.split('-')[0]}`,
dataFormat: dataFormat,
daysOfWeekDisabled: [],
buttonClass: 'btn',
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
defaultViewDate: 'today',
todayButton: false,
clearButton: true,
pickLevel: 0,
startView: 0,
todayHighlight: true,
minDate: null,
maxDate: null,
weekNumbers: 0,
weekStart: 1,
}
const dtRangeOptionsdtRangeA11yA = setDatePickerOptions( themeOptions, customOptions, dtRangeDefaultOptions );
const elDtPickerWrapperdtRangeA11yA = document.getElementById( 'dtRangeA11yA' );
const rangepickerdtRangeA11yA = new DateRangePickerA11y( elDtPickerWrapperdtRangeA11yA, dtRangeOptionsdtRangeA11yA );
});
</script>
</div>
<div class="col-12 col-lg-6 ">
<label class="form-label" for="dtRangeA11y">
Période B
</label>
<p class="form-text " id="help_dtRangeA11yB">
Période donnée</p>
<div class="daterange " id="dtRangeA11yB">
<div class="row ">
<div class="col pe-0">
<label class="form-label visually-hidden" for="dtRangeA11yB_range_start">
#i8n{theme.labelDateStart}
</label>
</div>
<div class="col ps-0">
<label class="form-label visually-hidden" for="dtRangeA11yB_range_end">
#i8n{theme.labelDateEnd}
</label>
</div>
</div>
<div class="row ">
<div class="col pe-0">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeA11yB" id="dtRangeA11yB_range_start" value="">
</div>
</div>
<div class="col ps-0">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeA11yB_range_end" id="dtRangeA11yB_range_end" value="">
<div class="input-group-text">
<svg class="paris-icon paris-icon-agenda"data-mce-svg="paris-icon paris-icon-agenda" focusable="false" role="img">
<use href="#paris-icon-agenda"></use>
</svg></div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', (e) => {
const customOptions = { };
const themeOptions = {};
const dtLocale = navigator.language.split('-')[0] == 'en' ? 'en' : navigator.language.split('-')[0];
let showFormat=getDatePickerDateFormat( dtLocale );
let dataFormat='yyyy-m-d 00:00:00' // Default for most DB;
const defaultOptions = {
autohide: true,
buttonClass: 'btn',
dataFormat: dataFormat,
dateDelimiter: '|', // Delimiter for mutlidate
daysOfWeekDisabled: [],
defaultViewDate: 'today',
clearButton: true,
enableReadOnly: true,
format: showFormat,
language: `${navigator.language.split('-')[0]}`,
minDate: null,
maxDate: null,
maxNumberOfDate: 1,
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
orientation: 'auto',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
pickLevel: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
showDaysOfWeek: true,
showOnClick: true,
showOnFocus: true,
startView: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
title: '',
todayButton: false,
todayButtonMode: 0, // 0 - Focus , 1 - Select
todayHighlight: true,
updateOnBlur: true,
weekNumbers: 0, // 0 – None, 1 – ISO 8601, 2 – Western traditional, 3 – Middle Eastern, 4 – Guess from weekStart
weekStart: 1,
}
const dtRangeDefaultOptions = {
title: '',
format: showFormat,
dateDelimiter: '|',
language: `${navigator.language.split('-')[0]}`,
dataFormat: dataFormat,
daysOfWeekDisabled: [],
buttonClass: 'btn',
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
defaultViewDate: 'today',
todayButton: false,
clearButton: true,
pickLevel: 0,
startView: 0,
todayHighlight: true,
minDate: null,
maxDate: null,
weekNumbers: 0,
weekStart: 1,
}
const dtRangeOptionsdtRangeA11yB = setDatePickerOptions( themeOptions, customOptions, dtRangeDefaultOptions );
const elDtPickerWrapperdtRangeA11yB = document.getElementById( 'dtRangeA11yB' );
const rangepickerdtRangeA11yB = new DateRangePickerA11y( elDtPickerWrapperdtRangeA11yB, dtRangeOptionsdtRangeA11yB );
});
</script>
</div>
<div class="col-12 col-lg-6 ">
<label class="form-label" for="dtRangeLabeled">
Période C avec labels<span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<div class="daterange " id="dtRangeLabeled">
<div class="row ">
<div class="col pe-0">
<label class="form-label" for="dtRangeLabeled_range_start">
Début
</label>
</div>
<div class="col ps-0">
<label class="form-label" for="dtRangeLabeled_range_end">
Fin
</label>
</div>
</div>
<div class="row ">
<div class="col pe-0">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeLabeled" id="dtRangeLabeled_range_start" value="">
</div>
</div>
<div class="col ps-0">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeLabeled_range_end" id="dtRangeLabeled_range_end" value="">
<div class="input-group-text">
<svg class="paris-icon paris-icon-agenda"data-mce-svg="paris-icon paris-icon-agenda" focusable="false" role="img">
<use href="#paris-icon-agenda"></use>
</svg></div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', (e) => {
const customOptions = { };
const themeOptions = {};
const dtLocale = navigator.language.split('-')[0] == 'en' ? 'en' : navigator.language.split('-')[0];
let showFormat=getDatePickerDateFormat( dtLocale );
let dataFormat='yyyy-m-d 00:00:00' // Default for most DB;
const defaultOptions = {
autohide: true,
buttonClass: 'btn',
dataFormat: dataFormat,
dateDelimiter: '|', // Delimiter for mutlidate
daysOfWeekDisabled: [],
defaultViewDate: 'today',
clearButton: true,
enableReadOnly: true,
format: showFormat,
language: `${navigator.language.split('-')[0]}`,
minDate: null,
maxDate: null,
maxNumberOfDate: 1,
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
orientation: 'auto',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
pickLevel: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
showDaysOfWeek: true,
showOnClick: true,
showOnFocus: true,
startView: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
title: '',
todayButton: false,
todayButtonMode: 0, // 0 - Focus , 1 - Select
todayHighlight: true,
updateOnBlur: true,
weekNumbers: 0, // 0 – None, 1 – ISO 8601, 2 – Western traditional, 3 – Middle Eastern, 4 – Guess from weekStart
weekStart: 1,
}
const dtRangeDefaultOptions = {
title: '',
format: showFormat,
dateDelimiter: '|',
language: `${navigator.language.split('-')[0]}`,
dataFormat: dataFormat,
daysOfWeekDisabled: [],
buttonClass: 'btn',
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
defaultViewDate: 'today',
todayButton: false,
clearButton: true,
pickLevel: 0,
startView: 0,
todayHighlight: true,
minDate: null,
maxDate: null,
weekNumbers: 0,
weekStart: 1,
}
const dtRangeOptionsdtRangeLabeled = setDatePickerOptions( themeOptions, customOptions, dtRangeDefaultOptions );
const elDtPickerWrapperdtRangeLabeled = document.getElementById( 'dtRangeLabeled' );
const rangepickerdtRangeLabeled = new DateRangePickerA11y( elDtPickerWrapperdtRangeLabeled, dtRangeOptionsdtRangeLabeled );
});
</script>
</div>
<div class="col-12 col-lg-6 ">
<label class="form-label" for="dtRangeLabeled2">
Période C avec Erreur<span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<p class="invalid-feedback" id="error_dtRangeLabeled_range_end">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Une erreur est survenue</p>
<div class="daterange is-invalid" id="dtRangeLabeled2">
<div class="row ">
<div class="col pe-0">
<label class="form-label" for="dtRangeLabeled2_range_start">
Début
</label>
</div>
<div class="col ps-0">
<label class="form-label" for="dtRangeLabeled2_range_end">
Fin
</label>
</div>
</div>
<div class="row ">
<div class="col pe-0">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeLabeled2" id="dtRangeLabeled2_range_start" value="">
</div>
</div>
<div class="col ps-0">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeLabeled2_range_end" id="dtRangeLabeled2_range_end" value="">
<div class="input-group-text">
<svg class="paris-icon paris-icon-agenda"data-mce-svg="paris-icon paris-icon-agenda" focusable="false" role="img">
<use href="#paris-icon-agenda"></use>
</svg></div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', (e) => {
const customOptions = { };
const themeOptions = {};
const dtLocale = navigator.language.split('-')[0] == 'en' ? 'en' : navigator.language.split('-')[0];
let showFormat=getDatePickerDateFormat( dtLocale );
let dataFormat='yyyy-m-d 00:00:00' // Default for most DB;
const defaultOptions = {
autohide: true,
buttonClass: 'btn',
dataFormat: dataFormat,
dateDelimiter: '|', // Delimiter for mutlidate
daysOfWeekDisabled: [],
defaultViewDate: 'today',
clearButton: true,
enableReadOnly: true,
format: showFormat,
language: `${navigator.language.split('-')[0]}`,
minDate: null,
maxDate: null,
maxNumberOfDate: 1,
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
orientation: 'auto',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
pickLevel: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
showDaysOfWeek: true,
showOnClick: true,
showOnFocus: true,
startView: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
title: '',
todayButton: false,
todayButtonMode: 0, // 0 - Focus , 1 - Select
todayHighlight: true,
updateOnBlur: true,
weekNumbers: 0, // 0 – None, 1 – ISO 8601, 2 – Western traditional, 3 – Middle Eastern, 4 – Guess from weekStart
weekStart: 1,
}
const dtRangeDefaultOptions = {
title: '',
format: showFormat,
dateDelimiter: '|',
language: `${navigator.language.split('-')[0]}`,
dataFormat: dataFormat,
daysOfWeekDisabled: [],
buttonClass: 'btn',
nextArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_3183)"><path d="M15.5151 13.4729L10.1484 8.10621L12.3093 5.94531L19.8369 13.4729L12.3093 21.0004L10.1484 18.8395L15.5151 13.4729Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_3183"><rect width="28" height="28" fill="white" transform="translate(28 28) rotate(180)"/></clipPath></defs></svg>',
prevArrow: '<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_6399_4241)"><path d="M12.4849 14.5271L17.8516 19.8938L15.6907 22.0547L8.16309 14.5271L15.6907 6.99955L17.8516 9.16045L12.4849 14.5271Z" fill="#071F32"/></g><defs><clipPath id="clip0_6399_4241"><rect width="28" height="28" fill="white"/></clipPath></defs></svg>',
defaultViewDate: 'today',
todayButton: false,
clearButton: true,
pickLevel: 0,
startView: 0,
todayHighlight: true,
minDate: null,
maxDate: null,
weekNumbers: 0,
weekStart: 1,
}
const dtRangeOptionsdtRangeLabeled2 = setDatePickerOptions( themeOptions, customOptions, dtRangeDefaultOptions );
const elDtPickerWrapperdtRangeLabeled2 = document.getElementById( 'dtRangeLabeled2' );
const rangepickerdtRangeLabeled2 = new DateRangePickerA11y( elDtPickerWrapperdtRangeLabeled2, dtRangeOptionsdtRangeLabeled2 );
});
</script>
</div>
</div>
</form>

Paramètres

  • name (string)
    required
    - permet de définir le name du champ
  • label (string)
    required
    - permet de définir le label du champ
  • id (string)
    optionnal
    - permet de définir l'id du champ
  • class (string)
    optionnal
    - permet de définir les class CSS du champ (default:'')
  • type (string)
    optionnal
    - permet de définir le type du champ (default:'datepicker'. Choix possibles: 'datepicker' ou 'date')
  • icon (boolean)
    optionnal
    - permet de définir l'icon du champ (default:true)
  • options (object)
    optionnal
    - permet de définir les options du champ (default:{})
    • autohide: customOptions.autohide || true,
    • buttonClass: customOptions.btn ||'btn',
    • dataFormat: customOptions.dataFormat || dataFormat,
    • dateDelimiter: customOptions.autohide || '|', // Delimiter for mutlidate
    • daysOfWeekDisabled: [0,6],
    • defaultViewDate: 'today',
    • clearButton: true,
    • enableReadOnly: true,
    • format: customOptions.showFormat || showFormat,
    • language: browserLang,
    • minDate: null,
    • maxDate: null,
    • maxNumberOfDate: 1,
    • nextArrow: '${customArrows[1]}',
    • orientation: 'auto',
    • prevArrow: '${customArrows[0]}',
    • picklevel: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
    • showDaysOfWeek: true,
    • showOnClick: true,
    • showOnFocus: true,
    • startView: 0, // 0 - Days 1 - Month, 2 - Year, 3 - Decade
    • title: '',
    • todayButton: false,
    • todayButtonMode: 0, // 0 - Focus , 1 - Select
    • todayHighlight: true,
    • updateOnBlur: true,
    • weekNumbers: 0, // 0 – None, 1 – ISO 8601, 2 – Western traditional, 3 – Middle Eastern, 4 – Guess from weekStart
    • weekStart: 1,
  • value (string)
    optionnal
    - permet de définir la valeur du champ (default:'')
  • placeholder (array)
    optionnal
    - permet de définir le placeholder du champ pour chaque date du range (default:['',''])
  • required (array)
    optionnal
    - permet de définir champ en required pour chaque date du range (default:[false,false])
  • disabled (array)
    optionnal
    - permet de desactiver le champ pour chaque date du range (default:[false,false])
  • readonly (array)
    optionnal
    - permet de définir le champ en readonly pour chaque date du range (default:[false,false])
  • helpMsg (string)
    optionnal
    - permet de définir le message d'aide du champ (default:'')
  • errorMsg (string)
    optionnal
    - permet de définir le message d'erreur du champ (default:'')
  • params (string)
    optionnal
    - permet de définir les paramètres HTML du champ (default:'') default ''
  • #nested (string)
    optionnal
    - Tous contenu
Information

La librairie utilisée est Vanilla JS Datepicker

La macro cInputDateRange permet de générer un champ avec un date picker. Il est possible d'utiliser un champ de type "date" HTML5 en modifiant le type par default 'datepicker' en "date"

La macro <@cInputDate /> initialise et affiche le date picker avec le chargement des fichiers nécessaires.

Configurable en BO

Les options peuvent être surchargée pour tous le site, dans les propriétés du site. Il s'agit de mettre les options de VanillaJS Datepicker dans le champs "Configuration par déaut du date picker".Une option de configurations du date picker doit être libellée sous forme de texte (clé : valeur) séparé par des virgules.

Par exemple: daysOfWeekDisabled: [0,6], etc...

DEPRECATED

Cette façon de faire est toujours possible mais il est conseillé d'utiliser la macro cInputDate décrite ci-dessus

Le champ avec date picker est l'utilisation de deux macro avec une macro "cInput" dans un input group, macro "cInputGroup". La librairie utilisée est vanillajs-datepicker

Les macros

La macro <@initThemeDatePicker /> initialise le date picker avec le chargement des fichiers nécessaires.

La macro <@getThemeDatePicker idField='datepickerflat' /> va charger le datepicker avec l'input dont l'id est passé en paramètre -idField-

Les paramètres de <@getThemeDatePicker idField='datepickerflat' />
  • idField (string) (obligatoire) : Identifiant unique
  • showFormat (string) (default :'')
    optionnal
    - Format d'affichage de type 'dd/mm/yyyy' voir la doc vanillajs-datepicker
  • mindate (string) (default : '')
    optionnal
    - Date minimum sélectionnable le datepicker
  • maxdate (string) (default : '')
    optionnal
    - Date maximum sélectionnable le datepicker
  • defaultDate (string) (default : '')
    optionnal
    - Date sélectionnée par défaut dans le datepicker
  • mode (string) (default :'single')
    optionnal
    - Valeur par défaut
  • time (boolean) (default : false)
    optionnal
    - Indique si le champs est en lecture seule.
  • maxlength ( int / default : 0)
    optionnal
    - Permet de saisir une limitation de taille de valeur saisie
  • range (string) (default :'')
    optionnal
    - Message d'aide
  • rangeIdField (string)
    required
    - Identifiant unique, égal
  • customArrows ( Array ) ( default : ',' : Flèches en SVG )

Créneau horaire

macro @cInputTimeSlot

Generates a time slot input field with optional start and end times, step increments, and labels.

Exemple

Meeting error *

Une erreur s'est produite !

Une erreur s'est produite !

Une erreur s'est produite !

Meeting time *

Veuillez sélectionner une heure de réunion

Choisir un créneau

Prendre un rendez-vous sur le créneau choisi

<@cForm>
<@cInputTimeSlot name='error' legend='Meeting error' beginHour='08:00' endHour='18:00' step=900 required=true errorMsg='Une erreur s\'est produite !' />
<@cInputTimeSlot name='meeting' legend='Meeting time' beginHour='08:00' endHour='18:00' step=900 required=true helpMsg='Veuillez sélectionner une heure de réunion' />
<@cInputTimeSlot name='slot' beginHour='09:00' endHour='17:00' labelFrom='Start Time' labelTo='End Time' showLabel=true />
<@cInputTimeSlot name='creneau' legend='Choisir un créneau' helpMsg='Prendre un rendez-vous sur le créneau choisi' /> 
</@cForm>

<form method="post">
<fieldset id="fieldset-error" role="group" aria-labelledby="legend-error">
<legend id="legend-error" aria-required="true">Meeting error <span class="main-danger-color" tabindex="-1" title="Mandatory">*</span></legend>
<p class="invalid-feedback mt-xs" id="error_error">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Une erreur s'est produite !</p>
<div class="row is-invalid mt-0">
<div class="col-6 col-md-4 col-lg-2 ">
<div id="label_error_begin" >
<label class="form-label visually-hidden" for="error_begin!">
From <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<p class="invalid-feedback visually-hidden" id="error_error_begin">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Une erreur s'est produite !</p>
<input type="time" class=" form-control is-invalid" name="error_begin" id="error_begin" value="08:00" title="From" min="08:00" max="18:00" step="900" aria-required="true" aria-invalid="true" aria-describedby="error_error_begin">
</div>
</div>
<div class="col-6 col-md-4 col-lg-2 ">
<div id="label_error_end" >
<label class="form-label visually-hidden" for="error_end!">
To <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<p class="invalid-feedback visually-hidden" id="error_error_end">
<svg class="paris-icon paris-icon-alert-error main-danger-color"data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Une erreur s'est produite !</p>
<input type="time" class=" form-control is-invalid" name="error_end" id="error_end" value="18:00" title="To" min="08:00" max="18:00" step="900" aria-required="true" aria-invalid="true" aria-describedby="error_error_end">
</div>
</div>
</div>
</fieldset>
<script src="themes/skin/parisfr/js/themeparisfr.util.min.js"></script>
<script src="themes/skin/parisfr/js/plugins/forms/input-time-polyfill.y11.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const browserInfo = getBrowserInfo();
// Polyfill for IE / FF / Safari
if ( browserInfo.name.includes( 'IE') || browserInfo.name.includes('Firefox') || browserInfo.name.includes('Safari') ) {
const btnSendStep = document.querySelector('[name="action_doSaveStep"]');
const timeInputs = document.querySelectorAll('input[type="time"]');
// Replace time inputs with text inputs with class "time-polyfill"
timeInputs.forEach( input => {
input.classList.add('time-polyfill');
input.type = 'text';
});
// Add event listener for keydown event to handle tabbing between inputs
document.addEventListener('keydown', function( e ) {
if( e.target.classList.contains('time-polyfill') ) {
switch (e.keyCode) {
case 9:
const inputName = e.target.name;
const nextInputName = inputName.endsWith('_begin') ? inputName.replace('_begin', '_end') : inputName.replace('_end', '_begin');
const nextInput = document.querySelector(`input[name="${nextInputName}"]`);
if (nextInput) {
nextInput.focus();
}
e.stopImmediatePropagation();
break;
default:
break;
}
}
// Validate before submitting the form
if( btnSendStep != null ){
btnSendStep.on('click', function(e) {
// Replace time inputs with text inputs with class "time-polyfill"
timeInputs.forEach( input => {
input.value = input.value === ('--:--') ? '' : input.value;
});
});
}
});
}
});
</script>
<fieldset id="fieldset-meeting" role="group" aria-labelledby="legend-meeting" aria-describedby="help_meeting">
<legend id="legend-meeting" aria-required="true">Meeting time <span class="main-danger-color" tabindex="-1" title="Mandatory">*</span></legend>
<p class="form-text " id="help_meeting">
Veuillez sélectionner une heure de réunion</p>
<div class="row ">
<div class="col-6 col-md-4 col-lg-2 ">
<div id="label_meeting_begin" >
<label class="form-label visually-hidden" for="meeting_begin!">
From <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="time" class=" form-control" name="meeting_begin" id="meeting_begin" value="08:00" title="From" min="08:00" max="18:00" step="900" aria-required="true">
</div>
</div>
<div class="col-6 col-md-4 col-lg-2 ">
<div id="label_meeting_end" >
<label class="form-label visually-hidden" for="meeting_end!">
To <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="time" class=" form-control" name="meeting_end" id="meeting_end" value="18:00" title="To" min="08:00" max="18:00" step="900" aria-required="true">
</div>
</div>
</div>
</fieldset>
<script src="themes/skin/parisfr/js/themeparisfr.util.min.js"></script>
<script src="themes/skin/parisfr/js/plugins/forms/input-time-polyfill.y11.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const browserInfo = getBrowserInfo();
// Polyfill for IE / FF / Safari
if ( browserInfo.name.includes( 'IE') || browserInfo.name.includes('Firefox') || browserInfo.name.includes('Safari') ) {
const btnSendStep = document.querySelector('[name="action_doSaveStep"]');
const timeInputs = document.querySelectorAll('input[type="time"]');
// Replace time inputs with text inputs with class "time-polyfill"
timeInputs.forEach( input => {
input.classList.add('time-polyfill');
input.type = 'text';
});
// Add event listener for keydown event to handle tabbing between inputs
document.addEventListener('keydown', function( e ) {
if( e.target.classList.contains('time-polyfill') ) {
switch (e.keyCode) {
case 9:
const inputName = e.target.name;
const nextInputName = inputName.endsWith('_begin') ? inputName.replace('_begin', '_end') : inputName.replace('_end', '_begin');
const nextInput = document.querySelector(`input[name="${nextInputName}"]`);
if (nextInput) {
nextInput.focus();
}
e.stopImmediatePropagation();
break;
default:
break;
}
}
// Validate before submitting the form
if( btnSendStep != null ){
btnSendStep.on('click', function(e) {
// Replace time inputs with text inputs with class "time-polyfill"
timeInputs.forEach( input => {
input.value = input.value === ('--:--') ? '' : input.value;
});
});
}
});
}
});
</script>
<fieldset id="fieldset-slot" role="group" aria-labelledby="legend-slot">
<div class="row ">
<div class="col-6 col-md-4 col-lg-2 ">
<div id="label_slot_begin" >
<label class="form-label" for="slot_begin!">
Start Time
</label>
<input type="time" class=" form-control" name="slot_begin" id="slot_begin" value="09:00" title="Start Time" min="09:00" max="17:00">
</div>
</div>
<div class="col-6 col-md-4 col-lg-2 ">
<div id="label_slot_end" >
<label class="form-label" for="slot_end!">
End Time
</label>
<input type="time" class=" form-control" name="slot_end" id="slot_end" value="17:00" title="End Time" min="09:00" max="17:00">
</div>
</div>
</div>
</fieldset>
<script src="themes/skin/parisfr/js/themeparisfr.util.min.js"></script>
<script src="themes/skin/parisfr/js/plugins/forms/input-time-polyfill.y11.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const browserInfo = getBrowserInfo();
// Polyfill for IE / FF / Safari
if ( browserInfo.name.includes( 'IE') || browserInfo.name.includes('Firefox') || browserInfo.name.includes('Safari') ) {
const btnSendStep = document.querySelector('[name="action_doSaveStep"]');
const timeInputs = document.querySelectorAll('input[type="time"]');
// Replace time inputs with text inputs with class "time-polyfill"
timeInputs.forEach( input => {
input.classList.add('time-polyfill');
input.type = 'text';
});
// Add event listener for keydown event to handle tabbing between inputs
document.addEventListener('keydown', function( e ) {
if( e.target.classList.contains('time-polyfill') ) {
switch (e.keyCode) {
case 9:
const inputName = e.target.name;
const nextInputName = inputName.endsWith('_begin') ? inputName.replace('_begin', '_end') : inputName.replace('_end', '_begin');
const nextInput = document.querySelector(`input[name="${nextInputName}"]`);
if (nextInput) {
nextInput.focus();
}
e.stopImmediatePropagation();
break;
default:
break;
}
}
// Validate before submitting the form
if( btnSendStep != null ){
btnSendStep.on('click', function(e) {
// Replace time inputs with text inputs with class "time-polyfill"
timeInputs.forEach( input => {
input.value = input.value === ('--:--') ? '' : input.value;
});
});
}
});
}
});
</script>
<fieldset id="fieldset-creneau" role="group" aria-labelledby="legend-creneau" aria-describedby="help_creneau">
<legend id="legend-creneau" >Choisir un créneau</legend>
<p class="form-text " id="help_creneau">
Prendre un rendez-vous sur le créneau choisi</p>
<div class="row ">
<div class="col-6 col-md-4 col-lg-2 ">
<div id="label_creneau_begin" >
<label class="form-label visually-hidden" for="creneau_begin!">
From
</label>
<input type="time" class=" form-control" name="creneau_begin" id="creneau_begin" value="00:00" title="From" min="00:00" max="23:59">
</div>
</div>
<div class="col-6 col-md-4 col-lg-2 ">
<div id="label_creneau_end" >
<label class="form-label visually-hidden" for="creneau_end!">
To
</label>
<input type="time" class=" form-control" name="creneau_end" id="creneau_end" value="23:59" title="To" min="00:00" max="23:59">
</div>
</div>
</div>
</fieldset>
<script src="themes/skin/parisfr/js/themeparisfr.util.min.js"></script>
<script src="themes/skin/parisfr/js/plugins/forms/input-time-polyfill.y11.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const browserInfo = getBrowserInfo();
// Polyfill for IE / FF / Safari
if ( browserInfo.name.includes( 'IE') || browserInfo.name.includes('Firefox') || browserInfo.name.includes('Safari') ) {
const btnSendStep = document.querySelector('[name="action_doSaveStep"]');
const timeInputs = document.querySelectorAll('input[type="time"]');
// Replace time inputs with text inputs with class "time-polyfill"
timeInputs.forEach( input => {
input.classList.add('time-polyfill');
input.type = 'text';
});
// Add event listener for keydown event to handle tabbing between inputs
document.addEventListener('keydown', function( e ) {
if( e.target.classList.contains('time-polyfill') ) {
switch (e.keyCode) {
case 9:
const inputName = e.target.name;
const nextInputName = inputName.endsWith('_begin') ? inputName.replace('_begin', '_end') : inputName.replace('_end', '_begin');
const nextInput = document.querySelector(`input[name="${nextInputName}"]`);
if (nextInput) {
nextInput.focus();
}
e.stopImmediatePropagation();
break;
default:
break;
}
}
// Validate before submitting the form
if( btnSendStep != null ){
btnSendStep.on('click', function(e) {
// Replace time inputs with text inputs with class "time-polyfill"
timeInputs.forEach( input => {
input.value = input.value === ('--:--') ? '' : input.value;
});
});
}
});
}
});
</script>
</form>

Paramètres

Generates a time slot picker with two time inputs (begin and end) wrapped in a fieldset, including browser polyfill support.

  • name (string)
    required
    - the name attribute prefix for the time inputs (generates {name}_begin and {name}_end)
  • legend (string)
    optional
    - the legend/title of the fieldset. Default: ''
  • legendClass (string)
    optional
    - CSS class for the fieldset legend. Default: ''
  • labelFrom (string)
    optional
    - label for the start time input. Default: 'From'
  • labelTo (string)
    optional
    - label for the end time input. Default: 'To'
  • showLabel (boolean)
    optional
    new
    - whether to display the labels for the time inputs. Default: false
  • beginHour (string)
    optional
    - default start time value. Default: '00:00'
  • endHour (string)
    optional
    - default end time value. Default: '23:59'
  • step (number)
    optional
    - step increment in seconds for the time input (e.g., 900 for 15-minute intervals). Default: 0
  • btnAction (string)
    optional
    - CSS selector for the form submit button, used by the polyfill. Default: '[name="action_doSaveStep"]'
  • autocomplete (string)
    optional
    - the autocomplete attribute value. Default: ''
  • html5Required (boolean)
    optional
    - uses the HTML5 required attribute. Default: false
  • required (boolean)
    optional
    - marks the fields as required. Default: false
  • disabled (boolean)
    optional
    - disables the inputs. Default: false
  • readonly (boolean)
    optional
    - sets the inputs as readonly. Default: false
  • helpMsg (string)
    optional
    - help message for the fieldset. Default: ''
  • errorMsg (string)
    optional
    - error message on validation failure. Default: ''
  • hideErrorMsg (boolean)
    optional
    - hides the error message display. Default: true
  • id (string)
    optional
    - the ID of the fieldset. Default: ''
  • class (string)
    optional
    - CSS class for the time inputs. Default: 'form-control'
  • params (string)
    optional
    - additional HTML attributes for the fieldset. Default: ''

Sélecteur de quantité

macro @cQuantityPicker

Generates a quantity picker with increment/decrement buttons and a number input, supporting min/max constraints.

Exemple

Information exemple

<@cForm>
<@cRow>
    <@cCol>
		<@cQuantityPicker name='seats' label='Number of seats' showLabel=true minQty='1' maxQty='20' required=true />
    </@cCol>
</@cRow>
<@cRow>
    <@cCol>
        <@cLabel label='Quantité' for='quantity' />
        <@cQuantityPicker name='quantity' minQty='0' maxQty='10' helpMsg='Information exemple' />
    </@cCol>
</@cRow>
</@cForm>

<form method="post">
<div class="row ">
<div class="col ">
<div class="quantity-picker ">
<label class="form-label" for="seats">
Number of seats<span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<div class="input-group w-auto">
<button class="btn btn-light quantity-btn decrement-quantity" type="submit"aria-label="Decrease quantity" data-direction="-1">
<span class="btn-label ">&#8722;</span>
</button>
<input type="number" class=" form-control quantity-input" name="seats" id="seats" value="1" data-min="1" data-max="20" aria-required="true">
<button class="btn btn-light quantity-btn increment-quantity" type="submit"aria-label="Increase quantity" data-direction="1">
<span class="btn-label ">&#43;</span>
</button>
</div>
</div>
<script>
document.addEventListener( 'DOMContentLoaded', function() {
document.addEventListener( 'click', function(ev) {
if ( ev.target.classList.contains('quantity-btn') ) {
const parentDiv = ev.target.closest('.quantity-picker');
const input = parentDiv.querySelector('input[name="seats"]');
const currentQty = parseInt(input.value);
const qtyDirection = parseInt(ev.target.getAttribute("data-direction"));
let newQty = currentQty + qtyDirection;
let minQty = parseInt(input.getAttribute("data-min"));
let maxQty = parseInt(input.getAttribute("data-max"));
newQty = Math.max(minQty, Math.min(maxQty, newQty));
parentDiv.querySelector(".decrement-quantity").disabled = (newQty === minQty);
parentDiv.querySelector(".increment-quantity").disabled = (newQty === maxQty);
input.value = newQty;
}
});
document.addEventListener("blur", function(ev) {
if ( ev.target.name ==='quantity') {
const input = ev.target;
const parentDiv = input.closest('.quantity-picker');
let minQty = parseInt(input.getAttribute("data-min"));
if (input.value.trim() === "") {
input.value = minQty;
parentDiv.querySelector(".decrement-quantity").disabled = true;
}
}
}, true);
});
</script>
</div>
</div>
<div class="row ">
<div class="col ">
<label class="form-label" for="quantity">
Quantité
</label>
<p class="form-text " id="help_seats">
Information exemple</p>
<div class="quantity-picker ">
<label class="form-label visually-hidden" for="quantity">
Choose a quantity
</label>
<div class="input-group w-auto">
<button class="btn btn-light quantity-btn decrement-quantity" type="submit"aria-label="Decrease quantity" data-direction="-1">
<span class="btn-label ">&#8722;</span>
</button>
<input type="number" class=" form-control quantity-input" name="quantity" id="quantity" value="0" data-min="0" data-max="10" >
<button class="btn btn-light quantity-btn increment-quantity" type="submit"aria-label="Increase quantity" data-direction="1">
<span class="btn-label ">&#43;</span>
</button>
</div>
</div>
<script>
document.addEventListener( 'DOMContentLoaded', function() {
document.addEventListener( 'click', function(ev) {
if ( ev.target.classList.contains('quantity-btn') ) {
const parentDiv = ev.target.closest('.quantity-picker');
const input = parentDiv.querySelector('input[name="quantity"]');
const currentQty = parseInt(input.value);
const qtyDirection = parseInt(ev.target.getAttribute("data-direction"));
let newQty = currentQty + qtyDirection;
let minQty = parseInt(input.getAttribute("data-min"));
let maxQty = parseInt(input.getAttribute("data-max"));
newQty = Math.max(minQty, Math.min(maxQty, newQty));
parentDiv.querySelector(".decrement-quantity").disabled = (newQty === minQty);
parentDiv.querySelector(".increment-quantity").disabled = (newQty === maxQty);
input.value = newQty;
}
});
document.addEventListener("blur", function(ev) {
if ( ev.target.name ==='quantity') {
const input = ev.target;
const parentDiv = input.closest('.quantity-picker');
let minQty = parseInt(input.getAttribute("data-min"));
if (input.value.trim() === "") {
input.value = minQty;
parentDiv.querySelector(".decrement-quantity").disabled = true;
}
}
}, true);
});
</script>
</div>
</div>
</form>

Paramètres

Generates a quantity picker with increment/decrement buttons and a number input, supporting min/max constraints.

  • name (string)
    required
    - the name attribute of the input
  • label (string)
    optional
    - the label text for the picker. Default: 'Choisir une quantite'
  • showLabel (boolean)
    optional
    - displays or hides the label. Default: false
  • labelDecrease (string)
    optional
    - accessible label for the decrease button. Default: 'Retirer une unite'
  • labelIncrease (string)
    optional
    - accessible label for the increase button. Default: 'Ajouter une unite'
  • minQty (string)
    optional
    - minimum selectable value. Default: '0'
  • maxQty (string)
    optional
    - maximum selectable value. Default: '10'
  • id (string)
    optional
    - the ID of the input. Default: ''
  • class (string)
    optional
    - CSS class for the picker container. Default: ''
  • required (boolean)
    optional
    - marks the field as required. Default: false
  • disabled (boolean)
    optional
    - disables the input and buttons. Default: false
  • helpMsg (string)
    optional
    - help message displayed below the picker. Default: ''
  • errorMsg (string)
    optional
    - error message displayed on validation failure. Default: ''

Étape terminée

macro @cStepDone

Generates a completed step in a multi-step form, displaying a check mark, summary content, and an edit button to navigate back to the step.

Exemple

Personal information

    John Doe - john.doe@email.com

Account details

Edit

    Username: johndoe

Edit

<@cStepDone step='1' title='Personal information' idx=0>
    <@cText>John Doe - john.doe@email.com</@cText>
</@cStepDone>

<@cStepDone step='1' title='Account details' idx=0 actionHref='jsp/site/Portal.jsp?page=form&step=1' actionLabel='Edit'>
    <@cText>Username: johndoe</@cText>
</@cStepDone>

<section class="step step-done ">
<section class="step-title">
<div class="container d-flex justify-content-between align-items-center">
<h2 class="title mt-0" title="Personal information">
<span class="step-number">
<svg width="32" height="32" role="img" aria-hidden="true" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.9607 23.9932L5.33203 16.3882L7.67726 14.0502L12.9607 19.3173L24.3201 7.99316L26.6654 10.3311L12.9607 23.9932Z" fill="white"/></svg></span>
<span>
Personal information</span>
</h2>
<span class="d-none d-sm-block">
<button class="btn btn-secondary btn-sm-block" type="submit"name="action_doGoToStep"value="0" aria-label="Update step Personal information" formnovalidate>
<span class="btn-label ">Update</span>
</button>
</span>
</div>
</section>
<div class="container mt-0">
<div class="step-content">
<ul class="list-unstyled" >
<p>
John Doe - john.doe@email.com</p>
</ul>
<div class="d-block d-sm-none mt-m">
<button class="btn btn-secondary btn-sm-block" type="submit"name="action_doGoToStep"value="0" aria-label="Update step Personal information" formnovalidate>
<span class="btn-label ">Update</span>
</button>
</div>
</div>
</div>
</section>
<section class="step step-done ">
<section class="step-title">
<div class="container d-flex justify-content-between align-items-center">
<h2 class="title mt-0" title="Account details">
<span class="step-number">
<svg width="32" height="32" role="img" aria-hidden="true" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.9607 23.9932L5.33203 16.3882L7.67726 14.0502L12.9607 19.3173L24.3201 7.99316L26.6654 10.3311L12.9607 23.9932Z" fill="white"/></svg></span>
<span>
Account details</span>
</h2>
<span class="d-none d-sm-block">
<a href="jsp/site/Portal.jsp?page=form&step=1" class="btn btn-secondary btn-sm-block " aria-label="Update step Account details" >
<span class="link-label">Edit</span>
</a>
</span>
</div>
</section>
<div class="container mt-0">
<div class="step-content">
<ul class="list-unstyled" >
<p>
Username: johndoe</p>
</ul>
<div class="d-block d-sm-none mt-m">
<a href="jsp/site/Portal.jsp?page=form&step=1" class="btn btn-secondary btn-sm-block " aria-label="Update step Account details" >
<span class="link-label">Edit</span>
</a>
</div>
</div>
</div>
</section>

Paramètres

Generates a completed step in a multi-step form, displaying a check mark, summary content, and an edit button to navigate back to the step.

  • step (string)
    required
    - the step number
  • title (string)
    required
    - the title of the step
  • idx (number)
    required
    - the index of the step used for the edit action value
  • titleLevel (number)
    optional
    - HTML heading level for the title tag. Default: 2
  • actionName (string)
    optional
    - action name for the edit/go-to-step button. Default: 'action_doGoToStep'
  • actionLabel (string)
    optional
    - label for the edit button. Default: ''
  • actionAriaLabelKey (string)
    optional
    - i18n key for the ARIA label of the edit button. Default: 'portal.theme.ariaLabelUpdate'
  • actionHref (string)
    optional
    - URL for the edit link (used instead of submit button). Default: ''
  • actionClass (string)
    optional
    - CSS class for the edit button/link. Default: ''
  • actionParams (string)
    optional
    - additional HTML attributes for the edit button. Default: ''
  • class (string)
    optional
    - CSS class for the step section. Default: ''
  • id (string)
    optional
    - the ID of the element. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Étape courante

macro @cStepCurrent

Generates a step-by-step form component with navigation buttons and optional backup functionality.

Exemple

2 Contact information

Fields followed by an asterisk * are mandatory.

Fields followed by an asterisk * are mandatory.

Remove the saved step

1 Personal information

Fields followed by an asterisk * are mandatory.

Fields followed by an asterisk * are mandatory.

Remove the saved step

<@cStepCurrent step='2' title='Contact information' actionNextStep='action_doNextStep' actionPrevStep='action_doPrevStep'>
    <@cField label='Email' for='email' required=true>
        <@cInput name='email' id='email' type='email' />
    </@cField>
    <@cField label='Phone' for='phone'>
        <@cInput name='phone' id='phone' type='tel' />
    </@cField>
</@cStepCurrent>

<@cStepCurrent step='1' title='Personal information' actionNextStep='action_doNextStep' showPrevStep=false>
    <@cField label='Name' for='name' required=true>
        <@cInput name='name' id='name' />
    </@cField>
</@cStepCurrent>

<section class="step step-current " id="current_step">
<div class="step-title">
<div class="container ">
<h2 class="title h3" data-step="2" title="Contact information - current step" aria-current="step" tabindex="0">
<span class="step-number">
2</span>
<span>
Contact information</span>
</h2>
</div>
</div>
<div class="step-content">
<div class="container ">
<p class="mandatory-warning visually-hidden">
Fields followed  by an asterisk  *  are mandatory.</p>
<label class="form-label" for="email">
Email <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="email" class=" form-control" name="email" id="email" value="" required aria-required="true">
<label class="form-label" for="phone">
Phone
</label>
<input type="tel" class=" form-control fr-number" name="phone" id="phone" value="">
<script>
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.fr-number').forEach(function(element) {
element.addEventListener('blur', function() {
var num = element.value;
var numFormatte = num
.replace(/^0(\d)(\s?)(\d{2})(\s?)(\d{2})(\s?)(\d{2})(\s?)(\d{2})$/, '+33 $1 $3 $5 $7 $9')
.replace(/^\+33(\d{9})$/, function(match, p1) {
return '+33 ' + p1.replace(/(\d)(\d{2})(\d{2})(\d{2})(\d{2})/, '$1 $2 $3 $4 $5');
});
element.value = numFormatte;
});
});
});
</script>
</div>
</div>
<div class="step-footer">
<div class="container ">
<p class="mandatory-warning ms-xs">
Fields followed  by an asterisk  *  are mandatory.</p>
<div class="step-current-toolbar d-flex justify-content-center justify-content-sm-end">
<ul class="list-unstyled d-flex justify-content-end flex-column flex-sm-row align-items-center mt-0 me-xs" >
<li>
<button class="btn btn-tertiary ms-sm" type="submit" id="action_doPrevStep" name="action_doPrevStep" formnovalidate>
<span class="btn-label ">Next step</span>
</button>
</li>
<li>
<button class="btn btn-primary ms-sm" type="submit" id="action_doNextStep" name="action_doNextStep">
<span class="btn-label ">Previous step</span>
</button>
</li>
</ul>
</div>
</div>
</div>
<div class="modal cmodal fade" id="reset-stepModal" tabindex="-1" aria-labelledby="modalreset-stepTitle" aria-hidden="true" >
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title h5 main-color" id="modalreset-stepTitle">
Remove the saved step</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
</button>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button class="btn btn-tertiary m-1" type="button"data-bs-dismiss="modal">
<span class="btn-label ">No save, return to my process</span>
</button>
<button class="btn btn-primary" id="modal-reset-backup" type="button"><span class="btn-label">Yes remove those informations</span></button>
</div>
</div>
</div>
</div>
<script>
window.addEventListener('DOMContentLoaded', (event) => {
/* Error Scroll */
// Add smooth scrolling to all links
const invalidElements = document.querySelectorAll('.step-current .step-content .is-invalid');
const currentStepId = document.querySelector('#current_step .step-title .step-number').textContent.trim();
if ( invalidElements.length > 0 ) {
const firstInvalidElements = invalidElements[0];
const invalidElementStatusMsg = `<p class="visually-hidden" id="step-alert" tabindex="-1">There are validation errors in this step. Your step has not been validated, please correct the errors before continuing.</p>`
document.querySelector('.step-current .step-content .container').insertAdjacentHTML( 'afterbegin', invalidElementStatusMsg );
document.querySelector('#step-alert').focus();
firstInvalidElements.scrollIntoView({ behavior: 'smooth', block: 'center' });
switch(firstInvalidElements.tagName.toLowerCase()) {
case 'legend':
firstInvalidElements.parentElement.querySelector('input').focus();
break;
case 'div':
firstInvalidElements.querySelector('input').focus();
break;
default:
firstInvalidElements.focus();
break;
}
} else if ( !isNaN(parseInt(currentStepId) ) && parseInt( currentStepId ) > 1 ) {
const current = document.querySelector('#current_step');
const y = current.offsetTop - 220;
window.scrollBy(0, y);
// Déplacer le focus sur le titre de l'étape courante
// pour assurer sa restitution par les technologies d'assistance.
const stepTitle = document.querySelector('.step-current .step-title .title');
if ( stepTitle ) {
stepTitle.focus();
}
}
const formValidate = document.getElementById('form-validate'), formValidateButton = document.getElementById('action_doNextStep');
formValidateButton.addEventListener('click', (e) => {
const invalids = document.querySelectorAll('.form-control:invalid','.form-control:user-invalid');
const arrInvalids = Array.prototype.slice.call(invalids);
arrInvalids.forEach( function( invalid ){
invalid.classList.add('is-invalid')
invalid.setAttribute('aria-invalid', 'true');
const isRequired = invalid.getAttributeNode('required');
if( isRequired !='' ){
let pInvalid = document.createElement("p");
pInvalid.classList.add( 'invalid-feedback' );
pInvalid.innerHTML = `Fields followed  by an asterisk  *  are mandatory.`;
if (invalid.closest('.input-group') != null) {
invalid.closest('.input-group').after(pInvalid);
} else {
invalid.after(pInvalid);
}
}
});
})
const saveStep = document.getElementById('save-step-status');
if(saveStep){
const at = saveStep.querySelector('.alert-title');
const btnReset = document.createElement('button');
btnReset.classList.add('btn', 'btn-tertiary', 'ms-sm');
btnReset.innerHTML = 'Remove the saved step';
btnReset.setAttribute('type', 'button');
btnReset.setAttribute('data-bs-target', '#reset-stepModal');
btnReset.setAttribute('data-bs-toggle', 'modal');
at.appendChild(btnReset);
const btnModalReset = document.querySelector('#modal-reset-backup');
btnModalReset.addEventListener('click', (e) => {
const resetBackup = document.getElementById('');
resetBackup.click();
});
}
const btnValidateHidden = '<button class="visually-hidden" name="action_doNextStep" aria-hidden="true" tabindex="-1" ></button>'
formValidate.insertAdjacentHTML('afterbegin', btnValidateHidden );
});
</script>
<script type="module" src="themes/skin/parisfr/js/modules/theme-form-validation.js"></script>
</section>
<section class="step step-current " id="current_step">
<div class="step-title">
<div class="container ">
<h2 class="title h3" data-step="1" title="Personal information - current step" aria-current="step" tabindex="0">
<span class="step-number">
1</span>
<span>
Personal information</span>
</h2>
</div>
</div>
<div class="step-content">
<div class="container ">
<p class="mandatory-warning visually-hidden">
Fields followed  by an asterisk  *  are mandatory.</p>
<label class="form-label" for="name">
Name <span aria-hidden="true" class="main-danger-color ms-xxs" title="Mandatory">*</span>
</label>
<input type="text" class=" form-control" name="name" id="name" value="" required aria-required="true">
</div>
</div>
<div class="step-footer">
<div class="container ">
<p class="mandatory-warning ms-xs">
Fields followed  by an asterisk  *  are mandatory.</p>
<div class="step-current-toolbar d-flex justify-content-center justify-content-sm-end">
<ul class="list-unstyled d-flex justify-content-end flex-column flex-sm-row align-items-center mt-0 me-xs" >
<li>
<button class="btn btn-primary ms-sm" type="submit" id="action_doNextStep" name="action_doNextStep">
<span class="btn-label ">Previous step</span>
</button>
</li>
</ul>
</div>
</div>
</div>
<div class="modal cmodal fade" id="reset-stepModal" tabindex="-1" aria-labelledby="modalreset-stepTitle" aria-hidden="true" >
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title h5 main-color" id="modalreset-stepTitle">
Remove the saved step</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
</button>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button class="btn btn-tertiary m-1" type="button"data-bs-dismiss="modal">
<span class="btn-label ">No save, return to my process</span>
</button>
<button class="btn btn-primary" id="modal-reset-backup" type="button"><span class="btn-label">Yes remove those informations</span></button>
</div>
</div>
</div>
</div>
<script>
window.addEventListener('DOMContentLoaded', (event) => {
/* Error Scroll */
// Add smooth scrolling to all links
const invalidElements = document.querySelectorAll('.step-current .step-content .is-invalid');
const currentStepId = document.querySelector('#current_step .step-title .step-number').textContent.trim();
if ( invalidElements.length > 0 ) {
const firstInvalidElements = invalidElements[0];
const invalidElementStatusMsg = `<p class="visually-hidden" id="step-alert" tabindex="-1">There are validation errors in this step. Your step has not been validated, please correct the errors before continuing.</p>`
document.querySelector('.step-current .step-content .container').insertAdjacentHTML( 'afterbegin', invalidElementStatusMsg );
document.querySelector('#step-alert').focus();
firstInvalidElements.scrollIntoView({ behavior: 'smooth', block: 'center' });
switch(firstInvalidElements.tagName.toLowerCase()) {
case 'legend':
firstInvalidElements.parentElement.querySelector('input').focus();
break;
case 'div':
firstInvalidElements.querySelector('input').focus();
break;
default:
firstInvalidElements.focus();
break;
}
} else if ( !isNaN(parseInt(currentStepId) ) && parseInt( currentStepId ) > 1 ) {
const current = document.querySelector('#current_step');
const y = current.offsetTop - 220;
window.scrollBy(0, y);
// Déplacer le focus sur le titre de l'étape courante
// pour assurer sa restitution par les technologies d'assistance.
const stepTitle = document.querySelector('.step-current .step-title .title');
if ( stepTitle ) {
stepTitle.focus();
}
}
const formValidate = document.getElementById('form-validate'), formValidateButton = document.getElementById('action_doNextStep');
const saveStep = document.getElementById('save-step-status');
if(saveStep){
const at = saveStep.querySelector('.alert-title');
const btnReset = document.createElement('button');
btnReset.classList.add('btn', 'btn-tertiary', 'ms-sm');
btnReset.innerHTML = 'Remove the saved step';
btnReset.setAttribute('type', 'button');
btnReset.setAttribute('data-bs-target', '#reset-stepModal');
btnReset.setAttribute('data-bs-toggle', 'modal');
at.appendChild(btnReset);
const btnModalReset = document.querySelector('#modal-reset-backup');
btnModalReset.addEventListener('click', (e) => {
const resetBackup = document.getElementById('');
resetBackup.click();
});
}
const btnValidateHidden = '<button class="visually-hidden" name="action_doNextStep" aria-hidden="true" tabindex="-1" ></button>'
formValidate.insertAdjacentHTML('afterbegin', btnValidateHidden );
});
</script>
<script type="module" src="themes/skin/parisfr/js/modules/theme-form-validation.js"></script>
</section>

Paramètres

Generates the current active step in a multi-step form, including title, navigation buttons (next, previous, save, backup), and mandatory field warnings.

  • step (string)
    required
    - the step number
  • title (string)
    required
    - the title of the step
  • showTitle (boolean)
    optional
    - displays the step title header. Default: true
  • titleLevel (number)
    optional
    - HTML heading level for the title tag. Default: 2
  • actionNextStep (string)
    optional
    - action name for the next step button. Default: ''
  • titleNextStep (string)
    optional
    - title attribute for the next step button. Default: ''
  • labelNextStep (string)
    optional
    - label of the next step button. Default: ''
  • actionPrevStep (string)
    optional
    - action name for the previous step button. Default: ''
  • titlePrevStep (string)
    optional
    - title attribute for the previous step button. Default: ''
  • labelPrevStep (string)
    optional
    - label of the previous step button. Default: ''
  • actionSaveStep (string)
    optional
    - action name for the save step button. Default: ''
  • titleSaveStep (string)
    optional
    - title attribute for the save step button. Default: ''
  • labelSaveStep (string)
    optional
    - label of the save step button. Default: ''
  • actionSaveForBackUpStep (string)
    optional
    - action name for the save-for-backup button. Default: ''
  • titleSaveForBackUpStep (string)
    optional
    - title attribute for the save-for-backup button. Default: ''
  • labelForBackUpStep (string)
    optional
    - label of the save-for-backup button. Default: 'Save progress'
  • actionResetBackUpStep (string)
    optional
    - action name for the reset backup button. Default: ''
  • titleResetBackUpStep (string)
    optional
    - title attribute for the reset backup button. Default: ''
  • labelResetBackUpStep (string)
    optional
    - label of the reset backup button. Default: 'Delete progress'
  • showPrevStep (boolean)
    optional
    - displays the previous step button. Default: true
  • hasSteps (boolean)
    optional
    - displays step number in the header. Default: true
  • hasMandatory (boolean)
    optional
    - adds mandatory field warnings. Default: true
  • class (string)
    optional
    - CSS class for the step section. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Groupe d'étapes

macro @cStepGroup

Generates a group of fields within a step, optionally iterable with add/remove controls, using either a fieldset or a div container.

Exemple

Contenu d'une étape : Avec bulle d'aide

2 Dossier

Fields followed by an asterisk * are mandatory.

Information
Lorem ipsum Help

Saisir votre nom de famille

Saisir votre prénom

Information sans Fieldset

Lorem ipsum Help

Saisir votre nom de famille

Saisir votre prénom

Contenu d'une étape avec au moins une itération

Information avec Itération (2)

Saisir votre nom de famille

Saisir votre prénom

Fields followed by an asterisk * are mandatory.

Remove the saved step

<@cText class="lead">Contenu d'une étape : Avec bulle d'aide</@cText>
<@cStepCurrent step='2' title='Dossier' actionNextStep='valid' >
    <@cStepGroup title='Information' help='Lorem ipsum Help'>
        <@cRow>
            <@cCol>
                <@cField label='Nom' for='name' labelData='<small class="text-muted">(Nom de famille)</small>'>
                    <@cFormHelp id='name' label='Saisir votre nom de famille' />
                    <@cInput name='name' placeholder='Exemple: Durand' />
                </@cField>
            </@cCol>
            <@cCol>
                <@cField label='Prénom' for='firstname'>
                    <@cFormHelp id='firstname' label='Saisir votre prénom' />
                    <@cInput name='firstname' required=false />
                </@cField>
            </@cCol>
        </@cRow>
    </@cStepGroup>
	<@cStepGroup title='Information sans Fieldset' isFieldset=false titleClass='mt-0' help='Lorem ipsum Help'>
        <@cRow>
            <@cCol>
                <@cField label='Nom' for='name' labelData='<small class="text-muted">(Nom de famille)</small>'>
                    <@cFormHelp id='name' label='Saisir votre nom de famille' />
                    <@cInput name='name' placeholder='Exemple: Durand' />
                </@cField>
            </@cCol>
            <@cCol>
                <@cField label='Prénom' for='firstname'>
                    <@cFormHelp id='firstname' label='Saisir votre prénom' />
                    <@cInput name='firstname' required=false />
                </@cField>
            </@cCol>
        </@cRow>
    </@cStepGroup>
    <@cText class="lead">Contenu d'une étape avec au moins une itération</@cText>
    <@cStepGroup title='Information avec Itération' iterable=true iteration=1>
        <@cRow>
            <@cCol>
                <@cField label='Nom' for='name635' labelData='<small class="text-muted">(Nom de famille)</small>'>
                    <@cFormHelp id='name635' label='Saisir votre nom de famille' />
                    <@cInput name='name635' placeholder='Exemple: Durand' />
                </@cField>
            </@cCol>
            <@cCol>
                <@cField label='Prénom' for='firstname-2'>
                    <@cFormHelp id='firstname-2' label='Saisir votre prénom' />
                    <@cInput name='firstname-2' required=false />
                </@cField>
            </@cCol>
        </@cRow>
    </@cStepGroup>
</@cStepCurrent>

<p class="lead">
Contenu d'une étape : Avec bulle d'aide</p>
<section class="step step-current " id="current_step">
<div class="step-title">
<div class="container ">
<h2 class="title h3" data-step="2" title="Dossier - current step" aria-current="step" tabindex="0">
<span class="step-number">
2</span>
<span>
Dossier</span>
</h2>
</div>
</div>
<div class="step-content">
<div class="container ">
<p class="mandatory-warning visually-hidden">
Fields followed  by an asterisk  *  are mandatory.</p>
<div class="step-group">
<fieldset class="w-100 flex-fill " id="fieldset-id-1453696044735601" role="group" aria-labelledby="legend-id-1453696044735601">
<legend id="legend-id-1453696044735601">
<span class="h3 group-title">
Information
</span>
</legend>
<div class="row ">
<div class="col ">
Lorem ipsum Help</div>
</div>
<div class="row ">
<div class="col ">
<label class="form-label" for="name">
Nom <small class="text-muted">(Nom de famille)</small>
</label>
<p class="form-text " id="help_name">
Saisir votre nom de famille</p>
<input type="text" class=" form-control" name="name" id="name" value="" placeholder="Exemple: Durand" aria-label="Exemple: Durand">
</div>
<div class="col ">
<label class="form-label" for="firstname">
Prénom
</label>
<p class="form-text " id="help_firstname">
Saisir votre prénom</p>
<input type="text" class=" form-control" name="firstname" id="firstname" value="">
</div>
</div>
</fieldset>
</div>
<div class="step-group">
<div class="w-100 flex-fill " id="id-1463454994895371">
<h3 class="mt-0 mt-0 group-title" tabindex="-1" >
Information sans Fieldset
</h3>
<div class="row ">
<div class="col ">
Lorem ipsum Help</div>
</div>
<div class="row ">
<div class="col ">
<label class="form-label" for="name">
Nom <small class="text-muted">(Nom de famille)</small>
</label>
<p class="form-text " id="help_name">
Saisir votre nom de famille</p>
<input type="text" class=" form-control" name="name" id="name" value="" placeholder="Exemple: Durand" aria-label="Exemple: Durand">
</div>
<div class="col ">
<label class="form-label" for="firstname">
Prénom
</label>
<p class="form-text " id="help_firstname">
Saisir votre prénom</p>
<input type="text" class=" form-control" name="firstname" id="firstname" value="">
</div>
</div>
</div>
</div>
<p class="lead">
Contenu d'une étape avec au moins une itération</p>
<div class="step-group">
<fieldset class="w-100 flex-fill " id="fieldset-id-1473213945055141" role="group" aria-labelledby="legend-id-1473213945055141">
<legend class="d-flex justify-content-between align-items-center" id="legend-id-1473213945055141">
<span class="h3 group-title">
Information avec Itération (2)
<div class="btn btn-group ms-auto mt-0">
<button class="btn btn-danger me-sm ms-auto mt-0" type="submit"name="action_removeIteration" value="rm_1">
<svg class="paris-icon paris-icon-trash"data-mce-svg="paris-icon paris-icon-trash" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-trash"></use>
</svg>
<span class="btn-label">
</span>
</button>
<button class="btn btn-primary ms-auto" type="submit"name="action_addIteration" value="add_1">
<svg class="paris-icon paris-icon-plus"data-mce-svg="paris-icon paris-icon-plus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-plus"></use>
</svg>
<span class="btn-label">
</span>
</button>
</div>
</span>
</legend>
<div class="row ">
<div class="col ">
<label class="form-label" for="name635">
Nom <small class="text-muted">(Nom de famille)</small>
</label>
<p class="form-text " id="help_name635">
Saisir votre nom de famille</p>
<input type="text" class=" form-control" name="name635" id="name635" value="" placeholder="Exemple: Durand" aria-label="Exemple: Durand">
</div>
<div class="col ">
<label class="form-label" for="firstname-2">
Prénom
</label>
<p class="form-text " id="help_firstname-2">
Saisir votre prénom</p>
<input type="text" class=" form-control" name="firstname-2" id="firstname-2" value="">
</div>
</div>
</fieldset>
</div>
</div>
</div>
<div class="step-footer">
<div class="container ">
<p class="mandatory-warning ms-xs">
Fields followed  by an asterisk  *  are mandatory.</p>
<div class="step-current-toolbar d-flex justify-content-center justify-content-sm-end">
<ul class="list-unstyled d-flex justify-content-end flex-column flex-sm-row align-items-center mt-0 me-xs" >
<li>
<button class="btn btn-primary ms-sm" type="submit" id="valid" name="valid">
<span class="btn-label ">Previous step</span>
</button>
</li>
</ul>
</div>
</div>
</div>
<div class="modal cmodal fade" id="reset-stepModal" tabindex="-1" aria-labelledby="modalreset-stepTitle" aria-hidden="true" >
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title h5 main-color" id="modalreset-stepTitle">
Remove the saved step</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
</button>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button class="btn btn-tertiary m-1" type="button"data-bs-dismiss="modal">
<span class="btn-label ">No save, return to my process</span>
</button>
<button class="btn btn-primary" id="modal-reset-backup" type="button"><span class="btn-label">Yes remove those informations</span></button>
</div>
</div>
</div>
</div>
<script>
window.addEventListener('DOMContentLoaded', (event) => {
/* Error Scroll */
// Add smooth scrolling to all links
const invalidElements = document.querySelectorAll('.step-current .step-content .is-invalid');
const currentStepId = document.querySelector('#current_step .step-title .step-number').textContent.trim();
if ( invalidElements.length > 0 ) {
const firstInvalidElements = invalidElements[0];
const invalidElementStatusMsg = `<p class="visually-hidden" id="step-alert" tabindex="-1">There are validation errors in this step. Your step has not been validated, please correct the errors before continuing.</p>`
document.querySelector('.step-current .step-content .container').insertAdjacentHTML( 'afterbegin', invalidElementStatusMsg );
document.querySelector('#step-alert').focus();
firstInvalidElements.scrollIntoView({ behavior: 'smooth', block: 'center' });
switch(firstInvalidElements.tagName.toLowerCase()) {
case 'legend':
firstInvalidElements.parentElement.querySelector('input').focus();
break;
case 'div':
firstInvalidElements.querySelector('input').focus();
break;
default:
firstInvalidElements.focus();
break;
}
} else if ( !isNaN(parseInt(currentStepId) ) && parseInt( currentStepId ) > 1 ) {
const current = document.querySelector('#current_step');
const y = current.offsetTop - 220;
window.scrollBy(0, y);
// Déplacer le focus sur le titre de l'étape courante
// pour assurer sa restitution par les technologies d'assistance.
const stepTitle = document.querySelector('.step-current .step-title .title');
if ( stepTitle ) {
stepTitle.focus();
}
}
const formValidate = document.getElementById('form-validate'), formValidateButton = document.getElementById('valid');
formValidateButton.addEventListener('click', (e) => {
const invalids = document.querySelectorAll('.form-control:invalid','.form-control:user-invalid');
const arrInvalids = Array.prototype.slice.call(invalids);
arrInvalids.forEach( function( invalid ){
invalid.classList.add('is-invalid')
invalid.setAttribute('aria-invalid', 'true');
const isRequired = invalid.getAttributeNode('required');
if( isRequired !='' ){
let pInvalid = document.createElement("p");
pInvalid.classList.add( 'invalid-feedback' );
pInvalid.innerHTML = `Fields followed  by an asterisk  *  are mandatory.`;
if (invalid.closest('.input-group') != null) {
invalid.closest('.input-group').after(pInvalid);
} else {
invalid.after(pInvalid);
}
}
});
})
const saveStep = document.getElementById('save-step-status');
if(saveStep){
const at = saveStep.querySelector('.alert-title');
const btnReset = document.createElement('button');
btnReset.classList.add('btn', 'btn-tertiary', 'ms-sm');
btnReset.innerHTML = 'Remove the saved step';
btnReset.setAttribute('type', 'button');
btnReset.setAttribute('data-bs-target', '#reset-stepModal');
btnReset.setAttribute('data-bs-toggle', 'modal');
at.appendChild(btnReset);
const btnModalReset = document.querySelector('#modal-reset-backup');
btnModalReset.addEventListener('click', (e) => {
const resetBackup = document.getElementById('');
resetBackup.click();
});
}
const btnValidateHidden = '<button class="visually-hidden" name="valid" aria-hidden="true" tabindex="-1" ></button>'
formValidate.insertAdjacentHTML('afterbegin', btnValidateHidden );
});
</script>
<script type="module" src="themes/skin/parisfr/js/modules/theme-form-validation.js"></script>
</section>

Paramètres

Generates a group of fields within a step, optionally iterable with add/remove controls, using either a fieldset or a div container.

  • title (string)
    required
    - the title of the group. If empty, a div is used instead of a fieldset
  • iterable (boolean)
    optional
    - enables add/remove iteration controls. Default: false
  • iteration (number)
    optional
    - the current iteration number. Default: 0
  • iterationMax (number)
    optional
    - maximum number of iterations allowed. Default: 10
  • labelAddIteration (string)
    optional
    - label for the add iteration button. Default: ''
  • labelDelIteration (string)
    optional
    - label for the delete iteration button. Default: ''
  • headerParams (string)
    optional
    - additional HTML attributes for the group header. Default: ''
  • isFieldset (boolean)
    optional
    - uses a fieldset element as parent. Default: false
  • noFieldsetTitleLevel (number)
    optional
    - heading level when not using a fieldset. Default: 3
  • titleClass (string)
    optional
    - CSS class for the title element. Default: 'h3'
  • help (string)
    optional
    - help content displayed in an accordion. Default: ''
  • class (string)
    optional
    - CSS class for the group container. Default: ''
  • id (string)
    optional
    - the ID of the element. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Étape suivante

macro @cStepNext

Generates a banner for a future (upcoming) step in a multi-step form, displaying the step number and title in a dimmed state.

Exemple

3 Payment details

4 Confirmation

<@cStepNext step='3' title='Payment details' />

<@cStepNext step='4' title='Confirmation' titleLevel=3 />

<section class="step step-next">
<section class="step-title">
<div class="container ">
<h2 class="title" title="Payment details" data-step="3">
<span class="step-number">
3</span>
<span>
Payment details</span>
</h2>
</div>
</section>
</section>
<section class="step step-next">
<section class="step-title">
<div class="container ">
<h3 class="title" title="Confirmation" data-step="4">
<span class="step-number">
4</span>
<span>
Confirmation</span>
</h3>
</div>
</section>
</section>

Paramètres

Generates a banner for a future (upcoming) step in a multi-step form, displaying the step number and title in a dimmed state.

  • step (string)
    required
    - the step number
  • title (string)
    required
    - the title of the step
  • titleLevel (number)
    optional
    - HTML heading level for the title tag. Default: 2
  • class (string)
    optional
    - CSS class for the step section. Default: ''
  • id (string)
    optional
    - the ID of the element. Default: ''
  • params (string)
    optional
    - additional HTML attributes. Default: ''

Lien

macro @cLink

Generates an HTML anchor element with label, optional title, target behavior, and nested content positioning. Supports styling as a button via CSS classes.

Exemple

Link primary
Link primary
Link secondary
Link secondary
Decouvrir Paris.fr
Decouvrir Paris.fr
OW2

<@cBlock class='mb-m'>
    <@cLink href='http://paris.fr' label='Link primary' target='_blank' class='btn btn-primary' title='Site de la Ville de Paris' />
</@cBlock>
<@cBlock class='mb-m'>
    <@cLink href='http://paris.fr' label='Link primary' target='_blank' class='btn btn-primary disabled' title='Site de la Ville de Paris' />
</@cBlock>
<@cBlock class='mb-m'>
    <@cLink href='http://fr.lutece.paris.fr' label='Link secondary' target='_blank' class='link-secondary' />
</@cBlock>
<@cBlock class='mb-m'>
    <@cLink href='http://fr.lutece.paris.fr' label='Link secondary' titleClass='main-info-color' target='_blank' class='link-secondary disabled' />
</@cBlock>
<@cBlock class='mb-m'>
    <@cLink href='http://paris.fr' label='Decouvrir Paris.fr' class="link-secondary" title='Site de la Ville de Paris' nestedPos='before'>
        <@parisIcon name='like' title='information'/>
    </@cLink>
</@cBlock>
<@cBlock class='mb-m'>
    <@cLink href='http://paris.fr' label='Decouvrir Paris.fr' class='btn btn-action' title='Site de la Ville de Paris' nestedPos='before'>
        <@parisIcon name='check' title='information' />
    </@cLink>
</@cBlock>
<@cBlock class='mb-m'>
    <@cLink href='https://www.ow2.org/' label='OW2' class='btn btn-outline-primary'  title='OW2 is an independent, global, open-source software community' target='_blank' />
</@cBlock>

<div class="mb-m">
<a href="http://paris.fr" class="btn btn-primary" title="Site de la Ville de Paris [New window]" target="_blank" >
<span class="link-label">Link primary</span>
</a>
</div>
<div class="mb-m">
<a href="http://paris.fr" class="btn btn-primary disabled" title="Site de la Ville de Paris [New window]" target="_blank" >
<span class="link-label">Link primary</span>
</a>
</div>
<div class="mb-m">
<a href="http://fr.lutece.paris.fr" class="link-secondary" target="_blank" >
<span class="link-label">Link secondary</span>
</a>
</div>
<div class="mb-m">
<!-- Warning : wrong or deprecated argument(s) : titleClass, ... -->
<a href="http://fr.lutece.paris.fr" class="link-secondary disabled" target="_blank" >
<span class="link-label">Link secondary</span>
</a>
</div>
<div class="mb-m">
<a href="http://paris.fr" class="link-secondary" title="Site de la Ville de Paris" >
<svg class="paris-icon paris-icon-like"data-mce-svg="paris-icon paris-icon-like" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-like"></use>
</svg><span class="link-label">Decouvrir Paris.fr</span>
</a>
</div>
<div class="mb-m">
<a href="http://paris.fr" class="btn btn-action" title="Site de la Ville de Paris" >
<svg class="paris-icon paris-icon-check"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-check"></use>
</svg><span class="link-label">Decouvrir Paris.fr</span>
</a>
</div>
<div class="mb-m">
<a href="https://www.ow2.org/" class="btn btn-outline-primary" title="OW2 is an independent, global, open-source software community [New window]" target="_blank" >
<span class="link-label">OW2</span>
</a>
</div>

Paramètres

Generates an HTML anchor element with label, optional title, target behavior, and nested content positioning. Supports styling as a button via CSS classes.

  • href (string)
    required
    - URL the link points to
  • label (string)
    required
    - Text label displayed inside the link
  • title (string)
    optional
    - Value of the title attribute for the link. Default: ''
  • nestedPos (string)
    optional
    - Position of nested content relative to the label ('before' or 'after'). Default: 'after'
  • target (string)
    optional
    - Target attribute for link opening behavior ('_blank', '_top', '_parent', or a frame id). Default: ''
  • showTarget (boolean)
    optional
    - If true, displays an icon when target is '_blank'. Default: false
  • class (string)
    optional
    - CSS class(es) applied to the link element. Use 'btn btn-primary' to style as a button. Default: ''
  • id (string)
    optional
    - Unique identifier for the link element. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the link element. Default: ''

Liste

macro @cList

Doc Bootstrap Liste

Generates a customizable list component with support for default, expandable ("more"), and file download list styles.

Exemple

Liste de liens

  • Page de Paris.fr dédiée aux régles d'urbanisme
  • Consultation du PLU
  • Decouvrir Paris.fr

Avec classe "list-highlight-secondary"

  • Page de Paris.fr dédiée aux régles d'urbanisme
  • Consultation du PLU
  • Decouvrir Paris.fr

Liste de fichiers

  • Régles d'urbanisme.pdf
    80ko
  • PLU.docx
    80ko

Avec classe "list-highlight-secondary"

  • Régles d'urbanisme.pdf
    80ko
  • PLU.docx
    80ko

Liste de liens

  • Tout sur le thème
  • Tout sur Lutece
  • Tout sur ma mère
  • Tout sur le thème
  • Tout sur Lutece
  • Tout sur ma mère
  • Show more

<#assign ls = [
{"title":"Page de Paris.fr dédiée aux régles d'urbanisme", "url":"https://paris.fr", "target":"_blank"},
{"title":"Consultation du PLU", "url":"https://www.paris.fr/municipalite", "target":"_blank", "current": 0}
]>
<@cCard title='Liste de liens '>
    <@cList ls>
    <#-- <@cBadge label='optionnal' class='bg-warning' hasp=false /> -->
    <@chItem>
        <@cLink href='http://paris.fr' target='_blank' label='Decouvrir Paris.fr' title='Site de la Ville de Paris' />
    </@chItem>
    </@cList>
     <@cText>Avec classe "list-highlight-secondary"</@cText>
    <@cList items=ls class='list-highlight-secondary'>
    <#-- <@cBadge label='optionnal' class='bg-warning' hasp=false /> -->
    <@chItem>
        <@cLink href='http://paris.fr' target='_blank' label='Decouvrir Paris.fr' title='Site de la Ville de Paris' />
    </@chItem>
    </@cList>
</@cCard>
<#assign lsFiles = [
{"title":"Régles d'urbanisme.pdf", "url":"https://paris.fr", "target":"_blank", "size": "80ko", "type":"pdf"},
{"title":"PLU.docx", "url":"https://www.paris.fr/", "target":"", "size": "80ko", "type":"pdf"}
]>
<@cCard title='Liste de fichiers '>
    <@cList items=lsFiles type='files' />
    <@cText>Avec classe "list-highlight-secondary"</@cText>
    <@cList items=lsFiles type='files' class='list-highlight-secondary' />
</@cCard>
<#assign lsall = [
	{"title":"Tout sur le thème", "url":"https://teleservices2.rec.apps.paris.fr/forms", "target":"_blank"},
	{"title":"Tout sur Lutece", "url":"https://lutece.paris.fr/", "target":"","current": 0},
	{"title":"Tout sur ma mère", "url":"https://www.allocine.fr/film/fichefilm_gen_cfilm=7868.html", "target":"", "current": 0}
	{"title":"Tout sur le thème", "url":"https://teleservices2.rec.apps.paris.fr/forms", "target":"_blank"},
	{"title":"Tout sur Lutece", "url":"https://lutece.paris.fr/", "target":"","current": 0},
	{"title":"Tout sur ma mère", "url":"https://www.allocine.fr/film/fichefilm_gen_cfilm=7868.html", "target":"", "current": 0}
]>
<@cCard title='Liste de liens'>
    <@cList items=lsall type='more' itemsShown=3 />
</@cCard>

<div class="card ">
<div class="card-body">
<h3 class="card-title">
Liste de liens </h3>
<ul class="custom-list list-default" >
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Page de Paris.fr dédiée aux régles d'urbanisme" target="_blank">
<span>Page de Paris.fr dédiée aux régles d'urbanisme </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://www.paris.fr/municipalite" title="Consultation du PLU" target="_blank">
<span>Consultation du PLU </span>
</a>
</li>
<li>
<a href="http://paris.fr" class="" title="Site de la Ville de Paris [New window]" target="_blank" >
<span class="link-label">Decouvrir Paris.fr</span>
</a>
</li>
</ul>
<p>
Avec classe "list-highlight-secondary"</p>
<ul class="custom-list list-default list-highlight-secondary" >
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Page de Paris.fr dédiée aux régles d'urbanisme" target="_blank">
<span>Page de Paris.fr dédiée aux régles d'urbanisme </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://www.paris.fr/municipalite" title="Consultation du PLU" target="_blank">
<span>Consultation du PLU </span>
</a>
</li>
<li>
<a href="http://paris.fr" class="" title="Site de la Ville de Paris [New window]" target="_blank" >
<span class="link-label">Decouvrir Paris.fr</span>
</a>
</li>
</ul>
</div>
</div>
<div class="card ">
<div class="card-body">
<h3 class="card-title">
Liste de fichiers </h3>
<ul class="custom-list list-files" >
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Régles d'urbanisme.pdf" target="_blank" download="Régles_d_urbanisme.pdf">
<span>Régles d'urbanisme.pdf </span>
<div class="files-info">
<small class='fw-bold'>80ko</small>
<svg class="paris-icon paris-icon-file-text ms-m main-color"data-mce-svg="paris-icon paris-icon-file-text" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-file-text"></use>
</svg> </div>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://www.paris.fr/" title="PLU.docx" download="PLU.docx">
<span>PLU.docx </span>
<div class="files-info">
<small class='fw-bold'>80ko</small>
<svg class="paris-icon paris-icon-file-text ms-m main-color"data-mce-svg="paris-icon paris-icon-file-text" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-file-text"></use>
</svg> </div>
</a>
</li>
</ul>
<p>
Avec classe "list-highlight-secondary"</p>
<ul class="custom-list list-files list-highlight-secondary" >
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Régles d'urbanisme.pdf" target="_blank" download="Régles_d_urbanisme.pdf">
<span>Régles d'urbanisme.pdf </span>
<div class="files-info">
<small class='fw-bold'>80ko</small>
<svg class="paris-icon paris-icon-file-text ms-m main-color"data-mce-svg="paris-icon paris-icon-file-text" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-file-text"></use>
</svg> </div>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://www.paris.fr/" title="PLU.docx" download="PLU.docx">
<span>PLU.docx </span>
<div class="files-info">
<small class='fw-bold'>80ko</small>
<svg class="paris-icon paris-icon-file-text ms-m main-color"data-mce-svg="paris-icon paris-icon-file-text" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-file-text"></use>
</svg> </div>
</a>
</li>
</ul>
</div>
</div>
<div class="card ">
<div class="card-body">
<h3 class="card-title">
Liste de liens</h3>
<ul class="custom-list list-more more-list" >
<li class="custom-list-item ">
<a class="list-info" href="https://teleservices2.rec.apps.paris.fr/forms" title="Tout sur le thème" target="_blank">
<span>Tout sur le thème </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://lutece.paris.fr/" title="Tout sur Lutece" >
<span>Tout sur Lutece </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://www.allocine.fr/film/fichefilm_gen_cfilm=7868.html" title="Tout sur ma mère" >
<span>Tout sur ma mère </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://teleservices2.rec.apps.paris.fr/forms" title="Tout sur le thème" target="_blank">
<span>Tout sur le thème </span>
</a>
</li>
<li class="custom-list-item extra hidden">
<a class="list-info" href="https://lutece.paris.fr/" title="Tout sur Lutece" >
<span>Tout sur Lutece </span>
</a>
</li>
<li class="custom-list-item extra hidden">
<a class="list-info" href="https://www.allocine.fr/film/fichefilm_gen_cfilm=7868.html" title="Tout sur ma mère" >
<span>Tout sur ma mère </span>
</a>
</li>
<li class="more">
<a href="#" class="btn-more" title="Show more" data-plus="Show more" data-minus="Close" >
<svg xmlns="http://www.w3.org/2000/svg" class="plus" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M12 5l0 14" /><path d="M5 12l14 0" /></svg>
<svg xmlns="http://www.w3.org/2000/svg" class="minus" width="24" height="24" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M5 12l14 0" /></svg>
<span class="link-label">Show more</span>
</a>
</li>
</ul>
</div>
</div>

Paramètres

Generates a customizable list component with support for default, expandable ('more'), and file download list styles.

  • items (list)
    required
    - List of item objects with properties: url, title, target, class, size (for files)
  • type (string)
    optional
    - List display type ('default', 'more', 'files'). Default: 'default'
  • itemsShown (number)
    optional
    - Number of items visible before requiring 'show more' (used with type='more'). Default: 0
  • indexShown (boolean)
    optional
    - Whether to display the item index. Default: false
  • labelMore (string)
    optional
    - Label for the 'show more' button. Default: i18n("portal.theme.labelShowMore")
  • labelClose (string)
    optional
    - Label for the 'close' button. Default: i18n("portal.theme.labelClose")
  • class (string)
    optional
    - Additional CSS classes. Default: ''
  • id (string)
    optional
    - HTML id attribute. Default: ''
  • params (string)
    optional
    - Additional HTML attributes. Default: ''

Il est possible de changer la puce d'un item de liste en ajoutant un attribut "class" à chaque item. Il faut ajouter pour nom de classe l'une des valeurs suivantes disponible: arrow, arobase, screen. Pour étendre la liste des illustration, il faut ajouter dans une css le code suivant:

    
    /* Default list [name] item icon */
    .custom-list.list-default li.yourclassname::after {
        /* Add content in url encoded SVG format */
        content: url(data:image/svg+xml,%3Csvg%20width%3D%2214%22%20height%3D%2215%22%20viewBox%3D%220%200%2020%2020%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M-2-2h24v24H-2z%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M10.72.03A9.991%209.991%200%2000.03%2010.72C.39%2016.01%205.01%2020%2010.31%2020H14c.55%200%201-.45%201-1s-.45-1-1-1h-3.67c-3.73%200-7.15-2.42-8.08-6.03C.76%206.17%206.16.76%2011.96%202.26%2015.58%203.18%2018%206.6%2018%2010.33v1.1c0%20.79-.71%201.57-1.5%201.57s-1.5-.78-1.5-1.57v-1.25c0-2.51-1.78-4.77-4.26-5.12a5.008%205.008%200%2000-5.66%205.87%204.996%204.996%200%20003.72%203.94c1.84.43%203.59-.16%204.74-1.33.89%201.22%202.67%201.86%204.3%201.21%201.34-.53%202.16-1.9%202.16-3.34v-1.09C20%205.01%2016.01.39%2010.72.03zM10%2013c-1.66%200-3-1.34-3-3s1.34-3%203-3%203%201.34%203%203-1.34%203-3%203z%22%20fill%3D%22%23071f32%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E);
        /* Any CSS values needed.. */
    }
    .custom-list.list-default li.yourclassname:hover::after {
        /* Add content in url encoded SVG format */
        content: url(data:image/svg+xml,%3Csvg%20width%3D%2214%22%20height%3D%2215%22%20viewBox%3D%220%200%2020%2020%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20d%3D%22M-2-2h24v24H-2z%22%2F%3E%0A%20%20%20%20%3Cpath%20d%3D%22M10.72.03A9.991%209.991%200%2000.03%2010.72C.39%2016.01%205.01%2020%2010.31%2020H14c.55%200%201-.45%201-1s-.45-1-1-1h-3.67c-3.73%200-7.15-2.42-8.08-6.03C.76%206.17%206.16.76%2011.96%202.26%2015.58%203.18%2018%206.6%2018%2010.33v1.1c0%20.79-.71%201.57-1.5%201.57s-1.5-.78-1.5-1.57v-1.25c0-2.51-1.78-4.77-4.26-5.12a5.008%205.008%200%2000-5.66%205.87%204.996%204.996%200%20003.72%203.94c1.84.43%203.59-.16%204.74-1.33.89%201.22%202.67%201.86%204.3%201.21%201.34-.53%202.16-1.9%202.16-3.34v-1.09C20%205.01%2016.01.39%2010.72.03zM10%2013c-1.66%200-3-1.34-3-3s1.34-3%203-3%203%201.34%203%203-1.34%203-3%203z%22%20fill%3D%22%23ffffff%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E);
        /* Any CSS values needed.. */
    }

Elément de liste

macro @cListItem

Generates a list item element with an optional link. Can be used within the @cList macro if not using JSON to provide list items.

Exemple

  • Decouvrir Paris.fr

<@cList>
    <@cListItem>
        <@cLink href='http://paris.fr' target='_blank' label='Decouvrir Paris.fr' title='Site de la Ville de Paris' />
    </@cListItem>
</@cList>

<ul class="custom-list list-default" >
<li class="custom-list-item">
<a href="http://paris.fr" class="" title="Site de la Ville de Paris [New window]" target="_blank" >
<span class="link-label">Decouvrir Paris.fr</span>
</a>
</li>
</ul>

Paramètres

Voici la liste des différents paramètres de la macro :

  • url (string)
    optionnal
    - Défaut '', Url pour le lien contenu dans l'item
  • label (string)
    optionnal
    - Default '', libellé du lien
  • title (string)
    optionnal
    - Défaut '', attribut title du lien
  • target (string)
    optionnal
    - Défaut '', attribut target du lien
  • id (string)
    optionnal
    - l'ID de la liste
  • class (string)
    optionnal
    - ajoute une classe CSS à la liste
  • params (string)
    optionnal
    - permet d'ajouter des parametres HTML à la liste

Lien contenu dans un élément "@cList". Utilisable dans la macro @cList si on n'utilise pas de JSON pour fournir les items de liste.

@cModal

Doc Bootstrap @cModal

Exemple

Cliquer sur les boutons ci-dessous pour afficher les boîtes de dialogue.

<@cBtn label='Modal 1' class='primary m-xxs' params=' data-bs-toggle="modal" data-bs-target="#example1Modal"'/>
<@cBtn label='Modal 2' class='primary m-xxs' params=' data-bs-toggle="modal" data-bs-target="#example2Modal"'/>
<@cBtn label='Modal 3' class='primary m-xxs' params=' data-bs-toggle="modal" data-bs-target="#example3Modal"'/>
</@docCode>
<@cModal title='Exemple de modal' dismissLabel='Fermer' id='example1' footer='<button class="btn btn-secondary m-xxs" type="submit"><span class="btn-label">Text example</span></button><button class="btn btn-primary m-xxs" type="submit"><span class="btn-label">Text example</span></button>'>
<@cText>Contenu de la modal</@cText>
</@cModal>
<@cModal title='Exemple de modal' dismissLabel='Annuler' id='example2' footer='<button class="btn btn-danger m-xxs" type="submit"><span class="btn-label">Text example</span></button>'>
<@cText>Contenu de la modal</@cText>
</@cModal>
<@cModal title='Exemple de modal' static=true scrollable=true dismissible=false dismissLabel='Annuler' id='example3' footer='<button class="btn btn-danger m-xxs" type="submit"><span class="btn-label">Text example</span></button>'>
<@cText>Appuyez sur la touche "Echap" pour continuer.</@cText>
<@cBtn label='Fermer Modal 3' class='secondary m-xxs' params=' data-bs-dismiss="modal"'/>
</@cModal>

<p class="text-cap">
Cliquer sur les boutons ci-dessous pour afficher les boîtes de dialogue.</p>
<button class="btn btn-primary m-xxs" type="submit" data-bs-toggle="modal" data-bs-target="#example1Modal">
<span class="btn-label ">Modal 1</span>
</button>
<button class="btn btn-primary m-xxs" type="submit" data-bs-toggle="modal" data-bs-target="#example2Modal">
<span class="btn-label ">Modal 2</span>
</button>
<button class="btn btn-primary m-xxs" type="submit" data-bs-toggle="modal" data-bs-target="#example3Modal">
<span class="btn-label ">Modal 3</span>
</button>

Paramètres

Generates a Bootstrap modal dialog box with a header, body, and footer section for displaying content overlays on skin pages.

  • title (string)
    required
    - Title displayed in the modal header
  • id (string)
    required
    - Unique identifier for the modal (used for targeting with data-bs-target)
  • size (string)
    optional
    - Modal size class suffix ('sm', 'lg', 'xl'). Default: 'lg'
  • static (boolean)
    optional
    - Whether the backdrop is static (prevents closing on outside click). Default: false
  • pos (string)
    optional
    - Modal dialog position ('centered'). Default: 'centered'
  • role (string)
    optional
    - ARIA role attribute for the modal dialog. Default: ''
  • scrollable (boolean)
    optional
    - Whether the modal body is scrollable. Default: false
  • dismissible (boolean)
    optional
    - Whether to show close button in header and footer. Default: true
  • dismissLabel (string)
    optional
    - Label for the dismiss button. Default: ''
  • footer (string)
    optional
    - HTML content for the modal footer (e.g., submit buttons). Default: ''
  • titleLevel (number)
    optional
    - Heading level for the title element. Default: 1
  • class (string)
    optional
    - Additional CSS classes for the modal. Default: ''
  • params (string)
    optional
    - Additional HTML attributes. Default: ''

Exemple de modal

Contenu de la modal

Exemple de modal

Contenu de la modal

Exemple de modal

Appuyez sur la touche "Echap" pour continuer.

Panneau coulissant

macro @cOffcanvas

Doc Bootstrap Panneau coulissant

Generates a sliding panel component with customizable toggle button, size, position, and AJAX or iframe content loading.

Exemple

Open panel Open panel

Side Panel

Panel content goes here.

View details View details

Details

Loading...
Notifications Notifications 3

Your notifications

You have 3 new notifications.

<@cOffcanvas id='sidePanel' btnTitle='Open panel' title='Side Panel'>
    <@cText>Panel content goes here.</@cText>
</@cOffcanvas>

<@cOffcanvas id='detailPanel' btnTitle='View details' position='end' size='half' targetUrl='jsp/site/Portal.jsp?page=detail' targetElement='detailContent' title='Details'>
	<@cBlock id="detailContent">Loading...</@cBlock>
</@cOffcanvas>

<@cOffcanvas id='notifications' btnTitle='Notifications' btnIcon='bell' btnColor='outline-primary' badgeContent='3' badgeColor='danger' title='Your notifications'>
    <@cText>You have 3 new notifications.</@cText>
</@cOffcanvas>

<a id="btn-sidePanel" class="btn btn-primary " onclick="event.preventDefault();" data-bs-toggle="offcanvas" data-bs-scroll=false data-bs-backdrop="true" href="#sidePanel" role="button" aria-controls="sidePanel" title="Open panel">
Open panel
<span class="visually-hidden">Open panel</span>
</a>
<div class="offcanvas offcanvas-end w-auto" data-lutece-load-content-url="" data-lutece-load-content-target="" data-lutece-redirectForm=true tabindex="-1" id="sidePanel" aria-labelledby="sidePanelLabel">
<div class="offcanvas-header border-bottom d-flex justify-content-between align-items-center">
<h2 class="h4 offcanvas-title p-0 pe-xl m-0 me-xl" id="sidePanelLabel">Side Panel</h2>
<button type="button" class="border btn btn-light btn-rounded btn-icon end-0 mx-sm p-0" data-bs-dismiss="offcanvas" aria-label="Fermer">
<svg class="paris-icon paris-icon-close mt-xs"data-mce-svg="paris-icon paris-icon-close" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-close"></use>
</svg> </button>
</div>
<div id="offcanvas-body-sidePanel" class="offcanvas-body text-break ps-xl">
<p>
Panel content goes here.</p>
</div>
</div>
<a id="btn-detailPanel" class="btn btn-primary " onclick="event.preventDefault();" data-bs-toggle="offcanvas" data-bs-scroll=false data-bs-backdrop="true" href="#detailPanel" role="button" aria-controls="detailPanel" title="View details">
View details
<span class="visually-hidden">View details</span>
</a>
<div class="offcanvas offcanvas-end w-half" data-lutece-load-content-url="jsp/site/Portal.jsp?page=detail" data-lutece-load-content-target="detailContent" data-lutece-redirectForm=true tabindex="-1" id="detailPanel" aria-labelledby="detailPanelLabel">
<div class="offcanvas-header border-bottom d-flex justify-content-between align-items-center">
<h2 class="h4 offcanvas-title p-0 pe-xl m-0 me-xl" id="detailPanelLabel">Details</h2>
<button type="button" class="border btn btn-light btn-rounded btn-icon end-0 mx-sm p-0" data-bs-dismiss="offcanvas" aria-label="Fermer">
<svg class="paris-icon paris-icon-close mt-xs"data-mce-svg="paris-icon paris-icon-close" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-close"></use>
</svg> </button>
</div>
<div id="offcanvas-body-detailPanel" class="offcanvas-body text-break ps-xl">
<div id="detailContent">
Loading...</div>
</div>
</div>
<script type="module">
import LuteceBSOffCanvas from "./themes/shared/modules/bootstrap/luteceBSOffCanvas.js";
new LuteceBSOffCanvas(`detailPanel`);
</script>
<a id="btn-notifications" class="btn btn-outline-primary position-relative" onclick="event.preventDefault();" data-bs-toggle="offcanvas" data-bs-scroll=false data-bs-backdrop="true" href="#notifications" role="button" aria-controls="notifications" style="overflow:inherit" title="Notifications">
<svg class="paris-icon paris-icon-bell"data-mce-svg="paris-icon paris-icon-bell" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-bell"></use>
</svg> <span class="ms-xs">
Notifications
<span class="visually-hidden">Notifications</span>
</span>
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill shadow border bg-danger" style="transform: translate(-50%, -50%) !important;">3</span>
</a>
<div class="offcanvas offcanvas-end w-auto" data-lutece-load-content-url="" data-lutece-load-content-target="" data-lutece-redirectForm=true tabindex="-1" id="notifications" aria-labelledby="notificationsLabel">
<div class="offcanvas-header border-bottom d-flex justify-content-between align-items-center">
<h2 class="h4 offcanvas-title p-0 pe-xl m-0 me-xl" id="notificationsLabel">Your notifications</h2>
<button type="button" class="border btn btn-light btn-rounded btn-icon end-0 mx-sm p-0" data-bs-dismiss="offcanvas" aria-label="Fermer">
<svg class="paris-icon paris-icon-close mt-xs"data-mce-svg="paris-icon paris-icon-close" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-close"></use>
</svg> </button>
</div>
<div id="offcanvas-body-notifications" class="offcanvas-body text-break ps-xl">
<p>
You have 3 new notifications.</p>
</div>
</div>

Paramètres

Generates a Bootstrap offcanvas sliding panel with an optional toggle button, supporting AJAX and iframe content loading.

  • id (string)
    required
    - Unique identifier for the offcanvas component
  • position (string)
    optional
    - Slide-in direction ('start', 'end', 'top', 'bottom'). Default: 'end'
  • class (string)
    optional
    - Additional CSS classes for the offcanvas element. Default: ''
  • title (string)
    optional
    - Title displayed in the offcanvas header. Default: ''
  • btnTitle (string)
    optional
    - Text on the toggle button (button is only rendered if set). Default: ''
  • btnColor (string)
    optional
    - Bootstrap color variant for the toggle button. Default: 'primary'
  • btnTitleShow (boolean)
    optional
    - Whether to display the button title text visually. Default: true
  • btnIcon (string)
    optional
    - Paris icon name for the toggle button. Default: ''
  • btnClass (string)
    optional
    - Additional CSS classes for the toggle button. Default: ''
  • bodyClass (string)
    optional
    - Additional CSS classes for the offcanvas body. Default: ''
  • backdrop (string)
    optional
    - Whether to show a backdrop ('true' or 'false'). Default: 'true'
  • size (string)
    optional
    - Width class suffix ('full', 'half', 'auto', 'sm'). Default: 'auto'
  • btnSize (string)
    optional
    - Bootstrap button size class suffix. Default: ''
  • targetUrl (string)
    optional
    - URL to load content from via AJAX when opened. Default: ''
  • targetElement (string)
    optional
    - ID of the element to load AJAX content into. Default: ''
  • useIframe (boolean)
    optional
    - Whether to load content via iframe instead of AJAX. Default: false
  • redirectForm (boolean)
    optional
    - Whether to redirect form submissions. Default: true
  • badgeContent (string)
    optional
    - Text content for a badge on the toggle button. Default: ''
  • badgeColor (string)
    optional
    - Bootstrap color for the badge. Default: ''

Pagination

macro @cPagination

Doc Bootstrap Pagination

Generates a navigation pagination component from a Lutece Paginator object for browsing paged content on skin pages.

Exemple

  • 1 - active
  • 2
  • ...

<@cPagination paginator=paginator />

<nav aria-label="Pagination">
<ul class="pagination">
<li class="page-item disabled">
<a class="page-link" href="jsp/site/Portal.jsp?page_id=6#section-pagination">
<svg class="paris-icon paris-icon-arrow-left"data-mce-svg="paris-icon paris-icon-arrow-left" focusable="false" role="img">
<use href="#paris-icon-arrow-left"></use>
</svg> </a>
</li>
<li class="page-item active" aria-current="page">
<a class="page-link" title="page 1 sur 5 - active" href="jsp/site/Portal.jsp?page_id=6#section-pagination">1<span class="visually-hidden"> - active</span></a>
</li>
<li class="page-item" >
<a class="page-link" title="page 2 sur 5" href="jsp/site/Portal.jsp?page_id=6#section-pagination">2</a>
</li>
<li class="page-item" >
<a class="page-link cesure" title="cesure" href="jsp/site/Portal.jsp?page_id=6#section-pagination">...</a>
</li>
<li class="page-item">
<a class="page-link" href="jsp/site/Portal.jsp?page_id=6#section-pagination">
<svg class="paris-icon paris-icon-arrow-right"data-mce-svg="paris-icon paris-icon-arrow-right" focusable="false" role="img">
<use href="#paris-icon-arrow-right"></use>
</svg> </a>
</li>
</ul>
</nav>

Paramètres

Generates a navigation pagination component from a Lutece Paginator object for browsing paged content on skin pages.

  • paginator (object)
    required
    - Lutece Paginator object containing page links, current page, and page count
  • label (string)
    optional
    - Accessible label for the nav element. Default: 'Pagination'
  • fragment (string)
    optional
    - URL fragment appended to pagination links (e.g., anchor id). Default: ''
  • class (string)
    optional
    - Additional CSS classes. Default: ''
  • id (string)
    optional
    - HTML id attribute. Default: ''
  • params (string)
    optional
    - Additional HTML attributes. Default: ''

Popover

macro @cPopover

Doc Bootstrap Popover

Generates a popover component using Bootstrap attributes.

Exemple

Popover sur lien

Voici un lien avec un Popover : Le Popover est visible en hover .

Voici un lien avec un Popover et contenu uniquement : Le Popover est visible en hover .

Voici un lien avec un Popover et titre uniquement: Le Popover est visible en hover .

Popover sur bouton

Popover sur bouton désactivé

<@cBlock>
<@cTitle level=4>Popover sur lien</@cTitle>
<@cText class="m-0">
	Voici un lien avec un Popover : <@cLink label='Le Popover est visible en hover' href='#' params='data-bs-toggle="popover" data-bs-custom-class="custom-popover" data-bs-trigger="hover" data-bs-placement="bottom"  data-bs-title="Titre du Popover" data-bs-content="Le contenu de mon popover."' />.
</@cText>
<@cText class="m-0">
	Voici un lien avec un Popover et contenu uniquement : <@cLink label='Le Popover est visible en hover' href='#' params='data-bs-toggle="popover" data-bs-custom-class="custom-popover" data-bs-trigger="hover" data-bs-placement="bottom" data-bs-content="Le contenu de mon popover."' />.
</@cText>
<@cText class="m-0">
	Voici un lien avec un Popover et titre uniquement: <@cLink label='Le Popover est visible en hover' href='#' params='data-bs-toggle="popover" data-bs-custom-class="custom-popover" data-bs-trigger="hover" data-bs-placement="bottom"  data-bs-title="Titre du Popover"' />.
</@cText>
</@cBlock>
<@cBlock>
    <@cTitle level=4>Popover sur bouton</@cTitle>
    <@cBtn label='btn-primary avec popover sur click' class='primary m-xxs' params='data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Top popover"' />
</@cBlock>
<@cBlock>
    <@cTitle level=4>Popover sur bouton désactivé</@cTitle>
    <@cInline class='d-inline-block m-0' params='tabindex="0" data-bs-toggle="popover" data-bs-custom-class="custom-popover secondary" data-bs-title="Mon bouton desactivé" data-bs-content="Le contenu de mon popover."'>
        <@cBtn label='Tooltip top custom' class='primary m-xxs' disabled=true />
    </@cInline >
</@cBlock>

<div>
<h4>
Popover sur lien</h4>
<p class="m-0">
Voici un lien avec un Popover :
<a href="#" data-bs-toggle="popover" data-bs-custom-class="custom-popover" data-bs-trigger="hover" data-bs-placement="bottom" data-bs-title="Titre du Popover" data-bs-content="Le contenu de mon popover." >
<span class="link-label">Le Popover est visible en hover</span>
</a>
.
</p>
<p class="m-0">
Voici un lien avec un Popover et contenu uniquement :
<a href="#" data-bs-toggle="popover" data-bs-custom-class="custom-popover" data-bs-trigger="hover" data-bs-placement="bottom" data-bs-content="Le contenu de mon popover." >
<span class="link-label">Le Popover est visible en hover</span>
</a>
.
</p>
<p class="m-0">
Voici un lien avec un Popover et titre uniquement:
<a href="#" data-bs-toggle="popover" data-bs-custom-class="custom-popover" data-bs-trigger="hover" data-bs-placement="bottom" data-bs-title="Titre du Popover" >
<span class="link-label">Le Popover est visible en hover</span>
</a>
.
</p>
</div>
<div>
<h4>
Popover sur bouton</h4>
<button class="btn btn-primary m-xxs" type="submit"data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Top popover">
<span class="btn-label ">btn-primary avec popover sur click</span>
</button>
</div>
<div>
<h4>
Popover sur bouton désactivé</h4>
<span class="d-inline-block m-0" tabindex="0" data-bs-toggle="popover" data-bs-custom-class="custom-popover secondary" data-bs-title="Mon bouton desactivé" data-bs-content="Le contenu de mon popover.">
<button class="btn btn-primary m-xxs" type="submit" disabled>
<span class="btn-label ">Tooltip top custom</span>
</button>
</span>
</div>

Paramètres

Les paramètres de popover
  • data-bs-toggle (string)
    required
    - permet d'activer le popover
  • data-bs-placement (string)
    optionnal
    - définit la position du popover
  • data-bs-custom-class (string)
    optionnal
    - définit une classe CSS pour le popover
  • data-bs-title (string)
    required
    - définit le titre du popover
  • data-bs-content (string)
    required
    - définit le texte du contenu du popover
  • data-bs-trigger (string)
    required
    - définit le mode de déclenchement du popover. Par défaut "click", peut aussi être "hover"
  • data-bs-html (string)
    required
    - définit si le contenu du popover contient du HTML
Aide

Ce composant n'est pas une macro car il se base sur le "popover"" de Bootstrap qui est utilisable uniquement via des attributs HTML à ajouter sur d'autres composants/macros déjà existants (liens, boutons, icons...)

D'autres paramètres sont disponibles sur la documentation de Bootstrap en plus de ceux disponibles ci-dessus: Documentation Popover de Bootstrap

Barre de progression

macro @cProgress

Doc Bootstrap Barre de progression

Generates a Bootstrap progress bar with optional Lutece progress manager integration for tracking long-running operations.

Exemple

Upload progress

45%

Steps completed

30%

Import in progress

0%

<@cProgress label='Upload progress' value=45 />

<@cProgress label='Steps completed' value=3 max=10 color='success' />

<@cProgress label='Import in progress' token=progressToken showReport=true intervalTime=3000 />

<p id="progressbar-label" class="label-progress">Upload progress</p>
<div class="progress">
<div id="progressbar" aria-labelledby="progressbar-label" class="progress-bar bg-primary" role="progressbar" style="width:45%;" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" >
45%
</div>
</div>
<p id="progressbar-label" class="label-progress">Steps completed</p>
<div class="progress">
<div id="progressbar" aria-labelledby="progressbar-label" class="progress-bar bg-success" role="progressbar" style="width:30%;" aria-valuenow="3" aria-valuemin="0" aria-valuemax="10" >
30%
</div>
</div>
<p id="progressbar-label" class="label-progress">Import in progress</p>
<div class="progress">
<div id="progressbar" aria-labelledby="progressbar-label" class="progress-bar bg-primary" role="progressbar" style="width:0%;" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" >
0%
</div>
</div>
<p id="progressbar-report" class="progress-bar-report" lastline=0></p>

Paramètres

Generates a Bootstrap progress bar with optional Lutece progress manager integration for tracking long-running operations.

  • label (string)
    required
    - Accessible label displayed above the progress bar
  • labelClass (string)
    optional
    - CSS class for the label element. Default: ''
  • class (string)
    optional
    - Additional CSS classes for the progress container. Default: ''
  • color (string)
    optional
    - Bootstrap color for the progress bar. Default: 'primary'
  • id (string)
    optional
    - HTML id attribute for the container. Default: ''
  • params (string)
    optional
    - Additional HTML attributes. Default: ''
  • value (number)
    optional
    - Current progress value. Default: 0
  • min (number)
    optional
    - Minimum value. Default: 0
  • max (number)
    optional
    - Maximum value. Default: 100
  • text (string)
    optional
    - Custom text displayed inside the progress bar. Default: ''
  • progressId (string)
    optional
    - HTML id for the progress bar element. Default: 'progressbar'
  • token (string)
    optional
    - Lutece progress manager feed token for live updates. Default: ''
  • role (string)
    optional
    - ARIA role attribute. Default: 'progressbar'
  • showReport (boolean)
    optional
    - Whether to display a progress report below the bar (requires token). Default: false
  • intervalTime (number)
    optional
    - Refresh interval in milliseconds for progress updates (requires token). Default: 2000

Information avec étapes

macro @cInfoStep

Generates an info step container to present steps graphically.

Exemple

  1. Etape Vide

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  2. Etape 50%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  3. Etape 100%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  1. Etape Vide

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  2. Etape 50%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  3. Etape 100%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  1. Etape Vide

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  2. Etape 25%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  3. Etape 50%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  4. Etape 75%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  5. Etape 100%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  1. Etape Vide

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  2. Etape 25%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  3. Etape 50%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  4. Etape 75%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

  5. Etape 100%

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.

<#assign lstep1 = [
{"title":"Etape Vide","content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.", "url":"images/icon-placeholder.svg"},
{"title":"Etape 50% ","content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.", "url":"images/icon-placeholder.svg"},
{"title":"Etape 100%","content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.", "url":"images/icon-placeholder.svg"}
]>
<#assign lstep2 = [
{"title":"Etape Vide","content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod."},
{"title":"Etape 50% ","content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod."},
{"title":"Etape 100%","content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod."}
]>
<#assign lstep3 = [
{"title":"Etape Vide", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.", "url":"images/icon-placeholder.svg"},
{"title":"Etape 25% ", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.", "url":"images/icon-placeholder.svg"},
{"title":"Etape 50% ", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.", "url":"images/icon-placeholder.svg"},
{"title":"Etape 75% ", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.", "url":"images/icon-placeholder.svg"},
{"title":"Etape 100%", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.", "url":"images/icon-placeholder.svg"}
]>
<#assign lstep4 = [
{"title":"Etape Vide", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod."},
{"title":"Etape 25% ", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod."},
{"title":"Etape 50% ", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod."},
{"title":"Etape 75% ", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod."},
{"title":"Etape 100%", "content":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod."}
]>
<@cInfoStep steps=lstep1 haspicto=true title=true />
<@cInfoStep steps=lstep2 title=true />
<@cInfoStep steps=lstep3 haspicto=true title=true verticalStepper=true />
<@cInfoStep steps=lstep4 title=true verticalStepper=true />

<div class="container ">
<div class="row ">
<div class="col ">
<div class="c-info-step-wrapper stepper-horizontal c-info-step-default" >
<ol class="c-info-step-icons d-none d-md-flex">
<li class="c-info-step-icons__item">
<div >
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</li>
<li class="c-info-step-icons__item">
<div >
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</li>
<li class="c-info-step-icons__item">
<div >
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</li>
</ol>
<ol class="c-info-step" >
<li class="c-info-step__item">
<div class="c-info-step__icon d-md-none">
<div class="mb-0">
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</div>
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape Vide</h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__icon d-md-none">
<div class="mb-0">
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</div>
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 50% </h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__icon d-md-none">
<div class="mb-0">
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</div>
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 100%</h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
</ol>
</div>
<script>
function handleResize() {
const width = window.innerWidth;
const elements = document.querySelectorAll('.c-info-step-default');
elements.forEach(function(element) {
if (width <= 767) {
element.classList.remove('stepper-horizontal');
element.classList.add('stepper-vertical');
} else {
element.classList.remove('stepper-vertical');
element.classList.add('stepper-horizontal');
}
});
}
window.addEventListener('resize', handleResize);
handleResize();
</script>
</div>
</div>
<div class="row ">
<div class="col ">
<div class="c-info-step-wrapper stepper-horizontal c-info-step-default" >
<ol class="c-info-step" >
<li class="c-info-step__item">
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape Vide</h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 50% </h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 100%</h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
</ol>
</div>
<script>
function handleResize() {
const width = window.innerWidth;
const elements = document.querySelectorAll('.c-info-step-default');
elements.forEach(function(element) {
if (width <= 767) {
element.classList.remove('stepper-horizontal');
element.classList.add('stepper-vertical');
} else {
element.classList.remove('stepper-vertical');
element.classList.add('stepper-horizontal');
}
});
}
window.addEventListener('resize', handleResize);
handleResize();
</script>
</div>
</div>
<div class="row ">
<div class="col ">
<div class="c-info-step-wrapper stepper-vertical" >
<ol class="c-info-step" >
<li class="c-info-step__item">
<div class="c-info-step__icon">
<div class="mb-0">
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</div>
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape Vide</h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__icon">
<div class="mb-0">
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</div>
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 25% </h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__icon">
<div class="mb-0">
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</div>
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 50% </h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__icon">
<div class="mb-0">
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</div>
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 75% </h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__icon">
<div class="mb-0">
<img src="images/icon-placeholder.svg" class="img-fluid" alt="" aria-hidden="true">
</div>
</div>
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 100%</h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
</ol>
</div>
</div>
<div class="col ">
<div class="c-info-step-wrapper stepper-vertical" >
<ol class="c-info-step" >
<li class="c-info-step__item">
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape Vide</h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 25% </h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 50% </h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 75% </h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
<li class="c-info-step__item">
<div class="c-info-step__content">
<h3 class="c-info-step__title">Etape 100%</h3>
<p class="c-info-step__desc mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod.</p>
</div>
</li>
</ol>
</div>
</div>
</div>
</div>

Paramètres

Voici la liste des différents paramètres de la macro :

  • id (string)
    optionnal
    - l'ID du stepper
  • class (string)
    optionnal
    - ajoute une classe CSS au stepper
  • steps (object)
    required
    - définit l'objet comprenant les informations pour chaque étape du stepper
  • haspicto (string)
    optionnal
    - permet de définir si le stepper doit afficher les images comprises dans l'objet 'steps' (par défaut: false)
  • title (string)
    optionnal
    - affiche le contenu de 'title' de l'objet 'steps' avec un style de titre (par défaut: false)
  • verticalStepper (boolean)
    optionnal
    - permet d'afficher le stepper à la verticale (par défaut: false)
  • imgClass (string)
    optionnal
    - permet d'ajouter une classe css pour les icones du stepper
  • params (string)
    optionnal
    - permet d'ajouter des parametres HTML au stepper
Aide

Ce composant est uniquement éditorial et permet de présenter graphiquement des étapes.

Scrollspy

macro @scrollSpy

Generates a Bootstrap scrollspy with optional anchors and content blocks.

Exemple

  • Item 1
  • Item 2
  • Item 3
  • Item 4
  • Item 5

Item 1

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Item 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Item 3

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Item 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Item 5

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

<#assign spyAnchors = [
	{"label":"Item 1", "href":"#anchor-scroll-item-1"},
	{"label":"Item 2", "href":"#anchor-scroll-item-2"},
	{"label":"Item 3", "href":"#anchor-scroll-item-3"},
	{"label":"Item 4", "href":"#anchor-scroll-item-4"},
	{"label":"Item 5", "href":"#anchor-scroll-item-5"}
]>
<@cScrollSpy anchorId='scrollspy-sample' anchors=spyAnchors anchorsLinkClass='btn btn-primary' anchorsParams='style="top:100px;"'>
	<@cTitle level=4 id="anchor-scroll-item-1" class="mt-0">Item 1</@cTitle>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cTitle level=4 id="anchor-scroll-item-2" class="mt-m">Item 2</@cTitle>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cTitle level=4 id="anchor-scroll-item-3" class="mt-m">Item 3</@cTitle>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cTitle level=4 id="anchor-scroll-item-4" class="mt-m">Item 4</@cTitle>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cTitle level=4 id="anchor-scroll-item-5" class="mt-m">Item 5</@cTitle>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
	<@cText class="m-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</@cText>
</@cScrollSpy>

<div class="row">
<div class="col-12 col-md-2">
<div class="anchors position-sticky" id="scrollspy-sample" style="top:100px;">
<ul class="list-unstyled" >
<li class="ps-m py-s">
<a href="#anchor-scroll-item-1" class="btn btn-primary" >
<span class="link-label">Item 1</span>
</a>
</li>
<li class="ps-m py-s">
<a href="#anchor-scroll-item-2" class="btn btn-primary" >
<span class="link-label">Item 2</span>
</a>
</li>
<li class="ps-m py-s">
<a href="#anchor-scroll-item-3" class="btn btn-primary" >
<span class="link-label">Item 3</span>
</a>
</li>
<li class="ps-m py-s">
<a href="#anchor-scroll-item-4" class="btn btn-primary" >
<span class="link-label">Item 4</span>
</a>
</li>
<li class="ps-m py-s">
<a href="#anchor-scroll-item-5" class="btn btn-primary" >
<span class="link-label">Item 5</span>
</a>
</li>
</ul>
</div>
</div>
<div class="col-12 col-md-10">
<div data-bs-spy="scroll" data-bs-target="#scrollspy-sample" tabindex="0"'>
<h4 class="mt-0" id="anchor-scroll-item-1">
Item 1</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<h4 class="mt-m" id="anchor-scroll-item-2">
Item 2</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<h4 class="mt-m" id="anchor-scroll-item-3">
Item 3</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<h4 class="mt-m" id="anchor-scroll-item-4">
Item 4</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<h4 class="mt-m" id="anchor-scroll-item-5">
Item 5</h4>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
<p class="m-0">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
</div>
</div>
</div>

Paramètres

Voici la liste des différents paramètres à ajouter à un élément HTML ou à une macro.

  • anchorId (string)
    required
    - l'ID de la liste d'ancres.
  • anchors (string)
    required
    - Liste de sancres dan su ntableau avec des items en JSON. par exemple <#assign anchors = [{"label":"Item 1", "href":"jsp/site/Portal.jsp?page_id=6#anchor-list-item-xxs"},...]>
  • anchorClass (string)
    optional
    - ajoute une classe CSS au à la liste des acnres - par défaut "position-sticky"
  • anchorListClass (string)
    optional
    - ajoute une classe CSS au à la liste
  • anchorListItemClass (string)
    optional
    - ajoute une classe CSS au éléments de la liste
  • anchorsLinkClass string
    optional
    - ajoute une classe CSS aux ancres
  • anchorsParams string
    optional
    - Objet list avec items d'ancres. L'objet contient un attribut 'href' et un attribut 'label'
  • anchorColClass string
    optional
    - Objet list avec items d'ancres. L'objet contient un attribut 'href' et un attribut 'label'
  • contentColClass string
    optional
    - Objet list avec items d'ancres. L'objet contient un attribut 'href' et un attribut 'label'
  • id string
    optional
    - l'Id du wrapper - .row- des colonnes
  • class string
    optional
    - ajoute une classe CSS au wrapper
  • params string
    optional
    - permet d'ajouter des parametres HTML au wrapper.
Aide

Ce composant n'est donc pas une macro... Il se base sur le composant "scrollspy" de Bootstrap qui est utilisable via des attributs HTML à ajouter sur d'autres composants/macros déjà existants.

Dans l'exemple ci-dessus on utilise avec les macros "@cAnchor" et "cBlock" qui portera les paramètres "scrollspy".

D'autres paramètres sont disponibles sur la documentation de Bootstrap en plus de ceux disponibles ci-dessus: Documentation Scrollspy Bootstrap

Skeleton loader

macro @cSkeleton

Generates a skeleton loading placeholder to display while content is being fetched, with configurable bone types.

Exemple

<@cSkeleton />

<@cSkeleton bones=['image', 'text', 'short', 'button'] />

<@cSkeleton bones=['text', 'text', 'short'] class='my-4' id='loading-placeholder' />

<div class="skeleton">
<div class="sk-bone sk-text"></div>
</div>
<div class="skeleton">
<div class="sk-bone sk-image-wrapper">
<div class="sk-bone sk-image"></div>
</div>
<div class="sk-bone sk-text"></div>
<div class="sk-bone sk-text-short"></div>
<div class="sk-bone sk-button"></div>
</div>
<div class="skeleton my-4" id="loading-placeholder">
<div class="sk-bone sk-text"></div>
<div class="sk-bone sk-text"></div>
<div class="sk-bone sk-text-short"></div>
</div>

Paramètres

Generates a skeleton loading placeholder to display while content is being fetched, with configurable bone types.

  • bones (sequence)
    optional
    - List of bone type strings defining the skeleton layout ('text', 'short', 'image', 'button'). Default: {} (displays a single text bone)
  • id (string)
    optional
    - HTML id attribute. Default: ''
  • class (string)
    optional
    - Additional CSS classes. Default: ''
  • params (string)
    optional
    - Additional HTML attributes. Default: ''

@cSessionTimeout

Exemple

Télécharger la vidéo au format MP4

<#-- Utilisation simple (en pied de page) -->
<@cSessionTimeout />

<#-- Intégration plugin : pré-configurer AVANT le rendu de la macro -->
<#-- Exemple pour le plugin Forms (dans step_view.html) : -->
<script>
window.__sessionTimeoutConfig = window.__sessionTimeoutConfig || {};
window.__sessionTimeoutConfig.processTimeoutDuration = 600;
window.__sessionTimeoutConfig.processWarningDelay = 60;
window.__sessionTimeoutConfig.saveEnabled = true;
window.__sessionTimeoutConfig.saveAction = function() {
    var form = document.getElementById('form-validate');
    if (!form) return Promise.resolve();
    var fd = new FormData(form);
    fd.append('action_doSaveForBackup', '');
    return fetch(form.action, { method: 'POST', body: fd });
};
</script>

<div class="d-flex justify-content-center algin-items-center">
<video controls width="800">
<source src="images/session-timeout.mp4" type="video/mp4" />
Télécharger la vidéo au format <a href="images/session-timeout.mp4">MP4</a>
</video>
</div>

Paramètres

Affiche une notification non intrusive avant l'expiration de la session pour avertir les utilisateurs. Conforme aux critères WCAG 2.2.1 Timing Adjustable (Niveau A) et WCAG 2.2.6 Timeouts (Niveau AAA). Inclut un compte à rebours, un bouton pour prolonger la session, une sauvegarde optionnelle des données, et des annonces pour les lecteurs d'écran.

Configuration core_datastore
  • core.session.timeout.enabled (string) - Active ('1') ou désactive ('0') la fonctionnalité. Par défaut : '0'.
  • core.session.timeout.duration (string) - Durée du timeout de session en secondes. Par défaut : '1800' (30 min).
  • core.session.timeout.warningDelay (string) - Nombre de secondes avant l'expiration pour afficher l'avertissement. Par défaut : '120' (2 min).
  • core.session.timeout.keepAliveUrl (string) - URL de prolongation de session. Par défaut : base_url + jsp/site/Portal.jsp.
  • core.session.timeout.maxExtensions (string) - Nombre maximum de prolongations autorisées (WCAG : au moins 10). Par défaut : '10'.
Configuration par les plugins (window.__sessionTimeoutConfig)

Les plugins peuvent pré-configurer des propriétés sur window.__sessionTimeoutConfig avant le rendu de la macro (leurs templates sont inclus plus tôt dans la page).

  • processTimeoutDuration (number)
    optional
    - Durée d'un timeout de processus plus court que la session web (en secondes, 0 = désactivé).
  • processWarningDelay (number)
    optional
    - Délai d'avertissement pour le timeout de processus (en secondes).
  • saveEnabled (boolean)
    optional
    - Affiche un bouton "Sauvegarder" dans la notification d'avertissement.
  • saveAction (function)
    optional
    - Fonction asynchrone retournant une Promise pour sauvegarder les données utilisateur.
  • maxExtensions (number)
    optional
    - Surcharge du nombre maximum de prolongations.
  • messages.* (strings)
    optional
    - Surcharge des messages i18n par le plugin.
Messages i18n
  • portal.site.session.timeout.warningTitle - Titre de la notification d'avertissement de session.
  • portal.site.session.timeout.warningMessage - Message d'avertissement ({0} = temps restant mm:ss).
  • portal.site.session.timeout.btnExtend - Libellé du bouton "Rester connecté".
  • portal.site.session.timeout.btnSave - Libellé du bouton "Sauvegarder mes données".
  • portal.site.session.timeout.saveSuccess - Message de confirmation de sauvegarde.
  • portal.site.session.timeout.saveError - Message d'erreur de sauvegarde.
  • portal.site.session.timeout.expiredTitle - Titre de la notification de session expirée.
  • portal.site.session.timeout.expiredMessage - Message de session expirée.
  • portal.site.session.timeout.btnLogin - Libellé du bouton "Se reconnecter".
  • portal.site.session.timeout.srCountdown - Annonce du compte à rebours pour lecteurs d'écran ({0} = minutes, {1} = secondes).
  • portal.site.session.timeout.maxExtensionsReached - Message affiché quand le nombre max de prolongations est atteint.
  • portal.site.session.timeout.processWarningTitle - Titre d'avertissement pour le timeout de processus.
  • portal.site.session.timeout.processWarningMessage - Message d'avertissement du processus ({0} = temps restant).
  • portal.site.session.timeout.processExpiredTitle - Titre d'expiration du processus.
  • portal.site.session.timeout.processExpiredMessage - Message d'expiration du processus.
Accessibilité
  • WCAG 2.2.1 Timing Adjustable (Niveau A) : l'utilisateur peut prolonger la session au moins maxExtensions fois (par défaut 10). Au-delà, le bouton de prolongation est remplacé par un message.
  • WCAG 2.2.6 Timeouts (Niveau AAA) : l'utilisateur est averti avant toute perte de données.
  • Utilise role="group" et aria-labelledby pour la structure sémantique (tink.uk).
  • Déplace le focus clavier sur la notification à son apparition, et le restaure à sa position d'origine après prolongation.
  • Utilise une zone aria-live="polite" séparée pour les annonces de compte à rebours toutes les 30 secondes et en dessous de 10 secondes.
  • Les éléments DOM sont insérés/supprimés dynamiquement (pas de display:none).
Comportement
  • Les timers sont réinitialisés à chaque activité utilisateur (souris, clavier, tactile, défilement).
  • La notification d'avertissement apparaît warningDelay secondes avant l'expiration de la session.
  • Le bouton "Rester connecté" envoie un ping keep-alive au serveur et relance les timers.
  • Si la session expire, une notification avec un lien de reconnexion est affichée.
Timeout de processus
  • Certaines opérations (ex. remplissage d'un formulaire) peuvent avoir un délai plus court que la session web.
  • Le plugin définit processTimeoutDuration pour activer un second timer indépendant, plus court que le timeout de session.
  • Si le process timeout arrive en premier, la notification de processus s'affiche avec ses propres messages et le bouton de sauvegarde si activé.
  • Le timeout de session continue de fonctionner en parallèle.
Intégration avec le plugin Forms

Le plugin Forms peut activer la sauvegarde automatique des brouillons et un timeout de processus en ajoutant un bloc <script> dans step_view.html, avant le rendu de <@cSessionTimeout />.




Slider

macro @cSlider

Doc Bootstrap Slider

Generates a horizontal card slider/carousel with navigation buttons and optional "view all" link for browsing content on skin pages.

Exemple

Title 1

Content 1

Title 2

Content 2

Title 3

Content 3

Title 4

Content 4

Title 5

Content 5

Title 6

Content 6

Warning

Le slider exemple n'est pas opérationnel. Seul l'aspect graphique est présenté ici !

<#assign mySlides = [
    {"content":"Content 1","linkLabel":"Title 1", "img":"images/adrien-xplr-wAScP0OY-yM-unsplash.png", "link":"https://paris.fr"},
    {"content":"Content 2", "linkLabel":"Title 2", "img":"images/alexander-kagan-t9Td0zfDTwI-unsplash.png", "link":"https://paris.fr"},
    {"content":"Content 3", "linkLabel":"Title 3", "img":"images/paul-dufour-5XndD3FhH-w-unsplash.png", "link":"https://paris.fr"},
    {"content":"Content 4", "linkLabel":"Title 4", "img":"images/adrien-xplr-wAScP0OY-yM-unsplash.png", "link":"https://paris.fr"},
    {"content":"Content 5", "linkLabel":"Title 5", "img":"images/alexander-kagan-t9Td0zfDTwI-unsplash.png", "link":"https://paris.fr"},
    {"content":"Content 6", "linkLabel":"Title 6", "img":"images/paul-dufour-5XndD3FhH-w-unsplash.png", "link":"https://paris.fr"}
]>
<@cSlider id='myslider' sliderLabel='Liens divers' slides=mySlides />

<section class="themeparisfr-slider-wrapper" id="myslider" aria-roledescription="slide" aria-label="Liens divers" >
<div class="row themeparisfr-slider row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4" id="myslider-theme-slider" aria-live="off">
<div class="card slide p-0" role="group" aria-roledescription="slide" aria-label="1 sur 6" >
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title 1</h3>
<p class="card-text">Content 1</p>
</div>
</div>
<div class="card slide p-0" role="group" aria-roledescription="slide" aria-label="2 sur 6" >
<figure class="card-figure ">
<img src="images/adrien-xplr-wAScP0OY-yM-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title 2</h3>
<p class="card-text">Content 2</p>
</div>
</div>
<div class="card slide p-0" role="group" aria-roledescription="slide" aria-label="3 sur 6" >
<figure class="card-figure ">
<img src="images/alexander-kagan-t9Td0zfDTwI-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title 3</h3>
<p class="card-text">Content 3</p>
</div>
</div>
<div class="card slide p-0" role="group" aria-roledescription="slide" aria-label="4 sur 6" >
<figure class="card-figure ">
<img src="images/paul-dufour-5XndD3FhH-w-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title 4</h3>
<p class="card-text">Content 4</p>
</div>
</div>
<div class="card slide p-0" role="group" aria-roledescription="slide" aria-label="5 sur 6" >
<figure class="card-figure ">
<img src="images/adrien-xplr-wAScP0OY-yM-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title 5</h3>
<p class="card-text">Content 5</p>
</div>
</div>
<div class="card slide p-0" role="group" aria-roledescription="slide" aria-label="6 sur 6" >
<figure class="card-figure ">
<img src="images/alexander-kagan-t9Td0zfDTwI-unsplash.png" alt="" title="" class="card-img-top">
</figure>
<div class="card-body">
<h3 class="card-title">
Title 6</h3>
<p class="card-text">Content 6</p>
</div>
</div>
</div>
<div class="slider-buttons">
<div class="container ">
<div class="d-flex justify-content-end pt-4 pb-md-5 mb-md-5">
<div class="d-flex align-items-center justify-content-end gap-1 test">
<button class="btn btn-light rounded-circle disabled prev-slide" type="button"tabindex="0" aria-controls="myslider-theme-slider" aria-label="Previous slide" disabled>
<svg class="paris-icon paris-icon-arrow-left"data-mce-svg="paris-icon paris-icon-arrow-left" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-left"></use>
</svg>
</button>
<button class="btn btn-light rounded-circle ms-sm next-slide" type="button"tabindex="0" aria-controls="myslider-theme-slider" aria-label="Next slide">
<svg class="paris-icon paris-icon-arrow-right"data-mce-svg="paris-icon paris-icon-arrow-right" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-right"></use>
</svg>
</button>
</div>
</div>
</div>
</div>
</section>
<script>
document.addEventListener('DOMContentLoaded', function (){
const _slides = $('#myslider .themeparisfr-slider'),
btnPrev = $('#myslider .slider-buttons .prev-slide'),
btnNext = $('#myslider .slider-buttons .next-slide');
_slides.focus()
let totalWidth = 0,
scrollWidth = 0,
nbSlides = 0;
_slides.children('.slide').each(function() {
totalWidth += $(this).width();
nbSlides++;
})
scrollWidth = totalWidth;
if (nbSlides > 1) {
btnPrev.on('click', function() {
_slides.animate({ scrollLeft: '-=305' }, "slow");
if (scrollWidth + 305 >= totalWidth) {
$(this).addClass('disabled').attr('disabled', 'disabled')
} else {
scrollWidth += 305
btnNext.removeClass('disabled').removeAttr('disabled')
}
}).addClass('disabled').attr('disabled', 'disabled');
btnNext.on('click', function() {
_slides.animate({ scrollLeft: '+=305' }, "slow");
if (scrollWidth <= 305) {
$(this).addClass('disabled').attr('disabled', 'disabled')
} else {
scrollWidth -= 305
btnPrev.removeClass('disabled').removeAttr('disabled')
}
}).attr('tabindex', 0);
btnPrev.attr('tabindex', 0).attr('role', 'button').keydown(function(event) {
if (event.which == 32) {
$(this).click();
event.preventDefault();
};
});
btnNext.attr('tabindex', 0).attr('role', 'button').keydown(function(event) {
if (event.which == 32) {
$(this).click();
event.preventDefault();
};
});
} else {
_slides.children('.slider-buttons .btn').remove();
}
});
</script>
<div class="alert alert-outline alert-warning warning" role="alert" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-warning"data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-1724910954641341" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-1724910954641341">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Le slider exemple n'est pas opérationnel. Seul l'aspect graphique est présenté ici !</p>
</div>
</div>
</div>

Paramètres

Generates a horizontal card slider/carousel with navigation buttons and optional "view all" link for browsing content on skin pages.

  • id (string)
    required
    - Unique identifier for the slider
  • sliderLabel (string)
    required
    - Accessible ARIA label for the slider
  • class (string)
    optional
    - CSS grid classes for slide layout. Default: 'row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4'
  • slides (object)
    optional
    - Collection of slide objects with properties: index, id, class, img, imgAlt, link, linkLabel, url, content. Default: {}
  • slideLabel (string)
    optional
    - Accessible label prefix for individual slides. Default: 'slide'
  • buttonNext (string)
    optional
    - Label for the next button. Default: 'Next'
  • buttonPrev (string)
    optional
    - Label for the previous button. Default: 'Previous'
  • buttonClass (string)
    optional
    - CSS classes for navigation buttons. Default: 'light rounded-circle'
  • linkAll (string)
    optional
    - URL for a "view all" link. Default: ''
  • linkAllLabel (string)
    optional
    - Label for the "view all" link. Default: 'See more'
  • linkAllClass (string)
    optional
    - CSS classes for the "view all" link. Default: 'btn btn-link-primary me-sm'
  • params (string)
    optional
    - Additional HTML attributes. Default: ''

Statut

macro @cStatus

Generates a status tag badge indicating the current state of a process or event on skin pages.

Exemple

Forthcoming
To be completed
In progress
Over
Bygone
Fini

    <@cStatus />
    <@cStatus level='tobecompleted' />
    <@cStatus level='inprogress' />
    <@cStatus level='over' />
    <@cStatus level='bygone' />
    <@cStatus label='Fini' level='bygone'  />

<div class="status forthcoming">
<span class="status-label fw-bold">Forthcoming</span>
</div>
<div class="status tobecompleted">
<svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="5" cy="5" r="5" fill="currentColor"/></svg>
<span class="status-label fw-bold">To be completed</span>
</div>
<div class="status inprogress">
<span class="status-label fw-bold">In progress</span>
</div>
<div class="status over">
<span class="status-label fw-bold">Over</span>
</div>
<div class="status bygone">
<span class="status-label fw-bold">Bygone</span>
</div>
<div class="status bygone">
<span class="status-label fw-bold">Fini</span>
</div>

Paramètres

Generates a status tag badge indicating the current state of a process or event on skin pages.

  • level (string)
    optional
    - Status level key ('forthcoming', 'tobecompleted', 'inprogress', 'over', 'bygone'). Default: 'forthcoming'
  • class (string)
    optional
    - Additional CSS classes. Default: ''
  • id (string)
    optional
    - HTML id attribute. Default: ''
  • label (string)
    optional
    - Custom label text (overrides i18n default). Default: ''
  • labelClass (string)
    optional
    - CSS class for the label span. Default: ''
  • params (string)
    optional
    - Additional HTML attributes. Default: ''

Progression à étape

macro @cStepper

Generates a multi-step progress stepper displaying sequential steps with status indicators, pictograms, and expandable content.

Exemple

Exemple Stepper 1

  1. 1

    Step 1 of 5

    Text example

    Content 1
  2. 2

    Step 2 of 5

    Text example

    Content 1
  3. 3

    Step 3 of 5

    Text example

    Content 1
  4. 4

    Step 4 of 5

    Text example

    Content 1
  5. 5

    Step 5 of 5

    Text example

    Content 1

Exemple Stepper 2

  1. Step 1 of 5

    Text example

    Content 2
  2. 2

    Step 2 of 5

    Text example

    Content 2
  3. 3

    Step 3 of 5

    Text example

    Content 2
  4. 4

    Step 4 of 5

    Text example

    Content 2
  5. 5

    Step 5 of 5

    Text example

    Content 2

Exemple Stepper 3

  1. Step 1 of 5

    Text example

    Content 3
  2. 2

    Step 2 of 5

    Text example

    Content 3
  3. 3

    Step 3 of 5

    Text example

    Content 3
  4. 4

    Step 4 of 5

    Text example

    Content 3
  5. 5

    Step 5 of 5

    Text example

    Content 3

Exemple Stepper 4

  1. Text example

    Step 1 of 5

    Text example

    Content 4
  2. Text example

    Step 2 of 5

    Text example

    Content 4
  3. Text example

    Step 3 of 5

    Text example

    Content 4
  4. Text example

    Step 4 of 5

    Text example

    Content 4
  5. Text example

    Step 5 of 5

    Text example

    Content 4

Exemple Stepper 5

  1. Step 1 of 5

    Text example

    Long content 5, long long content, long long long long content
  2. Step 2 of 5

    Text example

    Long content 5, long long content, long long long long content
  3. Step 3 of 5

    Text example

    Long content 5, long long content, long long long long content
  4. Step 4 of 5

    Text example

    Long content 5, long long content, long long long long content
  5. 5

    Step 5 of 5

    Text example

    Long content 5, long long content, long long long long content

Exemple Stepper 6 - sans contenu

  1. Step 1 of 5

    Text example

  2. Step 2 of 5

    Text example

  3. Step 3 of 5

    Text example

  4. Step 4 of 5

    Text example

  5. 5

    Step 5 of 5

    Text example

<#assign lstep1 = [
{"title":"Text example", "url":"images/fa-battery-0.png", "status":"started", "content":"Content 1"},
{"title":"Text example", "url":"images/fa-battery-1.png", "content":"Content 1"},
{"title":"Text example", "url":"images/fa-battery-2.png", "content":"Content 1"},
{"title":"Text example", "url":"images/fa-battery-3.png", "content":"Content 1"},
{"title":"Text example", "url":"images/fa-battery-4.png", "content":"Content 1"}
]>
<@cTitle level=3 >Exemple Stepper 1</@cTitle>
<@cBlock class='stepper-wrapper px-5 pb-xl mx-5 px-5'>
<@cStepper steps=lstep1 params='style="--title-w:120px"' />
</@cBlock>
<#assign lstep2 = [
{"title":"Text example", "url":"images/fa-battery-0.png", "status":"done", "content":"Content 2"},
{"title":"Text example", "url":"images/fa-battery-1.png", "status":"in-progress", "content":"Content 2"},
{"title":"Text example", "url":"images/fa-battery-2.png", "content":"Content 2"},
{"title":"Text example", "url":"images/fa-battery-3.png", "content":"Content 2"},
{"title":"Text example", "url":"images/fa-battery-4.png", "content":"Content 2"}
]>
<@cTitle level=3 >Exemple Stepper 2</@cTitle>
<@cBlock class='stepper-wrapper px-5 pb-xl mx-5 px-5'>
<@cStepper steps=lstep2 params='style="--title-w:120px"' />
</@cBlock>
<#assign lstep3 = [
{"title":"Text example", "url":"images/fa-battery-0.png", "status":"done", "content":"Content 3"},
{"title":"Text example", "url":"images/fa-battery-1.png", "status":"started", "content":"Content 3"},
{"title":"Text example", "url":"images/fa-battery-2.png", "content":"Content 3"},
{"title":"Text example", "url":"images/fa-battery-3.png", "content":"Content 3"},
{"title":"Text example", "url":"images/fa-battery-4.png", "content":"Content 3"}
]>
<@cTitle level=3 >Exemple Stepper 3</@cTitle>
<@cBlock class='stepper-wrapper px-5 pb-xl mx-5 px-5'>
<@cStepper steps=lstep3 params='style="--title-w:120px"' />
</@cBlock>
<#assign lstep4 = [
{"title":"Text example", "url":"images/fa-battery-0.png", "status":"done", "content":"Content 4"},
{"title":"Text example", "url":"images/fa-battery-1.png", "status":"done", "content":"Content 4"},
{"title":"Text example", "url":"images/fa-battery-2.png", "status":"started", "content":"Content 4"},
{"title":"Text example", "url":"images/fa-battery-3.png", "content":"Content 4"},
{"title":"Text example", "url":"images/fa-battery-4.png", "content":"Content 4"}
]>
<@cTitle level=3 >Exemple Stepper 4</@cTitle>
<@cBlock class='stepper-wrapper px-5 pb-xl mx-5 px-5' >
<@cStepper steps=lstep4 haspicto=true params='style="--content-w:120px;--title-w:120px"' />
</@cBlock>
<#assign lstep5 = [
{"title":"Text example", "url":"images/fa-battery-0.png", "status":"done", "content":"Long content 5, long long content, long long long long content"},
{"title":"Text example", "url":"images/fa-battery-1.png", "status":"done", "content":"Long content 5, long long content, long long long long content"},
{"title":"Text example", "url":"images/fa-battery-2.png", "status":"done", "content":"Long content 5, long long content, long long long long content"},
{"title":"Text example", "url":"images/fa-battery-3.png", "status":"done", "content":"Long content 5, long long content, long long long long content"},
{"title":"Text example", "url":"images/fa-battery-4.png", "status":"started", "content":"Long content 5, long long content, long long long long content"}
]>
<@cTitle level=3 >Exemple Stepper 5</@cTitle>
<@cBlock class='stepper-wrapper px-5 pb-xl mb-xl mx-5 px-5'>
<@cStepper steps=lstep5 showMore=true />
</@cBlock>
<#assign lstep6 = [
{"title":"Text example", "url":"images/fa-battery-0.png", "status":"done", "content":""},
{"title":"Text example", "url":"images/fa-battery-1.png", "status":"done", "content":""},
{"title":"Text example", "url":"images/fa-battery-2.png", "status":"done", "content":""},
{"title":"Text example", "url":"images/fa-battery-3.png", "status":"done", "content":""},
{"title":"Text example", "url":"images/fa-battery-4.png", "status":"started", "content":""}
]>
<@cTitle level=3 >Exemple Stepper 6 - sans contenu</@cTitle>
<@cBlock class='stepper-wrapper pt-l px-4xl pb-4xl'>
<@cStepper steps=lstep6 />
</@cBlock>

<h3>
Exemple Stepper 1</h3>
<div class="stepper-wrapper pt-l px-4xl pb-4xl">
<div class="stepper">
<ol class="stepper-list " style="--title-w:120px">
<li class="started">
<div class="idx" data-idx="1" aria-hidden="true">
<span>1</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 1 of 5</p>
<p id="step-title-1" class="stepper-title">Text example</p>
<div class="stepper-content">Content 1</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line started"></div>
</li>
<li>
<div class="idx" data-idx="2" aria-hidden="true">
<span>2</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 2 of 5</p>
<p id="step-title-2" class="stepper-title">Text example</p>
<div class="stepper-content">Content 1</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line "></div>
</li>
<li>
<div class="idx" data-idx="3" aria-hidden="true">
<span>3</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 3 of 5</p>
<p id="step-title-3" class="stepper-title">Text example</p>
<div class="stepper-content">Content 1</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line "></div>
</li>
<li>
<div class="idx" data-idx="4" aria-hidden="true">
<span>4</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 4 of 5</p>
<p id="step-title-4" class="stepper-title">Text example</p>
<div class="stepper-content">Content 1</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line "></div>
</li>
<li>
<div class="idx" data-idx="5" aria-hidden="true">
<span>5</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 5 of 5</p>
<p id="step-title-5" class="stepper-title">Text example</p>
<div class="stepper-content">Content 1</div>
</li>
</ol>
</div>
</div>
<h3>
Exemple Stepper 2</h3>
<div class="stepper-wrapper pt-l px-4xl pb-4xl">
<div class="stepper">
<ol class="stepper-list " style="--title-w:120px">
<li class="done">
<div class="idx" data-idx="1" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 1 of 5</p>
<p id="step-title-1" class="stepper-title">Text example</p>
<div class="stepper-content">Content 2</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="in-progress"aria-current="step">
<div class="idx" data-idx="2" aria-hidden="true">
<span>2</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 2 of 5</p>
<p id="step-title-2" class="stepper-title">Text example</p>
<div class="stepper-content">Content 2</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line start"></div>
<div class="bs-stepper-line end"></div>
</li>
<li>
<div class="idx" data-idx="3" aria-hidden="true">
<span>3</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 3 of 5</p>
<p id="step-title-3" class="stepper-title">Text example</p>
<div class="stepper-content">Content 2</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line "></div>
</li>
<li>
<div class="idx" data-idx="4" aria-hidden="true">
<span>4</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 4 of 5</p>
<p id="step-title-4" class="stepper-title">Text example</p>
<div class="stepper-content">Content 2</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line "></div>
</li>
<li>
<div class="idx" data-idx="5" aria-hidden="true">
<span>5</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 5 of 5</p>
<p id="step-title-5" class="stepper-title">Text example</p>
<div class="stepper-content">Content 2</div>
</li>
</ol>
</div>
</div>
<h3>
Exemple Stepper 3</h3>
<div class="stepper-wrapper pt-l px-4xl pb-4xl">
<div class="stepper">
<ol class="stepper-list " style="--title-w:120px">
<li class="done">
<div class="idx" data-idx="1" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 1 of 5</p>
<p id="step-title-1" class="stepper-title">Text example</p>
<div class="stepper-content">Content 3</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="started">
<div class="idx" data-idx="2" aria-hidden="true">
<span>2</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 2 of 5</p>
<p id="step-title-2" class="stepper-title">Text example</p>
<div class="stepper-content">Content 3</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line started"></div>
</li>
<li>
<div class="idx" data-idx="3" aria-hidden="true">
<span>3</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 3 of 5</p>
<p id="step-title-3" class="stepper-title">Text example</p>
<div class="stepper-content">Content 3</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line "></div>
</li>
<li>
<div class="idx" data-idx="4" aria-hidden="true">
<span>4</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 4 of 5</p>
<p id="step-title-4" class="stepper-title">Text example</p>
<div class="stepper-content">Content 3</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line "></div>
</li>
<li>
<div class="idx" data-idx="5" aria-hidden="true">
<span>5</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 5 of 5</p>
<p id="step-title-5" class="stepper-title">Text example</p>
<div class="stepper-content">Content 3</div>
</li>
</ol>
</div>
</div>
<h3>
Exemple Stepper 4</h3>
<div class="stepper-wrapper pt-l px-4xl pb-4xl">
<div class="stepper">
<ol class="stepper-list " style="--content-w:120px;--title-w:120px">
<li class="done">
<figure class="p-3 mb-0" data-idx="1">
<img src="images/fa-battery-0.png" class="img-fluid" alt="Text example">
</figure>
<p class="d-block d-sm-none text-secondary fs-5">Step 1 of 5</p>
<p id="step-title-1" class="stepper-title">Text example</p>
<div class="stepper-content">Content 4</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="done">
<figure class="p-3 mb-0" data-idx="2">
<img src="images/fa-battery-1.png" class="img-fluid" alt="Text example">
</figure>
<p class="d-block d-sm-none text-secondary fs-5">Step 2 of 5</p>
<p id="step-title-2" class="stepper-title">Text example</p>
<div class="stepper-content">Content 4</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="started">
<figure class="p-3 mb-0" data-idx="3">
<img src="images/fa-battery-2.png" class="img-fluid" alt="Text example">
</figure>
<p class="d-block d-sm-none text-secondary fs-5">Step 3 of 5</p>
<p id="step-title-3" class="stepper-title">Text example</p>
<div class="stepper-content">Content 4</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line started"></div>
</li>
<li>
<figure class="p-3 mb-0" data-idx="4">
<img src="images/fa-battery-3.png" class="img-fluid" alt="Text example">
</figure>
<p class="d-block d-sm-none text-secondary fs-5">Step 4 of 5</p>
<p id="step-title-4" class="stepper-title">Text example</p>
<div class="stepper-content">Content 4</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line "></div>
</li>
<li>
<figure class="p-3 mb-0" data-idx="5">
<img src="images/fa-battery-4.png" class="img-fluid" alt="Text example">
</figure>
<p class="d-block d-sm-none text-secondary fs-5">Step 5 of 5</p>
<p id="step-title-5" class="stepper-title">Text example</p>
<div class="stepper-content">Content 4</div>
</li>
</ol>
</div>
</div>
<h3>
Exemple Stepper 5</h3>
<div class="stepper-wrapper pt-l px-4xl pb-4xl">
<div class="stepper">
<ol class="stepper-list ">
<li class="done">
<div class="idx" data-idx="1" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 1 of 5</p>
<p id="step-title-1" class="stepper-title">Text example</p>
<div class="stepper-content truncate">Long content 5, long long content, long long long long content</div>
<div class="stepper-footer">
<button type='button' class='btn btn-stepper-more main-color btn-mini'>
<svg class="paris-icon paris-icon-plus"data-mce-svg="paris-icon paris-icon-plus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-plus"></use>
</svg> <span class="button-label">Show more</span>
</button>
<button type="button" class="btn btn-stepper-less main-color btn-mini">
<svg class="paris-icon paris-icon-minus"data-mce-svg="paris-icon paris-icon-minus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-minus"></use>
</svg> <span class="button-label">Close</span>
</button>
</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="done">
<div class="idx" data-idx="2" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 2 of 5</p>
<p id="step-title-2" class="stepper-title">Text example</p>
<div class="stepper-content truncate">Long content 5, long long content, long long long long content</div>
<div class="stepper-footer">
<button type='button' class='btn btn-stepper-more main-color btn-mini'>
<svg class="paris-icon paris-icon-plus"data-mce-svg="paris-icon paris-icon-plus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-plus"></use>
</svg> <span class="button-label">Show more</span>
</button>
<button type="button" class="btn btn-stepper-less main-color btn-mini">
<svg class="paris-icon paris-icon-minus"data-mce-svg="paris-icon paris-icon-minus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-minus"></use>
</svg> <span class="button-label">Close</span>
</button>
</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="done">
<div class="idx" data-idx="3" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 3 of 5</p>
<p id="step-title-3" class="stepper-title">Text example</p>
<div class="stepper-content truncate">Long content 5, long long content, long long long long content</div>
<div class="stepper-footer">
<button type='button' class='btn btn-stepper-more main-color btn-mini'>
<svg class="paris-icon paris-icon-plus"data-mce-svg="paris-icon paris-icon-plus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-plus"></use>
</svg> <span class="button-label">Show more</span>
</button>
<button type="button" class="btn btn-stepper-less main-color btn-mini">
<svg class="paris-icon paris-icon-minus"data-mce-svg="paris-icon paris-icon-minus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-minus"></use>
</svg> <span class="button-label">Close</span>
</button>
</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="done">
<div class="idx" data-idx="4" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 4 of 5</p>
<p id="step-title-4" class="stepper-title">Text example</p>
<div class="stepper-content truncate">Long content 5, long long content, long long long long content</div>
<div class="stepper-footer">
<button type='button' class='btn btn-stepper-more main-color btn-mini'>
<svg class="paris-icon paris-icon-plus"data-mce-svg="paris-icon paris-icon-plus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-plus"></use>
</svg> <span class="button-label">Show more</span>
</button>
<button type="button" class="btn btn-stepper-less main-color btn-mini">
<svg class="paris-icon paris-icon-minus"data-mce-svg="paris-icon paris-icon-minus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-minus"></use>
</svg> <span class="button-label">Close</span>
</button>
</div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="started">
<div class="idx" data-idx="5" aria-hidden="true">
<span>5</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 5 of 5</p>
<p id="step-title-5" class="stepper-title">Text example</p>
<div class="stepper-content truncate">Long content 5, long long content, long long long long content</div>
<div class="stepper-footer">
<button type='button' class='btn btn-stepper-more main-color btn-mini'>
<svg class="paris-icon paris-icon-plus"data-mce-svg="paris-icon paris-icon-plus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-plus"></use>
</svg> <span class="button-label">Show more</span>
</button>
<button type="button" class="btn btn-stepper-less main-color btn-mini">
<svg class="paris-icon paris-icon-minus"data-mce-svg="paris-icon paris-icon-minus" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-minus"></use>
</svg> <span class="button-label">Close</span>
</button>
</div>
</li>
</ol>
</div>
</div>
<h3>
Exemple Stepper 6 - sans contenu</h3>
<div class="stepper-wrapper pt-l px-4xl pb-4xl">
<div class="stepper">
<ol class="stepper-list ">
<li class="done">
<div class="idx" data-idx="1" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 1 of 5</p>
<p id="step-title-1" class="stepper-title">Text example</p>
<div class="stepper-content"></div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="done">
<div class="idx" data-idx="2" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 2 of 5</p>
<p id="step-title-2" class="stepper-title">Text example</p>
<div class="stepper-content"></div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="done">
<div class="idx" data-idx="3" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 3 of 5</p>
<p id="step-title-3" class="stepper-title">Text example</p>
<div class="stepper-content"></div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="done">
<div class="idx" data-idx="4" aria-hidden="true">
<svg class="paris-icon paris-icon-check main-color"data-mce-svg="paris-icon paris-icon-check" aria-hidden="true" focusable="false" role="img" aria-label="Step {0} done">
<use href="#paris-icon-check"></use>
</svg> </div>
<p class="d-block d-sm-none text-secondary fs-5">Step 4 of 5</p>
<p id="step-title-4" class="stepper-title">Text example</p>
<div class="stepper-content"></div>
</li>
<li class="bs-stepper-container">
<div class="bs-stepper-line done"></div>
</li>
<li class="started">
<div class="idx" data-idx="5" aria-hidden="true">
<span>5</span>
</div>
<p class="d-block d-sm-none text-secondary fs-5">Step 5 of 5</p>
<p id="step-title-5" class="stepper-title">Text example</p>
<div class="stepper-content"></div>
</li>
</ol>
</div>
</div>

Paramètres

Generates a multi-step progress stepper displaying sequential steps with status indicators, pictograms, and expandable content.

  • steps (object)
    required
    - Collection of step objects with properties: title, content, status ('done', 'in-progress', ''), url
  • haspicto (boolean)
    optional
    - Whether to display step pictogram images. Default: false
  • hasidx (boolean)
    optional
    - Whether to display numbered index bullets. Default: false
  • title (boolean)
    optional
    - Whether to display step titles with heading style. Default: false
  • showMore (boolean)
    optional
    - Whether to display a "show more" button for step content. Default: false
  • labelMore (string)
    optional
    - Label for the expand button. Default: i18n("portal.theme.labelShowMore")
  • a11StatusMsg (string)
    optional
    - Accessible status message for the active step. Default: ''
  • class (string)
    optional
    - Additional CSS classes (use 'pie' for pie-chart style). Default: ''
  • id (string)
    optional
    - HTML id attribute. Default: ''
  • params (string)
    optional
    - Additional HTML attributes. Default: ''

Tableau

macro @cTable

Doc Bootstrap Tableau

Generates a responsive HTML table with theme styling, collapsible rows for small screens, and an accessible caption. Automatically creates an accordion view for mobile devices.

Exemple

Tableau avec thème
Ligne Couleur Stations principales Détails
1 Jaune La Défense, Châtelet, Gare de Lyon Plan
2 Bleu Porte Dauphine, Place de Clichy, Nation Plan
3 Vert Pont de Levallois, Opéra, Gallieni Plan
4 Violet Porte de Clignancourt, Châtelet, Montrouge Plan

Exemple sans "id"

Information

Consulter les log dans la console développeur ( Ctrl + Shift + I ) du navigateur et chercher "Paris.fr".

Tableau sans id
Code Valeur
A Arc
B Ballon
C Canoë

<@cTable id='table1' collapsible=false caption='Tableau avec thème' collapsed=true >
    <@cThead>
        <@cTr>
            <@cTh id='label-1'>Ligne<@sortSite jsp_url='jsp/site/Portal.jsp?page_id=6#section-ctable' attribute='line' /></@cTh>
            <@cTh id='label-2'>Couleur</@cTh>
            <@cTh id='label-3'>Stations principales</@cTh>
            <@cTh id='label-4' class='text-right'>Détails</@cTh>
        </@cTr>
    </@cThead>
    <@cTbody>
        <@cTr>
            <@cTd>1</@cTd>
            <@cTd>Jaune</@cTd>
            <@cTd>La Défense, Châtelet, Gare de Lyon</@cTd>
            <@cTd class='text-right'><@cLink href='https://www.ratp.fr/plans-lignes/metro/1' label='Plan' target='_blank' class='btn btn-primary' title='Plan ligne 1' /></@cTd>
        </@cTr>
        <@cTr>
            <@cTd>2</@cTd>
            <@cTd>Bleu</@cTd>
            <@cTd>Porte Dauphine, Place de Clichy, Nation</@cTd>
            <@cTd class='text-right'><@cLink href='https://www.ratp.fr/plans-lignes/metro/2' label='Plan' target='_blank' class='btn btn-primary' title='Plan ligne 2' /></@cTd>
        </@cTr>
        <@cTr>
            <@cTd>3</@cTd>
            <@cTd>Vert</@cTd>
            <@cTd>Pont de Levallois, Opéra, Gallieni</@cTd>
            <@cTd class='text-right'><@cLink href='https://www.ratp.fr/plans-lignes/metro/3' label='Plan' target='_blank' class='btn btn-primary' title='Plan ligne 3' /></@cTd>
        </@cTr>
        <@cTr>
            <@cTd>4</@cTd>
            <@cTd>Violet</@cTd>
            <@cTd>Porte de Clignancourt, Châtelet, Montrouge</@cTd>
            <@cTd class='text-right'><@cLink href='https://www.ratp.fr/plans-lignes/metro/4' label='Plan' target='_blank' class='btn btn-primary' title='Plan ligne 4' /></@cTd>
        </@cTr>
    </@cTbody>
</@cTable>

<@cTable collapsible=false caption='Tableau sans id' >
    <@cThead>
        <@cTr>
            <@cTh id='label-1'>Code <@sortSite jsp_url='jsp/site/Portal.jsp?page_id=6#section-ctable' attribute='code' /></@cTh>
            <@cTh id='label-2'>Valeur <@sortSite jsp_url='jsp/site/Portal.jsp?page_id=6#section-ctable' attribute='value' /></@cTh>
        </@cTr>
    </@cThead>
    <@cTbody>
        <@cTr>
            <@cTd>A</@cTd>
            <@cTd>Arc</@cTd>
        </@cTr>
        <@cTr>
            <@cTd>B</@cTd>
            <@cTd>Ballon</@cTd>
        </@cTr>
        <@cTr>
            <@cTd>C</@cTd>
            <@cTd>Canoë</@cTd>
        </@cTr>
    </@cTbody>
</@cTable>

<div class="d-none d-md-block table-responsive">
<table class="table ctable" id="table1" >
<caption class="visually-hidden">Tableau avec thème</caption>
<thead >
<tr >
<th scope="col" class="" id="label-1" >
Ligne<a href="jsp/site/Portal.jsp?page_id=6#section-ctable&amp;sorted_attribute_name=line&amp;asc_sort=false#sort_line" title="Descending sort" class="btn-sort text-decoration-none" role="button">
<svg class="paris-icon paris-icon-arrow-down main-color"data-mce-svg="paris-icon paris-icon-arrow-down" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-down"></use>
</svg></a>
</th>
<th scope="col" class="" id="label-2" >
Couleur</th>
<th scope="col" class="" id="label-3" >
Stations principales</th>
<th scope="col" class="text-right" id="label-4" >
Détails</th>
</tr>
</thead>
<tbody >
<tr >
<td>
<span>1</span>
</td>
<td>
<span>Jaune</span>
</td>
<td>
<span>La Défense, Châtelet, Gare de Lyon</span>
</td>
<td class="text-right">
<span>
<a href="https://www.ratp.fr/plans-lignes/metro/1" class="btn btn-primary" title="Plan ligne 1 [New window]" target="_blank" >
<span class="link-label">Plan</span>
</a>
</span>
</td>
</tr>
<tr >
<td>
<span>2</span>
</td>
<td>
<span>Bleu</span>
</td>
<td>
<span>Porte Dauphine, Place de Clichy, Nation</span>
</td>
<td class="text-right">
<span>
<a href="https://www.ratp.fr/plans-lignes/metro/2" class="btn btn-primary" title="Plan ligne 2 [New window]" target="_blank" >
<span class="link-label">Plan</span>
</a>
</span>
</td>
</tr>
<tr >
<td>
<span>3</span>
</td>
<td>
<span>Vert</span>
</td>
<td>
<span>Pont de Levallois, Opéra, Gallieni</span>
</td>
<td class="text-right">
<span>
<a href="https://www.ratp.fr/plans-lignes/metro/3" class="btn btn-primary" title="Plan ligne 3 [New window]" target="_blank" >
<span class="link-label">Plan</span>
</a>
</span>
</td>
</tr>
<tr >
<td>
<span>4</span>
</td>
<td>
<span>Violet</span>
</td>
<td>
<span>Porte de Clignancourt, Châtelet, Montrouge</span>
</td>
<td class="text-right">
<span>
<a href="https://www.ratp.fr/plans-lignes/metro/4" class="btn btn-primary" title="Plan ligne 4 [New window]" target="_blank" >
<span class="link-label">Plan</span>
</a>
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="d-md-none" id="accordion-table-table1"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const rows = document.querySelectorAll('table#table1 tbody tr');
rows.forEach(function(row, index) {
const cells = row.querySelectorAll('td');
let accordionContent = '';
cells.forEach(function(cell, i) {
const headerSelector = document.querySelector('table#table1 thead th:nth-child(' + (i + 1) + ')')
const headerText = headerSelector.querySelector('a:not(.btn-sort), button') ? headerSelector.innerHTML : headerSelector.textContent;
const cellText = cell.getHTML();
const cellClass = cell.className;
accordionContent += `<p class="fw-bold">${headerText}</p><p class='mb-4 ${cellClass}'>${cellText}</p>`;
});
const accordionItem = `
<div class="accordion " id="accheadingtable1` + index + `" >
<div class="card " >
<h3 class="card-header m-0" data-bs-toggle="collapse" data-bs-target="#collapseAccheadingtable1` + index + `" aria-expanded="true" aria-controls="collapseAccheadingtable1` + index + `">
<button class="btn btn-link btn-header-accordion w-100" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccheadingtable1` + index + `" aria-expanded="true" aria-controls="collapseAccheadingtable1` + index + `">
<span class="d-flex flex-column flex-1">
<span class="card-title d-block" id="headingAccheadingtable1` + index + `">` + cells[0].textContent + `</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion btn-outline-action">
<svg class="paris-icon paris-icon-arrow-bottom btn-outline-action"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccheadingtable1` + index + `" class="m-0 collapse show" role="region" aria-labelledby="headingAccheadingtable1` + index + `" data-parent="#accheadingtable1` + index + `">
<div class="card-body">
` + accordionContent + `
</div>
</div>
<div class="card-footer d-block d-sm-none text-center">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccheadingtable1` + index + `" aria-expanded="true" aria-controls="collapseAccheadingtable1` + index + `">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
`;
document.getElementById('accordion-table-table1').insertAdjacentHTML('beforeend', accordionItem);
});
});
</script>
<div class="d-flex justify-content-end">
<div class="form-check btn-selection">
<div class="selection-check">
<input type="checkbox" id="selectResponsiveTable" name="selectResponsiveTable" class="form-check-input" value="1">
<label class="form-label form-check-label" for="selectResponsiveTable">
Mode responsive alternatif
<p class="selection-subtitle my-sm">Modifier le mode responsive.<br> Ajoute le paramètre "collapsed=true" à la macro cTable.<br>D'autres options sont disponibles pour masquer le header et/ou le footer<br> et modifier l'aspect graphique de la carte</p>
</label>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const checkboxTable = document.getElementById('selectResponsiveTable');
const tableSample = document.getElementById('accordion-table-table1');
const accordionCardList = tableSample.querySelectorAll('.card')
if (checkboxTable && tableSample && accordionCardList) {
checkboxTable.addEventListener('change', function() {
if (this.checked) {
tableSample.classList.add('tabs-list');
accordionCardList.forEach(card => {
const cardHeader = card.querySelector('.card-header');
const collapse = card.querySelector('.collapse');
if (cardHeader) {
cardHeader.classList.add('collapsed');
}
if (collapse) {
collapse.classList.add('show');
}
});
} else {
tableSample.classList.remove('tabs-list');
accordionCardList.forEach(card => {
const cardHeader = card.querySelector('.card-header');
const collapse = card.querySelector('.collapse');
if (cardHeader) {
cardHeader.classList.remove('collapsed');
}
if (collapse) {
collapse.classList.remove('show');
}
});
}
});
}
});
</script>
<h3>
Exemple sans "id"</h3>
<div class="alert alert-outline alert-primary " role="status" >
<div class="alert-header">
<div class="alert-icon">
<svg class="paris-icon paris-icon-alert-info"data-mce-svg="paris-icon paris-icon-alert-info" aria-labelledby="paris-icon-alert-info-paris-title-2372598229405691" focusable="false" role="img">
<title id="paris-icon-alert-info-paris-title-2372598229405691">Information</title>
<use href="#paris-icon-alert-info"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Consulter les log dans la console développeur ( <kdb>Ctrl</kdb> + <kdb>Shift</kdb> + <kdb>I</kdb> ) du navigateur et chercher "Paris.fr".</p>
</div>
</div>
</div>
<!-- ATTENTION : Risque de duplication d'id ! -->
<div class="d-none d-md-block table-responsive">
<table class="table ctable" id="changeme" >
<caption class="visually-hidden">Tableau sans id</caption>
<thead >
<tr >
<th scope="col" class="" id="label-1" >
Code <a href="jsp/site/Portal.jsp?page_id=6#section-ctable&amp;sorted_attribute_name=code&amp;asc_sort=false#sort_code" title="Descending sort" class="btn-sort text-decoration-none" role="button">
<svg class="paris-icon paris-icon-arrow-down main-color"data-mce-svg="paris-icon paris-icon-arrow-down" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-down"></use>
</svg></a>
</th>
<th scope="col" class="" id="label-2" >
Valeur <a href="jsp/site/Portal.jsp?page_id=6#section-ctable&amp;sorted_attribute_name=value&amp;asc_sort=false#sort_value" title="Descending sort" class="btn-sort text-decoration-none" role="button">
<svg class="paris-icon paris-icon-arrow-down main-color"data-mce-svg="paris-icon paris-icon-arrow-down" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-down"></use>
</svg></a>
</th>
</tr>
</thead>
<tbody >
<tr >
<td>
<span>A</span>
</td>
<td>
<span>Arc</span>
</td>
</tr>
<tr >
<td>
<span>B</span>
</td>
<td>
<span>Ballon</span>
</td>
</tr>
<tr >
<td>
<span>C</span>
</td>
<td>
<span>Canoë</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="d-md-none" id="accordion-table-changeme"></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
console.warn( "[Thème Paris fr] macro cTable : ATTENTION : Risque de duplication. Modifier l'id de la macro cTable !" )
const rows = document.querySelectorAll('table#changeme tbody tr');
rows.forEach(function(row, index) {
const cells = row.querySelectorAll('td');
let accordionContent = '';
cells.forEach(function(cell, i) {
const headerSelector = document.querySelector('table#changeme thead th:nth-child(' + (i + 1) + ')')
const headerText = headerSelector.querySelector('a:not(.btn-sort), button') ? headerSelector.innerHTML : headerSelector.textContent;
const cellText = cell.getHTML();
const cellClass = cell.className;
accordionContent += `<p class="fw-bold">${headerText}</p><p class='mb-4 ${cellClass}'>${cellText}</p>`;
});
const accordionItem = `
<div class="accordion " id="accheadingchangeme` + index + `" >
<div class="card " >
<h3 class="card-header m-0 collapsed" data-bs-toggle="collapse" data-bs-target="#collapseAccheadingchangeme` + index + `" aria-expanded="false" aria-controls="collapseAccheadingchangeme` + index + `">
<button class="btn btn-link btn-header-accordion w-100" type="button" data-bs-toggle="collapse" data-show-label="Show details" data-hide-label="Hide details" data-bs-target="#collapseAccheadingchangeme` + index + `" aria-expanded="false" aria-controls="collapseAccheadingchangeme` + index + `">
<span class="d-flex flex-column flex-1">
<span class="card-title d-block" id="headingAccheadingchangeme` + index + `">` + cells[0].textContent + `</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion btn-outline-action">
<svg class="paris-icon paris-icon-arrow-bottom btn-outline-action"data-mce-svg="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-bottom"></use>
</svg> </span>
</span>
</button>
</h3>
<div id="collapseAccheadingchangeme` + index + `" class="m-0 collapse " role="region" aria-labelledby="headingAccheadingchangeme` + index + `" data-parent="#accheadingchangeme` + index + `">
<div class="card-body">
` + accordionContent + `
</div>
</div>
<div class="card-footer d-block d-sm-none text-center">
<button class="btn btn-link btn-accordion" type="button" data-bs-toggle="collapse" data-bs-target="#collapseAccheadingchangeme` + index + `" aria-expanded="false" aria-controls="collapseAccheadingchangeme` + index + `">
<svg class="paris-icon paris-icon-arrow-bottom" aria-hidden="true" focusable="false">
<use xlink:href="#paris-icon-arrow-bottom"></use>
</svg>
</button>
</div>
</div>
</div>
`;
document.getElementById('accordion-table-changeme').insertAdjacentHTML('beforeend', accordionItem);
});
});
</script>
<script>
// Add toast notification functionality for table header links
document.querySelectorAll('.ctable th a').forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
// Create toast container if it doesn't exist
let toastContainer = document.getElementById('toast-container');
if (!toastContainer) {
toastContainer = document.createElement('div');
toastContainer.id = 'toast-container';
toastContainer.className = 'toast-container position-fixed top-0 end-0 p-3';
toastContainer.style.zIndex = '1055';
document.body.appendChild(toastContainer);
}
// Create toast element
const toastId = 'toast-' + Date.now();
const sortAttribute = this.closest('a').href.split('attribute=')[1] || 'column';
const toastHTML = `
<div id="${toastId}" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-header">
<div class="rounded me-2 bg-warning" style="width: 20px; height: 20px;"></div>
<strong class="me-auto">Attention</strong>
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Fermer"></button>
</div>
<div class="toast-body">
Le tri est désactivé
</div>
</div>
`;
toastContainer.insertAdjacentHTML('beforeend', toastHTML);
// Initialize and show the toast
const toastElement = document.getElementById(toastId);
const toast = new bootstrap.Toast(toastElement, {
delay: 3000
});
toast.show();
// Remove toast element after it's hidden
toastElement.addEventListener('hidden.bs.toast', function() {
this.remove();
});
});
});
console.log('Paris.fr - Table sort toast notifications initialized');
</script>

Paramètres

Generates a responsive HTML table with theme styling, collapsible rows for small screens, and an accessible caption. Automatically creates an accordion view for mobile devices.

  • caption (string)
    optional
    - Caption text for the table, used for accessibility. Default: ''
  • captionClass (string)
    optional
    - CSS class for the caption element. Default: 'visually-hidden'
  • summary (string)
    optional
    - Summary attribute for the table. Default: ''
  • breakpoint (string)
    optional
    - Responsive breakpoint suffix ('-sm', '-md', '-lg', '-xl', '-xxl'). Default: ''
  • themed (boolean)
    optional
    - If true, applies the theme default table styles; otherwise Bootstrap styles apply. Default: true
  • collapsible (boolean)
    optional
    - If true, collapses rows on small screens showing only the first cell. Default: true
  • class (string)
    optional
    - CSS class(es) applied to the table element. Default: ''
  • id (string)
    optional
    - Unique identifier for the table; must be changed from default to avoid conflicts. Default: 'changeme'
  • params (string)
    optional
    - Additional HTML attributes for the table element. Default: ''

Tuile

macro @cTile

Tuile - permet d'afficher un lien avec images et texte.

Exemple

Tag

Paris.fr

Accéder au site Paris.fr

Tag

Paris.fr [tooltip]

Accéder au site Paris.fr

Tag

Paris.fr Horizontal

Accéder au site Paris.fr

Voir la page [lien externe]

Accéder au site Paris.fr

Logo Dowload

Télécharger le logo

Logo Disabled

Télécharger le logo

Tag

Horizontal

Logo

Inscription scolaire

Inscriptions ouvertes toute l'année

Inscription scolaire

Inscriptions ouvertes toute l'année

Hotel de Ville

Télécharger le logo

Opéra

Télécharger le logo

Sacré Coeur de Montmartre

Télécharger le logo

<@cTile title='Paris.fr' url='https://paris.fr' detail='Accéder au site Paris.fr' badge='Tag' imgName='louvre' />
<@cTile title='Paris.fr Horizontal' url='https://paris.fr' detail='Accéder au site Paris.fr' badge='Tag' imgName='louvre' />
<@cTile title='Voir la page [lien externe]' url='https://paris.fr' detail='Accéder au site Paris.fr' target='_blank' button=true id='button-test' />
<@cTile title='Logo Dowload' url='themes/skin/parisfr/images/header-logo-paris.svg' detail='Télécharger le logo' imgName='louvre' download=true />
<@cTile title='Logo Disabled' url='themes/skin/parisfr/images/header-logo-paris.svg' detail='Télécharger le logo' imgName='louvre' disabled=true />
<@cTile title='Horizontal' url='https://paris.fr' detail='Logo' badge='Tag' imgName='louvre' horizontal=true />
<@cRow>
	<@cCol>
		<@cTile title='Inscription scolaire' url='https://paris.fr' detail='Inscriptions ouvertes toute l\'année' imgName='ecole' />
	</@cCol>
	<@cCol>
		<@cTile title='Inscription scolaire' url='https://paris.fr' detail='Inscriptions ouvertes toute l\'année' imgName='ecole'  />
	</@cCol>
</@cRow>
<@cRow>
	<@cCol>
		<@cTile title='Hotel de Ville' url='https://paris.fr' detail='Télécharger le logo' imgName='hoteldeville' />
	</@cCol>
	<@cCol>
		<@cTile title='Opéra' url='https://paris.fr' detail='Télécharger le logo' imgName='opera' />
	</@cCol>
	<@cCol>
		<@cTile title='Sacré Coeur de Montmartre' url='https://paris.fr' detail='Télécharger le logo' imgName='sacre-coeur' />
	</@cCol>
</@cRow>

<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre"data-mce-svg="paris-icon paris-icon-louvre" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-louvre"></use>
</svg></div>
</div>
<div class="tile-body">
<div class="tile-badge">
<div class="badge ">
<p class="badge-label">Tag</p>
</div>
</div>
<a href="https://paris.fr" class="tile-link" >
<h3 class="tile-title truncate">
Paris.fr</h3>
</a>
<p class="tile-detail truncate">
Accéder au site Paris.fr</p>
</div>
</div>
<div class="tile" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" data-bs-placement="bottom" data-bs-title="Paris.fr [tooltip] - Accéder au site Paris.fr"}>
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre"data-mce-svg="paris-icon paris-icon-louvre" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-louvre"></use>
</svg></div>
</div>
<div class="tile-body">
<div class="tile-badge">
<div class="badge ">
<p class="badge-label">Tag</p>
</div>
</div>
<a href="https://paris.fr" class="tile-link" >
<h3 class="tile-title truncate">
Paris.fr [tooltip]</h3>
</a>
<p class="tile-detail truncate">
Accéder au site Paris.fr</p>
</div>
</div>
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre"data-mce-svg="paris-icon paris-icon-louvre" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-louvre"></use>
</svg></div>
</div>
<div class="tile-body">
<div class="tile-badge">
<div class="badge ">
<p class="badge-label">Tag</p>
</div>
</div>
<a href="https://paris.fr" class="tile-link" >
<h3 class="tile-title truncate">
Paris.fr Horizontal</h3>
</a>
<p class="tile-detail truncate">
Accéder au site Paris.fr</p>
</div>
</div>
<!-- Warning : wrong or deprecated argument(s) : button, ... -->
<div class="tile" id="button-test">
<div class="tile-body">
<a href="https://paris.fr" class="tile-link" target="_blank" >
<h3 class="tile-title truncate">
Voir la page [lien externe]</h3>
<span class="visually-hidden visually-hidden-focusable"> </span>
</a>
<p class="tile-detail truncate">
Accéder au site Paris.fr</p>
</div>
</div>
<div class="tile download">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre"data-mce-svg="paris-icon paris-icon-louvre" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-louvre"></use>
</svg></div>
</div>
<div class="tile-body">
<a href="themes/skin/parisfr/images/header-logo-paris.svg" class="tile-link" download >
<h3 class="tile-title truncate">
Logo Dowload</h3>
</a>
<p class="tile-detail truncate">
Télécharger le logo</p>
</div>
</div>
<div class="tile disabled">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre"data-mce-svg="paris-icon paris-icon-louvre" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-louvre"></use>
</svg></div>
</div>
<div class="tile-body">
<a href="themes/skin/parisfr/images/header-logo-paris.svg" class="tile-link disabled" >
<h3 class="tile-title truncate">
Logo Disabled</h3>
</a>
<p class="tile-detail truncate">
Télécharger le logo</p>
</div>
</div>
<div class="tile horizontal">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre"data-mce-svg="paris-icon paris-icon-louvre" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-louvre"></use>
</svg></div>
</div>
<div class="tile-body">
<div class="tile-badge">
<div class="badge ">
<p class="badge-label">Tag</p>
</div>
</div>
<a href="https://paris.fr" class="tile-link" >
<h3 class="tile-title truncate">
Horizontal</h3>
</a>
<p class="tile-detail truncate">
Logo</p>
</div>
</div>
<div class="row ">
<div class="col ">
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-ecole"data-mce-svg="paris-icon paris-icon-ecole" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-ecole"></use>
</svg></div>
</div>
<div class="tile-body">
<a href="https://paris.fr" class="tile-link" >
<h3 class="tile-title truncate">
Inscription scolaire</h3>
</a>
<p class="tile-detail truncate">
Inscriptions ouvertes toute l'année</p>
</div>
</div>
</div>
<div class="col ">
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-ecole"data-mce-svg="paris-icon paris-icon-ecole" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-ecole"></use>
</svg></div>
</div>
<div class="tile-body">
<a href="https://paris.fr" class="tile-link" >
<h3 class="tile-title truncate">
Inscription scolaire</h3>
</a>
<p class="tile-detail truncate">
Inscriptions ouvertes toute l'année</p>
</div>
</div>
</div>
</div>
<div class="row ">
<div class="col ">
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-hoteldeville"data-mce-svg="paris-icon paris-icon-hoteldeville" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-hoteldeville"></use>
</svg></div>
</div>
<div class="tile-body">
<a href="https://paris.fr" class="tile-link" >
<h3 class="tile-title truncate">
Hotel de Ville</h3>
</a>
<p class="tile-detail truncate">
Télécharger le logo</p>
</div>
</div>
</div>
<div class="col ">
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-opera"data-mce-svg="paris-icon paris-icon-opera" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-opera"></use>
</svg></div>
</div>
<div class="tile-body">
<a href="https://paris.fr" class="tile-link" >
<h3 class="tile-title truncate">
Opéra</h3>
</a>
<p class="tile-detail truncate">
Télécharger le logo</p>
</div>
</div>
</div>
<div class="col ">
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-sacre-coeur"data-mce-svg="paris-icon paris-icon-sacre-coeur" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-sacre-coeur"></use>
</svg></div>
</div>
<div class="tile-body">
<a href="https://paris.fr" class="tile-link" >
<h3 class="tile-title truncate">
Sacré Coeur de Montmartre</h3>
</a>
<p class="tile-detail truncate">
Télécharger le logo</p>
</div>
</div>
</div>
</div>

Paramètres

A tile is an interactive element within the interface that directs the user to content pages.

Information

Les icônes utilisées sont celle du pack fourni par le thème.
Les icônes des monuments utilisées dans les exemples ne sont pas par défaut dans le thème.
Elles ont été ajoutées selon la procédure décrite dans la page "Iconographie" - voir section "Plus d'informations"

  • title (string)
    Mandatory
    - Title to show in link
  • url (string)
    Mandatory
    - Url for the link.
  • level (number)
    optional
    - Heading level from 2 to 6. Default: 3
  • target (string)
    optional
    - Link's target. Default: ''
  • detail (string)
    optional
    - Detail for the tile.
    Mandatory if "download" param is true
    . Default: ''
  • imgName (string)
    optional
    - name of the SVG image shown in tile. Default: 'nef'
  • badge (string)
    optional
    - Label for the optionnal badge shown after detal. Default: ''
  • badgeClass (string)
    optional
    - CSS class(es) applied to the badge element. Default: ''
  • horizontal (boolean)
    optional
    - If true the card elements are shown horizontaly. Default: false
  • download (boolean)
    optional
    - Add download param to link to force file download. Default: false
  • disabled (boolean)
    optional
    - If true the tile and link are disabled. Default: false
  • tooltip (boolean)
    optional
    - If true show tooltip on tile with title and detail. Default: false
  • tooltipPos (string)
    optional
    - Default position for the tooltip. Default: 'top'
  • id (string)
    optional
    - Unique identifier for the heading element. Default: ''
  • class (string)
    optional
    - CSS class(es) applied to the heading element. Default: ''
  • params (string)
    optional
    - Additional HTML attributes for the heading element. Default: ''

Onglets

macro @cTabs

Doc Bootstrap Onglets

Generates a Bootstrap tab navigation container wrapping individual cTab elements, with optional nav element semantics.

Exemple

Title Tab 1

Contenu Tab 1

Title Tab 2

Contenu Tab 2

Title Tab 3

Contenu Tab 3

Title Tab 4

Contenu Tab 4

Title Tab 5

Contenu Tab 5

<@cTabs id='tabSample1'>
    <@cTab url='#TabContent1' active=true>Onglet 1</@cTab>
    <@cTab url='#TabContent2'>Onglet 2 </@cTab>
    <@cTab url='#TabContent3'>Onglet 3</@cTab>
    <@cTab url='#TabContent4' disabled=true>Onglet 4</@cTab>
    <@cTab url='#TabContent5'>Onglet 5</@cTab>
</@cTabs>
<@cTabContent id='myContent'>
    <@cTabPane title='Onglet 1' id='TabContent1' active=true  class='px-xl pt-xs pb-4xl'>
        <@cTitle level=3>Title Tab 1</@cTitle>
    	<@cText>Contenu Tab 1</@cText>
    </@cTabPane>
    <@cTabPane title='Onglet 2' id='TabContent2' class='px-xl pt-xs pb-4xl'>
        <@cTitle level=3>Title Tab 2</@cTitle>
        <@cText>Contenu Tab 2</@cText>
    </@cTabPane>
    <@cTabPane title='Onglet 3 avec plus de 20 caractères et ellipsis' id='TabContent3' class='px-xl pt-xs pb-4xl'>
        <@cTitle level=3>Title Tab 3</@cTitle>
        <@cText>Contenu Tab 3</@cText>
    </@cTabPane>
    <@cTabPane title='Onglet 4' id='TabContent4' disabled=true class='px-xl pt-xs pb-4xl'>
    	<@cTitle level=3>Title Tab 4</@cTitle>
    	<@cText>Contenu Tab 4</@cText>
    </@cTabPane>
    <@cTabPane title='Onglet 5' id='TabContent5' class='px-xl pt-xs pb-4xl'>
    	<@cTitle level=3>Title Tab 5</@cTitle>
    	<@cText>Contenu Tab 5</@cText>
    </@cTabPane>
</@cTabContent>

<div class="nav-tabs-container">
<div class="nav nav-tabs" id="tabSample1" role="tablist" >
<button type="button" id="tab_TabContent1" aria-controls="TabContent1" data-bs-toggle="tab" role="tab" data-bs-target="#TabContent1" class="nav-link active" aria-selected="true">
Onglet 1</button>
<button type="button" id="tab_TabContent2" aria-controls="TabContent2" data-bs-toggle="tab" role="tab" data-bs-target="#TabContent2" class="nav-link" tabindex="-1" aria-selected="false">
Onglet 2 </button>
<button type="button" id="tab_TabContent3" aria-controls="TabContent3" data-bs-toggle="tab" role="tab" data-bs-target="#TabContent3" class="nav-link" tabindex="-1" aria-selected="false">
Onglet 3</button>
<button type="button" id="tab_TabContent4" aria-controls="TabContent4" data-bs-toggle="tab" role="tab" data-bs-target="#TabContent4" class="nav-link disabled" disabled tabindex="-1" aria-disabled="true" aria-selected="false">
Onglet 4</button>
<button type="button" id="tab_TabContent5" aria-controls="TabContent5" data-bs-toggle="tab" role="tab" data-bs-target="#TabContent5" class="nav-link" tabindex="-1" aria-selected="false">
Onglet 5</button>
</div>
</div>
<div class="tab-content " id="myContent">
<div class="card tab-pane fade show active px-xl pt-xs pb-4xl" id="TabContent1" role="tabpanel" aria-labelledby="tab_TabContent1" >
<div class="card-body">
<h3>
Title Tab 1</h3>
<p>
Contenu Tab 1</p>
</div>
</div>
<div class="card tab-pane fade px-xl pt-xs pb-4xl" id="TabContent2" role="tabpanel" aria-labelledby="tab_TabContent2" >
<div class="card-body">
<h3>
Title Tab 2</h3>
<p>
Contenu Tab 2</p>
</div>
</div>
<div class="card tab-pane fade px-xl pt-xs pb-4xl" id="TabContent3" role="tabpanel" aria-labelledby="tab_TabContent3" >
<div class="card-body">
<h3>
Title Tab 3</h3>
<p>
Contenu Tab 3</p>
</div>
</div>
<div class="card tab-pane fade disabled px-xl pt-xs pb-4xl" disabled aria-disabled="true" id="TabContent4" role="tabpanel" aria-labelledby="tab_TabContent4" >
<div class="card-body">
<h3>
Title Tab 4</h3>
<p>
Contenu Tab 4</p>
</div>
</div>
<div class="card tab-pane fade px-xl pt-xs pb-4xl" id="TabContent5" role="tabpanel" aria-labelledby="tab_TabContent5" >
<div class="card-body">
<h3>
Title Tab 5</h3>
<p>
Contenu Tab 5</p>
</div>
</div>
</div>
<div class="d-flex justify-content-end mt-l">
<div class="form-check btn-selection">
<div class="selection-check">
<input type="checkbox" id="selectResponsiveTabs" name="selectResponsiveTabs" class="form-check-input" value="1">
<label class="form-label form-check-label" for="selectResponsiveTabs">
Mode responsive alternatif
<p class="selection-subtitle my-sm">Modifier le mode responsive.<br> Si coché ajoute la class "tabs-list" à la macro cTabs.</p>
</label>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const checkbox = document.getElementById('selectResponsiveTabs');
const tabSample = document.getElementById('tabSample1');
if (checkbox && tabSample) {
checkbox.addEventListener('change', function() {
if (this.checked) {
tabSample.classList.add('tabs-list');
} else {
tabSample.classList.remove('tabs-list');
}
});
}
});
</script>

Paramètres

Generates a Bootstrap tab navigation container wrapping individual cTab elements, with optional nav element semantics.

  • navigation (boolean)
    optional
    - Whether to wrap tabs in a nav > ul structure (true) or a div structure (false). Default: false
  • id (string)
    optional
    - HTML id attribute. Default: ''
  • class (string)
    optional
    - Additional CSS classes. Default: ''
  • params (string)
    optional
    - Additional HTML attributes. Default: ''

Notification Toast

macro @cToast

Generates a toast notification with optional title, content, type, and actions.

Exemple

Toast succès
Toast warning
Toast erreur
Toast info
Notification Toast avec titre
Contenu du toast
Contenu du toast
Contenu du toast
Toast succès
Toast warning
Toast erreur
Toast info

<@cBtn id='showToastButton' label='Notification toast par bouton déclencheur' />
<@cInitToast id="toastContainer1" position="position-fixed" showAll=false triggerId="showToastButton">
    <@cToast id="toast1" content="Toast succès" type="success"></@cToast>
    <@cToast id="toast2" content="Toast warning" type="warning"></@cToast>
    <@cToast id="toast3" content="Toast erreur" type="error"></@cToast>
    <@cToast id="toast4" content="Toast info" type="info"></@cToast>
</@cInitToast>
<@cInitToast id="toastContainer2" position="position-static" duration=0 showAll=true class='ml-l'>
    <@cToast id="toast5" title="Notification Toast avec titre" content="Contenu du toast" delay=0></@cToast>
    <@cToast id="toast6" content="Contenu du toast" delay=0></@cToast>
    <@cToast id="toast7" content="Contenu du toast" dismiss=false delay=0>
        <@cBlock class="mt-m pt-xs border-top">
            <@cBtn label='Action' class='primary m-xxs' size="mini" />
            <@cBtn label='Fermer' class='secondary m-xxs' size="mini" params='data-bs-dismiss="toast"' />
        </@cBlock>
    </@cToast>
    <@cToast id="toast8" content="Toast succès" type="success" delay=0></@cToast>
    <@cToast id="toast9" content="Toast warning" type="warning" delay=0></@cToast>
    <@cToast id="toast10" content="Toast erreur" type="error" delay=0></@cToast>
    <@cToast id="toast11" content="Toast info" type="info" delay=0></@cToast>
</@cInitToast>

<button class="btn btn-primary" type="submit" id="showToastButton">
<span class="btn-label ">Notification toast par bouton déclencheur</span>
</button>
<div id="toastContainer1" class="toast-container position-fixed p-3" style="position-fixed">
<div id="toast1" class="toast success" role="alert" data-autohide="true" data-delay="2000" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto">
Toast succès
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<div id="toast2" class="toast warning" role="alert" data-autohide="true" data-delay="2000" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto">
Toast warning
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<div id="toast3" class="toast error" role="alert" data-autohide="true" data-delay="2000" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto">
Toast erreur
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<div id="toast4" class="toast info" role="alert" data-autohide="true" data-delay="2000" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto">
Toast info
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function() {
// Récupérer le conteneur spécifique par son identifiant
var container = document.getElementById('toastContainer1');
var toastElList = [].slice.call(container.querySelectorAll('.toast'));
var option = { delay: 2000, animation: true, autohide: true };
var toastList = toastElList.map(function(toastEl) {
return new bootstrap.Toast(toastEl, option);
});
// Ajouter un écouteur d'événement sur le bouton spécifié si triggerId est fourni
var toastTrigger = document.getElementById('showToastButton');
if (toastTrigger) {
toastTrigger.addEventListener('click', function() {
toastList.forEach(function(toast) {
toast.show();
});
});
}
});
</script>
<div id="toastContainer2" class="toast-container position-static p-3 ml-l" style="position-static">
<div id="toast5" class="toast" role="alert" data-autohide="false" aria-live="assertive" aria-atomic="true">
<div class="toast-header">
<strong class="me-auto">Notification Toast avec titre</strong>
<button type="button" class="ms-auto btn-close" data-bs-dismiss="toast" aria-label="Close">&times;</button>
</div>
<div class="toast-body">
Contenu du toast
</div>
</div>
<div id="toast6" class="toast" role="alert" data-autohide="false" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto">
Contenu du toast
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<div id="toast7" class="toast" role="alert" data-autohide="false" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto w-100">
Contenu du toast
<div class="mt-m pt-xs border-top">
<button class="btn btn-primary m-xxs btn-mini" type="submit">
<span class="btn-label ">Action</span>
</button>
<button class="btn btn-secondary m-xxs btn-mini" type="submit"data-bs-dismiss="toast">
<span class="btn-label ">Fermer</span>
</button>
</div>
</div>
</div>
</div>
<div id="toast8" class="toast success" role="alert" data-autohide="false" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto">
Toast succès
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<div id="toast9" class="toast warning" role="alert" data-autohide="false" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto">
Toast warning
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<div id="toast10" class="toast error" role="alert" data-autohide="false" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto">
Toast erreur
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
<div id="toast11" class="toast info" role="alert" data-autohide="false" aria-live="assertive" aria-atomic="true">
<div class="d-flex align-items-center">
<div class="toast-body me-auto">
Toast info
</div>
<button type="button" class="btn-close me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function() {
// Récupérer le conteneur spécifique par son identifiant
var container = document.getElementById('toastContainer2');
var toastElList = [].slice.call(container.querySelectorAll('.toast'));
var option = { delay: 0, animation: true, autohide: false };
var toastList = toastElList.map(function(toastEl) {
return new bootstrap.Toast(toastEl, option);
});
// Afficher les toasts au chargement si showAll est vrai
toastList.forEach(function(toast) {
toast.show();
});
});
</script>

Paramètres

Les paramètres cToast
  • title (string)
    optionnal
    - Titre de la notification toast.
  • content (string)
    optionnal
    - Contenu de la notification toast.
  • imgUrl (string)
    optionnal
    - URL de l'image à afficher dans le header de la notification toast.
  • type (string)
    optionnal
    - Type de notification toast ('info', 'success', 'warning', 'error').
  • delay (number)
    optionnal
    - Durée d'affichage en millisecondes, 0 pour persistant (par défaut: 2000).
  • dismiss (boolean)
    optionnal
    - Si true, affiche l'icône de fermeture (par défaut: true).
  • id (string)
    optionnal
    - L'ID de la notification toast.
  • class (string)
    optionnal
    - Permet d'ajouter une classe CSS à la notification toast.
  • params (string)
    optionnal
    - Permet d'ajouter des parametres HTML à la notification toast.
Les paramètres cInitToast
  • class (string)
    optionnal
    - Permet d'ajouter des classes CSS supplémentaires au conteneur de toasts.
  • id (string)
    optionnal
    - Identifiant unique du conteneur de toasts.
  • position (string)
    optionnal
    (par défaut : 'position-fixed') : Position CSS du conteneur de toasts. Valeurs possibles : 'position-fixed', 'position-static', etc.
  • showAll (boolean)
    optionnal
    (par défaut : true) : Indique si tous les toasts doivent être affichés au chargement de la page.
  • animation (boolean)
    optionnal
    (par défaut : true) : Active les animations des toasts si true.
  • duration (number)
    optionnal
    (par défaut : 2000) : Durée d'affichage des toasts en millisecondes.
  • triggerId (string)
    optionnal
    - Identifiant de l'élément déclencheur pour afficher les toasts.
  • params (string)
    optionnal
    - Paramètres supplémentaires à ajouter au conteneur de toasts.

Tooltip

macro @cTooltip

Doc Bootstrap Tooltip

Generates a Bootstrap tooltip with optional placement, custom class, and title.

Exemple

Tooltip sur lien

Voici un lien avec un tooltip : Le tooltip est visible en hover .

Tooltip sur bouton

Tooltip Secondary sur bouton

Tooltip sur bouton désactivé

Tooltip sur Icon

<@cTitle level=4>Tooltip sur lien</@cTitle>
<@cText class="m-0">
	Voici un lien avec un tooltip : <@cLink label="Le tooltip est visible en hover" href="#" params="data-bs-toggle='tooltip' data-bs-custom-class='custom-tooltip' data-bs-title='Mon Tooltip'"/>.
</@cText>
<@cTitle level=4>Tooltip sur bouton</@cTitle>
<@cBtn label='Tootlip top custom' class='secondary m-xxs' params="data-bs-toggle='tooltip' data-bs-placement='top' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'" />
<@cBtn label='Tootlip right custom' class='secondary m-xxs' params="data-bs-toggle='tooltip' data-bs-placement='right' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'" />
<@cBtn label='Tootlip bottom custom' class='secondary m-xxs' params="data-bs-toggle='tooltip' data-bs-placement='bottom' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'" />
<@cBtn label='Tootlip left custom' class='secondary m-xxs' params="data-bs-toggle='tooltip' data-bs-placement='left' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'" />
<@cTitle level=4>Tooltip Secondary sur bouton</@cTitle>
<@cBtn label='Tootlip top custom' class='primary m-xxs' params="data-bs-toggle='tooltip' data-bs-placement='top' data-bs-custom-class='custom-tooltip secondary' data-bs-title='Mon tooltip'" />
<@cBtn label='Tootlip right custom' class='primary m-xxs' params="data-bs-toggle='tooltip' data-bs-placement='right' data-bs-custom-class='custom-tooltip secondary' data-bs-title='Mon tooltip'" />
<@cBtn label='Tootlip bottom custom' class='primary m-xxs' params="data-bs-toggle='tooltip' data-bs-placement='bottom' data-bs-custom-class='custom-tooltip secondary' data-bs-title='Mon tooltip'" />
<@cBtn label='Tootlip left custom' class='primary m-xxs' params="data-bs-toggle='tooltip' data-bs-placement='left' data-bs-custom-class='custom-tooltip secondary' data-bs-title='Mon tooltip'" />
<@cTitle level=4>Tooltip sur bouton désactivé</@cTitle>
<@cInline class="d-inline-block m-0" params='tabindex="0" data-bs-toggle="tooltip" data-bs-custom-class='custom-tooltip' data-bs-title="Mon tooltip"'>
	<@cBtn label='Tooltip top custom' class='primary m-xxs' disabled=true />
</@cInline >
<@cTitle level=4>Tooltip sur Icon</@cTitle>
<@parisIcon name='nef' params="data-bs-toggle='tooltip' data-bs-placement='top' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'" />
<@parisIcon name='nef' params="data-bs-toggle='tooltip' data-bs-placement='right' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'" />
<@parisIcon name='nef' params="data-bs-toggle='tooltip' data-bs-placement='bottom' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'" />
<@parisIcon name='nef' params="data-bs-toggle='tooltip' data-bs-placement='left' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'" />

<h4>
Tooltip sur lien</h4>
<p class="m-0">
Voici un lien avec un tooltip :
<a href="#" data-bs-toggle='tooltip' data-bs-custom-class='custom-tooltip' data-bs-title='Mon Tooltip' >
<span class="link-label">Le tooltip est visible en hover</span>
</a>
.
</p>
<h4>
Tooltip sur bouton</h4>
<button class="btn btn-secondary m-xxs" type="submit"data-bs-toggle='tooltip' data-bs-placement='top' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'>
<span class="btn-label ">Tootlip top custom</span>
</button>
<button class="btn btn-secondary m-xxs" type="submit"data-bs-toggle='tooltip' data-bs-placement='right' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'>
<span class="btn-label ">Tootlip right custom</span>
</button>
<button class="btn btn-secondary m-xxs" type="submit"data-bs-toggle='tooltip' data-bs-placement='bottom' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'>
<span class="btn-label ">Tootlip bottom custom</span>
</button>
<button class="btn btn-secondary m-xxs" type="submit"data-bs-toggle='tooltip' data-bs-placement='left' data-bs-custom-class='custom-tooltip' data-bs-title='Mon tooltip'>
<span class="btn-label ">Tootlip left custom</span>
</button>
<h4>
Tooltip Secondary sur bouton</h4>
<button class="btn btn-primary m-xxs" type="submit"data-bs-toggle='tooltip' data-bs-placement='top' data-bs-custom-class='custom-tooltip secondary' data-bs-title='Mon tooltip'>
<span class="btn-label ">Tootlip top custom</span>
</button>
<button class="btn btn-primary m-xxs" type="submit"data-bs-toggle='tooltip' data-bs-placement='right' data-bs-custom-class='custom-tooltip secondary' data-bs-title='Mon tooltip'>
<span class="btn-label ">Tootlip right custom</span>
</button>
<button class="btn btn-primary m-xxs" type="submit"data-bs-toggle='tooltip' data-bs-placement='bottom' data-bs-custom-class='custom-tooltip secondary' data-bs-title='Mon tooltip'>
<span class="btn-label ">Tootlip bottom custom</span>
</button>
<button class="btn btn-primary m-xxs" type="submit"data-bs-toggle='tooltip' data-bs-placement='left' data-bs-custom-class='custom-tooltip secondary' data-bs-title='Mon tooltip'>
<span class="btn-label ">Tootlip left custom</span>
</button>
<h4>
Tooltip sur bouton désactivé</h4>
<span class="d-inline-block m-0" tabindex="0" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" data-bs-title="Mon tooltip">
<button class="btn btn-primary m-xxs" type="submit" disabled>
<span class="btn-label ">Tooltip top custom</span>
</button>
</span>
<h4>
Tooltip sur Icon</h4>
<svg class="paris-icon paris-icon-nef"data-mce-svg="paris-icon paris-icon-nef" aria-hidden="true" focusable="false" role="img" tabindex="0" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" data-bs-title="Mon tooltip">
<use href="#paris-icon-nef"></use>
</svg>
<svg class="paris-icon paris-icon-nef"data-mce-svg="paris-icon paris-icon-nef" aria-hidden="true" focusable="false" role="img" tabindex="0" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" data-bs-title="Mon tooltip">
<use href="#paris-icon-nef"></use>
</svg>
<svg class="paris-icon paris-icon-nef"data-mce-svg="paris-icon paris-icon-nef" aria-hidden="true" focusable="false" role="img" tabindex="0" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" data-bs-title="Mon tooltip">
<use href="#paris-icon-nef"></use>
</svg>
<svg class="paris-icon paris-icon-nef"data-mce-svg="paris-icon paris-icon-nef" aria-hidden="true" focusable="false" role="img" tabindex="0" data-bs-toggle="tooltip" data-bs-custom-class="custom-tooltip" data-bs-title="Mon tooltip">
<use href="#paris-icon-nef"></use>
</svg>

Paramètres

Les paramètres de tooltip
  • data-bs-toggle (string)
    required
    - permet d'activer le tooltip
  • data-bs-placement (string)
    optionnal
    - définit la position du tooltip
  • data-bs-custom-class (string)
    optionnal
    - définit la class du tooltip
  • data-bs-title (string)
    required
    - définit le texte du tooltip
Aide

Ce composant n'est pas une macro car il se base sur le tooltip de Bootstrap qui est utilisable uniquement via des attributs HTML à ajouter sur d'autres composants/macros déjà existants (liens, boutons, icons...)

D'autres paramètres sont disponibles sur la documentation de Bootstrap en plus de ceux disponibles ci-dessus: Documentation Tooltip Bootstrap

France Connect

Generates France Connect buttons, badges, and messages with optional labels and URLs.

Exemple

Quid FranceConnect Quid FranceConnect

Quoi de plus... More informations on FranceConnect's website

<@cBlock>
    <@fcBtnImg />
</@cBlock>
<@cBlock>
    <@fcImg label='Quid' />
</@cBlock>
<@cCard>
    <@fcMessage>Quoi de plus...</@fcMessage>
</@cCard>

<div>
<div class="fr-connect-group m-0">
<button class="fr-connect m-0" type="submit">
<span class="fr-connect__login">
Créer mon compte avec</span>
<span class="fr-connect__brand">
FranceConnect</span>
</button>
</div>
</div>
<div>
<svg height="74" viewBox="0 0 312 74" width="248" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" role="img" aria-labelledby="fc-img-title">
<clipPath id="a"><path d="m0 0h312v74h-312z"/></clipPath>
<title id="fc-img-title">Quid FranceConnect</title>
<g clip-path="url(#a)">
<path d="m0 0h312v74h-312z" fill="#fff"/>
<rect fill="#000091" height="74" rx="4" width="312"/>
<rect id="fc-btn-bg" fill="#000091" height="70" rx="4" transform="translate(1 1)" width="310"/>
<text fill="#fff" font-family="Montserrat-Regular, Montserrat" font-size="15" font-weight="500" transform="translate(81 32)">
<tspan x="0" y="0">Quid</tspan>
<tspan font-family="Montserrat-Bold, Montserrat" font-weight="700" font-size="18"><tspan x="0" y="20">FranceConnect</tspan></tspan>
</text>
<path d="m18 19.508v29.93l25.9 15.007 25.984-15.008v-29.929l-25.984-15.008z" fill="#fff" transform="translate(-5.142 1.529)"/>
<path d="m43.757 3.3-26.757 15.522v30.959l26.842 15.436 26.843-15.436v-30.959zm25.984 45.966-25.984 15.008-25.9-15.008v-29.929l25.9-15.008 25.984 15.008z" fill="#000091" transform="translate(-5 1.7)"/><path d="m57.373 19.675-11.749-6.775-11.748 6.775-7.976 4.631v22.726l19.724 11.406 19.725-11.406v-22.726z" fill="#0069cc" transform="translate(-6.268 .333)"/><path d="m62.107 35.626-7.118-12.264-6.089-10.462v45.538l19.724-11.406z" fill="#000091" transform="translate(-9.544 .333)"/><path d="m56 24.488 7.118 12.263 6.518-11.32-7.976-4.631z" fill="#0069cc" transform="translate(-10.555 -.792)"/><path d="m60.649 19.675-11.749-6.775 6.089 10.463z" fill="#ed1c24" transform="translate(-9.544 .333)"/><path d="m54.989 23.362-6.089-10.462z" fill="#0069cc" transform="translate(-9.544 .333)"/><path d="m70.818 48.926v-22.726l-6.518 11.32z" fill="#ed1c24" transform="translate(-11.737 -1.561)"/><path d="m64.3 39.4 6.518 11.406z" fill="#ed1c24" transform="translate(-11.737 -3.441)"/>
<path d="m32.5 35.626 7.118-12.263 6-10.463v45.538l-19.718-11.406z" fill="#0069cc" transform="translate(-6.268 .333)"/>
<path d="m39.621 24.488-7.121 12.263-6.6-11.32 7.976-4.631z" fill="#ed1c24" transform="translate(-6.268 -.792)"/>
<path d="m35.2 19.675 11.749-6.775-6 10.463z" fill="#000091" transform="translate(-7.592 .333)"/>
<path d="m41.9 23.362 6-10.463z" fill="#0069cc" transform="translate(-8.547 .333)"/>
<path d="m25.9 48.926v-22.726l6.6 11.32z" fill="#000091" transform="translate(-6.268 -1.561)"/>
<path d="m32.5 39.4-6.6 11.406z" fill="#0069cc" transform="translate(-6.268 -3.441)"/>
<path d="m57.144 41.909a4.133 4.133 0 0 1 1.029 0c.257.086.6.086.6.172-.086.515-.858.6-1.2 1.115h-.173c-.172.086-.086.429-.257.429-.172-.086-.343 0-.6.086a1.02 1.02 0 0 0 .943.343c.086 0 .172.086.172.257a.084.084 0 0 0 .086-.086c.086 0 .086 0 .086.086v.257c-.172.257-.515.172-.772.172a4.155 4.155 0 0 0 1.458 0c.343-.172 0-.772.257-1.029-.086 0 0-.172-.172-.172.086-.086.257-.343.343-.343s.343-.086.343-.172-.257-.172-.172-.343c.343-.257.686-.6.515-1.029-.086-.172-.6-.172-.858-.257a2.112 2.112 0 0 0 -1.029.086 3.866 3.866 0 0 0 -.943.257 8.57 8.57 0 0 0 -1.2.686 16.245 16.245 0 0 1 1.544-.515z" fill="#000091" transform="translate(-10.498 -3.72)"/>
<path d="m57.617 43.546a6.545 6.545 0 0 0 -.686-.943 3.732 3.732 0 0 1 -.686-1.286 4.163 4.163 0 0 1 0-1.458 9.721 9.721 0 0 0 -.515-2.744c-.172-.429-.257-.943-.429-1.372a3.046 3.046 0 0 0 -.343-.772.389.389 0 0 1 0-.429 2.61 2.61 0 0 0 .686-.686.78.78 0 0 0 -.257-.943c-.429-.172-.343.429-.686.6h-.172c-.086-.172.086-.257.172-.343 0-.086 0-.172-.086-.172a1 1 0 0 1 -.6-.172 5.263 5.263 0 0 0 -2.487-1.626 2.374 2.374 0 0 0 .772.086 2.156 2.156 0 0 0 1.286-.172c.343-.172.343-.6.429-.943.086-.086 0-.172 0-.343s-.172-.343-.257-.515a1.061 1.061 0 0 1 -.172-.257c-.686-.772-3.345-3-8.319-2.659a21.349 21.349 0 0 0 -7.89 2.315c-.086 0-.172.086-.343.086a5.336 5.336 0 0 0 -1.629 1.202 4.836 4.836 0 0 0 -1.115 2.058 5.667 5.667 0 0 0 -1.715 2.058c-.515 1.029-1.2 1.887-1.2 3v.172c.086.343.086.6.172.943a17.563 17.563 0 0 1 .429 2.058l.257 1.029c.172.343 0 .772.257 1.115.086.172.086.429.343.515v.252c.086.086.086.086.172.086v.257a9.59 9.59 0 0 1 1.458 1.8c.172.343-.6.172-.943.086a6.813 6.813 0 0 1 -1.544-1.2l-.086.086c.257.429 1.2.943.686 1.286-.257.172-.6-.172-.772.086-.086.086 0 .257 0 .343-.343-.257-.772-.086-1.115-.257-.257-.086-.343-.515-.6-.515a10.811 10.811 0 0 0 -2.4-.343h-.172a9.9 9.9 0 0 0 -2.23-.086v.943a8.609 8.609 0 0 1 2.058-.343h.172c.172 0 .429-.086.6 0a2.918 2.918 0 0 0 -.858.086 9.334 9.334 0 0 0 -2.058.6v.858c.343.086.772.086 1.115.172a7.144 7.144 0 0 1 1.286.343 8.421 8.421 0 0 1 1.544.686c.257.172.343.343.6.515a1.09 1.09 0 0 0 1.029 0h.343a4.366 4.366 0 0 0 2.482-1.289.084.084 0 0 0 .086.086 5.451 5.451 0 0 1 -.515 1.544c0 .086-.086.172.086.257h.086c-.086 0-.086 0-.086.086s.172 0 .257.086a1.155 1.155 0 0 0 -.772.429c0 .086.086.086.172.086-.086.086-.343.086-.343.172l.086.086c-.086 0-.086 0-.086.086v.172c-.172 0-.257.172-.343.172.257.172.429 0 .686 0a18.349 18.349 0 0 1 -1.887.858c-.086 0 0 .172-.086.172.172.086.343-.086.515-.086a6.4 6.4 0 0 1 -1.029.6l2.058 1.2a9.718 9.718 0 0 0 2.315-1.885l.086.086a2.869 2.869 0 0 1 -1.029 1.458c-.343.172-.6.515-.858.6l1.544.858a4.054 4.054 0 0 1 1.029-.6c.086 0 .172.086.343.086a2.221 2.221 0 0 1 1.972-.943c0 .086 0 .086.086.086a.084.084 0 0 0 .086-.086c0 .086 0 .086-.086.086-.257.172-.429.343-.686.515-.086.086 0 .086.086.086a6.019 6.019 0 0 0 .772-.515.315.315 0 0 0 -.086.257 13.786 13.786 0 0 0 -1.972 1.887l8.151 4.718c.257-.343.6-.858.943-1.286a72.649 72.649 0 0 1 4.459-5.917 2.517 2.517 0 0 1 .858-.257c1.029 0 2.144.257 3.173.343.086 0 .257.086.343.086a2.948 2.948 0 0 0 1.2-.086 1.741 1.741 0 0 0 1.115-.943 1.544 1.544 0 0 0 0-1.372c-.429-.515.343-.772.6-1.115.172-.343-.172-.515-.172-.772-.086-.086-.343-.086-.429-.257.429-.172 1.115-.6.772-1.115-.172-.343-.515-.772-.172-1.115.429-.257 1.115-.257 1.286-.686.517-.862-.254-1.462-.597-2.062zm-2.659-3.087c-.086.086.172.172.172.343a.65.65 0 0 1 -.343.172l-.343.343c.086 0 0 .172.172.172-.257.343.172.943-.257 1.029a2.126 2.126 0 0 1 -1.458 0c.257-.086.6.086.772-.172v-.257a.084.084 0 0 0 -.087-.089l-.086.086c0-.086-.172-.257-.172-.257a1.02 1.02 0 0 1 -.943-.343.7.7 0 0 1 .6-.086c.172 0 .086-.343.257-.429h.172c.343-.515 1.115-.686 1.2-1.115 0-.086-.343-.086-.6-.172a4.132 4.132 0 0 0 -1.029 0 6.427 6.427 0 0 0 -1.372.429 5.468 5.468 0 0 1 1.2-.686 3.866 3.866 0 0 1 .943-.257 2.19 2.19 0 0 1 1.029-.086c.343.086.772.086.858.257a1.677 1.677 0 0 1 -.685 1.117z" fill="#fff" transform="translate(-6.168 -1.583)"/>
</g>
</svg>
</div>
<div class="card ">
<div class="card-body">
<p>
<span class="d-block">
Quoi de plus...</span>
<a href="https://franceconnect.gouv.fr/" class="" target="_blank" rel="noopener" >
<span class="link-label">More informations on FranceConnect's website</span>
</a>
</p>
</div>
</div>

Paramètres

Les paramètres de la macro @fcBtnImg - bouton avec logo FranceConnect -
  • label (string)
    required
    (par défaut : 'Créer mon compte avec') : Texte souhaité, 'Créer', 'Supprimer'...
  • type (string)
    required
    ( par défaut : 'button')
    optionnal
    - Type du bouton, l'autre valeur est 'link'
  • linkClass (string)
    optionnal
    - Classes CSS du lien si le type est 'link'
  • btnClass (string)
    optionnal
    ( par default : 'fr-connect m-0') : Classes CSS du bouton si le type est 'button'
  • url (string)
    optionnal
    - Url du lien si le type est 'link'
Les paramètres de la macro @fcImg - "Badge" avec logo FranceConnect
  • label (string)
    optionnal
    - Texte souhaité, 'Créer', 'Supprimer'...
Les paramètres de la macro @fcMessage - bloc de message avec lien vers le site FranceConnect -
  • label (string)
    required
    (par défaut : 'Créer mon compte avec') : Texte souhaité, 'Créer', 'Supprimer'...
  • url (string)
    optionnal
    - ( par default : 'https://franceconnect.gouv.fr/') Url du lien
  • class (string)
    optionnal
    - ( par default : '') Classes CSS du lien
  • pclass (string)
    optionnal
    ( par default : '') : Classes CSS du paragraphe
  • brlink (boolean)
    optionnal
    ( par default : true) : Ajoute un saut de ligne après le lien

Documentation France Connect


Thème Paris.fr
  • Paris.fr [New window]
  • site map
  • Contact [New window]
  • Condition généales d'utilisation [New window]
  • Politique de gestion des données à caractère personnel [New window]
  • Cookies policy [New window]

Follow us

  • Facebook
  • Bluesky
  • Instagram
  • LinkedIn

Get weekly news from your city on social’s network