• Go to main content
Home

Thème Paris.fr

Thème Paris.fr

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

Thème Paris.fr

Thème Paris.fr

  1. Home
  2. Composants
Chargement...

Accordion

macro @cAccordion

Doc Bootstrap Accordion

@cAccordion permet de générer des éléments accordéon avec des titres, des sous-titres et du contenu repliable

Exemple

Accordion content

Accordion content

Accordion content of type "Info"

Accordion content of type "Info"

Accordion content of type "Unfolded"

Accordion content of type "Info"

Accordion content of type "Info"

Accordion content of type "Info"

Accordion content of type "Info"

Accordion content

<@cAccordion id='acc1' title='Accordion title' subTitle='...and its subtitle'>
Accordion content
</@cAccordion>
<@cAccordion id='acc2' title='accordion with titleClass and header...' class='primary' titleClass='main-info-color' header='<p class="ms-auto text-danger fw-bold">Header</p>'>
Accordion content
</@cAccordion>
<@cAccordion id='acc3' title='accordion with action button' subTitle='Subtitle' subTitleClass='text-muted' btnClass='btn-secondary'>
Accordion content of type "Info"
</@cAccordion>
<@cAccordion id='acc31' title='accordion with outline' class='outline' >
Accordion content of type "Info"
</@cAccordion>
<@cAccordion id='accCollapse' title='collapse accordion' class='unfold' >
Accordion content of type "Unfolded"
</@cAccordion>
<@cAccordion id='acc32' title='accordion with primary outline alert' class='alert alert-outline alert-primary' state=false>
Accordion content of type "Info"
</@cAccordion>
<@cAccordion id='acc33' title='accordion with primary outline alert' class='alert alert-outline alert-warning' btnTitle='View details'>
Accordion content of type "Info"
</@cAccordion>
<@cAccordion id='acc34' title='accordion with primary outline alert' class='alert alert-outline alert-success' btnTitle='View details'>
Accordion content of type "Info"
</@cAccordion>
<@cAccordion id='acc35' title='accordion with primary outline alert' class='alert alert-outline alert-danger' btnTitle='View details'>
Accordion content of type "Info"
</@cAccordion>
<@cAccordion id='acc6' title='Example with border' subTitle='...and its subtitle' border=true state=false>
Accordion content
</@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">Accordion title</span>
<span class="card-subtitle w-100">...and its subtitle</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom decorative" 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">
Accordion content
</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">accordion with titleClass and 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 decorative" 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">
Accordion content
</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">accordion with action button</span>
<span class="card-subtitle w-100 text-muted">Subtitle</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion btn-secondary">
<svg class="paris-icon paris-icon-arrow-bottom btn-secondary decorative" 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">
Accordion content of 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 decorative" 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">accordion with 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 decorative" 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">
Accordion content of 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">collapse accordion</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom decorative" 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">
Accordion content of type "Unfolded"
</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 decorative" 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">accordion with primary outline alert</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 decorative" 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">
Accordion content of 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 decorative" 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">accordion with primary outline alert</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">View details</span>
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom main-warning-color-text decorative" 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)">
Accordion content of 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 decorative" 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">accordion with primary outline alert</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">View details</span>
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom main-success-color-text decorative" 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)">
Accordion content of 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 decorative" 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">accordion with primary outline alert</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">View details</span>
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom main-danger-color-text decorative" 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)">
Accordion content of 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">Example with border</span>
<span class="card-subtitle w-100">...and its subtitle</span>
</span>
<span class="accordion-toggle ms-auto">
<span class="btn-accordion">
<svg class="paris-icon paris-icon-arrow-bottom decorative" 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">
Accordion content
</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

Génère un panneau accordéon repliable qui affiche ou masque le contenu associé lorsque le titre empilé est cliqué ou activé via le clavier ou un lecteur d'écran.

  • id (string)
    required
    - L'identifiant unique de l'accordéon
  • title (string)
    required
    - Le texte du titre affiché dans l'en-tête de l'accordéon
  • btnTitle (string)
    optional
    - Le label du bouton de bascule de l'accordéon. Par défaut: ‘'
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le conteneur de l'accordéon. Par défaut: ‘'
  • titleClass (string)
    optional
    - Classe(s) CSS appliquée(s) au titre de l'accordéon. Par défaut: ‘'
  • titleLevel (number)
    optional
    - Le niveau de titre pour le titre de l'accordéon. Par défaut: 3
  • subTitle (string)
    optional
    - Texte du sous-titre affiché sous le titre. Par défaut: ‘'
  • subTitleClass (string)
    optional
    - Classe(s) CSS pour le sous-titre. Par défaut: ‘'
  • btnClass (string)
    optional
    - Classe(s) CSS pour l'icône de bascule du repli. Par défaut: ‘'
  • btnShowLabel (string)
    optional
    - Texte pour l'attribut data-show-label. Par défaut: ‘'
  • btnHideLabel (string)
    optional
    - Texte pour l'attribut data-hide-label. Par défaut: ‘'
  • header (string)
    optional
    - Contenu HTML ajouté à côté du titre. Par défaut: ‘'
  • border (boolean)
    optional
    - Si true, une bordure est ajoutée à l'accordéon. Par défaut: false
  • state (boolean)
    optional
    - Si true, l'accordéon est déplié par défaut. Par défaut: true
  • hasCollapse (boolean)
    optional
    - Si true, affiche l'icône de bascule du repli. Par défaut: true
  • params (string)
    optional
    - Attributs HTML supplémentaires pour l'accordéon. Par défaut: ‘'

Alert

macro @cAlert

Doc Bootstrap Alert

@cAlert permet de générer des éléments d'alerte avec des titres, messages et boutons de fermeture optionnels

Exemple

Alert title - decorative

Error

Error message

Error

Error message

Error content
Error

Error message

Error message and close button
Warning

Warning message...

Warning

Warning message...

Content of the "warning" message
Success

Validation message...

Confirmation...
Success

Validation message...

Confirmation...
Warning

Validation message...

Confirmation...
Warning

Message with a level 3 HTML title

  • Message content with a custom HTML title
  • The title is level 3 thanks to the htmlTitleLevel parameter
  • The isHtmlTitle parameter must be true for the title to be interpreted as HTML

<@cAlert title='Alert title' />
<@cAlert class='danger' title='Error message' />
<@cAlert class='danger' title='Error message'>Error content</@cAlert>
<@cAlert class='danger' dismissible=true title='Error message'>Error message and close button</@cAlert>
<@cAlert class='warning' title='Warning message...' />
<@cAlert class='warning' dismissible=true title='Warning message...'>Content of the "warning" message</@cAlert>
<@cAlert class='success' title='Validation message...'>Confirmation...</@cAlert>
<@cAlert class='success' dismissible=true title='Validation message...'>Confirmation...</@cAlert>
<!-- With the new type parameter -->
<@cAlert type='warning' class='mt-xxl' dismissible=true title='Validation message...'>Confirmation...</@cAlert>
<!-- With the new isHtmlTitle parameter -->
<@cAlert type='warning' isHtmlTitle=true htmlTitleLevel=3 dismissible=true title='Message with a level 3 HTML title'>
<@chList>
	<@chItem>Message content with a custom HTML title</@chItem>
	<@chItem>The title is level 3 thanks to the htmlTitleLevel parameter</@chItem>
	<@chItem>The isHtmlTitle parameter must be true for the title to be interpreted as 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 decorative" data-mce-svg="paris-icon paris-icon-alert-info" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-info"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Alert title - decorative</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 informative" data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-302811391401891" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-302811391401891">Error</title>
<use href="#paris-icon-alert-danger"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Error message</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 informative" data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-307143548665761" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-307143548665761">Error</title>
<use href="#paris-icon-alert-danger"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Error message</p>
</div>
</div>
<div class="alert-content">
Error content</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 informative" data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-311475705929631" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-311475705929631">Error</title>
<use href="#paris-icon-alert-danger"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Error message</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">
Error message and close button</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 informative" data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-315807863193501" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-315807863193501">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Warning message...</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 informative" data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-320140020457371" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-320140020457371">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Warning message...</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">
Content of the "warning" message</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 informative" data-mce-svg="paris-icon paris-icon-alert-check" aria-labelledby="paris-icon-alert-check-paris-title-324472177721241" focusable="false" role="img">
<title id="paris-icon-alert-check-paris-title-324472177721241">Success</title>
<use href="#paris-icon-alert-check"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Validation message...</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 informative" data-mce-svg="paris-icon paris-icon-alert-check" aria-labelledby="paris-icon-alert-check-paris-title-328804334985111" focusable="false" role="img">
<title id="paris-icon-alert-check-paris-title-328804334985111">Success</title>
<use href="#paris-icon-alert-check"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Validation message...</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>
<!-- With the new type parameter -->
<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 informative" data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-333136492248981" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-333136492248981">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Validation message...</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>
<!-- With the new isHtmlTitle parameter -->
<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 informative" data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-337468649512851" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-337468649512851">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<h3 class="alert-title mt-0">
Message with a level 3 HTML title</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>
Message content with a custom HTML title</li>
<li>
The title is level 3 thanks to the htmlTitleLevel parameter</li>
<li>
The isHtmlTitle parameter must be true for the title to be interpreted as HTML</li>
</ul>
</div>
</div>

Paramètres

Génère une bannière d'alerte avec une icône, un titre optionnel et un bouton de fermeture.

  • id (string)
    optional
    - L'identifiant unique de l'alerte. Par défaut: ''
  • title (string)
    optional
    - Le texte du titre de l'alerte. Par défaut: ''
  • isHtmlTitle (boolean)
    optional
    - Indique si le titre contient du HTML. Par défaut: false
  • htmlTitleLevel (number)
    optional
    - Le niveau de titre pour le titre si isHtmlTitle vaut true. Par défaut: 3
  • type (string)
    optional
    -
    new
    Le type d'alerte contrôlant la couleur et l'icône ('primary', 'warning', 'danger', 'success'). Par défaut: 'primary'
  • iconType (string)
    optional
    new
    - Le type d'information véhiculé par l'icône. Par défaut: 'informative'. Peut aussi valoir 'decorative'.
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le conteneur de l'alerte. Par défaut: ''
  • classText (string)
    optional
    - Classe(s) CSS appliquée(s) au texte de l'alerte. Par défaut: ''
  • dismissible (boolean)
    optional
    - Si true, un bouton de fermeture est affiché. Par défaut: false
  • params (string)
    optional
    - Attributs HTML supplémentaires pour l'alerte. Par défaut: ''

Ancre

macro @cAnchor

Génère une liste de navigation par ancres pour les liens internes à la page

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

Génère une liste de navigation par ancres pour les liens internes à la page, construite à partir d'une liste d'objets ancre.

  • anchors (object)
    required
    - Liste des éléments d'ancre, chacun contenant les attributs 'href' et 'label'
  • id (string)
    optional
    - L'identifiant unique du conteneur des ancres. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS pour le conteneur externe. Par défaut: ''
  • listClass (string)
    optional
    - Classe(s) CSS pour l'élément de liste. Par défaut: ''
  • listItemClass (string)
    optional
    - Classe(s) CSS pour chaque élément de la liste. Par défaut: ''
  • anchorsClass (string)
    optional
    - Classe(s) CSS pour chaque lien d'ancre. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour le conteneur des ancres. Par défaut: ''

Badge

macro @cBadge

Doc Bootstrap Badge

Génère un élément badge ou tag avec un bouton de fermeture optionnel

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

Génère un élément badge ou tag avec un bouton de fermeture optionnel.

  • label (string)
    optional
    - Le texte affiché dans le badge. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le badge. Par défaut: ''
  • hasp (boolean)
    optional
    - Si true, englobe le label dans un élément paragraphe. Par défaut: true
  • dismissible (boolean)
    optional
    - Si true, affiche un bouton de fermeture pour masquer le badge. Par défaut: false
  • id (string)
    optional
    - L'identifiant unique du badge. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour le badge. Par défaut: ''

Boutons

macro @cBtn

Doc Bootstrap Boutons

Génère un élément bouton interactif, rendu comme un lien lorsqu'un href est fourni.

Exemple

btn-primary href

Floating button example

<@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>Floating button example</@cTitle>
    <@cBlock class='btn-floating-toolbar'>
        <@cBtn label='Floating button 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>
Floating button example</h4>
<div class="btn-floating-toolbar">
<button class="btn btn-primary btn-floating" type="submit">
<span class="btn-label ">Floating button Primary</span>
</button>
</div>
</div>

Paramètres

Génère un élément bouton interactif, rendu comme un lien lorsqu'un href est fourni.

  • label (string)
    required
    - Le texte du bouton
  • class (string)
    optional
    - Classe(s) CSS pour le bouton ('primary', 'secondary', 'tertiary', 'danger', 'expand'). Par défaut: 'primary'
  • btnClass (string)
    optional
    - Classe(s) CSS appliquée(s) au span du label. Par défaut: ''
  • noclass (boolean)
    optional
    - Si true, supprime les classes préfixées 'btn-' en l'absence de href. Par défaut: false
  • href (string)
    optional
    - Si défini, rend le bouton comme un lien ancre. Par défaut: ''
  • id (string)
    optional
    - L'identifiant unique du bouton. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour le bouton. Par défaut: ''
  • type (string)
    optional
    - L'attribut type du bouton. Par défaut: 'submit'
  • nestedPos (string)
    optional
    - Position du contenu imbriqué par rapport au label ('before', 'after'). Par défaut: 'before'
  • disabled (boolean)
    optional
    - Si true, désactive le bouton. Par défaut: false
  • size (string)
    optional
    - Taille du bouton ('mini' pour plus petit). Par défaut: ''

Boutons image

macro @cBtnImg

Génère un bouton avec une image ou un SVG intégré, et un libellé textuel issu du contenu imbriqué.

Exemple

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

<div class="mt-xs">
<!-- Warning : wrong or deprecated argument(s) : title, ... -->
<button class="btn btn-primary btn-img" type="submit">
<span>
News - RSS feed
</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>
News - RSS feed
</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>
News - RSS feed
</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>
News - RSS feed
</span>
</button>
</div>

Paramètres

Génère un bouton avec une image ou un SVG intégré, et un libellé textuel issu du contenu imbriqué.

  • src (string)
    required
    - L'URL source de l'image ou le balisage SVG du bouton
  • class (string)
    optional
    - Classe(s) CSS du bouton. Par défaut: 'primary'
  • id (string)
    optional
    - L'identifiant unique du bouton. Par défaut: ''
  • type (string)
    optional
    - Le type du bouton ('submit' ou 'svg' pour un SVG en ligne). Par défaut: 'submit'
  • params (string)
    optional
    - Attributs HTML supplémentaires du bouton. Par défaut: ''
  • imgPos (string)
    optional
    - Position de l'image par rapport au libellé ('before', 'after'). Par défaut: 'before'
  • disabled (boolean)
    optional
    - Si true, désactive le bouton. Par défaut: false

Groupes de boutons

macro @cBtnGroup

Doc Bootstrap Groupes de boutons

Génère un groupe de boutons, soit à partir d'une liste d'objets bouton, soit à partir d'un contenu imbriqué.

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='Home menu' buttonList=buttons1 />
</@cBlock>
<@cTitle level=4>Example 2</@cTitle>
<#assign buttons2 = [
{"label":"Off", "class":"danger"},
{"label":"On", "class":"success active"}
]>
<@cBlock>
	<@cBtnGroup label='Home menu' type='vertical' buttonList=buttons2 />
</@cBlock>

<h4>
Example 1</h4>
<div>
<div class="btn-group" role="group" aria-label="Home menu">
<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="Home menu">
<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

Génère un groupe de boutons, soit à partir d'une liste d'objets bouton, soit à partir d'un contenu imbriqué.

  • label (string)
    required
    - L'aria-label du groupe de boutons
  • buttonList (object)
    optional
    - Liste d'éléments bouton, chacun avec les attributs 'label', 'class' et 'disabled' optionnel. Par défaut: {}
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le groupe de boutons. Par défaut: ''
  • id (string)
    optional
    - L'identifiant unique du groupe de boutons. Par défaut: ''
  • type (string)
    optional
    - Type de disposition du groupe ('vertical' pour empilé). Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour le groupe de boutons. Par défaut: ''

Barre d'outils

macro @cBtnToolbar

Doc Bootstrap Barre d'outils

Génère un conteneur de barre d'outils permettant de regrouper plusieurs groupes de boutons.

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

Génère un conteneur de barre d'outils permettant de regrouper plusieurs groupes de boutons.

  • label (string)
    required
    - L'aria-label de la barre d'outils
  • type (string)
    optional
    - Type de disposition ('vertical' pour empilé). Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour la barre d'outils. Par défaut: ''
  • id (string)
    optional
    - L'identifiant unique de la barre d'outils. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour la barre d'outils. Par défaut: ''

Carte

macro @cCard

Doc Bootstrap Carte

Génère un composant carte avec des sections optionnelles pour l'en-tête, l'image, le contenu et le pied de page.

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.

Expandable cards

  • 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>Expandable cards</@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>
Expandable cards</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

Génère un composant carte avec image, titre, sous-titre, en-tête et pied de page optionnels, et la prise en charge d'une orientation verticale ou horizontale.

  • title (string)
    optional
    - Texte du titre de la carte. Par défaut: ''
  • titleClass (string)
    optional
    - Classe(s) CSS pour le titre de la carte. Par défaut: ''
  • titleLevel (number)
    optional
    - Niveau de titre pour le titre. Par défaut: 3
  • titleUrl (string)
    optional
    - URL pour transformer le titre en lien. Par défaut: ''
  • titleUrlTitle (string)
    optional
    - Attribut title du lien du titre. Par défaut: ''
  • subtitle (string)
    optional
    - Texte du sous-titre de la carte. Par défaut: ''
  • subtitleClass (string)
    optional
    - Classe(s) CSS pour le sous-titre. Par défaut: ''
  • subtitleLevel (number)
    optional
    - Niveau de titre pour le sous-titre. Par défaut: 4
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le conteneur de la carte. Par défaut: ''
  • id (string)
    optional
    - L'identifiant unique de la carte. Par défaut: ''
  • img (string)
    optional
    - URL de la source de l'image de la carte. Par défaut: ''
  • imgType (string)
    optional
    - Type d'image ('svg' pour un SVG en ligne). Par défaut: ''
  • imgClass (string)
    optional
    - Classe(s) CSS pour le conteneur de l'image. Par défaut: ''
  • imgAlt (string)
    optional
    - Texte alternatif pour l'image de la carte. Par défaut: ''
  • header (string)
    optional
    - Texte d'en-tête affiché au-dessus de l'image. Par défaut: ''
  • headerLevel (number)
    optional
    - Niveau de titre pour l'en-tête. Par défaut: 0
  • headerClass (string)
    optional
    - Classe(s) CSS pour le conteneur de l'en-tête. Par défaut: ''
  • headerLabelClass (string)
    optional
    - Classe(s) CSS pour le texte de l'en-tête. Par défaut: ''
  • headerImg (string)
    optional
    - URL de l'image de fond de l'en-tête. Par défaut: ''
  • subHeader (string)
    optional
    - Texte du sous-en-tête de la carte. Par défaut: ''
  • subHeaderClass (string)
    optional
    - Classe(s) CSS pour le sous-en-tête. Par défaut: ''
  • bodyClass (string)
    optional
    - Classe(s) CSS pour le corps de la carte. Par défaut: ''
  • footer (string)
    optional
    - Texte du pied de page de la carte. Par défaut: ''
  • footerClass (string)
    optional
    - Classe(s) CSS pour le pied de page. Par défaut: ''
  • orientation (string)
    optional
    - Orientation de la mise en page de la carte ('v' pour verticale, toute autre valeur pour horizontale). Par défaut: 'v'
  • vcolsInit (number)
    optional
    - Taille de colonne initiale pour les plus petits écrans (0 désactive le comportement responsive). Par défaut: 12
  • vcols (object)
    optional
    - Ratio de colonnes entre l'image et le contenu pour la mise en page horizontale. Par défaut: [4,8]
  • hoverEffect (boolean)
    optional
    - Si true, ajoute un effet au survol sur l'image de la carte. Par défaut: true
  • params (string)
    optional
    - Attributs HTML supplémentaires pour la carte. Par défaut: ''

