@maboussoleaidant/design-system 0.1.37 → 0.1.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1505,6 +1505,53 @@ a:hover {
1505
1505
  color: var(--mba-color-error-500);
1506
1506
  }
1507
1507
 
1508
+ /* ===========================================
1509
+ BACK TO TOP (retour en haut)
1510
+ Bouton rond flottant (bas-droit), ancre #top → JS-free.
1511
+ L'app bascule .is-hidden selon le scroll. Pour un défilement doux,
1512
+ poser `scroll-behavior: smooth` sur <html> côté app.
1513
+ width/height 48px, icône arrow_upward 24px.
1514
+ Source: Design System Figma (Annuaire, node 7672-576).
1515
+ =========================================== */
1516
+ .mba-btn-to-top {
1517
+ position: fixed;
1518
+ right: var(--mba-space-lg);
1519
+ bottom: var(--mba-space-lg);
1520
+ z-index: 40;
1521
+ display: inline-flex;
1522
+ align-items: center;
1523
+ justify-content: center;
1524
+ width: var(--mba-space-xl); /* 48px */
1525
+ height: var(--mba-space-xl); /* 48px */
1526
+ padding: 0;
1527
+ border: none;
1528
+ border-radius: var(--mba-radius-full);
1529
+ background-color: var(--mba-color-primary-500);
1530
+ color: var(--mba-color-white);
1531
+ cursor: pointer;
1532
+ transition: background-color var(--mba-transition-base);
1533
+ }
1534
+
1535
+ .mba-btn-to-top .mba-icon {
1536
+ font-size: 24px;
1537
+ width: 24px;
1538
+ height: 24px;
1539
+ }
1540
+
1541
+ .mba-btn-to-top:hover:not(:disabled):not(.is-disabled) {
1542
+ background-color: var(--mba-color-primary-800);
1543
+ }
1544
+
1545
+ .mba-btn-to-top:focus-visible {
1546
+ outline: none;
1547
+ box-shadow: var(--mba-focus-ring);
1548
+ }
1549
+
1550
+ /* Affichage géré par l'app (visible au scroll) */
1551
+ .mba-btn-to-top.is-hidden {
1552
+ display: none;
1553
+ }
1554
+
1508
1555
  /* ===========================================
1509
1556
  SMALL BUTTON
1510
1557
  padding: 4px 8px, gap: 8px
@@ -1710,6 +1757,24 @@ a:hover {
1710
1757
  transform: translateX(4px);
1711
1758
  }
1712
1759
 
1760
+ /* ===========================================
1761
+ ICÔNE EN PASTILLE RONDE (badge de tête)
1762
+ Modifieur de .mba-card__icon : icône décorative dans un cercle, en tête de
1763
+ card (ex. cartes « rubrique » / « sujet »). Neutralise le décalage au survol,
1764
+ réservé à la flèche d'action de fin de card.
1765
+ =========================================== */
1766
+ .mba-card__icon--circle {
1767
+ width: var(--mba-space-xl); /* 48px */
1768
+ height: var(--mba-space-xl);
1769
+ padding: var(--mba-space-xs);
1770
+ border-radius: var(--mba-radius-full);
1771
+ background-color: var(--mba-color-primary-50);
1772
+ }
1773
+
1774
+ .mba-card:hover .mba-card__icon--circle {
1775
+ transform: none;
1776
+ }
1777
+
1713
1778
  /* ===========================================
1714
1779
  CARD GRID
1715
1780
  =========================================== */
@@ -1989,6 +2054,239 @@ a:hover {
1989
2054
  }
1990
2055
  }
1991
2056
 
