Titre d'article
Chapô de l'article.
Corps de l'article…

À quoi sert cette page. Elle permet à une application métier — construite hors de WordPress (React, Vue, PHP, app interne…) — d'adopter exactement le même langage visuel que les sites de la Province Sud : couleurs, typographie, espacements, composants. Au lieu de recréer une UI, vous réutilisez celle de YOOtheme Pro + UIkit 3 telle qu'elle est compilée sur ce site.
Comment ça marche. YOOtheme compile UIkit avec les variables du Style Customizer en un seul theme.css qui porte toute l'identité PSud. Vous le chargez, vous ajoutez le JS UIkit pour l'interactif, et votre HTML utilise les classes uk-* documentées ci-dessous. Aucune dépendance à WordPress côté appli.
Ce que cette page détecte pour vous, en lisant le site réel : URLs CSS/JS, polices (CDN vs local), CSS/JS des Settings, tokens de design, et un squelette prêt à copier.
Liez le theme.css de ce site (section « URLs à charger »). Il porte l'identité PSud.
Ajoutez uikit.min.js + uikit-icons.min.js en defer pour l'interactif et les icônes.
Écrivez votre HTML avec les classes uk-* de la galerie. Copiez le markup exact.
Environnement réel de ce site, pour cadrer l'intégration.
Diagnostics d'intégration établis à partir de la configuration réelle de ce site.
Un seul CSS thème. Ce site contient plusieurs feuilles compilées, mais une seule est active. Ne chargez que celle listée ci-dessous : cumuler plusieurs theme*.css produit une cascade contradictoire et un rendu faux. Les CSS d'administration (barre admin, dashicons, outils SEO/éditeur) sont exclus — ils ne concernent pas une appli tierce.
URLs vérifiées sur ce serveur (RTL et variantes inactives exclues ; feuille active = badge « chargée ») :
| Type | Requis | URL |
|---|---|---|
| CSS thème | Toujours | https://www.province-sud.nc/wp-content/themes/yootheme/css/theme.css?ver=1785466538 |
| UIkit JS | Si interactif | https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit.min.js |
| UIkit Icons JS | Si icônes | https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit-icons.min.js |
Styles alternatifs ou résidus de mise à jour (*.update.css). Les cumuler écrase le style actif.
D'autres styles existent. La Province Sud dispose de variantes de charte supplémentaires, gérées par une extension interne dédiée. Elles ne sont pas exposées sur cette page pour le moment : seule la feuille active y est documentée. Leur mise à disposition, avec les palettes de couleurs associées, est prévue dans une version ultérieure de ce guide. Si votre application doit adopter une variante particulière, rapprochez-vous de l'équipe web avant d'engager l'intégration.
Pour ne pas dépendre du live (le CSS est régénéré à chaque recompilation du style) :
curl -o theme-psud.css "https://www.province-sud.nc/wp-content/themes/yootheme/css/theme.css?ver=1785466538"
curl -O "https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit.min.js"
curl -O "https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit-icons.min.js"
Bloc <head> :
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,300,400,600&subset=latin,latin-ext&display=fallback">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Noto+Serif%C2%A0%3A+400%2C400i%2C700%2C700i">
<link rel="stylesheet" href="https://www.province-sud.nc/wp-content/themes/yootheme/css/theme.css?ver=1785466538">
<script src="https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit.min.js" defer></script>
<script src="https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit-icons.min.js" defer></script>Ordre : <meta viewport> · CSS thème avant CSS applicatif · UIkit JS en defer, icons après · pas de jQuery.
Si le site sert le CSS inline, extraction du CSS réellement chargé :
Ce site sert son CSS sous forme de fichier : rien à extraire ici, utilisez directement l'adresse indiquée plus haut. Ce bloc ne concerne que les installations diffusant le CSS directement dans le code de la page.
Le CSS custom (Settings → Custom Code) est compilé dans theme.css : déjà inclus dès que vous chargez le theme.css. Rien à faire côté appli.
Point critique pour l'intégrateur. Le theme.css n'est pas un fichier figé. Il est régénéré par YOOtheme à chaque modification du style, et son nom peut même changer si le style actif change. Une URL copiée aujourd'hui peut donc, demain, pointer vers une version périmée ou ne plus exister du tout.
Concrètement, trois situations produisent ce décalage. Un simple ajustement de la charte (une couleur, une police, un espacement) déclenche une recompilation : le fichier garde son nom mais son contenu change, et son paramètre de version est mis à jour. Un changement de style actif fait basculer le site sur un autre fichier : l'ancien reste sur le serveur sans être servi, ce qui explique les feuilles marquées « inactives » plus haut. Une mise à jour de YOOtheme peut enfin laisser des fichiers résiduels qui ne sont jamais actifs.
Les conséquences côté application diffèrent selon le cas. Dans le meilleur, l'application continue de fonctionner mais affiche une version périmée de la charte, avec un décalage visuel progressif par rapport aux sites officiels. Dans le pire, l'URL renvoie une erreur 404 et l'application perd d'un coup toute sa mise en forme, sans avertissement préalable et sans qu'aucune modification n'ait été faite de son côté.
Deux réflexes évitent ces écueils. Ne codez jamais une URL en dur sans plan de mise à jour : revenez sur cette page après chaque évolution majeure de la charte, ou surveillez la disponibilité de l'URL. Ou figez une copie maîtrisée à l'aide des commandes de snapshot ci-dessous, quitte à la resynchroniser volontairement. Le tableau des stratégies, plus bas, vous aide à choisir selon la criticité de votre application. À terme, une URL stable et pérenne est envisagée pour supprimer ce problème à la racine : voir la section « Évolutions à venir ».
?ver= change. L'ancienne URL sert alors du CSS périmé (ou est invalidée par le cache navigateur).theme.1.css → theme.2.css). L'ancien reste sur le disque mais n'est plus servi : c'est l'origine des feuilles « inactives » listées plus haut.*.update.css peuvent apparaître. Ils ne sont jamais actifs et sont systématiquement écartés par cette page.theme*.css. Dès que vous recompilez ou changez de style, la détection est refaite immédiatement — jamais d'URL périmée affichée.?ver= systématique sur les URLs proposées : le navigateur du visiteur récupère bien la nouvelle version après recompilation.curl (ci-dessus) : pour figer une copie locale et se découpler totalement du live.| Stratégie | Avantage | Inconvénient | Pour qui |
|---|---|---|---|
| Lien direct vers l'URL du site | Toujours synchro avec l'identité PSud | Le rendu de l'appli change si le style du site change ; dépendance réseau + CORS polices | Applis internes, intranet |
| Snapshot (copie hébergée) | Stable, maîtrisé, pas de dépendance | À re-synchroniser manuellement après chaque évolution de charte | Applis critiques, hors réseau |
Tokens (:root{--psud-*}) | Découplé, léger, réutilisable dans n'importe quel framework | Ne fournit pas les composants, seulement les variables | Applis React/Vue avec leur propre UI |
Recommandation : lien direct pour rester aligné sur la charte, snapshot si vous devez garantir un rendu figé dans le temps.
215 fichier(s) :
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://www.province-sud.nc/wp-content/themes/yootheme/css/theme.css?ver=1785466538">
<script src="https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit.min.js" defer></script>
<script src="https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit-icons.min.js" defer></script>
</head>
<body>
<div class="uk-container uk-margin">
<h1 class="uk-heading-medium">Mon application metier PSud</h1>
<button class="uk-button uk-button-primary">Bouton au style PSud</button>
</div>
</body>
</html>uk-. Grille = attribut uk-grid + uk-child-width-1-3@m.uk-container > uk-section > uk-grid · espacement uk-margin*.uk-modal, uk-dropdown…). Contraste uk-light/uk-dark.theme.css écrasé au recompile → liez l'URL (?ver=).:root{--psud-*}. Jamais de CDN générique.Le CSS ne pose pas de difficulté, le JavaScript si. La feuille de style du thème s'applique sans problème dans Angular, React ou Vue : ce sont des styles globaux, et l'encapsulation des composants ne concerne que les styles définis à l'intérieur de ceux-ci. En revanche, UIkit JS manipule le DOM directement : il déplace des nœuds, en crée, en supprime. Votre framework fait exactement la même chose. Deux pilotes pour un même volant, c'est là que naissent les problèmes.
| Approche | Principe | Avantage | Limite |
|---|---|---|---|
| A. CSS + UIkit JS | Les deux ressources sont chargées depuis ce site | Mise en œuvre immédiate, rendu strictement identique aux sites PSud | Impose de gérer le cycle de vie des composants UIkit à la main |
| B. Snapshot local | Le CSS est copié dans le projet | Build reproductible, aucune dépendance réseau, pas de souci de polices distantes | À resynchroniser volontairement après chaque évolution de la charte |
| C. Tokens seuls | L'application consomme les variables de design et garde ses propres composants | Aucun conflit possible, très léger | Les composants sont à réimplémenter |
| D. CSS sans le JS recommandé | Classes UIkit pour l'apparence, interactivité native au framework | Un seul pilote du DOM, identité visuelle respectée | Les composants interactifs sont à recréer avec les outils du framework |
En pratique : l'approche A convient à un outil interne à livrer vite, l'approche D à une application métier destinée à durer.
Déclarez la feuille de style globalement, dans src/index.html ou via le tableau styles d'angular.json :
<!-- src/index.html -->
<link rel="stylesheet" href="https://www.province-sud.nc/wp-content/themes/yootheme/css/theme.css?ver=1785466538">
<script src="https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit.min.js" defer></script>
<script src="https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit-icons.min.js" defer></script>Ne placez jamais cette feuille dans les styleUrls d'un composant. Angular réécrirait alors les sélecteurs en y ajoutant ses attributs d'encapsulation, ce qui casserait l'intégralité des règles UIkit. Le CSS du thème est un style global : il se déclare comme tel.
// angular.json — variante : styles locaux (apres snapshot)
"styles": [
"src/assets/psud/theme.css",
"src/styles.css"
]
Angular utilise l'attribut class, exactement comme UIkit. Le balisage présenté dans la galerie de composants est donc copiable tel quel, sans transformation — contrairement à React qui impose className.
Un composant UIkit s'initialise après le rendu de la vue et doit être détruit explicitement :
// composant Angular utilisant un composant interactif UIkit
import { Component, ElementRef, ViewChild, NgZone,
AfterViewInit, OnDestroy } from '@angular/core';
declare const UIkit: any;
@Component({
selector: 'app-exemple',
template: `
<button class="uk-button uk-button-primary" (click)="ouvrir()">Ouvrir</button>
<div #dlg uk-modal>
<div class="uk-modal-dialog uk-modal-body">
<h2 class="uk-modal-title">Titre</h2>
<button class="uk-modal-close uk-button uk-button-default">Fermer</button>
</div>
</div>`
})
export class ExempleComponent implements AfterViewInit, OnDestroy {
@ViewChild('dlg') dlg!: ElementRef<HTMLElement>;
constructor(private zone: NgZone) {}
ngAfterViewInit(): void {
// UIkit vit hors d'Angular : on repasse dans la zone pour la detection de changements
this.dlg.nativeElement.addEventListener('hidden', () => {
this.zone.run(() => { /* mise a jour de l'etat */ });
});
}
ouvrir(): void { UIkit.modal(this.dlg.nativeElement).show(); }
ngOnDestroy(): void {
// INDISPENSABLE : UIkit deplace la modale dans <body>.
// Sans destruction explicite, elle survit au composant.
UIkit.modal(this.dlg.nativeElement).$destroy(true);
}
}<body>. C'est le piège le plus coûteux. Si un *ngIf détruit votre composant, la modale reste orpheline dans le DOM : fuite mémoire et éléments fantômes qui s'accumulent. D'où l'appel à $destroy(true) dans ngOnDestroy.*ngFor, *ngIf ou une réponse HTTP est invisible pour UIkit tant qu'on ne le lui signale pas.NgZone.run().// Contenu genere apres l'initialisation (*ngFor, *ngIf, appel HTTP) :
// UIkit ne le connait pas encore, il faut le lui signaler.
ngAfterViewChecked(): void {
UIkit.update(this.host.nativeElement);
}Avec Angular Universal, UIkit ne doit être manipulé que dans le navigateur : protégez ces appels par isPlatformBrowser, sinon le rendu serveur échouera sur l'absence de window et de document.
Pour une application durable, chargez le CSS du thème pour l'apparence — boutons, cartes, formulaires, grille, utilitaires — et confiez l'interactivité aux outils natifs d'Angular : @angular/cdk/overlay pour les menus déroulants et les infobulles, Dialog du CDK ou MatDialog pour les modales, l'animation Angular pour les transitions. Vous conservez l'identité visuelle PSud sans jamais laisser deux frameworks se disputer le DOM.
Déclarez la feuille de style dans index.html, ou importez-la depuis le point d'entrée de l'application. Le principe est identique à Angular : il s'agit d'un style global.
La syntaxe du balisage change. React impose className au lieu de class. Le bouton JSX situé en haut de cette page convertit automatiquement tous les extraits de la galerie : activez-le avant de copier. Pensez également à htmlFor à la place de for dans les libellés de formulaire.
L'initialisation et le nettoyage se font dans un useEffect, dont la fonction de retour joue le rôle de ngOnDestroy :
// React : les classes s'ecrivent className, et le cycle de vie passe par useEffect
import { useEffect, useRef } from 'react';
export function Exemple() {
const ref = useRef(null);
useEffect(() => {
const el = ref.current;
const onHide = () => { /* mise a jour de l'etat */ };
el.addEventListener('hidden', onHide);
return () => { // nettoyage au demontage
el.removeEventListener('hidden', onHide);
window.UIkit?.modal(el)?.$destroy(true);
};
}, []);
return (
<>
<button className="uk-button uk-button-primary"
onClick={() => window.UIkit.modal(ref.current).show()}>
Ouvrir
</button>
<div ref={ref} data-uk-modal>
<div className="uk-modal-dialog uk-modal-body">
<h2 className="uk-modal-title">Titre</h2>
</div>
</div>
</>
);
}useEffect n'est pas optionnelle.uk-modal comme attribut nu ; utilisez data-uk-modal, reconnu par UIkit.dangerouslySetInnerHTML pour contourner ces contraintes : React perdrait le contrôle du sous-arbre et les fuites deviendraient difficiles à diagnostiquer.<body> par UIkit, à l'intérieur d'un portail, devient très délicate à nettoyer : préférez alors une modale React native.Comme pour Angular, l'approche la plus saine sur la durée consiste à conserver le CSS pour l'apparence et à confier l'interactivité aux composants React de votre choix.
Déclaration globale dans index.html ou import dans main.js. Comme Angular, Vue utilise l'attribut class : le balisage de la galerie est directement réutilisable.
<!-- Vue 3 : class s'ecrit normalement, cycle de vie via onMounted / onBeforeUnmount -->
<script setup>
import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue';
const dlg = ref(null);
onMounted(() => {
// apres un v-if, attendre le rendu avant d'initialiser
nextTick(() => UIkit.update(dlg.value));
});
onBeforeUnmount(() => {
UIkit.modal(dlg.value)?.$destroy(true);
});
const ouvrir = () => UIkit.modal(dlg.value).show();
</script>
<template>
<button class="uk-button uk-button-primary" @click="ouvrir">Ouvrir</button>
<div ref="dlg" uk-modal>
<div class="uk-modal-dialog uk-modal-body">
<h2 class="uk-modal-title">Titre</h2>
</div>
</div>
</template>v-if ou une mise à jour de données, le DOM n'existe pas encore au moment où votre code s'exécute : passez par nextTick() avant d'appeler UIkit.:deep().Teleport et les déplacements UIkit se recoupent. Choisissez l'un ou l'autre pour les modales, jamais les deux simultanément./* Styles scopes : pour cibler un element UIkit interne, utiliser :deep() */
<style scoped>
:deep(.uk-modal-dialog) { max-width: 720px; }
</style>Extraits en direct du style compilé (couleurs, typo, rayons, ombres). Pour un thème dérivé découplé du live.
CSS custom properties
…JSON
…Less variables
…Familles dont les fichiers sont présents sur ce serveur. Une famille peut être installée sans être utilisée sur la page courante : la liste ci-dessous reflète ce qui est disponible, le complément mesuré en bas de section indique ce qui est effectivement rendu dans votre navigateur.
9 famille(s), 215 fichier(s) au total.
Nom déduit du fichier, à titre indicatif. Le nom exact à utiliser dans votre CSS figure dans les spécimens ci-dessous.
Nom déduit du fichier, à titre indicatif. Le nom exact à utiliser dans votre CSS figure dans les spécimens ci-dessous.
Nom déduit du fichier, à titre indicatif. Le nom exact à utiliser dans votre CSS figure dans les spécimens ci-dessous.
Nom déduit du fichier, à titre indicatif. Le nom exact à utiliser dans votre CSS figure dans les spécimens ci-dessous.
Nom déduit du fichier, à titre indicatif. Le nom exact à utiliser dans votre CSS figure dans les spécimens ci-dessous.
Nom déduit du fichier, à titre indicatif. Le nom exact à utiliser dans votre CSS figure dans les spécimens ci-dessous.
Nom déduit du fichier, à titre indicatif. Le nom exact à utiliser dans votre CSS figure dans les spécimens ci-dessous.
Nom déduit du fichier, à titre indicatif. Le nom exact à utiliser dans votre CSS figure dans les spécimens ci-dessous.
Nom déduit du fichier, à titre indicatif. Le nom exact à utiliser dans votre CSS figure dans les spécimens ci-dessous.
Collez du markup UIkit et voyez le rendu (bac à sable, composants initialisés).
Une page complète, déjà reliée aux ressources de ce site, à ouvrir directement dans un navigateur ou à déposer dans votre projet comme point de départ.
<!doctype html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Application PSud</title>
<link rel="stylesheet" href="https://www.province-sud.nc/wp-content/themes/yootheme/css/theme.css?ver=1785466538">
<script src="https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit.min.js" defer></script>
<script src="https://www.province-sud.nc/wp-content/themes/yootheme/vendor/assets/uikit/dist/js/uikit-icons.min.js" defer></script>
</head>
<body>
<div class="uk-container uk-margin-large-top">
<h1 class="uk-heading-medium">Application métier PSud</h1>
<p class="uk-text-lead">Point de départ conforme à la charte de la Province Sud.</p>
<div class="uk-child-width-1-2@m uk-grid-match" uk-grid>
<div>
<div class="uk-card uk-card-default uk-card-body">
<h3 class="uk-card-title">Une carte</h3>
<p>Remplacez ce contenu par le vôtre.</p>
<button class="uk-button uk-button-primary">Action</button>
</div>
</div>
<div>
<form class="uk-form-stacked">
<div class="uk-margin">
<label class="uk-form-label" for="nom">Nom</label>
<div class="uk-form-controls"><input class="uk-input" id="nom" type="text"></div>
</div>
<button class="uk-button uk-button-default" type="submit">Envoyer</button>
</form>
</div>
</div>
</div>
</body>
</html>
Les classes uk-h1 à uk-h6 permettent d'appliquer l'apparence d'un niveau sans changer la balise, afin de préserver la hiérarchie sémantique du document.
<h1 class="uk-h1">Titre de niveau 1</h1>
<h2 class="uk-h2">Titre de niveau 2</h2>
<h3 class="uk-h3">Titre de niveau 3</h3>
<h4 class="uk-h4">Titre de niveau 4</h4>
<h5 class="uk-h5">Titre de niveau 5</h5>
<h6 class="uk-h6">Titre de niveau 6</h6><div class="uk-heading-small">Heading Small</div>
<div class="uk-heading-medium">Heading Medium</div>
<div class="uk-heading-large">Heading Large</div><p class="uk-text-lead">Texte lead, pour introduire.</p>
<p>Paragraphe avec <a href="#">lien</a>, <strong>gras</strong>, <em>italique</em>.</p>
<p class="uk-text-meta">Texte meta.</p>
<p class="uk-text-small">Texte small.</p><span class="uk-text-muted">muted</span> ·
<span class="uk-text-primary">primary</span> ·
<span class="uk-text-secondary">secondary</span> ·
<span class="uk-text-success">success</span> ·
<span class="uk-text-warning">warning</span> ·
<span class="uk-text-danger">danger</span>mark del ins code
Ctrl ABBR sup sub
<p><mark>mark</mark> <del>del</del> <ins>ins</ins> <code>code</code>
<kbd>Ctrl</kbd> <abbr title="Abbreviation">ABBR</abbr> <sup>sup</sup> <sub>sub</sub></p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque nec velit vitae.
<p class="uk-dropcap"><span>L</span>orem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque nec velit vitae.</p>Une citation exemplaire pour illustrer le style.
<blockquote cite="#">
<p>Une citation exemplaire pour illustrer le style.</p>
<footer>Source <cite>Titre</cite></footer>
</blockquote><div class="uk-card">...</div><pre><code><div class="uk-card">...</div></code></pre>Texte réparti en colonnes automatiques via uk-column-1-2@s. Lorem ipsum dolor sit amet consectetur.
Deuxième bloc de texte qui remplit la seconde colonne pour la démonstration.
<div class="uk-column-1-2@s uk-column-divider">
<p>Texte réparti en colonnes automatiques via uk-column-1-2@s. Lorem ipsum dolor sit amet consectetur.</p>
<p>Deuxième bloc de texte qui remplit la seconde colonne pour la démonstration.</p>
</div><button class="uk-button uk-button-default">Default</button>
<button class="uk-button uk-button-primary">Primary</button>
<button class="uk-button uk-button-secondary">Secondary</button>
<button class="uk-button uk-button-danger">Danger</button>
<button class="uk-button uk-button-text">Text</button>
<button class="uk-button uk-button-link">Link</button><button class="uk-button uk-button-primary uk-button-small">Small</button>
<button class="uk-button uk-button-primary">Default</button>
<button class="uk-button uk-button-primary uk-button-large">Large</button><button class="uk-button uk-button-default"><span uk-icon="icon: plus"></span> Ajouter</button>
<button class="uk-button uk-button-default" type="button"><span uk-icon="icon: download"></span></button><div class="uk-button-group">
<button class="uk-button uk-button-default">Gauche</button>
<button class="uk-button uk-button-default">Centre</button>
<button class="uk-button uk-button-default">Droite</button>
</div><span class="uk-badge">1</span> <span class="uk-badge">99+</span><span class="uk-label">Default</span>
<span class="uk-label uk-label-success">Success</span>
<span class="uk-label uk-label-warning">Warning</span>
<span class="uk-label uk-label-danger">Danger</span><div class="uk-position-relative uk-display-inline-block"><span class="uk-margin-small-right" uk-marker></span> point d'intérêt</div><div class="uk-alert" uk-alert><a href class="uk-alert-close" uk-close></a><p>Default.</p></div>
<div class="uk-alert-primary" uk-alert><a href class="uk-alert-close" uk-close></a><p>Primary.</p></div>
<div class="uk-alert-success" uk-alert><a href class="uk-alert-close" uk-close></a><p>Success.</p></div>
<div class="uk-alert-warning" uk-alert><a href class="uk-alert-close" uk-close></a><p>Warning.</p></div>
<div class="uk-alert-danger" uk-alert><a href class="uk-alert-close" uk-close></a><p>Danger.</p></div><button class="uk-button uk-button-default" type="button" onclick="UIkit.notification({message: 'Notification PSud', status: 'primary', pos: 'top-center'})">Notifier</button>Contenu.
Contenu.
Contenu.
<div class="uk-child-width-1-3@s uk-grid-small" uk-grid>
<div><div class="uk-card uk-card-default uk-card-body"><h3 class="uk-card-title">Default</h3><p>Contenu.</p></div></div>
<div><div class="uk-card uk-card-primary uk-card-body"><h3 class="uk-card-title">Primary</h3><p>Contenu.</p></div></div>
<div><div class="uk-card uk-card-secondary uk-card-body"><h3 class="uk-card-title">Secondary</h3><p>Contenu.</p></div></div>
</div><div class="uk-card uk-card-default">
<div class="uk-card-header"><h3 class="uk-card-title uk-margin-remove-bottom">Header</h3></div>
<div class="uk-card-body"><p>Body.</p></div>
<div class="uk-card-footer"><a href="#" class="uk-button uk-button-text">Action</a></div>
</div>Survolez la carte.
<div class="uk-card uk-card-default uk-card-body uk-card-hover">
<div class="uk-card-badge uk-label">Nouveau</div>
<h3 class="uk-card-title">Card hover</h3>
<p>Survolez la carte.</p>
</div><div class="uk-child-width-1-2@s uk-grid-small" uk-grid>
<div><ul class="uk-list uk-list-disc"><li>Disc</li><li>Item</li></ul></div>
<div><ul class="uk-list uk-list-decimal"><li>Decimal</li><li>Item</li></ul></div>
<div><ul class="uk-list uk-list-divider"><li>Divider</li><li>Item</li></ul></div>
<div><ul class="uk-list uk-list-striped"><li>Striped</li><li>Item</li></ul></div>
</div><dl class="uk-description-list uk-description-list-divider">
<dt>Terme</dt><dd>Description.</dd>
<dt>Terme</dt><dd>Description.</dd>
</dl>| Nom | Rôle | Statut |
|---|---|---|
| Alicia | Dev | OK |
| PSud | Admin | - |
<table class="uk-table uk-table-divider uk-table-hover uk-table-small">
<thead><tr><th>Nom</th><th>Rôle</th><th>Statut</th></tr></thead>
<tbody>
<tr><td>Alicia</td><td>Dev</td><td><span class="uk-label uk-label-success">OK</span></td></tr>
<tr><td>PSud</td><td>Admin</td><td><span class="uk-label">-</span></td></tr>
</tbody>
</table>| Colonne A | Colonne B | Colonne C |
|---|---|---|
| A1 | B1 | C1 |
| A2 | B2 | C2 |
<table class="uk-table uk-table-striped uk-table-responsive uk-table-small">
<thead><tr><th>Colonne A</th><th>Colonne B</th><th>Colonne C</th></tr></thead>
<tbody>
<tr><td>A1</td><td>B1</td><td>C1</td></tr>
<tr><td>A2</td><td>B2</td><td>C2</td></tr>
</tbody>
</table><form class="uk-form-stacked">
<div class="uk-margin">
<label class="uk-form-label">Input</label>
<div class="uk-form-controls"><input class="uk-input" type="text" placeholder="Texte"></div>
</div>
<div class="uk-margin">
<label class="uk-form-label">Select</label>
<div class="uk-form-controls"><select class="uk-select"><option>A</option><option>B</option></select></div>
</div>
<div class="uk-margin">
<label class="uk-form-label">Textarea</label>
<div class="uk-form-controls"><textarea class="uk-textarea" rows="3"></textarea></div>
</div>
<div class="uk-margin uk-grid-small uk-child-width-auto" uk-grid>
<label><input class="uk-checkbox" type="checkbox" checked> Checkbox</label>
<label><input class="uk-radio" type="radio" name="r" checked> Radio</label>
</div>
<div class="uk-margin"><input class="uk-range" type="range" value="4" min="0" max="10"></div>
</form><div class="uk-inline">
<span class="uk-form-icon" uk-icon="icon: user"></span>
<input class="uk-input" type="text" placeholder="Utilisateur">
</div><input class="uk-input uk-form-success uk-margin-small-bottom" type="text" value="Valide">
<input class="uk-input uk-form-danger" type="text" value="Erreur"><nav class="uk-navbar-container" uk-navbar>
<div class="uk-navbar-left">
<ul class="uk-navbar-nav">
<li class="uk-active"><a href="#">Accueil</a></li>
<li><a href="#">Menu <span uk-navbar-parent-icon></span></a>
<div class="uk-navbar-dropdown">
<ul class="uk-nav uk-navbar-dropdown-nav"><li><a href="#">Sous-item</a></li></ul>
</div>
</li>
<li><a href="#">Contact</a></li>
</ul>
</div>
</nav><ul class="uk-nav uk-nav-default">
<li class="uk-active"><a href="#">Actif</a></li>
<li class="uk-parent"><a href="#">Parent</a>
<ul class="uk-nav-sub"><li><a href="#">Enfant</a></li></ul>
</li>
<li class="uk-nav-header">Header</li>
<li><a href="#">Item</a></li>
</ul><ul class="uk-subnav uk-subnav-pill">
<li class="uk-active"><a href="#">Actif</a></li>
<li><a href="#">Item</a></li>
<li><a href="#">Item</a></li>
</ul>
<ul class="uk-subnav uk-subnav-divider uk-margin-small-top">
<li class="uk-active"><a href="#">Actif</a></li>
<li><a href="#">Item</a></li>
</ul><ul class="uk-pagination">
<li><a href="#"><span uk-pagination-previous></span></a></li>
<li class="uk-active"><span>1</span></li>
<li><a href="#">2</a></li>
<li><a href="#"><span uk-pagination-next></span></a></li>
</ul><ul class="uk-dotnav">
<li class="uk-active"><a href="#">1</a></li>
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
</ul>
<ul class="uk-iconnav uk-margin-small-top">
<li><a href="#" uk-icon="icon: pencil"></a></li>
<li><a href="#" uk-icon="icon: trash"></a></li>
<li><a href="#" uk-icon="icon: settings"></a></li>
</ul>Le rendu dépend du style compilé : sans le CSS du thème, les titres et le repli restent non stylés. À vérifier dans votre application avant intégration.
<ul uk-accordion>
<li class="uk-open"><a class="uk-accordion-title" href>Section 1</a><div class="uk-accordion-content"><p>Contenu 1.</p></div></li>
<li><a class="uk-accordion-title" href>Section 2</a><div class="uk-accordion-content"><p>Contenu 2.</p></div></li>
</ul>Contenu.
<a href="#gls-modal" class="uk-button uk-button-primary" uk-toggle>Ouvrir la modale</a>
<div id="gls-modal" uk-modal>
<div class="uk-modal-dialog uk-modal-body">
<h2 class="uk-modal-title">Modale</h2>
<p>Contenu.</p>
<button class="uk-modal-close uk-button uk-button-default" type="button">Fermer</button>
</div>
</div>Contenu latéral.
<a href="#gls-offcanvas" class="uk-button uk-button-default" uk-toggle>Ouvrir l'offcanvas</a>
<div id="gls-offcanvas" uk-offcanvas>
<div class="uk-offcanvas-bar">
<button class="uk-offcanvas-close" type="button" uk-close></button>
<h3>Panneau</h3>
<p>Contenu latéral.</p>
</div>
</div><button class="uk-button uk-button-default" uk-tooltip="title: Info-bulle">Survole-moi</button><button class="uk-button uk-button-default" type="button" uk-toggle="target: #gls-toggle">Afficher / masquer</button>
<div id="gls-toggle" hidden class="uk-margin-small-top uk-padding-small uk-background-muted">Contenu basculé.</div>Nécessite UIkit JS. Les chiffres restent vides tant que le script n'est pas chargé, et la date cible doit être dans le futur.
<div uk-countdown="date: 2035-01-01T00:00:00+00:00" class="uk-grid-small uk-child-width-auto uk-text-center" uk-grid>
<div><div class="uk-countdown-number uk-countdown-days"></div><div class="uk-text-small">Jours</div></div>
<div><div class="uk-countdown-number uk-countdown-hours"></div><div class="uk-text-small">Heures</div></div>
<div><div class="uk-countdown-number uk-countdown-minutes"></div><div class="uk-text-small">Minutes</div></div>
<div><div class="uk-countdown-number uk-countdown-seconds"></div><div class="uk-text-small">Secondes</div></div>
</div><div class="uk-position-relative uk-light" tabindex="-1" uk-slideshow="ratio: 7:3">
<ul class="uk-slideshow-items">
<li><div class="uk-flex uk-flex-center uk-flex-middle uk-height-1-1 uk-background-primary"><span class="uk-h2">1</span></div></li>
<li><div class="uk-flex uk-flex-center uk-flex-middle uk-height-1-1 uk-background-secondary"><span class="uk-h2">2</span></div></li>
</ul>
<a class="uk-position-center-left uk-position-small" href uk-slidenav-previous uk-slideshow-item="previous"></a>
<a class="uk-position-center-right uk-position-small" href uk-slidenav-next uk-slideshow-item="next"></a>
</div><div uk-slider>
<div class="uk-position-relative">
<ul class="uk-slider-items uk-child-width-1-3@s uk-grid-small">
<li><div class="uk-background-muted uk-padding-small uk-text-center">1</div></li>
<li><div class="uk-background-muted uk-padding-small uk-text-center">2</div></li>
<li><div class="uk-background-muted uk-padding-small uk-text-center">3</div></li>
<li><div class="uk-background-muted uk-padding-small uk-text-center">4</div></li>
</ul>
<a class="uk-position-center-left-out uk-position-small" href uk-slider-item="previous" uk-slidenav-previous></a>
<a class="uk-position-center-right-out uk-position-small" href uk-slider-item="next" uk-slidenav-next></a>
</div>
</div>Légende en overlay.
<div class="uk-inline uk-width-1-1 uk-light">
<div class="uk-height-small uk-background-secondary uk-width-1-1"></div>
<div class="uk-overlay uk-overlay-primary uk-position-bottom uk-width-1-1">
<p class="uk-margin-remove">Légende en overlay.</p>
</div>
</div>Écrit le 21 juillet 2026 par Gr3g
Chapô de l'article.
Corps de l'article…
<article class="uk-article">
<h1 class="uk-article-title"><a class="uk-link-reset" href="#">Titre d'article</a></h1>
<p class="uk-article-meta">Écrit le 21 juillet 2026 par <a href="#">Gr3g</a></p>
<p class="uk-text-lead">Chapô de l'article.</p>
<p>Corps de l'article…</p>
</article>21 juillet 2026
Un commentaire.
<article class="uk-comment">
<header class="uk-comment-header">
<div class="uk-comment-title uk-margin-remove"><a class="uk-link-reset" href="#">Auteur</a></div>
<p class="uk-comment-meta uk-margin-remove-top">21 juillet 2026</p>
</header>
<div class="uk-comment-body"><p>Un commentaire.</p></div>
</article><div class="uk-child-width-1-3@s" uk-grid>
<div><div class="uk-tile uk-tile-muted uk-padding-small uk-text-center">Muted</div></div>
<div><div class="uk-tile uk-tile-primary uk-padding-small uk-text-center uk-light">Primary</div></div>
<div><div class="uk-tile uk-tile-secondary uk-padding-small uk-text-center uk-light">Secondary</div></div>
</div><div class="uk-placeholder uk-text-center">Zone placeholder (uk-placeholder).</div><progress class="uk-progress" value="40" max="100"></progress><span uk-spinner></span> <span uk-spinner="ratio: 2"></span>Extrait de la bibliothèque UIkit native. D'autres collections d'icônes (dont celles utilisées sur les sites PSud) seront ajoutées dans les versions à venir.
<span uk-icon="icon: check"></span>
<span uk-icon="icon: close"></span>
<span uk-icon="icon: search"></span>
<span uk-icon="icon: user"></span>
<span uk-icon="icon: settings"></span>
<span uk-icon="icon: mail"></span>
<span uk-icon="icon: heart"></span>
<span uk-icon="icon: star"></span>
<span uk-icon="icon: download"></span>
<span uk-icon="icon: link"></span>
<span uk-icon="icon: menu"></span>
<span uk-icon="icon: info"></span>
<span uk-icon="icon: calendar"></span>
<span uk-icon="icon: location"></span>
<span uk-icon="icon: cog"></span>
<span uk-icon="icon: file-text"></span><div class="uk-child-width-1-3@s uk-grid-small uk-text-center" uk-grid>
<div><div class="uk-background-muted uk-padding-small">1-3</div></div>
<div><div class="uk-background-muted uk-padding-small">1-3</div></div>
<div><div class="uk-background-muted uk-padding-small">1-3</div></div>
</div><div class="uk-grid-small uk-text-center" uk-grid>
<div class="uk-width-1-2@s"><div class="uk-background-muted uk-padding-small">1-2</div></div>
<div class="uk-width-1-4@s"><div class="uk-background-muted uk-padding-small">1-4</div></div>
<div class="uk-width-1-4@s"><div class="uk-background-muted uk-padding-small">1-4</div></div>
</div><div class="uk-child-width-1-3@s uk-grid-divider uk-grid-match" uk-grid>
<div><div class="uk-padding-small">Colonne A avec plus de texte pour la hauteur.</div></div>
<div><div class="uk-padding-small">Colonne B.</div></div>
<div><div class="uk-padding-small">Colonne C.</div></div>
</div><div class="uk-flex uk-flex-between uk-flex-middle uk-background-muted uk-padding-small">
<span>Gauche</span><span>Centre</span><span>Droite</span>
</div>Le bloc flotte à droite à partir de @s ; ce texte l'habille. Lorem ipsum dolor sit amet consectetur adipiscing.
<div>
<div class="uk-align-right@s uk-background-muted uk-padding-small uk-width-1-3@s uk-text-center">uk-align-right@s</div>
<p>Le bloc flotte à droite à partir de @s ; ce texte l'habille. Lorem ipsum dolor sit amet consectetur adipiscing.</p>
</div><div class="uk-child-width-1-3@s uk-grid-small uk-text-center" uk-grid>
<div><div class="uk-background-primary uk-light uk-padding-small">primary</div></div>
<div><div class="uk-background-secondary uk-light uk-padding-small">secondary</div></div>
<div><div class="uk-background-muted uk-padding-small">muted</div></div>
</div><div class="uk-child-width-1-3@s uk-grid-small uk-text-center" uk-grid>
<div><div class="uk-box-shadow-small uk-padding-small">small</div></div>
<div><div class="uk-box-shadow-medium uk-padding-small">medium</div></div>
<div><div class="uk-box-shadow-large uk-padding-small">large</div></div>
</div><div class="uk-flex uk-flex-wrap uk-flex-middle uk-text-center" style="gap:16px">
<div>
<div class="uk-background-secondary uk-border-rounded" style="width:96px;height:96px"></div>
<div class="uk-text-small uk-margin-small-top">uk-border-rounded</div>
</div>
<div>
<div class="uk-background-secondary uk-border-pill" style="width:160px;height:56px"></div>
<div class="uk-text-small uk-margin-small-top">uk-border-pill</div>
</div>
<div>
<div class="uk-background-secondary uk-border-circle" style="width:96px;height:96px"></div>
<div class="uk-text-small uk-margin-small-top">uk-border-circle</div>
</div>
</div>Texte tronqué sur une ligne quand la largeur est insuffisante pour tout afficher correctement.
uppercase
capitalize each word
Motdetrèslongsansespacequidoitpouvoirserompresurplusieurslignessansdéborderduconteneurparent.
<p class="uk-text-truncate">Texte tronqué sur une ligne quand la largeur est insuffisante pour tout afficher correctement.</p>
<p class="uk-text-uppercase">uppercase</p>
<p class="uk-text-capitalize">capitalize each word</p>
<p class="uk-text-break">Motdetrèslongsansespacequidoitpouvoirserompresurplusieurslignessansdéborderduconteneurparent.</p><span class="uk-hidden@m uk-label">Visible < @m</span>
<span class="uk-visible@m uk-label">Visible ≥ @m</span><hr>
<hr class="uk-divider-icon">
<hr class="uk-divider-small"><div class="uk-grid-small" uk-grid>
<div class="uk-width-expand"><span class="uk-leader">Article premium</span></div>
<div>12 900 F</div>
</div><div class="uk-background-muted uk-padding-small uk-text-center uk-transition-toggle" tabindex="0">
<span class="uk-transition-fade">Apparaît au survol</span>
</div><h3 class="uk-heading-line"><span>Heading line</span></h3>
<h3 class="uk-heading-bullet">Heading bullet</h3>
<h3 class="uk-heading-divider">Heading divider</h3><div uk-lightbox>
<a class="uk-button uk-button-default" href="https://via.placeholder.com/1200x800" data-caption="Exemple">Ouvrir une image</a>
</div><form class="uk-search uk-search-default">
<span uk-search-icon></span>
<input class="uk-search-input" type="search" placeholder="Rechercher…">
</form><ul class="uk-thumbnav">
<li class="uk-active"><a href="#"><div class="uk-background-primary" style="width:60px;height:40px"></div></a></li>
<li><a href="#"><div class="uk-background-secondary" style="width:60px;height:40px"></div></a></li>
<li><a href="#"><div class="uk-background-muted" style="width:60px;height:40px"></div></a></li>
</ul>Bloc générique uk-panel.
<div class="uk-panel uk-padding-small uk-background-muted"><h4 class="uk-margin-remove">Panel</h4><p class="uk-margin-remove">Bloc générique uk-panel.</p></div><div uk-sticky="end: true; offset: 90" class="uk-background-primary uk-light uk-padding-small uk-text-center">Élément sticky au scroll (uk-sticky)</div><div uk-scrollspy="cls: uk-animation-slide-bottom; repeat: true" class="uk-background-muted uk-padding-small uk-text-center">Apparaît en scrollant (uk-scrollspy)</div><div uk-parallax="bgy: -80" class="uk-background-primary uk-light uk-height-small uk-flex uk-flex-center uk-flex-middle">Parallax au scroll</div><ul class="uk-grid-small uk-child-width-1-3@s" uk-grid uk-sortable="handle: .uk-card">
<li><div class="uk-card uk-card-default uk-card-body uk-padding-small">A</div></li>
<li><div class="uk-card uk-card-default uk-card-body uk-padding-small">B</div></li>
<li><div class="uk-card uk-card-default uk-card-body uk-padding-small">C</div></li>
</ul><div uk-filter="target: .gls-filter">
<ul class="uk-subnav uk-subnav-pill">
<li class="uk-active" uk-filter-control><a href="#">Tous</a></li>
<li uk-filter-control="[data-color='a']"><a href="#">A</a></li>
<li uk-filter-control="[data-color='b']"><a href="#">B</a></li>
</ul>
<ul class="gls-filter uk-child-width-1-3@s uk-grid-small" uk-grid>
<li data-color="a"><div class="uk-background-primary uk-light uk-padding-small uk-text-center">A</div></li>
<li data-color="b"><div class="uk-background-secondary uk-light uk-padding-small uk-text-center">B</div></li>
<li data-color="a"><div class="uk-background-primary uk-light uk-padding-small uk-text-center">A</div></li>
</ul>
</div><div class="uk-cover-container uk-height-small">
<div class="uk-background-secondary uk-position-cover"></div>
<div class="uk-position-center uk-light">Contenu centré (uk-cover-container)</div>
</div><div class="uk-position-relative uk-background-muted uk-height-small">
<div class="uk-position-top-left uk-padding-small">top-left</div>
<div class="uk-position-center uk-padding-small">center</div>
<div class="uk-position-bottom-right uk-padding-small">bottom-right</div>
</div><div class="uk-child-width-1-3@s uk-grid-small uk-text-center uk-light" uk-grid>
<div><div class="uk-height-small uk-background-primary uk-flex uk-flex-center uk-flex-middle">small</div></div>
<div><div class="uk-height-medium uk-background-secondary uk-flex uk-flex-center uk-flex-middle">medium</div></div>
<div><div class="uk-height-small uk-background-primary uk-flex uk-flex-center uk-flex-middle">small</div></div>
</div><div class="uk-child-width-1-2@s uk-grid-small" uk-grid>
<div><div class="uk-background-secondary uk-light uk-padding-small">uk-light sur fond sombre</div></div>
<div><div class="uk-background-muted uk-dark uk-padding-small">uk-dark sur fond clair</div></div>
</div>Texte lead (accroche).
Texte nowrap qui ne passe pas à la ligne et se tronque.
<p class="uk-text-lead">Texte lead (accroche).</p>
<p class="uk-text-nowrap uk-text-truncate">Texte nowrap qui ne passe pas à la ligne et se tronque.</p>Aucun composant ne correspond.
Aucune des fonctionnalités décrites dans cette section n'existe à ce jour. Il s'agit de pistes de travail, présentées ici pour que les équipes puissent anticiper leurs intégrations. Les adresses et exemples qui suivent sont fictifs et non fonctionnels : ne les utilisez pas dans une application. Seules les URLs indiquées dans les sections précédentes sont réelles et exploitables aujourd'hui.
Le principal point de friction aujourd'hui est la durée de vie des URLs. Le fichier theme.css est régénéré à chaque modification du style, et son nom peut changer si le style actif change. Une application tierce qui code l'URL en dur finit donc, tôt ou tard, avec un lien mort ou un rendu périmé. Or, côté YOOtheme Pro, des changements surviendront nécessairement de temps en temps : évolutions de la charte, mises à jour du thème, recompilations.
La solution envisagée serait un petit mu-plugin exposant une URL fixe et définitive, sur ce modèle :
https://www.province-sud.nc/psud-ui/latest.css (exemple non fonctionnel)
Cette URL effectuerait une redirection 302 vers le fichier de thème réellement actif au moment de l'appel. Le développeur externe ne coderait alors qu'une seule URL, une fois pour toutes : lorsque la Province Sud change de style, recompile ou met à jour YOOtheme, la redirection suivrait automatiquement, sans aucune intervention côté application.
En complément, des URLs épinglées pourraient être proposées :
https://www.province-sud.nc/psud-ui/1.0.0.css (exemple non fonctionnel)
Elles pointeraient vers une version figée de la charte, pour les applications critiques devant garantir un rendu strictement identique dans le temps. Chaque équipe choisirait ainsi son curseur : une URL « dernière version » pour rester toujours aligné sur la charte en vigueur, ou une version épinglée pour un rendu gelé, mis à jour de manière maîtrisée.
Une suggestion, un besoin non couvert ? Signalez-le à l'équipe web : cette page a vocation à évoluer avec vos usages.