Carte flottante

macro @cCardFloating

Doc Bootstrap Carte flottante

Génère une carte flottante en superposition avec un bouton de fermeture optionnel, adaptée aux panneaux d'informations contextuelles.

Exemple

Floating Card

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

Floating Card

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

Your selection

  • 3 x Full-price admission at 3,50 €

    10,50 €

  • 2 x Full-price admission at 28,00 €

    56,00 €

  • Total: 67,00 €

Floating Card 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.

Your selection

  • 3 x Full-price admission at 3,50 €

    10,50 €

  • 2 x Full-price admission at 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='Floating Card' 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='Floating Card' 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='Your selection' class='d-block'>
                <@chList class='list-unstyled'>
                    <@chItem>
                        <@cText class='d-flex align-items-start'>3 x Full-price admission at 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 Full-price admission at 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='Floating Card 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='Your selection' class='d-block secondary' dismissible=false >
                <@chList class='list-unstyled'>
                    <@chItem>
                        <@cText class='d-flex align-items-start'>3 x Full-price admission at 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 Full-price admission at 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">
Floating Card</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">
Floating Card</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">
Your selection</h3>
</div>
<div class="card-body">
<ul class="list-unstyled" >
<li>
<p class="d-flex align-items-start">
3 x Full-price admission at 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 decorative" 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 Full-price admission at 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 decorative" 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">
Floating Card 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">
Your selection</h3>
</div>
<div class="card-body">
<ul class="list-unstyled" >
<li>
<p class="d-flex align-items-start">
3 x Full-price admission at 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 decorative" 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 Full-price admission at 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 decorative" 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

Génère une carte flottante en superposition avec un bouton de fermeture optionnel, adaptée aux panneaux d'informations contextuelles.

  • id (string)
    required
    - L'identifiant unique de la carte flottante
  • title (string)
    optional
    - Le texte du titre de la carte. Par défaut: ''
  • titleLevel (number)
    optional
    - Niveau de titre pour le titre. Par défaut: 3
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour la carte flottante. Par défaut: ''
  • dismissible (boolean)
    optional
    - Si true, affiche un bouton de fermeture. Par défaut: true
  • params (string)
    optional
    - Attributs HTML supplémentaires pour la carte flottante. Par défaut: ''

Disposition des cartes

macro @cCardLayout

Doc Bootstrap Disposition des cartes

Exemple

Default 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.

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 with 3 columns for the "md" breakpoint or 4 for the "lg" breakpoint

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'>Default example</@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 with 3 columns for the "md" breakpoint or 4 for the "lg" breakpoint</@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">
Default example</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 with 3 columns for the "md" breakpoint or 4 for the "lg" breakpoint</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

Génère un conteneur de grille permettant d'organiser plusieurs cartes en modes group, deck ou colonnes masonry.

  • type (string)
    optional
    - Type de disposition ('group', 'deck', 'columns'). Par défaut: 'group'
  • rowCols (string)
    optional
    - Nombre de colonnes par ligne pour la disposition deck. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le conteneur de grille. Par défaut: ''
  • id (string)
    optional
    - L'identifiant unique de la disposition des cartes. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour la disposition des cartes. Par défaut: ''

Carousel

macro @cCarousel

Doc Bootstrap Carousel

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 lecture/pause optionnels.

Exemple

Example 1

Chance

Does it well

But not only...

Things

Example 2

Chance

Does it well

But not only...

Things

Example 3

  1. 1
  2. 2
  3. 3

Chance

Does it well

But not only...

Things

Example 4

Chance

Does it well

But not only...

Things

<@cTitle level=4>Example 1</@cTitle>
<@cCarousel id='manege1' items='' labelPrev='' labelNext=''>
  <@cCarouselItem img='images/alexander-kagan-t9Td0zfDTwI-unsplash.png' active=true title='Chance' />
  <@cCarouselItem img='images/adrien-xplr-wAScP0OY-yM-unsplash.png' title='Does it well' subtitle='But not only...' />
  <@cCarouselItem img='images/paul-dufour-5XndD3FhH-w-unsplash.png' title='Things' />
</@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='Chance' />
  <@cCarouselItem img='images/adrien-xplr-wAScP0OY-yM-unsplash.png' title='Does it well' subtitle='But not only...' />
  <@cCarouselItem img='images/alexander-kagan-t9Td0zfDTwI-unsplash.png' title='Things' />
</@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='Chance' />
  <@cCarouselItem img='images/alexander-kagan-t9Td0zfDTwI-unsplash.png' title='Does it well' subtitle='But not only...' />
  <@cCarouselItem img='images/paul-dufour-5XndD3FhH-w-unsplash.png' title='Things' />
</@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='Chance' />
  <@cCarouselItem img='images/paul-dufour-5XndD3FhH-w-unsplash.png' title='Does it well' subtitle='But not only...' />
  <@cCarouselItem img='images/alexander-kagan-t9Td0zfDTwI-unsplash.png' title='Things' />
</@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>
Chance</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>
Does it well</h3>
<p>But not only...</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>
Things</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>
Chance</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>
Does it well</h3>
<p>But not only...</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>
Things</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 decorative" 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 decorative" 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>
Chance</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>
Does it well</h3>
<p>But not only...</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>
Things</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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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>
Chance</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>
Does it well</h3>
<p>But not only...</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>
Things</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

Génère un carrousel d'images ou de vidéos avec des contrôles de navigation, une pagination et des boutons lecture/pause optionnels.

  • id (string)
    optional
    - L'identifiant unique du carrousel. Par défaut: 'manege'
  • items (object)
    optional
    - Liste d'objets représentant les éléments du carrousel (avec 'img', 'alt', 'title', 'subTitle', 'class'). Si vide, le contenu imbriqué est utilisé. Par défaut: ''
  • indicatorSize (number)
    optional
    - Nombre d'indicateurs de pagination (calculé automatiquement à partir des items s'ils sont fournis). Par défaut: 1
  • controls (boolean)
    optional
    - Si true, affiche les flèches de navigation précédent/suivant. Par défaut: false
  • slideControls (boolean)
    optional
    - Si true, affiche les boutons lecture/pause/stop. Par défaut: false
  • pagination (boolean)
    optional
    - Si true, affiche des indicateurs de pagination numérotés. Par défaut: false
  • label (string)
    optional
    - L'aria-label du carrousel. Par défaut: 'Carousel'
  • labelPrev (string)
    optional
    - Label du bouton précédent. Par défaut: ''
  • labelNext (string)
    optional
    - Label du bouton suivant. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le carrousel. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour le carrousel. Par défaut: ''

Cascading

macro @cCascading

La macro cCascading permet de générer un élément details/summary repliable qui révèle ou masque le contenu au clic.

Exemple

nested 1
nested 2

Content

nested 3

Title

Content

nested 4

Content

nested 1

content

Planted pedestrian facilities

Content

Covered pedestrian passage to be preserved

Content

Height cap: 31m

Content

Special provisions area: Miollis Site

UG 3.1.3 Placement of facing constructions on the same plot

UG.3.2.6 Envelope gauge* of facing constructions on the same plot*

<@cCascading id='cascad1' title='nested 1' state=true>
    <@cCascading id='cascad2' title='nested 2'><@cText>Content</@cText></@cCascading>
    <@cCascading id='cascad3' title='nested 3'><@cTitle level=3>Title</@cTitle><@cText>Content</@cText></@cCascading>
    <@cCascading id='cascad4' title='nested 4'><@cText>Content</@cText></@cCascading>
</@cCascading>
<@cCascading id='cascadSolo1' title='nested 1'><@cText>content</@cText></@cCascading>
<@cCascading id='cascadFile1' class='cascading-files' title='Planted pedestrian facilities'><@cText>Content</@cText></@cCascading>
<@cCascading id='cascadFile2' class='cascading-files' title='Covered pedestrian passage to be preserved'><@cText>Content</@cText></@cCascading>
<@cCascading id='cascadFile3' class='cascading-files' title='Height cap: 31m'><@cText>Content</@cText></@cCascading>
<@cCascading id='cascadFile4' class='cascading-files' title='Special provisions area: Miollis Site' state=true>
    <@cText>UG 3.1.3 Placement of facing constructions on the same plot</@cText>
    <@cText>UG.3.2.6 Envelope gauge* of facing constructions on the same plot*</@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>
Content</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>
Title</h3>
<p>
Content</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>
Content</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>
content</p>
</div>
</details>
<details id='cascadFile1' class="cascading cascading-files" aria-expanded="false" >
<summary><span class="cascading-label ">Planted pedestrian facilities</span></summary>
<div class="cascading-content">
<p>
Content</p>
</div>
</details>
<details id='cascadFile2' class="cascading cascading-files" aria-expanded="false" >
<summary><span class="cascading-label ">Covered pedestrian passage to be preserved</span></summary>
<div class="cascading-content">
<p>
Content</p>
</div>
</details>
<details id='cascadFile3' class="cascading cascading-files" aria-expanded="false" >
<summary><span class="cascading-label ">Height cap: 31m</span></summary>
<div class="cascading-content">
<p>
Content</p>
</div>
</details>
<details id='cascadFile4' class="cascading cascading-files" open aria-expanded="true" >
<summary><span class="cascading-label ">Special provisions area: Miollis Site</span></summary>
<div class="cascading-content">
<p>
UG 3.1.3 Placement of facing constructions on the same plot</p>
<p>
UG.3.2.6 Envelope gauge* of facing constructions on the same plot*</p>
</div>
</details>

Paramètres

Génère un élément details/summary repliable qui révèle ou masque le contenu au clic.

  • title (string)
    required
    - Le label affiché dans le bouton de bascule du summary
  • id (string)
    optional
    - L'identifiant unique de l'élément cascading. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le conteneur cascading. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour l'élément cascading. Par défaut: ''
  • state (boolean)
    optional
    - Si true, l'élément est ouvert au chargement de la page. Par défaut: false

Gestion du consentement

macro @cConsentTac

La macro cConsentTac gère le consentement en utilisant la bibliothèque TarteAuCitron.

Exemple

La macro cConsentTac gère le consentement en utilisant la bibliothèque TarteAuCitron .

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

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

<p class="lead">
La macro cConsentTac gère le consentement en utilisant la bibliothèque
<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 afficher la fenêtre de gestion des cookies.</p>

Paramètres