2057
+ /* ===========================================
2058
+ ARTICLE CARD - VARIANTE EDITO
2059
+ Card article éditoriale : image inset arrondie, ligne meta (date + auteur),
2060
+ tag catégorie AU-DESSUS du titre (réutiliser .mba-tag), lien « Lire l'article ».
2061
+ N'altère pas la base .mba-article-card.
2062
+ Source: Design System Figma (Card edito, node 4749-3666).
2063
+ =========================================== */
2064
+ .mba-article-card--edito {
2065
+ padding: var(--mba-space-xs); /* 8px : l'image et le contenu sont inset */
2066
+ gap: var(--mba-space-md); /* 16px entre média / contenu / footer */
2067
+ justify-content: space-between;
2068
+ }
2069
+
2070
+ /* Bloc média : image + ligne meta (gap 8px) */
2071
+ .mba-article-card__media {
2072
+ display: flex;
2073
+ flex-direction: column;
2074
+ gap: var(--mba-space-xs);
2075
+ width: 100%;
2076
+ }
2077
+
2078
+ /* Image inset : arrondie sur tous les coins, plus haute */
2079
+ .mba-article-card--edito .mba-article-card__image {
2080
+ height: 232px;
2081
+ border-radius: var(--mba-radius-xs);
2082
+ }
2083
+
2084
+ /* Ligne meta : « Mis à jour le … - Par … » */
2085
+ .mba-article-card__meta {
2086
+ margin: 0;
2087
+ font-family: var(--mba-font-family-text);
2088
+ font-size: var(--mba-font-size-xxs); /* 14px */
2089
+ font-weight: var(--mba-font-weight-regular);
2090
+ color: var(--mba-color-primary-900);
2091
+ line-height: normal;
2092
+ }
2093
+
2094
+ /* Contenu edito : le tag/titre/texte s'alignent sur l'image (pas de padding) */
2095
+ .mba-article-card--edito .mba-article-card__content {
2096
+ padding: 0;
2097
+ gap: var(--mba-space-xs);
2098
+ }
2099
+
2100
+ /* Titre edito : primary-900, tronqué sur 2 lignes */
2101
+ .mba-article-card--edito .mba-article-card__title {
2102
+ color: var(--mba-color-primary-900);
2103
+ display: -webkit-box;
2104
+ -webkit-box-orient: vertical;
2105
+ -webkit-line-clamp: 2;
2106
+ overflow: hidden;
2107
+ }
2108
+
2109
+ /* Texte edito : primary-900, tronqué sur 3 lignes */
2110
+ .mba-article-card--edito .mba-article-card__text {
2111
+ color: var(--mba-color-primary-900);
2112
+ display: -webkit-box;
2113
+ -webkit-box-orient: vertical;
2114
+ -webkit-line-clamp: 3;
2115
+ overflow: hidden;
2116
+ }
2117
+
2118
+ /* Footer edito : le padding est porté par la card, on neutralise */
2119
+ .mba-article-card--edito .mba-article-card__footer {
2120
+ padding: 0;
2121
+ margin-top: 0;
2122
+ }
2123
+
2124
+ /* ===========================================
2125
+ FEATURE CARD (image pleine + label flottant)
2126
+ Card de mise en avant : image de couverture + étiquette blanche ancrée en
2127
+ bas (titre + flèche). Toute la card est cliquable.
2128
+ Source: Design System Figma (node 4660-19320).
2129
+ =========================================== */
2130
+ .mba-feature-card {
2131
+ position: relative;
2132
+ display: block;
2133
+ overflow: hidden;
2134
+ aspect-ratio: 181 / 212; /* ~362 x 424 (maquette) */
2135
+ border-radius: var(--mba-radius-sm);
2136
+ text-decoration: none;
2137
+ }
2138
+
2139
+ .mba-feature-card__image {
2140
+ position: absolute;
2141
+ inset: 0;
2142
+ width: 100%;
2143
+ height: 100%;
2144
+ object-fit: cover;
2145
+ transition: transform var(--mba-transition-base);
2146
+ }
2147
+
2148
+ /* Étiquette blanche flottante, ancrée en bas avec 8px de marge */
2149
+ .mba-feature-card__label {
2150
+ position: absolute;
2151
+ left: var(--mba-space-xs);
2152
+ right: var(--mba-space-xs);
2153
+ bottom: var(--mba-space-xs);
2154
+ display: flex;
2155
+ align-items: center;
2156
+ gap: var(--mba-space-xs);
2157
+ padding: var(--mba-space-sm);
2158
+ background-color: var(--mba-color-white);
2159
+ border-radius: var(--mba-radius-sm);
2160
+ }
2161
+
2162
+ .mba-feature-card__title {
2163
+ flex: 1 1 0;
2164
+ min-width: 0;
2165
+ font-family: var(--mba-font-family-text);
2166
+ font-size: var(--mba-font-size-sm); /* 18px */
2167
+ font-weight: var(--mba-font-weight-semibold);
2168
+ color: var(--mba-color-primary-900);
2169
+ line-height: normal;
2170
+ }
2171
+
2172
+ .mba-feature-card__icon {
2173
+ flex-shrink: 0;
2174
+ color: var(--mba-color-primary-500);
2175
+ transition: transform var(--mba-transition-base);
2176
+ }
2177
+
2178
+ /* Hover : léger zoom de l'image + flèche qui avance */
2179
+ .mba-feature-card:hover .mba-feature-card__image {
2180
+ transform: scale(1.04);
2181
+ }
2182
+
2183
+ .mba-feature-card:hover .mba-feature-card__icon {
2184
+ transform: translateX(4px);
2185
+ }
2186
+
2187
+ .mba-feature-card:focus-visible {
2188
+ outline: none;
2189
+ box-shadow: var(--mba-focus-ring);
2190
+ }
2191
+
2192
+ @media (prefers-reduced-motion: reduce) {
2193
+ .mba-feature-card__image,
2194
+ .mba-feature-card__icon {
2195
+ transition: none;
2196
+ }
2197
+ .mba-feature-card:hover .mba-feature-card__image {
2198
+ transform: none;
2199
+ }
2200
+ }
2201
+
2202
+ /* ===========================================
2203
+ RESOURCE CARD (dossier / ressource)
2204
+ Card bordée avec forme décorative en fond, pastille, titre, sous-titre et
2205
+ bouton. Réutilise .mba-tag (pastille) et .mba-btn (bouton).
2206
+ La forme décorative est un SLOT rempli par l'app (.mba-resource-card__decoration) :
2207
+ le DS pose un lavis pastel par défaut, thémable via --lavender/--oranger/--bleuet.
2208
+ Source: Design System Figma (node 4660-19046).
2209
+ =========================================== */
2210
+ .mba-resource-card {
2211
+ /* Couleur du lavis décoratif (thémée par les modifieurs ci-dessous) */
2212
+ --mba-resource-decoration-color: var(--mba-color-pastel-lavender);
2213
+
2214
+ position: relative;
2215
+ display: flex;
2216
+ flex-direction: column;
2217
+ justify-content: space-between;
2218
+ gap: var(--mba-space-md);
2219
+ overflow: hidden;
2220
+ padding: var(--mba-space-md) var(--mba-space-xxl) var(--mba-space-md) var(--mba-space-md);
2221
+ background-color: var(--mba-color-white);
2222
+ border: 1px solid var(--mba-color-grey-100);
2223
+ border-radius: var(--mba-radius-md);
2224
+ }
2225
+
2226
+ /* Thèmes de la forme décorative */
2227
+ .mba-resource-card--oranger {
2228
+ --mba-resource-decoration-color: var(--mba-color-pastel-oranger);
2229
+ }
2230
+ .mba-resource-card--bleuet {
2231
+ --mba-resource-decoration-color: var(--mba-color-pastel-bleuet);
2232
+ }
2233
+
2234
+ /* Slot décoratif : lavis pastel par défaut, remplaçable par une illustration
2235
+ fournie par l'app (poser une <img>/<svg> à l'intérieur). */
2236
+ .mba-resource-card__decoration {
2237
+ position: absolute;
2238
+ inset: 0;
2239
+ z-index: 0;
2240
+ overflow: hidden;
2241
+ border-radius: inherit;
2242
+ pointer-events: none;
2243
+ background: radial-gradient(
2244
+ 115% 90% at 12% 100%,
2245
+ var(--mba-resource-decoration-color),
2246
+ transparent 72%
2247
+ );
2248
+ }
2249
+
2250
+ /* Contenu au-dessus de la décoration */
2251
+ .mba-resource-card__content {
2252
+ position: relative;
2253
+ z-index: 1;
2254
+ display: flex;
2255
+ flex-direction: column;
2256
+ gap: var(--mba-space-sm);
2257
+ width: 100%;
2258
+ }
2259
+
2260
+ .mba-resource-card__title {
2261
+ margin: 0;
2262
+ font-family: var(--mba-font-family-text);
2263
+ font-size: var(--mba-font-size-md); /* 24px */
2264
+ font-weight: var(--mba-font-weight-semibold);
2265
+ color: var(--mba-color-primary-900);
2266
+ line-height: normal;
2267
+ }
2268
+
2269
+ .mba-resource-card__text {
2270
+ margin: 0;
2271
+ font-family: var(--mba-font-family-text);
2272
+ font-size: var(--mba-font-size-xs); /* 16px */
2273
+ font-weight: var(--mba-font-weight-semibold);
2274
+ color: var(--mba-color-primary-900);
2275
+ line-height: normal;
2276
+ }
2277
+
2278
+ /* Bouton : au-dessus de la décoration */
2279
+ .mba-resource-card__action {
2280
+ position: relative;
2281
+ z-index: 1;
2282
+ }
2283
+
2284
+ @media (max-width: 600px) {
2285
+ .mba-resource-card {
2286
+ padding-right: var(--mba-space-md);
2287
+ }
2288
+ }
2289
+
1992
2290
  }