Génère un bandeau de consentement aux cookies conforme à la CNIL en utilisant la bibliothèque TarteAuCitron (https://tarteaucitron.io).

  • title (string)
    optional
    - Le titre du bandeau de consentement. Par défaut: ''
  • privacyLink (string)
    optional
    - URL vers la page de politique de confidentialité. Par défaut: ''
  • denyAll (boolean)
    optional
    - Si true, affiche un bouton "Tout refuser". Par défaut: false
  • cookieMenu (string)
    optional
    - Libellé du lien de gestion des cookies en bas de page. Par défaut: 'Cookie management'
  • cookiePolicyLink (string)
    optional
    - URL vers la page de politique des cookies. Par défaut: ''
  • hashtag (string)
    optional
    - Identifiant hashtag de la fenêtre modale de gestion du consentement. Par défaut: 'cookiepolicy'
  • cookiename (string)
    optional
    - Nom du cookie de consentement. Par défaut: 'cookiepageId'
  • nocredit (boolean)
    optional
    - Si true, masque les crédits de TarteAuCitron. Par défaut: false

Dropdown menu

Doc Bootstrap Dropdown menu

Génère un bouton avec un menu déroulant activable, alimenté par une liste d'éléments ou un contenu imbriqué.

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

Génère un bouton avec un menu déroulant activable, alimenté par une liste d'éléments ou un contenu imbriqué.

  • label (string)
    required
    - Le texte du libellé du bouton
  • items (object)
    optional
    - Liste des éléments du menu avec les attributs 'label', 'action', 'active' et 'disabled'. Par défaut: []
  • itemType (string)
    optional
    - Type de rendu des éléments ('link' pour des ancres, autre pour des boutons). Par défaut: 'link'
  • type (string)
    optional
    - Type de menu déroulant ('split' pour un bouton scindé). Par défaut: ''
  • centered (boolean)
    optional
    - Si true, centre le menu déroulant dans un groupe de boutons. Par défaut: false
  • dropup (boolean)
    optional
    - Si true, ouvre le menu vers le haut. Par défaut: false
  • autoclose (string)
    optional
    - Comportement de fermeture automatique ('inside', 'outside', 'true', 'false'). Par défaut: ''
  • nobutton (boolean)
    optional
    - Si true, masque le bouton d'activation. Par défaut: false
  • header (string)
    optional
    - Texte d'en-tête du menu déroulant. Par défaut: ''
  • dark (boolean)
    optional
    - Si true, utilise un menu au thème sombre. Par défaut: false
  • dropDownMenuType (string)
    optional
    - Type d'élément HTML du menu ('ul' ou 'div'). Par défaut: 'ul'
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le conteneur du menu déroulant. Par défaut: ''
  • btnClass (string)
    optional
    - Classe CSS pour le style du bouton ('primary', 'secondary', 'tertiary', 'danger'). Par défaut: 'secondary'
  • noclass (boolean)
    optional
    - Si true, supprime les classes par défaut du bouton. Par défaut: false
  • id (string)
    optional
    - L'identifiant unique du menu déroulant. Par défaut: ''
  • disabled (boolean)
    optional
    - Si true, désactive le bouton du menu déroulant. Par défaut: false
  • params (string)
    optional
    - Attributs HTML supplémentaires du menu déroulant. Par défaut: ''

Message d'erreur

macro @cErrorMessage

Génère un message d'erreur pleine page avec une alerte de type danger, des liens de navigation optionnels et un bouton d'accueil.

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 informative" data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-634172984497961" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-634172984497961">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 informative" data-mce-svg="paris-icon paris-icon-alert-danger" aria-labelledby="paris-icon-alert-danger-paris-title-638005141761831" focusable="false" role="img">
<title id="paris-icon-alert-danger-paris-title-638005141761831">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

Génère un message d'erreur pleine page avec une alerte de type danger, des liens de navigation optionnels et un bouton d'accueil.

  • title (string)
    required
    - Le titre de l'erreur affiché dans l'alerte
  • text (string)
    required
    - Le texte de description de l'erreur
  • linkUrl (string)
    optional
    - URL d'un lien de navigation supplémentaire. Par défaut: ''
  • linkLabelUrl (string)
    optional
    - Texte du libellé du lien de navigation. Par défaut: ''
  • id (string)
    optional
    - L'identifiant unique du conteneur d'erreur. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le conteneur d'erreur. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour le conteneur d'erreur. Par défaut: ''

Filtre

macro @cFilter

Génère un panneau de filtres rétractable avec des filtres à cases à cocher, des boutons de recherche et de réinitialisation, et l'affichage du nombre de résultats.

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 decorative" 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-670998085345051" role="group" aria-labelledby="legend-id-670998085345051">
<legend class="visually-hidden" id="legend-id-670998085345051">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

Génère un panneau de filtres rétractable avec des filtres à cases à cocher, des boutons de recherche et de réinitialisation, et l'affichage du nombre de résultats.

  • checkboxes (object)
    required
    - Liste des éléments de filtre, chacun avec les attributs 'title' et 'id'
  • id (string)
    optional
    - L'identifiant unique du conteneur de filtres. Par défaut: ''
  • result (string)
    optional
    - Texte affichant le nombre de résultats du filtre. Par défaut: ''
  • fieldSetLabel (string)
    optional
    - Le texte de la légende du fieldset de filtre. Par défaut: 'Liste de filtres'
  • showLegend (boolean)
    optional
    - Si true, la légende du fieldset est visible. Par défaut: false
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le conteneur de filtres. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour le conteneur de filtres. Par défaut: ''

Formulaire

macro @cForm

Doc Bootstrap Formulaire

Génère un conteneur de formulaire HTML avec action, méthode et attributs ARIA configurables pour les pages de front-office.

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

Génère un conteneur de formulaire HTML avec action, méthode et attributs ARIA configurables pour les pages de front-office.

  • class (string)
    optional
    - Classe CSS du formulaire. Par défaut: ''
  • id (string)
    optional
    - l'identifiant du formulaire. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''
  • name (string)
    optional
    - l'attribut name du formulaire. Par défaut: ''
  • method (string)
    optional
    - la méthode HTTP. Par défaut: 'post'
  • role (string)
    optional
    - Label ARIA du formulaire. Par défaut: ''
  • action (string)
    optional
    - l'URL d'action du formulaire. Par défaut: 'jsp/site/Portal.jsp'

Fieldset

macro @cFieldSet

Génère un fieldset avec une légende et des champs de formulaire imbriqués.

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" 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" 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" 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" 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" 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" 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

Groupe de checkbox ou radio bouton

macro @cFormCheckGroup

Génère un groupe de cases à cocher ou de boutons radio au sein d'un 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-723987500719881" role="group" aria-labelledby="legend-form-check-group-723987500719881">
<legend id="legend-form-check-group-723987500719881">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

Checkbox

macro @cCheckbox

Doc Bootstrap Checkbox

Génère un élément de saisie de type case à cocher avec diverses options et configurations.

Exemple

Choose a schedule

Choose a schedule

Error in the sport!

Make your choice

<@cForm>
<@cRow>
    <@cCol >
		<@cFieldset params='aria-describedby="help_checkboxHelp1"'>
			<@cField label='Schedule'>
				<@cFormHelp id='checkboxHelp1' label='Choose a schedule' />
				<@cCheckbox name='sport' id='football' label='Football' value='foot' />
				<@cCheckbox name='sport' id='natation' label='Swimming' 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='Schedule'>
				<@cFormHelp id='checkboxHelp2' label='Choose a schedule' />
				<@cCheckbox name='sport' id='judo2' label='Judo' value='judo' />
				<@cCheckbox errorMsg='Error in the sport!' name='sport' id='football2' label='Football' value='foot' />
			</@cField>
		</@cFieldset>
    </@cCol>
</@cRow>
<@cRow>
    <@cCol>
		<@cFieldset params='aria-describedby="help_selectHelp"'>
			<@cField label='Which choice?'>
				<@cFormHelp id='selectHelp' label='Make your choice' />
				<@cCheckbox name='selectCheckbox' id='selectFootball' label='Football' value='foot' selectionButton=true selectionLabel='A sport with a ball.' />
				<@cCheckbox name='selectCheckbox' id='selectJudo' label='Judo' value='judo' selectionButton=true selectionLabel='A combat sport.' />
				<@cCheckbox name='selectCheckbox' id='selectNatation' label='Swimming' value='nata' selectionButton=true selectionLabel='A sport in the water.' />
				<@cCheckbox name='selectCheckbox' id='selectTennis' label='Tennis' value='tenn' selectionButton=true selectionLabel='A racket sport.' disabled=true />
			</@cField>
		</@cFieldset>
    </@cCol>
</@cRow>
</@cForm>

<form method="post">
<div class="row ">
<div class="col ">
<fieldset id="fieldset-id-772512601566971" aria-describedby="help_checkboxHelp1" role="group" aria-labelledby="legend-id-772512601566971">
<label class="form-label">
Schedule
</label>
<p class="form-text " id="help_checkboxHelp1">
Choose a schedule</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">
Swimming
</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-779444758830841" aria-describedby="help_checkboxHelp2" role="group" aria-labelledby="legend-id-779444758830841">
<label class="form-label">
Schedule
</label>
<p class="form-text " id="help_checkboxHelp2">
Choose a schedule</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 decorative" data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>Error in the 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-795309073358581" aria-describedby="help_selectHelp" role="group" aria-labelledby="legend-id-795309073358581">
<label class="form-label">
Which choice?
</label>
<p class="form-text " id="help_selectHelp">
Make your choice</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">A sport with a ball.</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">A combat sport.</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">
Swimming
<p class="selection-subtitle my-sm">A sport in the water.</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">A racket sport.</p>
</label>
</div>
</div>
</fieldset>
</div>
</div>
</form>

Paramètres

Génère un élément de saisie de type case à cocher. Encapsule cFormCheck avec le type 'checkbox' par défaut.

  • name (string)
    required
    - le nom de l'élément
  • label (string)
    required
    - le libellé associé à la saisie
  • type (string)
    optional
    - le type 'checkbox'. Par défaut: 'checkbox'
  • button (boolean)
    optional
    - si l'élément doit être rendu comme un bouton. Par défaut: false
  • class (string)
    optional
    - la classe CSS de l'élément. Par défaut: 'form-check'
  • id (string)
    optional
    - l'identifiant de l'élément. Par défaut: ''
  • value (string)
    optional
    - la valeur de l'élément. Par défaut: ''
  • btnClass (string)
    optional
    - Classe CSS du libellé du bouton, utilisée uniquement si le type est 'button'. Par défaut: ''
  • labelClass (string)
    optional
    - la classe CSS du libellé. Par défaut: ''
  • selectionButton (boolean)
    optional
    - ajoute un cadre de sélection autour de la case à cocher. Par défaut: false
  • selectionLabel (string)
    optional
    - libellé du cadre de sélection. Par défaut: ''
  • textCenter (boolean)
    optional
    - centre le texte sur toutes les sélections. Par défaut: false
  • errorMsg (string)
    optional
    - contenu du message d'erreur. Par défaut: ''
  • helpMsg (string)
    optional
    - contenu du message d'aide. Par défaut: ''
  • inline (boolean)
    optional
    - définit l'affichage en ligne. Par défaut: false
  • disabled (boolean)
    optional
    - désactive l'élément. Par défaut: false
  • readonly (boolean)
    optional
    - définit l'élément en lecture seule. Par défaut: false
  • checked (boolean)
    optional
    - coche l'élément. Par défaut: false
  • required (boolean)
    optional
    - définit l'élément comme requis. Par défaut: false
  • html5Required (boolean)
    optional
    - utilise l'attribut required HTML5. Par défaut: true
  • showRequiredLabel (boolean)
    optional
    - affiche l'astérisque de champ requis sur le libellé englobant (true) ou sur le libellé de la case à cocher (false). Par défaut: true
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Bouton radio

macro @cRadio

Doc Bootstrap Bouton radio

Génère un composant bouton radio avec diverses options d'affichage en ligne, de boutons de sélection, et plus encore.

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' />
<@cText>
<@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 />
</@cText>
<@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-894714960525021" name="gender" class="form-check-input" value="male">
<label class="form-label form-check-label" for="gender-894714960525021">
Male
</label>
</div>
<div class="form-check">
<input type="radio" id="gender-894757117788891" name="gender" class="form-check-input" value="female">
<label class="form-label form-check-label" for="gender-894757117788891">
Female
</label>
</div>
<div class="form-check">
<input type="radio" id="gender-894799275052761" name="gender" class="form-check-input" value="other">
<label class="form-label form-check-label" for="gender-894799275052761">
Other
</label>
</div>
<div class="row ">
<div class="col ">
<div class="form-check form-check-inline">
<input type="radio" id="size-894841432316631" name="size" class="form-check-input" value="S">
<label class="form-label form-check-label" for="size-894841432316631">
Small
</label>
</div>
<div class="form-check form-check-inline">
<input type="radio" id="size-894883589580501" name="size" class="form-check-input" value="M">
<label class="form-label form-check-label" for="size-894883589580501">
Medium
</label>
</div>
<div class="form-check form-check-inline">
<input type="radio" id="size-894925746844371" name="size" class="form-check-input" value="L">
<label class="form-label form-check-label" for="size-894925746844371">
Large
</label>
</div>
</div>
</div>
<div class="row ">
<div class="col ">
<input type="radio" name="plan" class="btn-check form-check" id="plan-894967904108241" autocomplete="off" value="monthly">
<label class="form-label btn btn-outline-primary" for="plan-894967904108241">
Monthly
</label>
<input type="radio" name="plan" class="btn-check form-check" id="plan-895010061372111" autocomplete="off" value="yearly">
<label class="form-label btn btn-outline-primary" for="plan-895010061372111">
Yearly
</label>
</div>
</div>
<div class="form-check btn-selection">
<div class="selection-check">
<input type="radio" id="delivery-895052218635981" name="delivery" class="form-check-input" value="express">
<label class="form-label form-check-label" for="delivery-895052218635981">
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

Génère un élément input de type bouton radio. Encapsule cFormCheck avec le type 'radio' par défaut.

  • name (string)
    required
    - le nom de l'élément
  • label (string)
    required
    - le libellé associé à l'input
  • type (string)
    optional
    - le type, 'radio' ou 'button'. Par défaut: 'radio'
  • button (boolean)
    optional
    - si l'élément doit être rendu comme un bouton. Par défaut: false
  • class (string)
    optional
    - la classe CSS de l'élément. Par défaut: 'form-check'
  • labelClass (string)
    optional
    - la classe CSS du libellé, peut être 'visually-hidden' pour le masquer. Par défaut: ''
  • btnClass (string)
    optional
    - classe CSS du libellé de bouton, utilisée uniquement si le type est 'button'. Par défaut: ''
  • id (string)
    optional
    - l'identifiant de l'élément. Par défaut: ''
  • value (string)
    optional
    - la valeur de l'élément. Par défaut: ''
  • errorMsg (string)
    optional
    - contenu du message d'erreur. Par défaut: ''
  • helpMsg (string)
    optional
    - contenu du message d'aide. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''
  • inline (boolean)
    optional
    - définit l'affichage en ligne. Par défaut: false
  • selectionButton (boolean)
    optional
    - ajoute un cadre de sélection autour du bouton radio. Par défaut: false
  • selectionLabel (string)
    optional
    - libellé du cadre de sélection. Par défaut: ''
  • textCenter (boolean)
    optional
    - centre le texte sur toutes les sélections. Par défaut: false
  • disabled (boolean)
    optional
    - désactive l'élément. Par défaut: false
  • readonly (boolean)
    optional
    - définit l'élément en lecture seule. Par défaut: false
  • checked (boolean)
    optional
    - coche l'élément. Par défaut: false
  • required (boolean)
    optional
    - définit l'élément comme requis. Par défaut: false
  • html5Required (boolean)
    optional
    - utilise l'attribut required HTML5. Par défaut: true
  • showRequiredLabel (boolean)
    optional
    - affiche l'astérisque de champ requis sur le libellé englobant (true) ou sur le libellé du bouton radio (false). Par défaut: true

Aide de formulaire

macro @cFormHelp

Génère un message d'aide associé à un champ de formulaire, rendu sous forme d'élément form-text relié 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

Génère un message d'aide associé à un champ de formulaire, rendu sous forme d'élément form-text relié via aria-describedby.

  • id (string)
    required
    - l'identifiant du champ associé, utilisé pour générer l'identifiant de l'élément d'aide (help_{id})
  • label (string)
    required
    - le contenu du message d'aide
  • class (string)
    optional
    - ajoute une classe CSS au texte d'aide. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Erreur de formulaire

macro @cFormError

Doc Bootstrap Erreur de formulaire

Génère un élément de message d'erreur pour un champ de formulaire, affiché avec une icône d'alerte et lié via aria-describedby pour l'accessibilité.

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 decorative" 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 decorative" 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

Génère un élément de message d'erreur pour un champ de formulaire, affiché avec une icône d'alerte et lié via aria-describedby pour l'accessibilité.

  • id (string)
    required
    - l'identifiant du champ associé, utilisé pour générer l'identifiant de l'élément d'erreur (error_{id})
  • label (string)
    required
    - le contenu du message d'erreur
  • class (string)
    optional
    - ajoute une classe CSS au message d'erreur. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Ligne de formulaire

macro @cFormRow

DEPRECATED : Utiliser la macro <@cRow>.

Voir la documentation de la macro @cRow

Label

macro @cLabel

Doc Bootstrap Label

Génère un élément label de formulaire avec un indicateur astérisque d'obligation optionnel et un contrôle de visibilité.

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...">

Paramètres

Génère un élément label de formulaire avec un indicateur astérisque d'obligation optionnel et un contrôle de visibilité.

  • label (string)
    required
    - le texte du label
  • class (string)
    optional
    - Classe CSS pour le label. Par défaut: ''
  • id (string)
    optional
    - l'identifiant du label. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''
  • for (string)
    optional
    - l'identifiant de l'élément de formulaire associé. Par défaut: ''
  • showLabel (boolean)
    optional
    - affiche ou masque le label (utilise la classe visually-hidden). Par défaut: true
  • required (boolean)
    optional
    - affiche un astérisque d'obligation (*) après le label. Par défaut: false

macro @cInput

Doc Bootstrap

Génère un champ de saisie avec différents attributs et options de validation.

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">
<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 decorative" 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">
<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

Génère un champ de saisie de formulaire prenant en charge différents types, la validation, les messages d'aide/d'erreur, la datalist et le formatage des numéros de téléphone.

  • name (string)
    required
    - l'attribut name du champ
  • class (string)
    optional
    - classe CSS pour le champ. Par défaut: 'form-control'
  • id (string)
    optional
    - l'identifiant du champ. Par défaut: ''
  • type (string)
    optional
    - le type du champ (text, email, tel, number, etc.). Par défaut: 'text'
  • size (string)
    optional
    - ajoute un suffixe de taille à la classe form-control, 'lg' ou 'sm'. Par défaut: ''
  • value (string)
    optional
    - la valeur par défaut. Par défaut: ''
  • placeholder (string)
    optional
    - le texte du placeholder. Par défaut: ''
  • ariaLabel (string)
    optional
    new
    - utilisé pour définir la valeur de l'attribut 'aria-label' du champ de formulaire. Par défaut: ''
  • phoneCountry (string)
    optional
    - formate le numéro de téléphone pour le pays donné lorsque le type est 'tel'. Par défaut: 'FR'
  • required (boolean)
    optional
    - marque le champ comme obligatoire. Par défaut: false
  • html5Required (boolean)
    optional
    - utilise l'attribut HTML5 required. Par défaut: true
  • disabled (boolean)
    optional
    - désactive le champ. Par défaut: false
  • readonly (boolean)
    optional
    - définit le champ en lecture seule. Par défaut: false
  • pattern (string)
    optional
    - une expression régulière pour la validation du champ. Par défaut: ''
  • autocomplete (string)
    optional
    - la valeur de l'attribut autocomplete. Par défaut: ''
  • accept (string)
    optional
    - types de fichiers acceptés pour les champs de type fichier. Par défaut: ''
  • title (string)
    optional
    - l'attribut title. Par défaut: ''
  • maxlength (number)
    optional
    - longueur maximale en caractères. Par défaut: 0
  • min (number)
    optional
    - valeur minimale pour les champs de type number. Par défaut: 0
  • max (number)
    optional
    - valeur maximale pour les champs de type number. Par défaut: 0
  • datalistId (string)
    optional
    - identifiant de l'élément datalist associé. Par défaut: ''
  • datalist (string)
    optional
    - liste d'objets avec id et label pour les options de la datalist. Par défaut: ''
  • helpMsg (string)
    optional
    - message d'aide affiché sous le champ. Par défaut: ''
  • errorMsg (string)
    optional
    - message d'erreur affiché lorsque la validation échoue. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Champ avec icône, bouton ou texte

macro @cInputGroup+@cInputGroupAddonText+@cInputGroupAddon

Doc Bootstrap Champ avec icône, bouton ou texte

Génère un conteneur de groupe de champs qui enveloppe les champs et les addons ensemble pour des contrôles de formulaire combinés.

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">
</div>
<div class="input-group input-group-lg">
<input type="text" class=" form-control" name="search" id="search" value="" placeholder="Search...">
<span class="input-group-text">
Go</span>
</div>

Paramètres

Génère un conteneur de groupe de champs qui enveloppe les champs et les addons ensemble pour des contrôles de formulaire combinés.

  • class (string)
    optional
    - ajoute une classe CSS au groupe. Par défaut: ''
  • size (string)
    optional
    - ajoute un suffixe de taille à la classe input-group, valeurs possibles 'lg' ou 'sm'. Par défaut: ''
  • id (string)
    optional
    - l'identifiant du groupe. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Zone de texte long

macro @cTextArea

Doc Bootstrap Zone de texte long

Génère un champ de formulaire textarea avec prise en charge de la validation, des messages d'aide/d'erreur et des limites de caractères

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 decorative" 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

Génère un champ de formulaire textarea avec prise en charge de la validation, des messages d'aide/d'erreur et des limites de caractères.

  • name (string)
    required
    - l'attribut name du textarea
  • class (string)
    optional
    - Classe CSS pour le textarea. Par défaut: 'form-control'
  • id (string)
    optional
    - l'identifiant du textarea. Par défaut: ''
  • placeholder (string)
    optional
    - le texte du placeholder. Par défaut: ''
  • required (boolean)
    optional
    - marque le champ comme obligatoire. Par défaut: false
  • html5Required (boolean)
    optional
    - utilise l'attribut required HTML5. Par défaut: true
  • disabled (boolean)
    optional
    - désactive le textarea. Par défaut: false
  • readonly (boolean)
    optional
    - définit le textarea en lecture seule. Par défaut: false
  • title (string)
    optional
    - l'attribut title. Par défaut: ''
  • autocomplete (string)
    optional
    - la valeur de l'attribut autocomplete (on/off). Par défaut: ''
  • maxlength (number)
    optional
    - longueur maximale en caractères. Par défaut: 0
  • counter (boolean)
    optional
    new
    - indique s'il faut afficher un compteur de caractères. Par défaut: false
  • helpMsg (string)
    optional
    - message d'aide affiché sous le textarea. Par défaut: ''
  • rows (number)
    optional
    - nombre de lignes de texte visibles. Par défaut: 0
  • errorMsg (string)
    optional
    - message d'erreur affiché en cas d'échec de validation. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Champ de formulaire

macro @cField

Génère un conteneur de champ de formulaire avec un label, combinant un label et des éléments de saisie imbriqués au sein d'un conteneur bloc.

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">
<label class="form-label visually-hidden" for="search">
Search
</label>
<input type="text" class=" form-control" name="search" id="search" value="" placeholder="Search...">

Paramètres

Génère un conteneur de champ de formulaire avec un label, combinant un label et des éléments de saisie imbriqués au sein d'un conteneur bloc.

  • label (string)
    optional
    - le texte du label du champ. Par défaut: ''
  • labelClass (string)
    optional
    - ajoute une classe CSS au label. Par défaut: ''
  • labelData (string)
    optional
    - texte supplémentaire ajouté au label. Par défaut: ''
  • for (string)
    optional
    - lie le label au champ via l'attribut for. Par défaut: ''
  • showLabel (boolean)
    optional
    - affiche ou masque le label. Par défaut: true
  • required (boolean)
    optional
    - marque le champ comme requis avec un astérisque. Par défaut: false
  • class (string)
    optional
    - ajoute une classe CSS au conteneur du champ. Par défaut: 'mb-3'
  • id (string)
    optional
    - l'identifiant du conteneur du champ. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Liste déroulante

macro @cSelect

Doc Bootstrap Liste déroulante

Génère une liste déroulante avec la prise en charge de la validation, des messages d'aide/d'erreur, de la sélection multiple et des attributs d'accessibilité.

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 decorative" 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

Génère une liste déroulante avec la prise en charge de la validation, des messages d'aide/d'erreur, de la sélection multiple et des attributs d'accessibilité.

  • name (string)
    required
    - l'attribut name de la liste déroulante
  • class (string)
    optional
    - Classe CSS de la liste déroulante. Par défaut: 'form-select'
  • size (string)
    optional
    - ajoute un suffixe de taille à la classe form-select, 'lg' ou 'sm'. Par défaut: ''
  • id (string)
    optional
    - l'identifiant de l'élément. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''
  • multiple (boolean)
    optional
    - active la sélection multiple. Par défaut: false
  • disabled (boolean)
    optional
    - désactive la liste déroulante. Par défaut: false
  • autocomplete (string)
    optional
    - la valeur de l'attribut autocomplete. Par défaut: ''
  • readonly (boolean)
    optional
    - définit la liste déroulante en lecture seule. Par défaut: false
  • required (boolean)
    optional
    - marque le champ comme requis. Par défaut: false
  • html5Required (boolean)
    optional
    - utilise l'attribut required HTML5. Par défaut: true
  • helpMsg (string)
    optional
    - message d'aide affiché sous la liste déroulante. Par défaut: ''
  • errorMsg (string)
    optional
    - message d'erreur affiché en cas d'échec de la validation. Par défaut: ''

Sélection multiple

macro @cMultiselect

Génère un composant de liste déroulante à sélection multiple avec une sélection sous forme d'étiquettes, prenant en charge un nombre maximum d'options et des libellés personnalisés.

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-1103912037399171" data-maxoptions="0">
<div class="tags-container mt-s"></div>
<div class="dropdown">
<button class="form-select multi-select " type="button" id='btn-msg-1103912037399171' 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-1113054194663041" autocomplete="off" value="sport">
<label class="form-label btn btn-outline-primary my-0" for="categories-1113054194663041">
Sport
</label>
</li>
<li>
<input type="checkbox" name="categories" class="btn-check" id="categories-1122196351926911" autocomplete="off" value="culture">
<label class="form-label btn btn-outline-primary my-0" for="categories-1122196351926911">
Culture
</label>
</li>
<li>
<input type="checkbox" name="categories" class="btn-check" id="categories-1131338509190781" autocomplete="off" value="education">
<label class="form-label btn btn-outline-primary my-0" for="categories-1131338509190781">
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-1140480666454651" autocomplete="off" value="music">
<label class="form-label btn btn-outline-primary my-0" for="interests-1140480666454651">
Music
</label>
</li>
<li>
<input type="checkbox" name="interests" class="btn-check" id="interests-1149622823718521" autocomplete="off" value="travel">
<label class="form-label btn btn-outline-primary my-0" for="interests-1149622823718521">
Travel
</label>
</li>
<li>
<input type="checkbox" name="interests" class="btn-check" id="interests-1158764980982391" autocomplete="off" value="food">
<label class="form-label btn btn-outline-primary my-0" for="interests-1158764980982391">
Food
</label>
</li>
<li>
<input type="checkbox" name="interests" class="btn-check" id="interests-1167907138246261" autocomplete="off" value="art">
<label class="form-label btn btn-outline-primary my-0" for="interests-1167907138246261">
Art
</label>
</li>
</ul>
</div>
</div>

Paramètres

Génère un composant de liste déroulante à sélection multiple avec une sélection sous forme d'étiquettes, prenant en charge un nombre maximum d'options et des libellés personnalisés.

  • class (string)
    optional
    - Classe CSS du conteneur de la sélection multiple. Par défaut: ''
  • labelOptionSelection (string)
    optional
    - libellé du bouton de la liste déroulante. Par défaut: ''
  • maxSelectedOptions (number)
    optional
    - nombre maximum d'éléments pouvant être sélectionnés, 0 pour illimité. Par défaut: 0
  • id (string)
    optional
    - l'identifiant de l'élément. Par défaut: ''
  • helpMsg (string)
    optional
    - contenu du message d'aide. Par défaut: ''
  • errorMsg (string)
    optional
    - contenu du message d'erreur. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''
  • disabled (boolean)
    optional
    - désactive la sélection multiple. Par défaut: false

Champ mot de passe

macro @cInputPassword

Doc Bootstrap Champ mot de passe

Génère un champ de saisie de mot de passe avec indicateur de robustesse optionnel et synchronisation du champ de confirmation.

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 decorative" 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 decorative" 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 decorative" 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

Génère un champ de saisie de mot de passe avec bouton d'affichage/masquage optionnel, indicateur de robustesse du mot de passe et prise en charge de la génération de mot de passe.

  • name (string)
    required
    - l'attribut name du champ
  • label (string)
    optional
    - le texte du label. Par défaut: ''
  • btnShowPassword (boolean)
    optional
    - affiche un bouton pour basculer la visibilité du mot de passe. Par défaut: true
  • passwordMeter (boolean)
    optional
    - affiche l'indicateur de robustesse du mot de passe. Par défaut: false
  • pmLabel (string)
    optional
    - label du message de robustesse du mot de passe. Par défaut: ' '
  • pmUrl (string)
    optional
    - URL pour générer un mot de passe via AJAX. Par défaut: ''
  • pmConfirmFieldId (string)
    optional
    - identifiant du champ de confirmation du mot de passe pour synchroniser les mots de passe générés. Par défaut: ''
  • placeholder (string)
    optional
    - le texte du placeholder. Par défaut: ''
  • autocomplete (string)
    optional
    - la valeur de l'attribut autocomplete. Par défaut: ''
  • class (string)
    optional
    - Classe CSS du champ. Par défaut: ''
  • id (string)
    optional
    - l'identifiant du champ. Par défaut: ''
  • size (string)
    optional
    - suffixe de taille pour la classe form-control, 'sm' ou 'lg'. Par défaut: ''
  • value (string)
    optional
    - la valeur par défaut. Par défaut: ''
  • required (boolean)
    optional
    - marque le champ comme requis. Par défaut: true
  • disabled (boolean)
    optional
    - désactive le champ. Par défaut: false
  • maxlength (number)
    optional
    - longueur maximale en caractères. Par défaut: 100
  • helpMsg (string)
    optional
    - message d'aide affiché sous le champ. Par défaut: ''
  • errorMsg (string)
    optional
    - message d'erreur affiché en cas d'échec de validation. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Validation mot de passe

macro @cPasswordCheck

Génère une liste de critères de mot de passe (longueur de caractères, majuscule, chiffre) affichée sous forme de texte d'aide sous un champ mot de passe.

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 decorative" 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 decorative" 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 decorative" 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 decorative" 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

Génère une liste de critères de mot de passe (longueur de caractères, majuscule, chiffre) affichée sous forme de texte d'aide sous un champ mot de passe. La fonction JS initPasswordCheck valide le champ en temps réel et bascule les classes text-success / text-danger sur chaque critère.

  • id (string)
    required
    - l'identifiant du champ mot de passe associé

Champ de téléversement par glisser-déposer

macro @cInputDropFiles+@cInputDropFilesItem

Génère un champ de téléversement de fichiers par glisser-déposer avec limites de taille de fichier optionnelles, types de fichiers acceptés et sélection de fichiers multiples.

Exemple

Warning

Avertissement

Cette macro nécessite le plugin AsynchronousUpload pour fonctionner !
Avertissement
Les téléversements ne sont pas disponibles dans la démo

File drop zone

Upload your files!

Drop your files here or Select

Drop zone + uploaded files list

Drop your files here or Select

<@cForm>
<@cTitle level=4 class='main-info-color'>File drop zone</@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='Upload your files!' />
	</@cCol>
</@cRow>
<@cTitle level=4 class='main-info-color'>Drop zone + uploaded files list</@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='My certificate.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='Proof.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='Submit' class='action' id="doSaveForm"/>
            <@cBtn label='Cancel' 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 informative" data-mce-svg="paris-icon paris-icon-alert-warning" aria-labelledby="paris-icon-alert-warning-paris-title-1293618912579141" focusable="false" role="img">
<title id="paris-icon-alert-warning-paris-title-1293618912579141">Warning</title>
<use href="#paris-icon-alert-warning"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Avertissement</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 bibliothèque autre que le JQuery FileUpload inclus dans le plugin, vous devrez 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 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">Avertissement</strong>
<button type="button" class="ms-auto btn-close" data-bs-dismiss="toast" aria-label="Close">&times;</button>
</div>
<div class="toast-body">
Les téléversements ne sont pas disponibles dans 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">
File drop zone</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">
Upload your files!</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" role="button" tabindex="0">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">
Drop zone + uploaded files list</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" role="button" tabindex="0">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=My certificate.docx&asynchronousupload.handler=formsAsynchronousUploadHandler" class="files-item-link" data-type="DOCX" data-img="">
<span class="file-item-label">My certificate.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 My certificate.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=Proof.docx&asynchronousupload.handler=formsAsynchronousUploadHandler" class="files-item-link" data-type="DOCX" data-img="">
<span class="file-item-label">Proof.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 Proof.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 ">Submit</span>
</button>
<button class="btn btn-link-action" type="submit">
<svg class="paris-icon paris-icon-close decorative" 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 ">Cancel</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='Select' labelSubmit='Submit' labelDelete='Delete' required=false disabled=false helpMsg='' errorMsg='' params=''

  • name (string)
    required
    - L'attribut name du champ
  • handler (json/text)
    optional
    - Gestionnaire (handler) pour les champs
  • type (string) ('dropzone' / 'dropzone' | 'button')
    optional
    - Type de téléversement, 'dropzone' par défaut (une zone de dépôt), sinon 'button'.
  • nbFiles (number) (default : 0)
    optional
    - Ajuste l'affichage selon le nombre de fichiers. Si supérieur à 1, affiche une zone sur deux colonnes.
  • nbUplodadedFiles (number) (default : 0)
    optional
    - Nombre de fichiers déjà téléversés. Nouveau
  • maxFileSize (number) (default : 0)
    optional
    - Taille maximale des fichiers à téléverser. Si 0, il n'y a pas de limite spécifique sur le champ mais la limite par défaut du site s'applique.
  • unit (string) (default : '')
    optional
    - Unité de taille choisie, par exemple "Mo"
  • accept ( text list / default : '')
    optional
    - Format(s) de fichier acceptés.
  • label (string) (default : 'Upload files')
    optional
    - Titre de la zone de téléversement de fichiers
  • showLabel (number) (default : '')
    optional
    - Afficher ou non le titre de la zone de téléversement
  • labelPos (number) (default : 1)
    optional
    - Zone d'affichage du label, par défaut dans la première colonne.
  • labelSelect (string) (default : 'Select')
    optional
    - Valeur "Delete" définie dans le fichier "themeparisfr_messages_fr.properties".
  • labelSubmit (string) (default : 'Submit' )
    optional
    - Valeur "Select" définie dans le fichier "themeparisfr_messages_fr.properties".
  • formSubmitButtonName (string) (default : 'action_doSaveStep' )
    optional
    - Nom du bouton de soumission du formulaire, utilisé dans le JS pour associer les validations requises avant la soumission.
  • labelDelete (string) (default : 'Delete' )
    optional
    - Valeur "Submit" définie dans le fichier "themeparisfr_messages_fr.properties".
  • required (boolean) (default : false)
    optional
    - Indique si le champ est obligatoire.
  • disabled (boolean) (default : false)
    optional
    - Indique si le champ est désactivé.
  • multiple (boolean) (default : true)
    optional
    - Ajoute l'attribut "multiple" au champ de téléversement.
  • noJs (boolean) (default : false)
    optional
    - Ajoute l'attribut "nojs" au bouton de suppression multiple.
  • helpMsg (string) (default :'')
    optional
    - Message d'aide
  • hasFiles (boolean) (default : false)
    optional
    - Si true, affiche la liste des fichiers.
  • errorMsg (string) (default :'')
    optional
    - Message d'erreur.
  • ariaDescribedby (string) (default :'')
    optional
    - Ajoute un attribut aria-describedby uniquement s'il n'y a pas de helpMsg ou d'errorMsg
  • id (string) (default :'')
    optional
    - Identifiant unique, égal à l'attribut name s'il n'est pas fourni
  • class (string) (default : '')
    optional
    - Une ou plusieurs classe(s) séparées par un espace peuvent être ajoutées.
  • params (string) (default :'')
    optional
    - Attributs HTML supplémentaires
Fichier téléversé Nouveau

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

  • name (string)
    required
    - L'attribut name du champ, si le handler ne porte pas le nom
  • idx (string)
    required
    - Index du champ.
  • label (string)
    required
    - Label associé au champ.
  • handler (json/text)
    optional
    - Gestionnaire (handler) pour les champs
  • fileSize (number) (default : 0)
    optional
    - Taille du fichier téléversé, en octets.
  • ext (string) (default : '')
    optional
    - Extension du fichier
  • unit (string) (default : '')
    optional
    - Unité de taille choisie, par exemple "Mo"
  • urlDl (string) (default : '')
    optional
    - URL de téléchargement du fichier, si le handler ne porte pas l'URL
  • urlRm (string) (default : '')
    optional
    - URL de suppression du fichier, si le handler ne porte pas l'URL
  • maxChars (number) (default : 24)
    optional
    - Nombre maximal de caractères pour l'affichage du nom du fichier
  • class (string) (default : '')
    optional
    - Nom d'une ou plusieurs classe(s) séparées par un espace.

Champ de date

macro @cInputDate

Doc Bootstrap Champ de date

Génère un champ de saisie de date avec intégration optionnelle de Vanilla JS Datepicker, une icône de calendrier et un repli en date HTML5.

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 without icon' 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='No date picker' for='datepicker' />
        <@cInputDate id='datepicker_4' label='' name='date4' type=''  />
    </@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-07-09">
<span class="input-group-text">
<svg class="paris-icon paris-icon-agenda datepicker_1" data-mce-svg="paris-icon paris-icon-agenda" aria-labelledby="paris-icon-agenda-paris-title-1331114013426231" focusable="false" role="img">
<title id="paris-icon-agenda-paris-title-1331114013426231"></title>
<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>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('datepicker_1');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</script>
</div>
<div class="col-4 ">
<label class="form-label" for="datepicker">
Date picker without icon<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="dd/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>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('datepicker_2');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</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 with separator
</label>
<div class="input-group">
<input type="text" class=" form-control" name="date4" id="datepicker_4" value="">
</div>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('datepicker_4');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
// No datepicker on this field: check the typed value is a real calendar
// date (rejects 31/02/2026), raise the error message in the HTML and
// keep focus in the field while it is not valid (same behaviour as the
// validation patch of initThemeDatePicker.ftl for datepicker fields)
const dayFirst = localeSample.indexOf('31') < localeSample.indexOf('12');
const yearFirst = localeSample.indexOf(String(yr)) === 0;
function isValidDate(str) {
const parts = str.split(sep);
if (parts.length !== partLengths.length) return false;
let d, m, y;
if (yearFirst) { y = parts[0]; m = parts[1]; d = parts[2]; }
else if (dayFirst) { d = parts[0]; m = parts[1]; y = parts[2]; }
else { m = parts[0]; d = parts[1]; y = parts[2]; }
if (!/^[0-9]+$/.test(d + m + y) || y.length !== 4) return false;
const dt = new Date(parseInt(y, 10), parseInt(m, 10) - 1, parseInt(d, 10));
return dt.getFullYear() === parseInt(y, 10)
&& dt.getMonth() === parseInt(m, 10) - 1
&& dt.getDate() === parseInt(d, 10);
}
const msg = (el.getAttribute('data-date-error') || 'Please enter a valid date in the {0} format (example: {1}).')
.replace('{0}', fmtHint).replace('{1}', new Date(yr, 5, 30).toLocaleDateString(lang));
let feedback = null;
function showError() {
el.classList.add('is-invalid');
el.setAttribute('aria-invalid', 'true');
if (!feedback || !feedback.parentNode) {
feedback = document.createElement('p');
feedback.className = 'invalid-feedback';
feedback.id = 'error_datepicker_4';
feedback.innerHTML = '<svg class="paris-icon paris-icon-alert-error main-danger-color" aria-hidden="true" focusable="false" role="img"><use href="#paris-icon-alert-error"></use></svg> ';
feedback.appendChild(document.createTextNode(msg));
const group = el.closest('.input-group') || el;
group.parentNode.insertBefore(feedback, group);
}
el.setAttribute('aria-describedby', feedback.id);
}
function clearError() {
el.classList.remove('is-invalid');
el.removeAttribute('aria-invalid');
el.removeAttribute('aria-describedby');
if (feedback && feedback.parentNode) feedback.parentNode.removeChild(feedback);
feedback = null;
}
let touched = false;
function validate() {
if (el.value === '' || isValidDate(el.value)) { clearError(); return true; }
showError();
return false;
}
el.addEventListener('blur', function() {
touched = true;
if (validate()) return;
setTimeout(function() {
el.focus();
el.setSelectionRange(0, el.value.length);
}, 0);
});
// Re-validate while typing once the field has been touched, so the
// message disappears as soon as the value becomes valid again
el.addEventListener('input', function() { if (touched) validate(); });
// Validate on submit and block the submission if the date is invalid
const form = el.closest('form');
if (form) {
form.addEventListener('submit', function(e) {
touched = true;
if (el.offsetParent !== null && !validate()) {
e.preventDefault();
el.focus();
}
});
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</script>
</div>
</div>

Paramètres

La macro cInputDate permet de générer un champ avec un sélecteur de date. Il est possible d'utiliser un champ HTML5 "date" en remplaçant le type par défaut 'datepicker' par "date"

La macro <@cInputDate /> initialise et affiche le sélecteur de date, en chargeant les fichiers requis.

Configurable dans le BO

Les options peuvent être surchargées pour l'ensemble du site, dans les propriétés du site. Cela consiste à définir les options dans le champ "Configuration par défaut du sélecteur de date". Une option de configuration du sélecteur de date doit être écrite sous forme de texte (clé : valeur) séparé par des virgules.

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

DEPRECATED

Cette approche est toujours possible, mais il est recommandé d'utiliser la macro cInputDate décrite ci-dessus

Le champ avec un sélecteur de date utilise deux macros, avec une macro "cInput" à l'intérieur d'un groupe d'input, la macro "cInputGroup".

Les macros

La macro <@initThemeDatePicker /> initialise le sélecteur de date, en chargeant les fichiers requis.

La macro <@getThemeDatePicker idField='datepickerflat' /> charge le sélecteur de date sur l'input dont l'id est passé dans le paramètre -idField-

Les paramètres de <@getThemeDatePicker idField='datepickerflat' />
  • idField (string) (required) : L'identifiant unique
  • showFormat (string) (default :'')
    optional
    - Format d'affichage tel que 'dd/mm/yyyy', voir la documentation vanillajs-datepicker
  • mindate (string) (default : '')
    optional
    - Date minimale sélectionnable dans le sélecteur de date
  • maxdate (string) (default : '')
    optional
    - Date maximale sélectionnable dans le sélecteur de date
  • defaultDate (string) (default : '')
    optional
    - Date sélectionnée par défaut dans le sélecteur de date
  • mode (string) (default :'single')
    optional
    - Valeur par défaut
  • time (boolean) (default : false)
    optional
    - Indique si le champ est en lecture seule.
  • maxlength ( int / default : 0)
    optional
    - Permet de définir une limite de taille sur la valeur saisie
  • range (string) (default :'')
    optional
    - Message d'aide
  • rangeIdField (string)
    required
    - L'identifiant unique, égal à
  • customArrows ( Array ) ( default : ',' : SVG arrows )

Génère un champ de saisie de date avec intégration optionnelle de Vanilla JS Datepicker, une icône de calendrier et un repli en date HTML5.

  • name (string)
    required
    - l'attribut name de l'input
  • label (string)
    required
    - le label associé à l'input
  • id (string)
    optional
    - l'identifiant de l'input. Par défaut: ''
  • class (string)
    optional
    - Classe CSS pour l'input. Par défaut: ''
  • type (string)
    optional
    - le type de l'input, 'datepicker' pour le datepicker JS ou 'date' pour la date HTML5. Par défaut: 'datepicker'
  • icon (boolean)
    optional
    - affiche une icône de calendrier à droite de l'input. Par défaut: true
  • options (object)
    optional
    - Options de Vanilla JS Datepicker (voir https://mymth.github.io/vanillajs-datepicker/#/). Par défaut: {}
  • value (string)
    optional
    - la valeur par défaut. Par défaut: ''
  • placeholder (string)
    optional
    - le texte du placeholder. Par défaut: ''
  • autocomplete (string)
    optional
    - la valeur de l'attribut autocomplete. Par défaut: ''
  • required (boolean)
    optional
    - marque le champ comme obligatoire. Par défaut: false
  • disabled (boolean)
    optional
    - désactive l'input. Par défaut: false
  • readonly (boolean)
    optional
    - définit l'input en lecture seule. Par défaut: false
  • helpMsg (string)
    optional
    - message d'aide affiché sous l'input. Par défaut: ''
  • errorMsg (string)
    optional
    - message d'erreur affiché en cas d'échec de validation. Par défaut: ''
  • separator (boolean)
    optional
    - séparateur inséré automatiquement lors de la saisie selon le format de date. Si true, le séparateur est inséré automatiquement après le jour et le mois selon le format de date. Par défaut: false
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Date range

macro @cInputDateRange

Génère un champ de saisie de plage de dates avec intégration optionnelle de Vanilla JS Datepicker, icône de calendrier et solution de repli date HTML5.

Exemple

Période donnée

Une erreur est survenue

<@cForm>
<@cRow>
  <@cCol cols='12 col-lg-6'>
    <@cLabel label='Période A' for='dtRangeA11y' />
    <@cInputDateRange id='dtRangeA11yA' name='dateRangeA11yA' />
  </@cCol>
  <@cCol cols='12 col-lg-6'>
    <@cLabel label='Période B' for='dtRangeA11y' />
    <@cInputDateRange id='dtRangeA11yB' name='dateRangeA11yB' helpMsg='Période donnée' />
  </@cCol>
  <@cCol cols='12 col-lg-6'>
    <@cLabel label='Période C avec labels' for='dtRangeLabeled' required=true />
    <@cInputDateRange id='dtRangeLabeled' name='dateRangeLabeled' label=['Début','Fin'] showLabel=[true,true] />
  </@cCol>
  <@cCol cols='12 col-lg-6'>
    <@cLabel label='Période C avec Erreur' for='dtRangeLabeled2' required=true />
    <@cInputDateRange id='dtRangeLabeled2' name='dateRangeLabeled2' label=['Début','Fin'] showLabel=[true,true]  errorMsg='Une erreur est survenue' />
  </@cCol>
</@cRow>
</@cForm>

<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 ">
<label class="form-label visually-hidden" for="dtRangeA11yA_range_start">
#i8n{theme.labelDateStart}
</label>
</div>
<div class="col ">
<label class="form-label visually-hidden" for="dtRangeA11yA_range_end">
#i8n{theme.labelDateEnd}
</label>
</div>
</div>
<div class="row ">
<div class="col ">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeA11yA" id="dtRangeA11yA_range_start" value="">
</div>
</div>
<div class="col ">
<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 dtRangeA11yA" data-mce-svg="paris-icon paris-icon-agenda" aria-labelledby="paris-icon-agenda-paris-title-1400277743328801" focusable="false" role="img">
<title id="paris-icon-agenda-paris-title-1400277743328801"></title>
<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>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('dtRangeA11yA_range_start');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</script>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('dtRangeA11yA_range_end');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</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 ">
<label class="form-label visually-hidden" for="dtRangeA11yB_range_start">
#i8n{theme.labelDateStart}
</label>
</div>
<div class="col ">
<label class="form-label visually-hidden" for="dtRangeA11yB_range_end">
#i8n{theme.labelDateEnd}
</label>
</div>
</div>
<div class="row ">
<div class="col ">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeA11yB" id="dtRangeA11yB_range_start" value="">
</div>
</div>
<div class="col ">
<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 dtRangeA11yB" data-mce-svg="paris-icon paris-icon-agenda" aria-labelledby="paris-icon-agenda-paris-title-1402019900592671" focusable="false" role="img">
<title id="paris-icon-agenda-paris-title-1402019900592671"></title>
<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>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('dtRangeA11yB_range_start');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</script>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('dtRangeA11yB_range_end');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</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 ">
<label class="form-label" for="dtRangeLabeled_range_start">
Début
</label>
</div>
<div class="col ">
<label class="form-label" for="dtRangeLabeled_range_end">
Fin
</label>
</div>
</div>
<div class="row ">
<div class="col ">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeLabeled" id="dtRangeLabeled_range_start" value="">
</div>
</div>
<div class="col ">
<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 dtRangeLabeled" data-mce-svg="paris-icon paris-icon-agenda" aria-labelledby="paris-icon-agenda-paris-title-1404762057856541" focusable="false" role="img">
<title id="paris-icon-agenda-paris-title-1404762057856541"></title>
<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>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('dtRangeLabeled_range_start');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</script>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('dtRangeLabeled_range_end');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</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 decorative" 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 ">
<label class="form-label" for="dtRangeLabeled2_range_start">
Début
</label>
</div>
<div class="col ">
<label class="form-label" for="dtRangeLabeled2_range_end">
Fin
</label>
</div>
</div>
<div class="row ">
<div class="col ">
<div class="input-group">
<input type="text" class=" form-control" name="dateRangeLabeled2" id="dtRangeLabeled2_range_start" value="">
</div>
</div>
<div class="col ">
<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 dtRangeLabeled2" data-mce-svg="paris-icon paris-icon-agenda" aria-labelledby="paris-icon-agenda-paris-title-1412246372384281" focusable="false" role="img">
<title id="paris-icon-agenda-paris-title-1412246372384281"></title>
<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>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('dtRangeLabeled2_range_start');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</script>
<script>
(function() {
function initDateTyping() {
const el = document.getElementById('dtRangeLabeled2_range_end');
if (!el || el.type === 'hidden') return;
// Detect separator and format from locale (e.g. "31/12/2026" → sep="/", parts=[2,2,4])
const yr = new Date().getFullYear();
const lang = document.documentElement.lang || navigator.language;
const localeSample = new Date(yr, 11, 31).toLocaleDateString(lang);
const sep = localeSample.replace(/[0-9]/g, '').charAt(0) || '/';
const partLengths = localeSample.split(sep).map(function(p) { return p.length; });
// Localized format hint, e.g. "JJ/MM/AAAA" (fr) / "DD/MM/YYYY" (en)
const fmtLetters = 'DMY';
const fmtHint = localeSample.replace('31', (fmtLetters.charAt(0) || 'J').repeat(2))
.replace('12', (fmtLetters.charAt(1) || 'M').repeat(2))
.replace(String(yr), (fmtLetters.charAt(2) || 'A').repeat(4));
if (el.placeholder === '') {
el.placeholder = fmtHint.toLowerCase();
}
// Format digits, inserting the separator as soon as a part is complete ("01" → "01/")
function formatWithSep(digits) {
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 (chunk.length === partLengths[i] && i < partLengths.length - 1 && di >= digits.length) {
result += sep;
break;
}
}
return result;
}
// Track previous value so the user can delete freely
let prevLen = el.value.length;
el.addEventListener('input', function() {
const curLen = el.value.length;
const isDeleting = curLen < prevLen;
prevLen = curLen;
if (isDeleting) return;
const digits = el.value.replace(/[^0-9]/g, '');
const result = formatWithSep(digits);
if (result !== el.value) {
el.value = result;
prevLen = result.length;
el.setSelectionRange(result.length, result.length);
// Notify listeners (datepicker hidden-field sync, live validation)
el.dispatchEvent(new Event('input', { bubbles: true }));
}
});
el.addEventListener('changeDate', function() { prevLen = el.value.length; });
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDateTyping);
} else {
initDateTyping();
}
})();
</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 || '|', // Délimiteur pour multidate
    • 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

Génère un champ de saisie de créneau horaire avec des heures de début et de fin optionnelles, des incréments de pas et des labels.

Exemple

Meeting error *

An error occurred!

An error occurred!

An error occurred!

Meeting time *

Please select a meeting time

Choose a time slot

Book an appointment for the chosen time slot

<@cForm>
<@cInputTimeSlot name='error' legend='Meeting error' beginHour='08:00' endHour='18:00' step=900 required=true errorMsg='An error occurred!' />
<@cInputTimeSlot name='meeting' legend='Meeting time' beginHour='08:00' endHour='18:00' step=900 required=true helpMsg='Please select a meeting time' />
<@cInputTimeSlot name='slot' beginHour='09:00' endHour='17:00' labelFrom='Start Time' labelTo='End Time' showLabel=true />
<@cInputTimeSlot name='creneau' legend='Choose a time slot' helpMsg='Book an appointment for the chosen time slot' />
</@cForm>

<form method="post">
<fieldset id="fieldset-error" role="group" aria-labelledby="legend-error">
<legend id="legend-error">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 decorative" data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>An error occurred!</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 decorative" data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>An error occurred!</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 decorative" data-mce-svg="paris-icon paris-icon-alert-error" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-alert-error"></use>
</svg>An error occurred!</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">Meeting time <span class="main-danger-color" tabindex="-1" title="Mandatory">*</span></legend>
<p class="form-text " id="help_meeting">
Please select a meeting time</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">Choose a time slot</legend>
<p class="form-text " id="help_creneau">
Book an appointment for the chosen time slot</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

Génère un sélecteur de créneau horaire avec deux champs d'heure (début et fin) encadrés dans un fieldset, incluant la prise en charge d'un polyfill navigateur.

  • name (string)
    required
    - le préfixe de l'attribut name pour les champs d'heure (génère {name}_begin et {name}_end)
  • legend (string)
    optional
    - la légende/le titre du fieldset. Par défaut: ''
  • legendClass (string)
    optional
    - classe CSS pour la légende du fieldset. Par défaut: ''
  • labelFrom (string)
    optional
    - label du champ d'heure de début. Par défaut: 'From'
  • labelTo (string)
    optional
    - label du champ d'heure de fin. Par défaut: 'To'
  • showLabel (boolean)
    optional
    new
    - indique si les labels des champs d'heure doivent être affichés. Par défaut: false
  • beginHour (string)
    optional
    - valeur de l'heure de début par défaut. Par défaut: '00:00'
  • endHour (string)
    optional
    - valeur de l'heure de fin par défaut. Par défaut: '23:59'
  • step (number)
    optional
    - incrément du pas en secondes pour le champ d'heure (par exemple, 900 pour des intervalles de 15 minutes). Par défaut: 0
  • btnAction (string)
    optional
    - sélecteur CSS du bouton de soumission du formulaire, utilisé par le polyfill. Par défaut: '[name="action_doSaveStep"]'
  • autocomplete (string)
    optional
    - la valeur de l'attribut autocomplete. Par défaut: ''
  • html5Required (boolean)
    optional
    - utilise l'attribut HTML5 required. Par défaut: false
  • required (boolean)
    optional
    - marque les champs comme obligatoires. Par défaut: false
  • disabled (boolean)
    optional
    - désactive les champs. Par défaut: false
  • readonly (boolean)
    optional
    - définit les champs en lecture seule. Par défaut: false
  • helpMsg (string)
    optional
    - message d'aide pour le fieldset. Par défaut: ''
  • errorMsg (string)
    optional
    - message d'erreur en cas d'échec de la validation. Par défaut: ''
  • hideErrorMsg (boolean)
    optional
    - masque l'affichage du message d'erreur. Par défaut: true
  • id (string)
    optional
    - l'identifiant du fieldset. Par défaut: ''
  • class (string)
    optional
    - classe CSS pour les champs d'heure. Par défaut: 'form-control'
  • params (string)
    optional
    - attributs HTML supplémentaires pour le fieldset. Par défaut: ''

Sélecteur de quantité

macro @cQuantityPicker

Génère un sélecteur de quantité avec des boutons d'incrémentation/décrémentation et un champ numérique, prenant en charge les contraintes min/max.

Exemple

Example information

<@cForm>
<@cRow>
    <@cCol>
		<@cQuantityPicker name='seats' label='Number of seats' showLabel=true minQty='1' maxQty='20' required=true />
    </@cCol>
</@cRow>
<@cRow>
    <@cCol>
        <@cLabel label='Quantity' for='quantity' />
        <@cQuantityPicker name='quantity' minQty='0' maxQty='10' helpMsg='Example information' />
    </@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">
Quantity
</label>
<p class="form-text " id="help_seats">
Example information</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

Génère un sélecteur de quantité avec des boutons d'incrémentation/décrémentation et un champ numérique, prenant en charge les contraintes min/max.

  • name (string)
    required
    - l'attribut name du champ
  • label (string)
    optional
    - le texte du label du sélecteur. Par défaut: 'Choose a quantity'
  • showLabel (boolean)
    optional
    - affiche ou masque le label. Par défaut: false
  • labelDecrease (string)
    optional
    - label accessible pour le bouton de diminution. Par défaut: 'Remove one unit'
  • labelIncrease (string)
    optional
    - label accessible pour le bouton d'augmentation. Par défaut: 'Add one unit'
  • minQty (string)
    optional
    - valeur minimale sélectionnable. Par défaut: '0'
  • maxQty (string)
    optional
    - valeur maximale sélectionnable. Par défaut: '10'
  • id (string)
    optional
    - l'identifiant du champ. Par défaut: ''
  • class (string)
    optional
    - classe CSS pour le conteneur du sélecteur. Par défaut: ''
  • required (boolean)
    optional
    - marque le champ comme requis. Par défaut: false
  • disabled (boolean)
    optional
    - désactive le champ et les boutons. Par défaut: false
  • helpMsg (string)
    optional
    - message d'aide affiché sous le sélecteur. Par défaut: ''
  • errorMsg (string)
    optional
    - message d'erreur affiché en cas d'échec de validation. Par défaut: ''

Étape terminée

macro @cStepDone

Génère une étape terminée dans un formulaire multi-étapes, affichant une coche, un contenu récapitulatif et un bouton de modification pour revenir à l'étape.

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

Génère une étape terminée dans un formulaire multi-étapes, affichant une coche, un contenu récapitulatif et un bouton de modification pour revenir à l'étape.

  • step (string)
    required
    - le numéro de l'étape
  • title (string)
    required
    - le titre de l'étape
  • idx (number)
    required
    - l'index de l'étape utilisé pour la valeur de l'action de modification
  • titleLevel (number)
    optional
    - Niveau de titre HTML pour la balise de titre. Par défaut: 2
  • actionName (string)
    optional
    - nom de l'action pour le bouton de modification/accès à l'étape. Par défaut: 'action_doGoToStep'
  • actionLabel (string)
    optional
    - label du bouton de modification. Par défaut: ''
  • actionAriaLabelKey (string)
    optional
    - clé i18n pour le label ARIA du bouton de modification. Par défaut: 'portal.theme.ariaLabelUpdate'
  • actionHref (string)
    optional
    - URL du lien de modification (utilisé à la place du bouton de soumission). Par défaut: ''
  • actionClass (string)
    optional
    - Classe CSS du bouton/lien de modification. Par défaut: ''
  • actionParams (string)
    optional
    - attributs HTML supplémentaires pour le bouton de modification. Par défaut: ''
  • class (string)
    optional
    - Classe CSS de la section d'étape. Par défaut: ''
  • id (string)
    optional
    - l'identifiant de l'élément. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Étape courante

macro @cStepCurrent

Génère un composant de formulaire étape par étape avec des boutons de navigation et une fonctionnalité de sauvegarde optionnelle.

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="">
</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-none d-sm-block">
<ul class="list-unstyled" >
<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 class="step-current-toolbar d-block d-sm-none">
<ul class="list-unstyled" >
<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>
<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>
</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-none d-sm-block">
<ul class="list-unstyled" >
<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 class="step-current-toolbar d-block d-sm-none">
<ul class="list-unstyled" >
<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

Génère l'étape active courante dans un formulaire multi-étapes, incluant le titre, les boutons de navigation (suivant, précédent, enregistrer, sauvegarder) et les avertissements de champs obligatoires.

  • step (string)
    required
    - le numéro de l'étape
  • title (string)
    required
    - le titre de l'étape
  • showTitle (boolean)
    optional
    - affiche l'en-tête du titre de l'étape. Par défaut: true
  • titleLevel (number)
    optional
    - niveau de titre HTML pour la balise de titre. Par défaut: 2
  • formId (string)
    optional
    new
    - l'identifiant du formulaire à valider. Par défaut: 'form-validate'
  • actionNextStep (string)
    optional
    - nom de l'action pour le bouton suivant. Par défaut: ''
  • titleNextStep (string)
    optional
    - attribut title du bouton suivant. Par défaut: ''
  • labelNextStep (string)
    optional
    - label du bouton suivant. Par défaut: ''
  • actionPrevStep (string)
    optional
    - nom de l'action pour le bouton précédent. Par défaut: ''
  • titlePrevStep (string)
    optional
    - attribut title du bouton précédent. Par défaut: ''
  • labelPrevStep (string)
    optional
    - label du bouton précédent. Par défaut: ''
  • actionSaveStep (string)
    optional
    - nom de l'action pour le bouton enregistrer. Par défaut: ''
  • titleSaveStep (string)
    optional
    - attribut title du bouton enregistrer. Par défaut: ''
  • labelSaveStep (string)
    optional
    - label du bouton enregistrer. Par défaut: ''
  • actionSaveForBackUpStep (string)
    optional
    - nom de l'action pour le bouton sauvegarder. Par défaut: ''
  • titleSaveForBackUpStep (string)
    optional
    - attribut title du bouton sauvegarder. Par défaut: ''
  • labelForBackUpStep (string)
    optional
    - label du bouton sauvegarder. Par défaut: 'Save progress'
  • actionResetBackUpStep (string)
    optional
    - nom de l'action pour le bouton de réinitialisation de la sauvegarde. Par défaut: ''
  • titleResetBackUpStep (string)
    optional
    - attribut title du bouton de réinitialisation de la sauvegarde. Par défaut: ''
  • labelResetBackUpStep (string)
    optional
    - label du bouton de réinitialisation de la sauvegarde. Par défaut: 'Delete progress'
  • showPrevStep (boolean)
    optional
    - affiche le bouton précédent. Par défaut: true
  • hasSteps (boolean)
    optional
    - affiche le numéro de l'étape dans l'en-tête. Par défaut: true
  • hasMandatory (boolean)
    optional
    - ajoute les avertissements de champs obligatoires. Par défaut: true
  • class (string)
    optional
    - classe CSS pour la section de l'étape. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Groupe d'étapes

macro @cStepGroup

Génère un groupe de champs au sein d'une étape, optionnellement itérable avec des contrôles d'ajout/suppression, en utilisant soit un fieldset, soit un conteneur div.

Exemple

Step content: With help tooltip

2 File

Fields followed by an asterisk * are mandatory.

Information
Lorem ipsum Help

Enter your last name

Enter your first name

Information without Fieldset

Lorem ipsum Help

Enter your last name

Enter your first name

Step content with at least one iteration

Information with iteration (2)

Enter your last name

Enter your first name

Fields followed by an asterisk * are mandatory.

Remove the saved step

<@cText class="lead">Step content: With help tooltip</@cText>
<@cStepCurrent step='2' title='File' actionNextStep='valid' >
    <@cStepGroup title='Information' help='Lorem ipsum Help'>
        <@cRow>
            <@cCol>
                <@cField label='Last name' for='name' labelData='<small class="text-muted">(Family name)</small>'>
                    <@cFormHelp id='name' label='Enter your last name' />
                    <@cInput name='name' placeholder='Example: Durand' />
                </@cField>
            </@cCol>
            <@cCol>
                <@cField label='First name' for='firstname'>
                    <@cFormHelp id='firstname' label='Enter your first name' />
                    <@cInput name='firstname' required=false />
                </@cField>
            </@cCol>
        </@cRow>
    </@cStepGroup>
	<@cStepGroup title='Information without Fieldset' isFieldset=false titleClass='mt-0' help='Lorem ipsum Help'>
        <@cRow>
            <@cCol>
                <@cField label='Last name' for='name' labelData='<small class="text-muted">(Family name)</small>'>
                    <@cFormHelp id='name' label='Enter your last name' />
                    <@cInput name='name' placeholder='Example: Durand' />
                </@cField>
            </@cCol>
            <@cCol>
                <@cField label='First name' for='firstname'>
                    <@cFormHelp id='firstname' label='Enter your first name' />
                    <@cInput name='firstname' required=false />
                </@cField>
            </@cCol>
        </@cRow>
    </@cStepGroup>
    <@cText class="lead">Step content with at least one iteration</@cText>
    <@cStepGroup title='Information with iteration' iterable=true iteration=1>
        <@cRow>
            <@cCol>
                <@cField label='Last name' for='name635' labelData='<small class="text-muted">(Family name)</small>'>
                    <@cFormHelp id='name635' label='Enter your last name' />
                    <@cInput name='name635' placeholder='Example: Durand' />
                </@cField>
            </@cCol>
            <@cCol>
                <@cField label='First name' for='firstname-2'>
                    <@cFormHelp id='firstname-2' label='Enter your first name' />
                    <@cInput name='firstname-2' required=false />
                </@cField>
            </@cCol>
        </@cRow>
    </@cStepGroup>
</@cStepCurrent>

<p class="lead">
Step content: With help tooltip</p>
<section class="step step-current " id="current_step">
<div class="step-title">
<div class="container ">
<h2 class="title h3" data-step="2" title="File - current step" aria-current="step" tabindex="0">
<span class="step-number">
2</span>
<span>
File</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-1507553832189421" role="group" aria-labelledby="legend-id-1507553832189421">
<legend id="legend-id-1507553832189421">
<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">
Last name <small class="text-muted">(Family name)</small>
</label>
<p class="form-text " id="help_name">
Enter your last name</p>
<input type="text" class=" form-control" name="name" id="name" value="" placeholder="Example: Durand">
</div>
<div class="col ">
<label class="form-label" for="firstname">
First name
</label>
<p class="form-text " id="help_firstname">
Enter your first name</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-1511605989453291">
<h3 class="mt-0 mt-0 group-title" tabindex="-1" >
Information without 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">
Last name <small class="text-muted">(Family name)</small>
</label>
<p class="form-text " id="help_name">
Enter your last name</p>
<input type="text" class=" form-control" name="name" id="name" value="" placeholder="Example: Durand">
</div>
<div class="col ">
<label class="form-label" for="firstname">
First name
</label>
<p class="form-text " id="help_firstname">
Enter your first name</p>
<input type="text" class=" form-control" name="firstname" id="firstname" value="">
</div>
</div>
</div>
</div>
<p class="lead">
Step content with at least one iteration</p>
<div class="step-group">
<fieldset class="w-100 flex-fill " id="fieldset-id-1515658146717161" role="group" aria-labelledby="legend-id-1515658146717161">
<legend class="d-flex justify-content-between align-items-center" id="legend-id-1515658146717161">
<span class="h3 group-title">
Information with iteration (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 decorative" 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 decorative" 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">
Last name <small class="text-muted">(Family name)</small>
</label>
<p class="form-text " id="help_name635">
Enter your last name</p>
<input type="text" class=" form-control" name="name635" id="name635" value="" placeholder="Example: Durand">
</div>
<div class="col ">
<label class="form-label" for="firstname-2">
First name
</label>
<p class="form-text " id="help_firstname-2">
Enter your first name</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-none d-sm-block">
<ul class="list-unstyled" >
<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 class="step-current-toolbar d-block d-sm-none">
<ul class="list-unstyled" >
<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

Génère un groupe de champs au sein d'une étape, optionnellement itérable avec des contrôles d'ajout/suppression, en utilisant soit un fieldset, soit un conteneur div.

  • title (string)
    required
    - le titre du groupe. Si vide, un div est utilisé à la place d'un fieldset
  • iterable (boolean)
    optional
    - active les contrôles d'itération ajout/suppression. Par défaut: false
  • iteration (number)
    optional
    - le numéro de l'itération courante. Par défaut: 0
  • iterationMax (number)
    optional
    - nombre maximum d'itérations autorisées. Par défaut: 10
  • labelAddIteration (string)
    optional
    - libellé du bouton d'ajout d'itération. Par défaut: ''
  • labelDelIteration (string)
    optional
    - libellé du bouton de suppression d'itération. Par défaut: ''
  • headerParams (string)
    optional
    - attributs HTML supplémentaires pour l'en-tête du groupe. Par défaut: ''
  • isFieldset (boolean)
    optional
    - utilise un élément fieldset comme parent. Par défaut: false
  • noFieldsetTitleLevel (number)
    optional
    - niveau de titre lorsqu'un fieldset n'est pas utilisé. Par défaut: 3
  • titleClass (string)
    optional
    - classe CSS de l'élément de titre. Par défaut: 'h3'
  • help (string)
    optional
    - contenu d'aide affiché dans un accordéon. Par défaut: ''
  • class (string)
    optional
    - classe CSS du conteneur du groupe. Par défaut: ''
  • id (string)
    optional
    - l'identifiant de l'élément. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Étape suivante

macro @cStepNext

Génère une bannière pour une étape future (à venir) dans un formulaire multi-étapes, affichant le numéro et le titre de l'étape dans un état atténué.

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

Génère une bannière pour une étape future (à venir) dans un formulaire multi-étapes, affichant le numéro et le titre de l'étape dans un état atténué.

  • step (string)
    required
    - le numéro de l'étape
  • title (string)
    required
    - le titre de l'étape
  • titleLevel (number)
    optional
    - Niveau de titre HTML pour la balise de titre. Par défaut: 2
  • class (string)
    optional
    - Classe CSS de la section d'étape. Par défaut: ''
  • id (string)
    optional
    - l'identifiant de l'élément. Par défaut: ''
  • params (string)
    optional
    - attributs HTML supplémentaires. Par défaut: ''

Lien

macro @cLink

Génère un élément ancre HTML avec un label, un titre optionnel, un comportement de cible et le positionnement du contenu imbriqué. Permet une mise en forme en bouton via des classes CSS.

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 decorative" 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 decorative" 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

Génère un élément ancre HTML avec un label, un titre optionnel, un comportement de cible et le positionnement du contenu imbriqué. Permet une mise en forme en bouton via des classes CSS.

  • href (string)
    required
    - URL vers laquelle pointe le lien
  • label (string)
    required
    - Texte du label affiché à l'intérieur du lien
  • title (string)
    optional
    - Valeur de l'attribut title du lien. Par défaut: ''
  • nestedPos (string)
    optional
    - Position du contenu imbriqué par rapport au label ('before' ou 'after'). Par défaut: 'after'
  • target (string)
    optional
    - Attribut target pour le comportement d'ouverture du lien ('_blank', '_top', '_parent', ou un id de frame). Par défaut: ''
  • showTarget (boolean)
    optional
    - Si true, affiche une icône lorsque target vaut '_blank'. Par défaut: false
  • class (string)
    optional
    - Classe(s) CSS appliquée(s) à l'élément lien. Utilisez 'btn btn-primary' pour une mise en forme en bouton. Par défaut: ''
  • id (string)
    optional
    - Identifiant unique de l'élément lien. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour l'élément lien. Par défaut: ''

Liste

macro @cList

Doc Bootstrap Liste

Génère un composant de liste personnalisable prenant en charge les styles de liste par défaut, extensible ("more") et de téléchargement de fichiers.

Exemple

List of links

  • Paris.fr page dedicated to town planning rules
  • View the PLU
  • Discover Paris.fr

With class "list-highlight-secondary"

  • Paris.fr page dedicated to town planning rules
  • View the PLU
  • Discover Paris.fr

List of files

  • Town planning rules.pdf
    80ko
  • PLU.docx
    80ko

With class "list-highlight-secondary"

  • Town planning rules.pdf
    80ko
  • PLU.docx
    80ko

List of links

  • All about the theme
  • All about Lutece
  • All about my mother
  • All about the theme
  • All about Lutece
  • All about my mother
  • Show more

<#assign ls = [
{"title":"Paris.fr page dedicated to town planning rules", "url":"https://paris.fr", "target":"_blank"},
{"title":"View the PLU", "url":"https://www.paris.fr/municipalite", "target":"_blank", "current": 0}
]>
<@cCard title='List of links '>
    <@cList ls>
    <#-- <@cBadge label='optional' class='bg-warning' hasp=false /> -->
    <@chItem>
        <@cLink href='http://paris.fr' target='_blank' label='Discover Paris.fr' title='City of Paris website' />
    </@chItem>
    </@cList>
     <@cText>With class "list-highlight-secondary"</@cText>
    <@cList items=ls class='list-highlight-secondary'>
    <#-- <@cBadge label='optional' class='bg-warning' hasp=false /> -->
    <@chItem>
        <@cLink href='http://paris.fr' target='_blank' label='Discover Paris.fr' title='City of Paris website' />
    </@chItem>
    </@cList>
</@cCard>
<#assign lsFiles = [
{"title":"Town planning rules.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='List of files '>
    <@cList items=lsFiles type='files' />
    <@cText>With class "list-highlight-secondary"</@cText>
    <@cList items=lsFiles type='files' class='list-highlight-secondary' />
</@cCard>
<#assign lsall = [
	{"title":"All about the theme", "url":"https://teleservices2.rec.apps.paris.fr/forms", "target":"_blank"},
	{"title":"All about Lutece", "url":"https://lutece.paris.fr/", "target":"","current": 0},
	{"title":"All about my mother", "url":"https://www.allocine.fr/film/fichefilm_gen_cfilm=7868.html", "target":"", "current": 0}
	{"title":"All about the theme", "url":"https://teleservices2.rec.apps.paris.fr/forms", "target":"_blank"},
	{"title":"All about Lutece", "url":"https://lutece.paris.fr/", "target":"","current": 0},
	{"title":"All about my mother", "url":"https://www.allocine.fr/film/fichefilm_gen_cfilm=7868.html", "target":"", "current": 0}
]>
<@cCard title='List of links'>
    <@cList items=lsall type='more' itemsShown=3 />
</@cCard>

<div class="card ">
<div class="card-body ">
<h3 class="card-title">
List of links </h3>
<ul class="custom-list list-default" >
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Paris.fr page dedicated to town planning rules" target="_blank">
<span>Paris.fr page dedicated to town planning rules </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://www.paris.fr/municipalite" title="View the PLU" target="_blank">
<span>View the PLU </span>
</a>
</li>
<li>
<a href="http://paris.fr" class="" title="City of Paris website [New window]" target="_blank" >
<span class="link-label">Discover Paris.fr</span>
</a>
</li>
</ul>
<p>
With class "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="Paris.fr page dedicated to town planning rules" target="_blank">
<span>Paris.fr page dedicated to town planning rules </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://www.paris.fr/municipalite" title="View the PLU" target="_blank">
<span>View the PLU </span>
</a>
</li>
<li>
<a href="http://paris.fr" class="" title="City of Paris website [New window]" target="_blank" >
<span class="link-label">Discover Paris.fr</span>
</a>
</li>
</ul>
</div>
</div>
<div class="card ">
<div class="card-body ">
<h3 class="card-title">
List of files </h3>
<ul class="custom-list list-files" >
<li class="custom-list-item ">
<a class="list-info" href="https://paris.fr" title="Town planning rules.pdf" target="_blank" download="Town_planning_rules.pdf">
<span>Town planning rules.pdf </span>
<div class="files-info">
<small class='fw-bold'>80ko</small>
<svg class="paris-icon paris-icon-file-text ms-m main-color decorative" 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 decorative" 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>
With class "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="Town planning rules.pdf" target="_blank" download="Town_planning_rules.pdf">
<span>Town planning rules.pdf </span>
<div class="files-info">
<small class='fw-bold'>80ko</small>
<svg class="paris-icon paris-icon-file-text ms-m main-color decorative" 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 decorative" 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">
List of links</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="All about the theme" target="_blank">
<span>All about the theme </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://lutece.paris.fr/" title="All about Lutece" >
<span>All about 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="All about my mother" >
<span>All about my mother </span>
</a>
</li>
<li class="custom-list-item ">
<a class="list-info" href="https://teleservices2.rec.apps.paris.fr/forms" title="All about the theme" target="_blank">
<span>All about the theme </span>
</a>
</li>
<li class="custom-list-item extra hidden">
<a class="list-info" href="https://lutece.paris.fr/" title="All about Lutece" >
<span>All about 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="All about my mother" >
<span>All about my mother </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

Génère un composant de liste personnalisable prenant en charge les styles de liste par défaut, extensible ('more') et de téléchargement de fichiers.

  • items (list)
    required
    - Liste d'objets item avec les propriétés: url, title, target, class, size (pour les fichiers)
  • type (string)
    optional
    - Type d'affichage de la liste ('default', 'more', 'files'). Par défaut: 'default'
  • itemsShown (number)
    optional
    - Nombre d'items visibles avant d'afficher le bouton 'voir plus' (utilisé avec type='more'). Par défaut: 0
  • indexShown (boolean)
    optional
    - Indique si l'index de l'item doit être affiché. Par défaut: false
  • labelMore (string)
    optional
    - Label du bouton 'voir plus'. Par défaut: i18n("portal.theme.labelShowMore")
  • labelClose (string)
    optional
    - Label du bouton 'fermer'. Par défaut: i18n("portal.theme.labelClose")
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s). Par défaut: ''
  • id (string)
    optional
    - Attribut HTML id. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires. Par défaut: ''

Vous pouvez changer la puce d'un item de liste en ajoutant un attribut "class" à chaque item. Le nom de la classe doit être l'une des valeurs disponibles suivantes: arrow, arobase, screen. Pour étendre la liste des illustrations, ajoutez le code suivant à un fichier CSS:

    
    /* 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

Génère un élément de liste avec un lien optionnel. Peut être utilisé dans la macro @cList si l'on n'utilise pas de JSON pour fournir les items de liste.

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
    - Défaut '', 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

Cliquez 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='Modal example' dismissLabel='Close' 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>Modal content</@cText>
</@cModal>
<@cModal title='Modal example' dismissLabel='Cancel' id='example2' footer='<button class="btn btn-danger m-xxs" type="submit"><span class="btn-label">Text example</span></button>'>
<@cText>Modal content</@cText>
</@cModal>
<@cModal title='Modal example' static=true scrollable=true dismissible=false dismissLabel='Cancel' id='example3' footer='<button class="btn btn-danger m-xxs" type="submit"><span class="btn-label">Text example</span></button>'>
<@cText>Press the "Esc" key to continue.</@cText>
<@cBtn label='Close Modal 3' class='secondary m-xxs' params=' data-bs-dismiss="modal"'/>
</@cModal>

<p class="text-cap">
Cliquez 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

Génère une boîte de dialogue modale Bootstrap avec un en-tête, un corps et un pied de page pour afficher des contenus en surimpression sur les pages du skin.

  • title (string)
    required
    - Titre affiché dans l'en-tête de la fenêtre modale
  • id (string)
    required
    - Identifiant unique de la fenêtre modale (utilisé pour le ciblage avec data-bs-target)
  • size (string)
    optional
    - Suffixe de classe de taille de la fenêtre modale ('sm', 'lg', 'xl'). Par défaut: 'lg'
  • static (boolean)
    optional
    - Indique si l'arrière-plan est statique (empêche la fermeture au clic à l'extérieur). Par défaut: false
  • pos (string)
    optional
    - Position de la fenêtre modale ('centered'). Par défaut: 'centered'
  • role (string)
    optional
    - Attribut ARIA role de la fenêtre modale. Par défaut: ''
  • scrollable (boolean)
    optional
    - Indique si le corps de la fenêtre modale est défilable. Par défaut: false
  • dismissible (boolean)
    optional
    - Indique s'il faut afficher le bouton de fermeture dans l'en-tête et le pied de page. Par défaut: true
  • dismissLabel (string)
    optional
    - Label du bouton de fermeture. Par défaut: ''
  • footer (string)
    optional
    - Contenu HTML du pied de page de la fenêtre modale (par exemple, boutons de soumission). Par défaut: ''
  • titleLevel (number)
    optional
    - Niveau de titre de l'élément titre. Par défaut: 1
  • class (string)
    optional
    - Classes CSS supplémentaires pour la fenêtre modale. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires. Par défaut: ''

Modal example

Modal content

Modal example

Modal content

Modal example

Press the "Esc" key to continue.

Panneau coulissant

macro @cOffcanvas

Doc Bootstrap Panneau coulissant

Génère un composant de panneau coulissant avec un bouton de déclenchement personnalisable, une taille, une position et un chargement de contenu via AJAX ou iframe.

Exemple

Open panel Open panel

Side Panel

Panel content goes here.

View search View search

Search

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='searchPanel' btnTitle='View search' position='end' size='half' targetUrl='jsp/site/Portal.jsp?page=search' targetElement='#main' title='Search'>
	<@cBlock>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 mt-0 ms-s" id="sidePanelLabel">Side Panel</h2>
<button type="button" class="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 decorative" 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 px-xl">
<p>
Panel content goes here.</p>
</div>
</div>
<a id="btn-searchPanel" class="btn btn-primary " onclick="event.preventDefault();" data-bs-toggle="offcanvas" data-bs-scroll=false data-bs-backdrop="true" href="#searchPanel" role="button" aria-controls="searchPanel" title="View search">
View search
<span class="visually-hidden">View search</span>
</a>
<div class="offcanvas offcanvas-end w-half" data-lutece-load-content-url="jsp/site/Portal.jsp?page=search" data-lutece-load-content-target="#main" data-lutece-redirectForm=true tabindex="-1" id="searchPanel" aria-labelledby="searchPanelLabel">
<div class="offcanvas-header border-bottom d-flex justify-content-between align-items-center">
<h2 class="h4 offcanvas-title p-0 mt-0 ms-s" id="searchPanelLabel">Search</h2>
<button type="button" class="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 decorative" 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-searchPanel" class="offcanvas-body text-break px-xl">
<div>
Loading...</div>
</div>
</div>
<script type="module">
import LuteceBSOffCanvas from "./themes/shared/modules/bootstrap/luteceBSOffCanvas.js";
new LuteceBSOffCanvas(`searchPanel`);
</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 decorative" 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 mt-0 ms-s" id="notificationsLabel">Your notifications</h2>
<button type="button" class="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 decorative" 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 px-xl">
<p>
You have 3 new notifications.</p>
</div>
</div>

Paramètres

Génère un panneau coulissant offcanvas Bootstrap avec un bouton de déclenchement optionnel, prenant en charge le chargement de contenu via AJAX et iframe.

  • id (string)
    required
    - L'identifiant unique du composant offcanvas
  • position (string)
    optional
    - Direction d'apparition ('start', 'end', 'top', 'bottom'). Par défaut: 'end'
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour l'élément offcanvas. Par défaut: ''
  • title (string)
    optional
    - Titre affiché dans l'en-tête de l'offcanvas. Par défaut: ''
  • btnTitle (string)
    optional
    - Texte du bouton de déclenchement (le bouton n'est rendu que s'il est défini). Par défaut: ''
  • btnColor (string)
    optional
    - Variante de couleur Bootstrap du bouton de déclenchement. Par défaut: 'primary'
  • btnTitleShow (boolean)
    optional
    - Indique s'il faut afficher visuellement le texte du titre du bouton. Par défaut: true
  • btnIcon (string)
    optional
    - Nom de l'icône Paris pour le bouton de déclenchement. Par défaut: ''
  • btnClass (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le bouton de déclenchement. Par défaut: ''
  • bodyClass (string)
    optional
    - Classe(s) CSS supplémentaire(s) pour le corps de l'offcanvas. Par défaut: ''
  • backdrop (string)
    optional
    - Indique s'il faut afficher un arrière-plan ('true' ou 'false'). Par défaut: 'true'
  • size (string)
    optional
    - Suffixe de classe de largeur ('full', 'half', 'auto', 'sm'). Par défaut: 'auto'
  • btnSize (string)
    optional
    - Suffixe de classe de taille de bouton Bootstrap. Par défaut: ''
  • targetUrl (string)
    optional
    - URL depuis laquelle charger le contenu via AJAX à l'ouverture. Par défaut: ''
  • targetElement (string)
    optional
    - Identifiant de l'élément dans lequel charger le contenu AJAX. Par défaut: ''
  • useIframe (boolean)
    optional
    - Indique s'il faut charger le contenu via iframe au lieu d'AJAX. Par défaut: false
  • redirectForm (boolean)
    optional
    - Indique s'il faut rediriger les soumissions de formulaire. Par défaut: true
  • badgeContent (string)
    optional
    - Contenu textuel d'un badge sur le bouton de déclenchement. Par défaut: ''
  • badgeColor (string)
    optional
    - Couleur Bootstrap du badge. Par défaut: ''

Pagination

macro @cPagination

Doc Bootstrap Pagination

Génère un composant de pagination de navigation à partir d'un objet Paginator Lutece pour parcourir un contenu paginé sur les pages du skin.

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 Previous" data-mce-svg="paris-icon paris-icon-arrow-left" aria-labelledby="paris-icon-arrow-left-paris-title-1728592280008091" focusable="false" role="img">
<title id="paris-icon-arrow-left-paris-title-1728592280008091"></title>
<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 of 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 of 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 Next" data-mce-svg="paris-icon paris-icon-arrow-right" aria-labelledby="paris-icon-arrow-right-paris-title-1736944437271961" focusable="false" role="img">
<title id="paris-icon-arrow-right-paris-title-1736944437271961"></title>
<use href="#paris-icon-arrow-right"></use>
</svg> </a>
</li>
</ul>
</nav>

Paramètres

Génère un composant de pagination de navigation à partir d'un objet Paginator Lutece pour parcourir un contenu paginé sur les pages du skin.

  • paginator (object)
    required
    - Objet Paginator Lutece contenant les liens de pages, la page courante et le nombre de pages
  • label (string)
    optional
    - Libellé accessible pour l'élément nav. Par défaut: 'Pagination'
  • fragment (string)
    optional
    - Fragment d'URL ajouté aux liens de pagination (ex.: identifiant d'ancre). Par défaut: ''
  • class (string)
    optional
    - Classes CSS supplémentaires. Par défaut: ''
  • id (string)
    optional
    - Attribut id HTML. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires. Par défaut: ''

Popover

macro @cPopover

Doc Bootstrap Popover

Génère un composant popover à l'aide des attributs Bootstrap. Pour que la charte du thème soit respectée, il faut utiliser la classe "theme-popover" avec le paramètre "data-bs-custom-class".

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="theme-popover"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="theme-popover"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="theme-popover"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' 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="theme-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="theme-popover"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="theme-popover"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="theme-popover"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 </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="theme-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.

    Pour avoir la charte du thème il faut utiliser la classe "theme-popover"

    .
  • data-bs-title (string)
    optionnal
    - définit le titre du popover
  • data-bs-content (string)
    optionnal
    - définit le texte du contenu du popover
  • data-bs-html (string)
    optionnal
    - 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

Information

Pour des raisons d'accessibilité le paramètre "btn-trigger" est forcé à "hover" et non pas "click" qui est le fonctionnement par défaut de Bootstrap.

Barre de progression

macro @cProgress

Doc Bootstrap Barre de progression

Génère une barre de progression Bootstrap avec une intégration optionnelle au gestionnaire de progression Lutece pour le suivi des opérations de longue durée.

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

Génère une barre de progression Bootstrap avec une intégration optionnelle au gestionnaire de progression Lutece pour le suivi des opérations de longue durée.

  • label (string)
    required
    - Label accessible affiché au-dessus de la barre de progression
  • labelClass (string)
    optional
    - Classe CSS de l'élément label. Par défaut: ''
  • class (string)
    optional
    - Classes CSS supplémentaires pour le conteneur de progression. Par défaut: ''
  • color (string)
    optional
    - Couleur Bootstrap de la barre de progression. Par défaut: 'primary'
  • id (string)
    optional
    - Attribut HTML id du conteneur. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires. Par défaut: ''
  • value (number)
    optional
    - Valeur de progression actuelle. Par défaut: 0
  • min (number)
    optional
    - Valeur minimale. Par défaut: 0
  • max (number)
    optional
    - Valeur maximale. Par défaut: 100
  • text (string)
    optional
    - Texte personnalisé affiché à l'intérieur de la barre de progression. Par défaut: ''
  • progressId (string)
    optional
    - HTML id de l'élément barre de progression. Par défaut: 'progressbar'
  • token (string)
    optional
    - Token du flux du gestionnaire de progression Lutece pour les mises à jour en direct. Par défaut: ''
  • role (string)
    optional
    - Attribut ARIA role. Par défaut: 'progressbar'
  • showReport (boolean)
    optional
    - Indique s'il faut afficher un rapport de progression sous la barre (nécessite token). Par défaut: false
  • intervalTime (number)
    optional
    - Intervalle de rafraîchissement en millisecondes pour les mises à jour de progression (nécessite token). Par défaut: 2000

Information avec étapes

macro @cInfoStep

Génère un conteneur d'étapes informatives pour présenter graphiquement des étapes.

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" >
<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 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">
<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

Génère un scrollspy Bootstrap avec des ancres et des blocs de contenu optionnels.

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

Génère un placeholder de chargement de type squelette à afficher pendant la récupération du contenu, avec des types de blocs configurables.

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

Génère un placeholder de chargement de type squelette à afficher pendant la récupération du contenu, avec des types de blocs configurables.

  • bones (sequence)
    optional
    - Liste de chaînes de type de bloc définissant la disposition du squelette ('text', 'short', 'image', 'button'). Par défaut: {} (affiche un unique bloc de texte)
  • id (string)
    optional
    - Attribut id HTML. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s). Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires. Par défaut: ''

@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

Génère un slider/carrousel horizontal de cartes avec boutons de navigation et lien optionnel "voir tout" pour parcourir du contenu sur les pages du skin.

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

<#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='Miscellaneous links' slides=mySlides />

<section class="themeparisfr-slider-wrapper" id="myslider" aria-roledescription="slide" aria-label="Miscellaneous links" data-reload-on-show>
<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">
<svg class="paris-icon paris-icon-arrow-left decorative" 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 decorative" 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 wrapper = document.getElementById('myslider');
if (!wrapper) return;
const slider = wrapper.querySelector('.themeparisfr-slider');
const btnPrev = wrapper.querySelector('.slider-buttons .prev-slide');
const btnNext = wrapper.querySelector('.slider-buttons .next-slide');
const nbSlides = slider ? slider.querySelectorAll('.slide').length : 0;
if (!slider || !btnPrev || !btnNext || nbSlides <= 1) return;
// Calculate scroll amount based on first slide width
function getScrollAmount() {
const firstSlide = slider.querySelector('.slide');
return firstSlide ? firstSlide.offsetWidth + 16 : 305; // 16 = gap
}
function updateButtons() {
const atStart = slider.scrollLeft <= 1;
const hasOverflow = slider.scrollWidth > slider.clientWidth + 1;
const atEnd = !hasOverflow || (slider.scrollLeft + slider.clientWidth >= slider.scrollWidth - 1);
btnPrev.classList.toggle('disabled', atStart);
btnNext.classList.toggle('disabled', atEnd);
}
function scrollSlider(direction) {
const scrollAmount = getScrollAmount();
const target = slider.scrollLeft + (direction * scrollAmount);
slider.scrollTo({ left: target, behavior: 'smooth' });
}
// Initial state: prev disabled, next enabled (will be updated after layout)
btnPrev.classList.add('disabled');
btnNext.classList.remove('disabled');
// Wait for layout to be complete before checking actual overflow
requestAnimationFrame(function() {
requestAnimationFrame(updateButtons);
});
btnPrev.addEventListener('click', function(e) {
e.preventDefault();
if (!this.classList.contains('disabled')) {
scrollSlider(-1);
}
});
btnNext.addEventListener('click', function(e) {
e.preventDefault();
if (!this.classList.contains('disabled')) {
scrollSlider(1);
}
});
// Update buttons after scroll animation
slider.addEventListener('scroll', function() {
clearTimeout(slider._scrollTimeout);
slider._scrollTimeout = setTimeout(updateButtons, 50);
});
// Keyboard accessibility (spacebar + enter)
[btnPrev, btnNext].forEach(function(btn) {
btn.setAttribute('tabindex', '0');
btn.setAttribute('role', 'button');
btn.removeAttribute('disabled');
btn.addEventListener('keydown', function(event) {
if (event.key === ' ' || event.key === 'Enter') {
event.preventDefault();
btn.click();
}
});
});
// Also update when images load (changes scrollWidth)
slider.querySelectorAll('img').forEach(function(img) {
if (!img.complete) {
img.addEventListener('load', updateButtons);
}
});
});
</script>

Paramètres

Génère un slider/carrousel horizontal de cartes avec boutons de navigation et lien optionnel "voir tout" pour parcourir du contenu sur les pages du skin.

  • id (string)
    required
    - Identifiant unique du slider
  • sliderLabel (string)
    required
    - Libellé ARIA accessible du slider
  • class (string)
    optional
    - Classes de grille CSS pour la disposition des slides. Par défaut: 'row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4'
  • slides (object)
    optional
    - Collection d'objets slide avec les propriétés : index, id, class, img, imgAlt, link, linkLabel, url, content. Par défaut: {}
  • slideLabel (string)
    optional
    - Préfixe de libellé accessible pour les slides individuels. Par défaut: 'slide'
  • buttonNext (string)
    optional
    - Libellé du bouton suivant. Par défaut: 'Next'
  • buttonPrev (string)
    optional
    - Libellé du bouton précédent. Par défaut: 'Previous'
  • buttonClass (string)
    optional
    - Classes CSS des boutons de navigation. Par défaut: 'light rounded-circle'
  • linkAll (string)
    optional
    - URL d'un lien "voir tout". Par défaut: ''
  • linkAllLabel (string)
    optional
    - Libellé du lien "voir tout". Par défaut: 'See more'
  • linkAllClass (string)
    optional
    - Classes CSS du lien "voir tout". Par défaut: 'btn btn-link-primary me-sm'
  • params (string)
    optional
    - Attributs HTML supplémentaires. Par défaut: ''

Statut

macro @cStatus

Génère un badge de statut indiquant l'état actuel d'un processus ou d'un événement sur les pages skin.

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

Génère un badge de statut indiquant l'état actuel d'un processus ou d'un événement sur les pages skin.

  • level (string)
    optional
    - Clé du niveau de statut ('forthcoming', 'tobecompleted', 'inprogress', 'over', 'bygone'). Par défaut: 'forthcoming'
  • class (string)
    optional
    - Classes CSS supplémentaires. Par défaut: ''
  • id (string)
    optional
    - attribut id HTML. Par défaut: ''
  • label (string)
    optional
    - Texte de label personnalisé (surcharge la valeur i18n par défaut). Par défaut: ''
  • labelClass (string)
    optional
    - Classe CSS pour le span du label. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires. Par défaut: ''

Progression par étapes

macro @cStepper

Génère un indicateur de progression à plusieurs étapes affichant des étapes séquentielles avec indicateurs de statut, pictogrammes et contenu déroulant.

Exemple

Stepper example 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

Stepper example 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

Stepper example 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

Stepper example 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

Stepper example 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

Stepper example 6 - without content

  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 >Stepper example 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 >Stepper example 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 >Stepper example 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 >Stepper example 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 >Stepper example 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 >Stepper example 6 - without content</@cTitle>
<@cBlock class='stepper-wrapper pt-l px-4xl pb-4xl'>
<@cStepper steps=lstep6 />
</@cBlock>

<h3>
Stepper example 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>
Stepper example 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 decorative" 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>
Stepper example 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 decorative" 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>
Stepper example 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>
Stepper example 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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 decorative" 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>
Stepper example 6 - without content</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 decorative" 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 decorative" 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 decorative" 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 decorative" 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

Génère un indicateur de progression à plusieurs étapes affichant des étapes séquentielles avec indicateurs de statut, pictogrammes et contenu déroulant.

  • steps (object)
    required
    - Collection d'objets étape avec les propriétés : title, content, status ('done', 'in-progress', ''), url
  • haspicto (boolean)
    optional
    - Indique s'il faut afficher les images de pictogramme des étapes. Par défaut: false
  • hasidx (boolean)
    optional
    - Indique s'il faut afficher des puces numérotées. Par défaut: false
  • title (boolean)
    optional
    - Indique s'il faut afficher les titres des étapes avec un style de titre. Par défaut: false
  • showMore (boolean)
    optional
    - Indique s'il faut afficher un bouton "voir plus" pour le contenu des étapes. Par défaut: false
  • labelMore (string)
    optional
    - Libellé du bouton de déroulement. Par défaut: i18n("portal.theme.labelShowMore")
  • a11StatusMsg (string)
    optional
    - Message de statut accessible pour l'étape active. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s) (utiliser 'pie' pour le style camembert). Par défaut: ''
  • id (string)
    optional
    - Attribut id HTML. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires. Par défaut: ''

Table

macro @cTable

Doc Bootstrap Table

Génère un tableau HTML responsive avec la mise en forme du thème, des lignes repliables pour les petits écrans et une légende accessible. Crée automatiquement une vue accordéon pour les appareils mobiles.

Exemple

Table with theme
Line Color Main stations Details
1 Yellow La Défense, Châtelet, Gare de Lyon Map
2 Blue Porte Dauphine, Place de Clichy, Nation Map
3 Green Pont de Levallois, Opéra, Gallieni Map
4 Purple Porte de Clignancourt, Châtelet, Montrouge Map

Exemple sans "id"

Information

Consultez les logs dans la console développeur du navigateur ( Ctrl + Shift + I ) et recherchez "Paris.fr".

Table without id
Code Value
A Arc
B Ball
C Canoe

<@cTable id='table1' collapsible=false caption='Table with theme' collapsed=true >
    <@cThead>
        <@cTr>
            <@cTh id='label-1'>Line<@sortSite jsp_url='jsp/site/Portal.jsp?page_id=6' attribute='line' /></@cTh>
            <@cTh id='label-2'>Color</@cTh>
            <@cTh id='label-3'>Main stations</@cTh>
            <@cTh id='label-4' class='text-right'>Details</@cTh>
        </@cTr>
    </@cThead>
    <@cTbody>
        <@cTr>
            <@cTd>1</@cTd>
            <@cTd>Yellow</@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='Map' target='_blank' class='btn btn-primary' title='Line 1 map' /></@cTd>
        </@cTr>
        <@cTr>
            <@cTd>2</@cTd>
            <@cTd>Blue</@cTd>
            <@cTd>Porte Dauphine, Place de Clichy, Nation</@cTd>
            <@cTd class='text-right'><@cLink href='https://www.ratp.fr/plans-lignes/metro/2' label='Map' target='_blank' class='btn btn-primary' title='Line 2 map' /></@cTd>
        </@cTr>
        <@cTr>
            <@cTd>3</@cTd>
            <@cTd>Green</@cTd>
            <@cTd>Pont de Levallois, Opéra, Gallieni</@cTd>
            <@cTd class='text-right'><@cLink href='https://www.ratp.fr/plans-lignes/metro/3' label='Map' target='_blank' class='btn btn-primary' title='Line 3 map' /></@cTd>
        </@cTr>
        <@cTr>
            <@cTd>4</@cTd>
            <@cTd>Purple</@cTd>
            <@cTd>Porte de Clignancourt, Châtelet, Montrouge</@cTd>
            <@cTd class='text-right'><@cLink href='https://www.ratp.fr/plans-lignes/metro/4' label='Map' target='_blank' class='btn btn-primary' title='Line 4 map' /></@cTd>
        </@cTr>
    </@cTbody>
</@cTable>

<@cTable collapsible=false caption='Table without 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'>Value <@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>Ball</@cTd>
        </@cTr>
        <@cTr>
            <@cTd>C</@cTd>
            <@cTd>Canoe</@cTd>
        </@cTr>
    </@cTbody>
</@cTable>

<div class="table-responsive" id="table-wrapper-table1">
<table class="table ctable" id="table1" >
<caption class="visually-hidden">Table with theme</caption>
<thead >
<tr >
<th scope="col" class="" id="label-1" >
Line
<button type="button" onclick="window.location.href='?sorted_attribute_name=line&amp;asc_sort=false#sort_line'" title="Descending sort" aria-label="Descending sort" class="btn btn-link btn-sort text-decoration-none p-0" disabled>
<svg class="paris-icon paris-icon-arrow-down main-color decorative" data-mce-svg="paris-icon paris-icon-arrow-down" aria-hidden="true" focusable="false" role="img">
<use href="#paris-icon-arrow-down"></use>
</svg></button>
</th>
<th scope="col" class="" id="label-2" >
Color</th>
<th scope="col" class="" id="label-3" >
Main stations</th>
<th scope="col" class="text-right" id="label-4" >
Details</th>
</tr>
</thead>
<tbody >
<tr >
<td>
<span>1</span>
</td>
<td>
<span>Yellow</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="Line 1 map [New window]" target="_blank" >
<span class="link-label">Map</span>
</a>
</span>
</td>
</tr>
<tr >
<td>
<span>2</span>
</td>
<td>
<span>Blue</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="Line 2 map [New window]" target="_blank" >
<span class="link-label">Map</span>
</a>
</span>
</td>
</tr>
<tr >
<td>
<span>3</span>
</td>
<td>
<span>Green</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="Line 3 map [New window]" target="_blank" >
<span class="link-label">Map</span>
</a>
</span>
</td>
</tr>
<tr >
<td>
<span>4</span>
</td>
<td>
<span>Purple</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="Line 4 map [New window]" target="_blank" >
<span class="link-label">Map</span>
</a>
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div id="accordion-table-table1" hidden></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const tableWrapper = document.getElementById('table-wrapper-table1');
const accordion = document.getElementById('accordion-table-table1');
const mql = window.matchMedia('(min-width: 768px)');
let built = false;
function buildAccordion() {
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('button:not(.btn-sort)') ? 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 decorative" 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>
`;
accordion.insertAdjacentHTML('beforeend', accordionItem);
});
built = true;
}
function update(isDesktop) {
if (isDesktop) {
// Vue large: on affiche le tableau, on masque l'accordion.
if (tableWrapper) tableWrapper.hidden = false;
accordion.hidden = true;
} else {
// Vue mobile: on construit l'accordion (une seule fois) et on masque le tableau.
if (!built) buildAccordion();
if (tableWrapper) tableWrapper.hidden = true;
accordion.hidden = false;
}
}
update(mql.matches);
mql.addEventListener('change', function(e) { update(e.matches); });
});
</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">
Alternative responsive mode
<p class="selection-subtitle my-sm">Change the responsive mode.<br> Adds the "collapsed=true" parameter to the cTable macro.<br>Other options are available to hide the header and/or the footer<br> and to change the visual appearance of the card</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 informative" data-mce-svg="paris-icon paris-icon-alert-info" aria-labelledby="paris-icon-alert-info-paris-title-2473185486657601" focusable="false" role="img">
<title id="paris-icon-alert-info-paris-title-2473185486657601">Information</title>
<use href="#paris-icon-alert-info"></use>
</svg></div>
<div class="alert-text ">
<p class="alert-title">
Consultez les logs dans la console développeur du navigateur ( <kdb>Ctrl</kdb> + <kdb>Shift</kdb> + <kdb>I</kdb> ) et recherchez "Paris.fr".</p>
</div>
</div>
</div>
<!-- [Paris fr Theme] macro cTable : ATTENTION : Duplicated is risk. Update the cTable macro id ! -->
<div class="table-responsive" id="table-wrapper-changeme">
<table class="table ctable" id="changeme" >
<caption class="visually-hidden">Table without id</caption>
<thead >
<tr >
<th scope="col" class="" id="label-1" >
Code </th>
<th scope="col" class="" id="label-2" >
Value</th>
</tr>
</thead>
<tbody >
<tr >
<td>
<span>A</span>
</td>
<td>
<span>Arc</span>
</td>
</tr>
<tr >
<td>
<span>B</span>
</td>
<td>
<span>Ball</span>
</td>
</tr>
<tr >
<td>
<span>C</span>
</td>
<td>
<span>Canoe</span>
</td>
</tr>
</tbody>
</table>
</div>
<div id="accordion-table-changeme" hidden></div>
<script>
document.addEventListener('DOMContentLoaded', function() {
console.warn( "[Paris fr Theme] macro cTable : ATTENTION : Duplicated is risk. Update the cTable macro id !" )
const tableWrapper = document.getElementById('table-wrapper-changeme');
const accordion = document.getElementById('accordion-table-changeme');
const mql = window.matchMedia('(min-width: 768px)');
let built = false;
function buildAccordion() {
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('button:not(.btn-sort)') ? 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 decorative" 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>
`;
accordion.insertAdjacentHTML('beforeend', accordionItem);
});
built = true;
}
function update(isDesktop) {
if (isDesktop) {
// Vue large: on affiche le tableau, on masque l'accordion.
if (tableWrapper) tableWrapper.hidden = false;
accordion.hidden = true;
} else {
// Vue mobile: on construit l'accordion (une seule fois) et on masque le tableau.
if (!built) buildAccordion();
if (tableWrapper) tableWrapper.hidden = true;
accordion.hidden = false;
}
}
update(mql.matches);
mql.addEventListener('change', function(e) { update(e.matches); });
});
</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">Warning</strong>
<button type="button" class="btn-close" data-bs-dismiss="toast" aria-label="Close"></button>
</div>
<div class="toast-body">
Sorting is disabled
</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

Génère un tableau HTML responsive avec la mise en forme du thème, des lignes repliables pour les petits écrans et une légende accessible. Crée automatiquement une vue accordéon pour les appareils mobiles.

  • caption (string)
    optional
    - Texte de la légende du tableau, utilisé pour l'accessibilité. Par défaut: ''
  • captionClass (string)
    optional
    - Classe CSS de l'élément de légende. Par défaut: 'visually-hidden'
  • summary (string)
    optional
    - Attribut summary du tableau. Par défaut: ''
  • breakpoint (string)
    optional
    - Suffixe de point de rupture responsive ('-sm', '-md', '-lg', '-xl', '-xxl'). Par défaut: ''
  • themed (boolean)
    optional
    - Si true, applique les styles de tableau par défaut du thème ; sinon les styles Bootstrap s'appliquent. Par défaut: true
  • collapsible (boolean)
    optional
    - Si true, replie les lignes sur les petits écrans en n'affichant que la première cellule. Par défaut: true
  • class (string)
    optional
    - Classe(s) CSS appliquée(s) à l'élément du tableau. Par défaut: ''
  • id (string)
    optional
    - L'identifiant unique du tableau ; doit être modifié par rapport à la valeur par défaut pour éviter les conflits. Par défaut: 'changeme'
  • params (string)
    optional
    - Attributs HTML supplémentaires pour l'élément du tableau. Par défaut: ''

Tile

macro @cTile

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

Exemple

Tag

Paris.fr

Go to the Paris.fr website

Tag

Paris.fr [tooltip]

Go to the Paris.fr website

Tag

Paris.fr Horizontal

Go to the Paris.fr website

View the page [external link]

Go to the Paris.fr website

Logo Dowload

Download the logo

Logo Disabled

Download the logo

Tag

Horizontal

Logo

Dans un groupe de tuiles - wrapper les "tile" dans une div avec la classe "tiles"

School enrolment

Enrolment open all year round

School enrolment

Enrolment open all year round

Hotel de Ville

Download the logo

Opéra

Lorem ipsum dolor sit amet consectetur adipiscing

Sacré Coeur de Montmartre en haut de la Butte

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

<@cTile title='Paris.fr' url='https://paris.fr' detail='Go to the Paris.fr website' badge='Tag' imgName='louvre' />
<@cTile title='Paris.fr Horizontal' url='https://paris.fr' detail='Go to the Paris.fr website' badge='Tag' imgName='louvre' />
<@cTile title='View the page [external link]' url='https://paris.fr' detail='Go to the Paris.fr website' target='_blank' button=true id='button-test' />
<@cTile title='Logo Dowload' url='themes/skin/parisfr/images/header-logo-paris.svg' detail='Download the logo' imgName='louvre' download=true />
<@cTile title='Logo Disabled' url='themes/skin/parisfr/images/header-logo-paris.svg' detail='Download the logo' imgName='louvre' disabled=true />
<@cTile title='Horizontal' url='https://paris.fr' detail='Logo' badge='Tag' imgName='louvre' horizontal=true />
<@cRow class='tiles'>
	<@cCol>
		<@cTile title='School enrolment' url='https://paris.fr' detail='Enrolment open all year round' imgName='ecole' />
	</@cCol>
	<@cCol>
		<@cTile title='School enrolment' url='https://paris.fr' detail='Enrolment open all year round' imgName='ecole'  />
	</@cCol>
</@cRow>
<@cRow class='tiles'>
	<@cCol>
		<@cTile title='Hotel de Ville' url='https://paris.fr' detail='Download the logo' imgName='hoteldeville' />
	</@cCol>
	<@cCol>
		<@cTile title='Opéra' url='https://paris.fr' detail='Download the logo' imgName='opera' />
	</@cCol>
	<@cCol>
		<@cTile title='Sacré Coeur de Montmartre' url='https://paris.fr' detail='Download the logo' imgName='sacre-coeur' />
	</@cCol>
</@cRow>

<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre decorative" 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">
Paris.fr</h3>
</a>
<p class="tile-detail">
Go to the Paris.fr website</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] - Go to the Paris.fr website"}>
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre decorative" 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">
Paris.fr [tooltip]</h3>
</a>
<p class="tile-detail">
Go to the Paris.fr website</p>
</div>
</div>
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre decorative" 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">
Paris.fr Horizontal</h3>
</a>
<p class="tile-detail">
Go to the Paris.fr website</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">
View the page [external link]</h3>
<span class="visually-hidden visually-hidden-focusable"> </span>
</a>
<p class="tile-detail">
Go to the Paris.fr website</p>
</div>
</div>
<div class="tile download">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre decorative" 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">
Logo Dowload</h3>
</a>
<p class="tile-detail">
Download the logo</p>
</div>
</div>
<div class="tile disabled">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre decorative" 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">
Logo Disabled</h3>
</a>
<p class="tile-detail">
Download the logo</p>
</div>
</div>
<div class="tile horizontal">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-louvre decorative" 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">
Horizontal</h3>
</a>
<p class="tile-detail">
Logo</p>
</div>
</div>
<p class="divider">Dans un groupe de tuiles - wrapper les "tile" dans une div avec la classe "tiles"</p>
<div class="row tiles">
<div class="col ">
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-ecole decorative" 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">
School enrolment</h3>
</a>
<p class="tile-detail">
Enrolment open all year round</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 decorative" 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">
School enrolment</h3>
</a>
<p class="tile-detail">
Enrolment open all year round</p>
</div>
</div>
</div>
</div>
<div class="row tiles">
<div class="col col-12 col-md-4">
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-hoteldeville decorative" 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">
Hotel de Ville</h3>
</a>
<p class="tile-detail">
Download the logo</p>
</div>
</div>
</div>
<div class="col col-12 col-md-4">
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-opera decorative" 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">
Opéra</h3>
</a>
<p class="tile-detail">
Lorem ipsum dolor sit amet consectetur adipiscing</p>
</div>
</div>
</div>
<div class="col col-12 col-md-4">
<div class="tile">
<div class="tile-header">
<div class="tile-img">
<svg class="paris-icon paris-icon-sacre-coeur decorative" 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">
Sacré Coeur de Montmartre en haut de la Butte</h3>
</a>
<p class="tile-detail">
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</p>
</div>
</div>
</div>
</div>

Paramètres

Une tuile est un élément interactif de l'interface qui dirige l'utilisateur vers des pages de contenu.

Warning

Si vous avez un groupe de tuiles, utilisez la classe "tiles" sur le conteneur des tuiles.

Par exemple :

<@cBlock class="tiles"> <@cTile>...</@cTile> <@cTile>...</@cTile> </@cBlock>

ou

<@cRow class="tiles"> <@cTile>...</@cTile><@cTile>...</@cTile></@cRow>
Information

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

  • title (string)
    Mandatory
    - Titre à afficher dans le lien
  • url (string)
    Mandatory
    - URL du lien.
  • level (number)
    optional
    - Niveau de titre de 2 à 6. Par défaut: 3
  • target (string)
    optional
    - Cible du lien. Par défaut: ''
  • detail (string)
    optional
    - Détail de la tuile.
    Mandatory if "download" param is true
    . Par défaut: ''
  • imgName (string)
    optional
    - nom de l'image SVG affichée dans la tuile. Par défaut: 'nef'
  • badge (string)
    optional
    - Libellé du badge optionnel affiché après le détail. Par défaut: ''
  • badgeClass (string)
    optional
    - Classe(s) CSS appliquée(s) à l'élément badge. Par défaut: ''
  • horizontal (boolean)
    optional
    - Si true, les éléments de la carte sont affichés horizontalement. Par défaut: false
  • download (boolean)
    optional
    - Ajoute le paramètre download au lien pour forcer le téléchargement du fichier. Par défaut: false
  • disabled (boolean)
    optional
    - Si true, la tuile et le lien sont désactivés. Par défaut: false
  • tooltip (boolean)
    optional
    - Si true, affiche une infobulle sur la tuile avec le titre et le détail. Par défaut: false
  • tooltipPos (string)
    optional
    - Position par défaut de l'infobulle. Par défaut: 'top'
  • id (string)
    optional
    - L'identifiant unique de l'élément de titre. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS appliquée(s) à l'élément de titre. Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires pour l'élément de titre. Par défaut: ''

Tabs

macro @cTabs

Doc Bootstrap Tabs

Génère un conteneur de navigation par onglets Bootstrap englobant des éléments cTab individuels, avec une sémantique d'élément nav optionnelle.

Exemple

Title Tab 1

Tab content 1

Title Tab 2

Tab content 2

Title Tab 3

Tab content 3

Title Tab 4

Tab content 4

Title Tab 5

Tab content 5

or

Onglet avec la classe "nav-fill"

Titre "Mes commandes en cours"

Contenu "Mes commandes en cours"

Titre "Mes documents téléchargeables"

Contenu "Mes documents téléchargeables"

<@cTabs id='tabSample1'>
    <@cTab url='#TabContent1' active=true>Tab 1</@cTab>
    <@cTab url='#TabContent2'>Tab 2 </@cTab>
    <@cTab url='#TabContent3'>Tab 3</@cTab>
    <@cTab url='#TabContent4' disabled=true>Tab 4</@cTab>
    <@cTab url='#TabContent5'>Tab 5</@cTab>
</@cTabs>
<@cTabContent id='myContent'>
    <@cTabPane title='Tab 1' id='TabContent1' active=true  class='px-xl pt-xs pb-4xl'>
        <@cTitle level=3>Title Tab 1</@cTitle>
    	<@cText>Tab content 1</@cText>
    </@cTabPane>
    <@cTabPane title='Tab 2' id='TabContent2' class='px-xl pt-xs pb-4xl'>
        <@cTitle level=3>Title Tab 2</@cTitle>
        <@cText>Tab content 2</@cText>
    </@cTabPane>
    <@cTabPane title='Tab 3 with more than 20 characters and ellipsis' id='TabContent3' class='px-xl pt-xs pb-4xl'>
        <@cTitle level=3>Title Tab 3</@cTitle>
        <@cText>Tab content 3</@cText>
    </@cTabPane>
    <@cTabPane title='Tab 4' id='TabContent4' disabled=true class='px-xl pt-xs pb-4xl'>
    	<@cTitle level=3>Title Tab 4</@cTitle>
    	<@cText>Tab content 4</@cText>
    </@cTabPane>
    <@cTabPane title='Tab 5' id='TabContent5' class='px-xl pt-xs pb-4xl'>
    	<@cTitle level=3>Title Tab 5</@cTitle>
    	<@cText>Tab content 5</@cText>
    </@cTabPane>
</@cTabContent>
<@cBlock class='d-flex justify-content-end mt-l'>
    <@cCheckbox name='selectResponsiveTabs' id='selectResponsiveTabs' label='Alternative responsive mode' value='1' selectionButton=true selectionLabel='Change the responsive mode.<br> If checked, adds the "tabs-list" class to the cTabs macro.' />
</@cBlock>
<@cDivider />
<@cText class='mb-m'>Onglet avec la classe "nav-fill"</@cText>
<@cTabs id='tabSample2' class='nav-fill'>
    <@cTab url='#TabContent21' active=true>Mes commandes en cours</@cTab>
    <@cTab url='#TabContent22'>Mes documents téléchargeables</@cTab>
</@cTabs>
<@cTabContent id='myContent2'>
    <@cTabPane title='Tab 1' id='TabContent21' active=true  class='px-xl pt-xs pb-4xl'>
        <@cTitle level=3>Titre "Mes commandes en cours"</@cTitle>
    	<@cText>Contenu "Mes commandes en cours"</@cText>
    </@cTabPane>
    <@cTabPane title='Tab 2' id='TabContent22' class='px-xl pt-xs pb-4xl'>
        <@cTitle level=3>Titre "Mes documents téléchargeables"</@cTitle>
        <@cText>Contenu "Mes documents téléchargeables"</@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">
Tab 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">
Tab 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">
Tab 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">
Tab 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">
Tab 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>
Tab content 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>
Tab content 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>
Tab content 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>
Tab content 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>
Tab content 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">
Alternative responsive mode
<p class="selection-subtitle my-sm">Change the responsive mode.<br> If checked, adds the "tabs-list" class to the cTabs macro.</p>
</label>
</div>
</div>
</div>
<p class="divider">or</p>
<p class="mb-m">
Onglet avec la classe "nav-fill"</p>
<div class="nav-tabs-container">
<div class="nav nav-tabs nav-fill" id="tabSample2" role="tablist" >
<button type="button" id="tab_TabContent21" aria-controls="TabContent21" data-bs-toggle="tab" role="tab" data-bs-target="#TabContent21" class="nav-link active" aria-selected="true">
Mes commandes en cours</button>
<button type="button" id="tab_TabContent22" aria-controls="TabContent22" data-bs-toggle="tab" role="tab" data-bs-target="#TabContent22" class="nav-link" tabindex="-1" aria-selected="false">
Mes documents téléchargeables</button>
</div>
</div>
<div class="tab-content " id="myContent2">
<div class="card tab-pane fade show active px-xl pt-xs pb-4xl" id="TabContent21" role="tabpanel" aria-labelledby="tab_TabContent21" >
<div class="card-body">
<h3>
Titre "Mes commandes en cours"</h3>
<p>
Contenu "Mes commandes en cours"</p>
</div>
</div>
<div class="card tab-pane fade px-xl pt-xs pb-4xl" id="TabContent22" role="tabpanel" aria-labelledby="tab_TabContent22" >
<div class="card-body">
<h3>
Titre "Mes documents téléchargeables"</h3>
<p>
Contenu "Mes documents téléchargeables"</p>
</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

Génère un conteneur de navigation par onglets Bootstrap englobant des éléments cTab individuels, avec une sémantique d'élément nav optionnelle.

  • navigation (boolean)
    optional
    - Indique s'il faut envelopper les onglets dans une structure nav > ul (true) ou une structure div (false). Par défaut: false
  • id (string)
    optional
    - Attribut HTML id. Par défaut: ''
  • class (string)
    optional
    - Classe(s) CSS supplémentaire(s). Par défaut: ''
  • params (string)
    optional
    - Attributs HTML supplémentaires. Par défaut: ''

Notification Toast

macro @cToast

Génère une notification toast avec titre, contenu, type et actions optionnels.

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

Génère une infobulle Bootstrap avec un positionnement, une classe personnalisée et un titre optionnels.

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 decorative" 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 decorative" 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 decorative" 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 decorative" 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

Génère des boutons, badges et messages France Connect avec libellés et URL optionnels.

Exemple

Quid FranceConnect Quid FranceConnect

What more... More informations on FranceConnect's website

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

Documentation France Connect

  • 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