1993
2291
 
1994
2292
  /* end @layer components */
@@ -2438,6 +2736,32 @@ a:hover {
2438
2736
  cursor: default;
2439
2737
  }
2440
2738
 
2739
+ /* ===========================================
2740
+ DOTS - Variante « pilule extensible »
2741
+ Point actif allongé, inactifs courts (carousel).
2742
+ Actif: 72px primary-500 · inactif: 16px grey-100.
2743
+ =========================================== */
2744
+ .mba-dots--expand .mba-dot {
2745
+ width: var(--mba-space-sm); /* 16px (inactif) */
2746
+ background-color: var(--mba-color-grey-100);
2747
+ transition: width var(--mba-transition-base), background-color var(--mba-transition-base);
2748
+ }
2749
+
2750
+ .mba-dots--expand .mba-dot:hover:not(.is-active) {
2751
+ background-color: var(--mba-color-grey-300);
2752
+ }
2753
+
2754
+ .mba-dots--expand .mba-dot.is-active {
2755
+ width: 4.5rem; /* 72px (actif) - valeur visuelle maquette (~71px) */
2756
+ background-color: var(--mba-color-primary-500);
2757
+ }
2758
+
2759
+ @media (prefers-reduced-motion: reduce) {
2760
+ .mba-dots--expand .mba-dot {
2761
+ transition: none;
2762
+ }
2763
+ }
2764
+
2441
2765
  }
2442
2766
 
2443
2767
  /* end @layer components */
@@ -2880,6 +3204,14 @@ a:hover {
2880
3204
  margin-left: var(--mba-space-xs);
2881
3205
  }
2882
3206
 
3207
+ /* Variante icône EN TÊTE (à gauche du champ).
3208
+ L'icône précède l'<input> dans le DOM : on inverse la marge
3209
+ (margin-right au lieu de margin-left). Ex. barre de recherche « loupe ». */
3210
+ .mba-input-icon--leading .mba-input-icon__icon {
3211
+ margin-left: 0;
3212
+ margin-right: var(--mba-space-xs);
3213
+ }
3214
+
2883
3215
  /* Icon clickable (button) */
2884
3216
  button.mba-input-icon__icon {
2885
3217
  background: none;
@@ -4571,7 +4903,169 @@ button.mba-input-icon__icon:hover {
4571
4903
 
4572
4904
  /* @import "./_forms.css"; */
4573
4905
 
4574
- /* @import "./_alerts.css"; */
4906
+ /**
4907
+ * MBA Design System - Alerts
4908
+ *
4909
+ * Alerte contextuelle : message d'information, de succès, d'avertissement ou
4910
+ * d'erreur. Différent de `.mba-feedback` (qui ne sert qu'à la validation de
4911
+ * champs de formulaire).
4912
+ *
4913
+ * Principe visuel (source Figma - « Recherche : détresse détectée ») :
4914
+ * - fond + bordure portent la couleur sémantique de la variante ;
4915
+ * - le texte reste neutre (titre grey-800, corps primary-900) pour la
4916
+ * lisibilité et le contraste ;
4917
+ * - l'icône porte l'accent de la variante.
4918
+ *
4919
+ * Variantes : --info, --success, --warning, --error.
4920
+ * Le « bandeau détresse » de la maquette = .mba-alert--warning (+ --dashed et
4921
+ * icône « boxed »), pas de variante « support » maison.
4922
+ *
4923
+ * Convention d'état :
4924
+ * - .is-hidden masque l'alerte (dismiss basculé par l'app, zéro JS dans le DS).
4925
+ *
4926
+ * Accessibilité (câblage markup, cf. story) :
4927
+ * - info / success : role="status" + aria-live="polite".
4928
+ * - warning / error : role="alert" + aria-live="assertive".
4929
+ * - bouton fermeture : aria-label="Fermer".
4930
+ *
4931
+ * Source: Design System Figma (node 4660-18800).
4932
+ */
4933
+
4934
+ @layer components {
4935
+
4936
+ /* ===========================================
4937
+ CONTENEUR
4938
+ =========================================== */
4939
+ .mba-alert {
4940
+ display: flex;
4941
+ align-items: flex-start;
4942
+ gap: var(--mba-space-sm);
4943
+ padding: var(--mba-space-sm);
4944
+ border: 1px solid transparent;
4945
+ border-radius: var(--mba-radius-sm);
4946
+ background-color: var(--mba-color-grey-50);
4947
+ font-family: var(--mba-font-family-text);
4948
+ }
4949
+
4950
+ /* Bordure en pointillés (bandeau détresse) */
4951
+ .mba-alert--dashed {
4952
+ border-style: dashed;
4953
+ }
4954
+
4955
+ /* État masqué (dismiss géré par l'app) */
4956
+ .mba-alert.is-hidden {
4957
+ display: none;
4958
+ }
4959
+
4960
+ /* ===========================================
4961
+ ICÔNE
4962
+ =========================================== */
4963
+ .mba-alert__icon {
4964
+ display: inline-flex;
4965
+ align-items: center;
4966
+ justify-content: center;
4967
+ flex-shrink: 0;
4968
+ color: var(--mba-color-grey-800);
4969
+ }
4970
+
4971
+ /* Icône dans un chip blanc (bandeau détresse) */
4972
+ .mba-alert__icon--boxed {
4973
+ padding: var(--mba-space-xs);
4974
+ background-color: var(--mba-color-white);
4975
+ border-radius: var(--mba-radius-xs);
4976
+ }
4977
+
4978
+ /* ===========================================
4979
+ CONTENU
4980
+ =========================================== */
4981
+ .mba-alert__content {
4982
+ display: flex;
4983
+ flex-direction: column;
4984
+ gap: var(--mba-space-xs);
4985
+ flex: 1 1 0;
4986
+ min-width: 0;
4987
+ }
4988
+
4989
+ .mba-alert__title {
4990
+ margin: 0;
4991
+ font-size: var(--mba-font-size-xxs); /* 14px */
4992
+ font-weight: var(--mba-font-weight-bold);
4993
+ color: var(--mba-color-grey-800);
4994
+ line-height: normal;
4995
+ }
4996
+
4997
+ .mba-alert__text {
4998
+ margin: 0;
4999
+ font-size: var(--mba-font-size-xs); /* 16px */
5000
+ font-weight: var(--mba-font-weight-regular);
5001
+ color: var(--mba-color-primary-900);
5002
+ line-height: var(--mba-leading-snug);
5003
+ }
5004
+
5005
+ /* ===========================================
5006
+ BOUTON FERMETURE (optionnel)
5007
+ =========================================== */
5008
+ .mba-alert__close {
5009
+ display: inline-flex;
5010
+ align-items: center;
5011
+ justify-content: center;
5012
+ flex-shrink: 0;
5013
+ margin-left: auto;
5014
+ padding: 0;
5015
+ border: none;
5016
+ background-color: transparent;
5017
+ color: var(--mba-color-grey-400);
5018
+ cursor: pointer;
5019
+ transition: color var(--mba-transition-base);
5020
+ }
5021
+
5022
+ .mba-alert__close:hover {
5023
+ color: var(--mba-color-grey-800);
5024
+ }
5025
+
5026
+ .mba-alert__close:focus-visible {
5027
+ outline: none;
5028
+ border-radius: var(--mba-radius-2xs);
5029
+ box-shadow: var(--mba-focus-ring);
5030
+ }
5031
+
5032
+ /* ===========================================
5033
+ VARIANTES SÉMANTIQUES
5034
+ Fond = teinte claire ; bordure = teinte 400 ; icône = teinte 500.
5035
+ =========================================== */
5036
+ .mba-alert--info {
5037
+ background-color: var(--mba-color-info-50);
5038
+ border-color: var(--mba-color-info-400);
5039
+ }
5040
+ .mba-alert--info .mba-alert__icon {
5041
+ color: var(--mba-color-info-500);
5042
+ }
5043
+
5044
+ .mba-alert--success {
5045
+ background-color: var(--mba-color-success-100);
5046
+ border-color: var(--mba-color-success-400);
5047
+ }
5048
+ .mba-alert--success .mba-alert__icon {
5049
+ color: var(--mba-color-success-500);
5050
+ }
5051
+
5052
+ .mba-alert--warning {
5053
+ background-color: var(--mba-color-warning-50);
5054
+ border-color: var(--mba-color-warning-400);
5055
+ }
5056
+ .mba-alert--warning .mba-alert__icon {
5057
+ color: var(--mba-color-warning-500);
5058
+ }
5059
+
5060
+ .mba-alert--error {
5061
+ background-color: var(--mba-color-error-100);
5062
+ border-color: var(--mba-color-error-400);
5063
+ }
5064
+ .mba-alert--error .mba-alert__icon {
5065
+ color: var(--mba-color-error-500);
5066
+ }
5067
+
5068
+ }
4575
5069
 
4576
5070
  /**
4577
5071
  * MBA Design System - Accordion
@@ -4668,6 +5162,19 @@ button.mba-input-icon__icon:hover {
4668
5162
  background-color: transparent;
4669
5163
  }
4670
5164
 
5165
+ /* ===========================================
5166
+ IMBRICATION (parent → sous-éléments)
5167
+ - Parent : séparateur ligne pleine (défaut .mba-accordion--line).
5168
+ - Sous-élément imbriqué dans le panneau du parent : ligne pointillés.
5169
+ - Replier le parent replie visuellement les sous-éléments : ils vivent
5170
+ dans .mba-accordion__panel (display:none tant que le parent est fermé).
5171
+ =========================================== */
5172
+
5173
+ /* Tout accordion line imbriqué dans le panneau d'un parent → trait pointillés */
5174
+ .mba-accordion__panel .mba-accordion--line .mba-accordion__header {
5175
+ border-bottom-style: dashed;
5176
+ }
5177
+
4671
5178
  .mba-accordion__title-wrapper {
4672
5179
  display: flex;
4673
5180
  align-items: center;
@@ -4725,7 +5232,8 @@ button.mba-input-icon__icon:hover {
4725
5232
  transition: transform var(--mba-transition-base);
4726
5233
  }
4727
5234
 
4728
- .mba-accordion--open .mba-accordion__icon {
5235
+ /* Enfant direct uniquement : ne pas piloter l'icône des accordions imbriqués */
5236
+ .mba-accordion--open > .mba-accordion__header .mba-accordion__icon {
4729
5237
  transform: rotate(180deg);
4730
5238
  }
4731
5239
 
@@ -4737,7 +5245,9 @@ button.mba-input-icon__icon:hover {
4737
5245
  background-color: var(--mba-color-white);
4738
5246
  }
4739
5247
 
4740
- .mba-accordion--open .mba-accordion__panel {
5248
+ /* Enfant direct uniquement : chaque accordion contrôle son propre panneau,
5249
+ sans forcer l'ouverture des panneaux des accordions imbriqués */
5250
+ .mba-accordion--open > .mba-accordion__panel {
4741
5251
  display: block;
4742
5252
  }
4743
5253
 
@@ -4833,9 +5343,282 @@ button.mba-input-icon__icon:hover {
4833
5343
 
4834
5344
  }
4835
5345
 
4836
- /* @import "./_carousel.css"; */
5346
+ /**
5347
+ * MBA Design System - Carousel
5348
+ *
5349
+ * Carousel 100% CSS : défilement horizontal natif avec scroll-snap (swipe
5350
+ * tactile + molette + clavier), zéro JS dans le DS.
5351
+ * - .mba-carousel__track : piste flex scrollable, scroll-snap-type: x mandatory.
5352
+ * - .mba-carousel__slide : chaque diapo s'aligne au début (scroll-snap-align).
5353
+ * - .mba-carousel__controls : flèches rondes (précédent / suivant).
5354
+ * - Pagination : réutiliser .mba-dots / .mba-dot (_paging.css).
5355
+ *
5356
+ * Comportement (à la charge de l'app, zéro JS embarqué) :
5357
+ * - Le clic sur les flèches / points fait défiler la piste (scrollBy / scrollIntoView).
5358
+ * - L'app bascule .is-active sur le point courant et .is-disabled / [disabled]
5359
+ * sur la flèche en butée.
5360
+ *
5361
+ * Accessibilité (câblage markup, cf. story) :
5362
+ * - Conteneur : role="region" + aria-roledescription="carousel" + aria-label.
5363
+ * - Piste focusable au clavier (tabindex="0") pour le défilement clavier.
5364
+ * - Flèches : aria-label "Précédent" / "Suivant".
5365
+ *
5366
+ * Largeur des diapos : personnalisable via --mba-carousel-slide-width
5367
+ * (défaut 360px ; ex. 85% pour laisser deviner la diapo suivante en mobile).
5368
+ *
5369
+ * Source: Design System Figma (nodes 4660-19043 / 4660-19016).
5370
+ */
5371
+
5372
+ @layer components {
5373
+
5374
+ .mba-carousel {
5375
+ width: 100%;
5376
+ }
5377
+
5378
+ /* ===========================================
5379
+ PISTE (scroll-snap horizontal)
5380
+ =========================================== */
5381
+ .mba-carousel__track {
5382
+ display: flex;
5383
+ gap: var(--mba-space-sm);
5384
+ overflow-x: auto;
5385
+ scroll-snap-type: x mandatory;
5386
+ scroll-behavior: smooth;
5387
+ /* Masquer la scrollbar sans bloquer le scroll clavier / tactile */
5388
+ scrollbar-width: none; /* Firefox */
5389
+ -ms-overflow-style: none; /* IE/Edge legacy */
5390
+ }
5391
+
5392
+ .mba-carousel__track::-webkit-scrollbar {
5393
+ display: none; /* WebKit */
5394
+ }
5395
+
5396
+ .mba-carousel__slide {
5397
+ flex: 0 0 var(--mba-carousel-slide-width, 360px);
5398
+ max-width: 100%;
5399
+ scroll-snap-align: start;
5400
+ }
4837
5401
 
4838
- /* @import "./_navigation.css"; */
5402
+ /* ===========================================
5403
+ PIED : pagination centrée + flèches à droite
5404
+ =========================================== */
5405
+ .mba-carousel__footer {
5406
+ position: relative;
5407
+ display: flex;
5408
+ align-items: center;
5409
+ justify-content: center;
5410
+ min-height: 32px;
5411
+ margin-top: var(--mba-space-md);
5412
+ }
5413
+
5414
+ .mba-carousel__controls {
5415
+ position: absolute;
5416
+ right: 0;
5417
+ display: inline-flex;
5418
+ align-items: center;
5419
+ gap: var(--mba-space-xs);
5420
+ }
5421
+
5422
+ /* ===========================================
5423
+ FLÈCHE (contrôle rond)
5424
+ =========================================== */
5425
+ .mba-carousel__control {
5426
+ display: inline-flex;
5427
+ align-items: center;
5428
+ justify-content: center;
5429
+ flex-shrink: 0;
5430
+ padding: var(--mba-space-xxs);
5431
+ border: none;
5432
+ border-radius: var(--mba-radius-full);
5433
+ background-color: var(--mba-color-primary-500);
5434
+ color: var(--mba-color-white);
5435
+ cursor: pointer;
5436
+ transition: background-color var(--mba-transition-base);
5437
+ }
5438
+
5439
+ .mba-carousel__control:hover:not(:disabled):not(.is-disabled) {
5440
+ background-color: var(--mba-color-primary-800);
5441
+ }
5442
+
5443
+ .mba-carousel__control:focus-visible {
5444
+ outline: none;
5445
+ box-shadow: var(--mba-focus-ring);
5446
+ }
5447
+
5448
+ /* Flèche en butée (début / fin de piste) */
5449
+ .mba-carousel__control:disabled,
5450
+ .mba-carousel__control.is-disabled {
5451
+ background-color: var(--mba-color-grey-100);
5452
+ cursor: not-allowed;
5453
+ }
5454
+
5455
+ /* ===========================================
5456
+ ACCESSIBILITÉ : mouvement réduit
5457
+ =========================================== */
5458
+ @media (prefers-reduced-motion: reduce) {
5459
+ .mba-carousel__track {
5460
+ scroll-behavior: auto;
5461
+ }
5462
+ }
5463
+
5464
+ }
5465
+
5466
+ /**
5467
+ * MBA Design System - Navigation
5468
+ *
5469
+ * Fil d'Ariane (breadcrumb).
5470
+ * - Le premier niveau porte une icône « maison » (home) + libellé.
5471
+ * - Les séparateurs sont des chevrons décoratifs (keyboard_arrow_right).
5472
+ * - Les niveaux parents sont des liens neutres (grey-800) ; l'élément courant
5473
+ * est mis en avant en primary-500 et n'est pas cliquable.
5474
+ *
5475
+ * Accessibilité (câblage markup, cf. story) :
5476
+ * - Conteneur : <nav aria-label="Fil d'Ariane"> avec un <ol>.
5477
+ * - Élément courant : aria-current="page" (stylé via l'attribut).
5478
+ * - Séparateurs : aria-hidden="true".
5479
+ *
5480
+ * Source: Design System Figma (Breadcrumbs - Ma vie d'aidant, node 4660-18352).
5481
+ */
5482
+
5483
+ @layer components {
5484
+
5485
+ /* ===========================================
5486
+ CONTENEUR
5487
+ =========================================== */
5488
+ .mba-breadcrumb {
5489
+ font-family: var(--mba-font-family-text);
5490
+ font-size: var(--mba-font-size-xxs); /* 14px */
5491
+ line-height: normal;
5492
+ }
5493
+
5494
+ /* ===========================================
5495
+ LISTE (<ol>)
5496
+ Gap uniforme de 4px entre chaque élément et séparateur.
5497
+ =========================================== */
5498
+ .mba-breadcrumb__list {
5499
+ display: flex;
5500
+ flex-wrap: wrap;
5501
+ align-items: center;
5502
+ gap: var(--mba-space-xxs); /* 4px */
5503
+ margin: 0;
5504
+ padding: 0;
5505
+ list-style: none;
5506
+ }
5507
+
5508
+ /* ===========================================
5509
+ ITEM (<li>)
5510
+ Contient le lien (ou l'élément courant) et son séparateur.
5511
+ =========================================== */
5512
+ .mba-breadcrumb__item {
5513
+ display: inline-flex;
5514
+ align-items: center;
5515
+ gap: var(--mba-space-xxs); /* 4px */
5516
+ min-width: 0;
5517
+ }
5518
+
5519
+ /* ===========================================
5520
+ LIEN (niveaux parents)
5521
+ Neutre grey-800, hover primary-800 + soulignement.
5522
+ =========================================== */
5523
+ .mba-breadcrumb__link {
5524
+ display: inline-flex;
5525
+ align-items: center;
5526
+ gap: var(--mba-space-xxs); /* 4px : icône home + libellé */
5527
+ min-width: 0;
5528
+ color: var(--mba-color-grey-800);
5529
+ font-weight: var(--mba-font-weight-semibold);
5530
+ text-decoration: none;
5531
+ transition: color var(--mba-transition-base);
5532
+ }
5533
+
5534
+ .mba-breadcrumb__link:hover {
5535
+ color: var(--mba-color-primary-800);
5536
+ text-decoration: underline;
5537
+ }
5538
+
5539
+ .mba-breadcrumb__link:focus-visible {
5540
+ outline: none;
5541
+ border-radius: var(--mba-radius-2xs);
5542
+ box-shadow: var(--mba-focus-ring);
5543
+ }
5544
+
5545
+ /* Libellé tronqué proprement si trop long (mobile) */
5546
+ .mba-breadcrumb__label {
5547
+ overflow: hidden;
5548
+ text-overflow: ellipsis;
5549
+ white-space: nowrap;
5550
+ }
5551
+
5552
+ /* Icône « maison » : hérite de la couleur du lien (grey-800) */
5553
+ .mba-breadcrumb__home-icon {
5554
+ flex-shrink: 0;
5555
+ color: inherit;
5556
+ }
5557
+
5558
+ /* ===========================================
5559
+ SÉPARATEUR (chevron décoratif)
5560
+ =========================================== */
5561
+ .mba-breadcrumb__separator {
5562
+ flex-shrink: 0;
5563
+ color: var(--mba-color-grey-400);
5564
+ user-select: none;
5565
+ }
5566
+
5567
+ /* ===========================================
5568
+ ÉLÉMENT COURANT (page active, non cliquable)
5569
+ Accent primary-500. Stylé via la classe ou l'attribut aria-current.
5570
+ =========================================== */
5571
+ .mba-breadcrumb__current,
5572
+ .mba-breadcrumb [aria-current="page"] {
5573
+ color: var(--mba-color-primary-500);
5574
+ font-weight: var(--mba-font-weight-semibold);
5575
+ overflow: hidden;
5576
+ text-overflow: ellipsis;
5577
+ white-space: nowrap;
5578
+ }
5579
+
5580
+ /* ===========================================
5581
+ FIL REPLIABLE (ellipsis)
5582
+ Pour les fils longs / mobile : les niveaux intermédiaires sont masqués
5583
+ derrière un bouton « … » qui les déplie.
5584
+ Comportement (masquage des items, bascule aria-expanded) piloté par l'app —
5585
+ zéro JS dans le DS. Style du bouton aligné sur .mba-breadcrumb__link.
5586
+ À câbler : <button class="mba-breadcrumb__toggle" aria-expanded="false"
5587
+ aria-label="Afficher le fil d'Ariane complet">…</button>
5588
+ =========================================== */
5589
+ .mba-breadcrumb__toggle {
5590
+ display: inline-flex;
5591
+ align-items: center;
5592
+ justify-content: center;
5593
+ min-width: 24px;
5594
+ padding: 0 var(--mba-space-xxs);
5595
+ border: none;
5596
+ background: transparent;
5597
+ color: var(--mba-color-grey-800);
5598
+ font-family: inherit;
5599
+ font-size: inherit;
5600
+ font-weight: var(--mba-font-weight-semibold);
5601
+ line-height: normal;
5602
+ cursor: pointer;
5603
+ transition: color var(--mba-transition-base);
5604
+ }
5605
+
5606
+ .mba-breadcrumb__toggle:hover {
5607
+ color: var(--mba-color-primary-800);
5608
+ }
5609
+
5610
+ .mba-breadcrumb__toggle:focus-visible {
5611
+ outline: none;
5612
+ border-radius: var(--mba-radius-2xs);
5613
+ box-shadow: var(--mba-focus-ring);
5614
+ }
5615
+
5616
+ /* Item masqué tant que le fil est replié (bascule par l'app). */
5617
+ .mba-breadcrumb__item.is-hidden {
5618
+ display: none;
5619
+ }
5620
+
5621
+ }
4839
5622
 
4840
5623
  /**
4841
5624
  * MBA Design System - Utilities