@lab-anssi/ui-kit 1.61.3 → 1.62.0

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.
Files changed (221) hide show
  1. package/README.md +102 -21
  2. package/dist/assets/assets.d.ts +1 -0
  3. package/dist/assets/assets.js +1 -0
  4. package/dist/assets/dsfr-icons.css +1 -0
  5. package/dist/composants/Alerte.svelte +83 -0
  6. package/dist/composants/Alerte.svelte.d.ts +32 -0
  7. package/dist/composants/AncresParcours.svelte +132 -0
  8. package/dist/composants/AncresParcours.svelte.d.ts +11 -0
  9. package/dist/composants/BandeauPage.svelte +218 -0
  10. package/dist/composants/BandeauPage.svelte.d.ts +58 -0
  11. package/dist/composants/BlocFonctionnalites.svelte +570 -0
  12. package/dist/composants/BlocFonctionnalites.svelte.d.ts +105 -0
  13. package/dist/composants/Bouton.svelte +156 -0
  14. package/dist/composants/Bouton.svelte.d.ts +36 -0
  15. package/dist/composants/CentreAide.svelte +223 -0
  16. package/dist/composants/CentreAide.svelte.d.ts +41 -0
  17. package/dist/composants/FiltresCatalogue.svelte +147 -0
  18. package/dist/composants/FiltresCatalogue.svelte.d.ts +15 -0
  19. package/dist/composants/Icone.svelte +42 -0
  20. package/dist/composants/Icone.svelte.d.ts +7 -0
  21. package/dist/composants/Lien.svelte +233 -0
  22. package/dist/composants/Lien.svelte.d.ts +39 -0
  23. package/dist/composants/MultiSelect.svelte +931 -0
  24. package/dist/composants/MultiSelect.svelte.d.ts +51 -0
  25. package/dist/composants/Reactions.svelte +360 -0
  26. package/dist/composants/Reactions.svelte.d.ts +23 -0
  27. package/dist/composants/ResumePssi.svelte +92 -0
  28. package/dist/composants/ResumePssi.svelte.d.ts +6 -0
  29. package/dist/composants/Tag.svelte +113 -0
  30. package/dist/composants/Tag.svelte.d.ts +35 -0
  31. package/dist/composants/blog/BandeauTitre.svelte +150 -0
  32. package/dist/composants/blog/BandeauTitre.svelte.d.ts +29 -0
  33. package/dist/composants/blog/CarteArticle.svelte +69 -0
  34. package/dist/composants/blog/CarteArticle.svelte.d.ts +8 -0
  35. package/dist/composants/blog/IconeChevronBas.svelte +22 -0
  36. package/dist/composants/blog/IconeChevronBas.svelte.d.ts +26 -0
  37. package/dist/composants/blog/IconeMenuLateral.svelte +15 -0
  38. package/dist/composants/blog/IconeMenuLateral.svelte.d.ts +26 -0
  39. package/dist/composants/blog/ListeArticles.svelte +62 -0
  40. package/dist/composants/blog/ListeArticles.svelte.d.ts +9 -0
  41. package/dist/composants/blog/ListeDeroulante.svelte +57 -0
  42. package/dist/composants/blog/ListeDeroulante.svelte.d.ts +10 -0
  43. package/dist/composants/blog/PageCrisp.svelte +244 -0
  44. package/dist/composants/blog/PageCrisp.svelte.d.ts +8 -0
  45. package/dist/composants/blog/SommaireBureau.svelte +64 -0
  46. package/dist/composants/blog/SommaireBureau.svelte.d.ts +9 -0
  47. package/dist/composants/blog/SommaireMobile.svelte +115 -0
  48. package/dist/composants/blog/SommaireMobile.svelte.d.ts +9 -0
  49. package/dist/composants/carrousel-tuiles/CarrouselTuiles.svelte +184 -0
  50. package/dist/composants/carrousel-tuiles/CarrouselTuiles.svelte.d.ts +34 -0
  51. package/dist/composants/carrousel-tuiles/IconeFlecheDroite.svelte +16 -0
  52. package/dist/composants/carrousel-tuiles/IconeFlecheDroite.svelte.d.ts +26 -0
  53. package/dist/composants/carrousel-tuiles/IconeFlecheGauche.svelte +12 -0
  54. package/dist/composants/carrousel-tuiles/IconeFlecheGauche.svelte.d.ts +26 -0
  55. package/dist/composants/carrousel-tuiles/Tuile.svelte +72 -0
  56. package/dist/composants/carrousel-tuiles/Tuile.svelte.d.ts +10 -0
  57. package/dist/composants/icones/Fleche.svelte +25 -0
  58. package/dist/composants/icones/Fleche.svelte.d.ts +6 -0
  59. package/dist/composants/icones/LienExterne.svelte +20 -0
  60. package/dist/composants/icones/LienExterne.svelte.d.ts +6 -0
  61. package/dist/composants/marelle/Etape.svelte +165 -0
  62. package/dist/composants/marelle/Etape.svelte.d.ts +32 -0
  63. package/dist/composants/marelle/Marelle.svelte +97 -0
  64. package/dist/composants/marelle/Marelle.svelte.d.ts +44 -0
  65. package/dist/composants/mes-services-cyber/bandeau/Bandeau.svelte +158 -0
  66. package/dist/composants/mes-services-cyber/bandeau/Bandeau.svelte.d.ts +3 -0
  67. package/dist/composants/mes-services-cyber/lien/LienDiagnosticCyber.svelte +125 -0
  68. package/dist/composants/mes-services-cyber/lien/LienDiagnosticCyber.svelte.d.ts +7 -0
  69. package/dist/composants/pied-de-page/NavigationPiedDePage.svelte +62 -0
  70. package/dist/composants/pied-de-page/NavigationPiedDePage.svelte.d.ts +6 -0
  71. package/dist/composants/suite-cyber/AccueilSuiteCyber.svelte +96 -0
  72. package/dist/composants/suite-cyber/AccueilSuiteCyber.svelte.d.ts +6 -0
  73. package/dist/composants/suite-cyber/LiensSuiteCyber.svelte +99 -0
  74. package/dist/composants/suite-cyber/LiensSuiteCyber.svelte.d.ts +14 -0
  75. package/dist/composants/suite-cyber/SuiteCyber.svelte +296 -0
  76. package/dist/composants/suite-cyber/SuiteCyber.svelte.d.ts +6 -0
  77. package/dist/composants/vitrines-produits/briques/Brique.svelte +50 -0
  78. package/dist/composants/vitrines-produits/briques/Brique.svelte.d.ts +9 -0
  79. package/dist/composants/vitrines-produits/briques/BriqueContenuADeuxColonnes.svelte +144 -0
  80. package/dist/composants/vitrines-produits/briques/BriqueContenuADeuxColonnes.svelte.d.ts +29 -0
  81. package/dist/composants/vitrines-produits/briques/BriqueHero.svelte +246 -0
  82. package/dist/composants/vitrines-produits/briques/BriqueHero.svelte.d.ts +31 -0
  83. package/dist/composants/vitrines-produits/briques/BriqueTitreMultimedia.svelte +50 -0
  84. package/dist/composants/vitrines-produits/briques/BriqueTitreMultimedia.svelte.d.ts +25 -0
  85. package/dist/composants/vitrines-produits/briques/LecteurVideo.svelte +14 -0
  86. package/dist/composants/vitrines-produits/briques/LecteurVideo.svelte.d.ts +9 -0
  87. package/dist/composants/vitrines-produits/briques/PresentationANSSI.svelte +148 -0
  88. package/dist/composants/vitrines-produits/briques/PresentationANSSI.svelte.d.ts +37 -0
  89. package/dist/composants/vitrines-produits/briques/RejoindreLaCommunaute.svelte +139 -0
  90. package/dist/composants/vitrines-produits/briques/RejoindreLaCommunaute.svelte.d.ts +36 -0
  91. package/dist/composants/vitrines-produits/briques/temoignages/IconeTemoignage.svelte +18 -0
  92. package/dist/composants/vitrines-produits/briques/temoignages/IconeTemoignage.svelte.d.ts +26 -0
  93. package/dist/composants/vitrines-produits/briques/temoignages/Temoignages.svelte +168 -0
  94. package/dist/composants/vitrines-produits/briques/temoignages/Temoignages.svelte.d.ts +13 -0
  95. package/dist/directives/actions.svelte.d.ts +32 -0
  96. package/dist/directives/actions.svelte.js +158 -0
  97. package/dist/dsfr/DsfrAccordion.svelte +889 -0
  98. package/dist/dsfr/DsfrAccordion.svelte.d.ts +40 -0
  99. package/dist/dsfr/DsfrAlert.svelte +2097 -0
  100. package/dist/dsfr/DsfrAlert.svelte.d.ts +36 -0
  101. package/dist/dsfr/DsfrBadge.svelte +532 -0
  102. package/dist/dsfr/DsfrBadge.svelte.d.ts +41 -0
  103. package/dist/dsfr/DsfrBadgesGroup.svelte +610 -0
  104. package/dist/dsfr/DsfrBadgesGroup.svelte.d.ts +25 -0
  105. package/dist/dsfr/DsfrBreadcrumb.svelte +657 -0
  106. package/dist/dsfr/DsfrBreadcrumb.svelte.d.ts +25 -0
  107. package/dist/dsfr/DsfrButton.svelte +1821 -0
  108. package/dist/dsfr/DsfrButton.svelte.d.ts +68 -0
  109. package/dist/dsfr/DsfrButtonsGroup.svelte +1896 -0
  110. package/dist/dsfr/DsfrButtonsGroup.svelte.d.ts +36 -0
  111. package/dist/dsfr/DsfrCallout.svelte +242 -0
  112. package/dist/dsfr/DsfrCallout.svelte.d.ts +46 -0
  113. package/dist/dsfr/DsfrCard.svelte +10223 -0
  114. package/dist/dsfr/DsfrCard.svelte.d.ts +102 -0
  115. package/dist/dsfr/DsfrCheckbox.svelte +1280 -0
  116. package/dist/dsfr/DsfrCheckbox.svelte.d.ts +69 -0
  117. package/dist/dsfr/DsfrCheckboxesGroup.svelte +1532 -0
  118. package/dist/dsfr/DsfrCheckboxesGroup.svelte.d.ts +73 -0
  119. package/dist/dsfr/DsfrConnect.svelte +511 -0
  120. package/dist/dsfr/DsfrConnect.svelte.d.ts +15 -0
  121. package/dist/dsfr/DsfrContainer.svelte +894 -0
  122. package/dist/dsfr/DsfrContainer.svelte.d.ts +31 -0
  123. package/dist/dsfr/DsfrContent.svelte +1140 -0
  124. package/dist/dsfr/DsfrContent.svelte.d.ts +60 -0
  125. package/dist/dsfr/DsfrDropdown.svelte +335 -0
  126. package/dist/dsfr/DsfrDropdown.svelte.d.ts +73 -0
  127. package/dist/dsfr/DsfrFooter.svelte +2370 -0
  128. package/dist/dsfr/DsfrFooter.svelte.d.ts +77 -0
  129. package/dist/dsfr/DsfrHeader.svelte +4162 -0
  130. package/dist/dsfr/DsfrHeader.svelte.d.ts +131 -0
  131. package/dist/dsfr/DsfrHighlight.svelte +294 -0
  132. package/dist/dsfr/DsfrHighlight.svelte.d.ts +33 -0
  133. package/dist/dsfr/DsfrInput.svelte +1270 -0
  134. package/dist/dsfr/DsfrInput.svelte.d.ts +86 -0
  135. package/dist/dsfr/DsfrLabel.svelte +438 -0
  136. package/dist/dsfr/DsfrLabel.svelte.d.ts +65 -0
  137. package/dist/dsfr/DsfrLink.svelte +1007 -0
  138. package/dist/dsfr/DsfrLink.svelte.d.ts +66 -0
  139. package/dist/dsfr/DsfrLogo.svelte +228 -0
  140. package/dist/dsfr/DsfrLogo.svelte.d.ts +11 -0
  141. package/dist/dsfr/DsfrMessagesGroup.svelte +260 -0
  142. package/dist/dsfr/DsfrMessagesGroup.svelte.d.ts +46 -0
  143. package/dist/dsfr/DsfrModal.svelte +2983 -0
  144. package/dist/dsfr/DsfrModal.svelte.d.ts +56 -0
  145. package/dist/dsfr/DsfrNavigation.svelte +7626 -0
  146. package/dist/dsfr/DsfrNotice.svelte +2948 -0
  147. package/dist/dsfr/DsfrNotice.svelte.d.ts +37 -0
  148. package/dist/dsfr/DsfrPagination.svelte +1036 -0
  149. package/dist/dsfr/DsfrPagination.svelte.d.ts +35 -0
  150. package/dist/dsfr/DsfrQuote.svelte +646 -0
  151. package/dist/dsfr/DsfrQuote.svelte.d.ts +29 -0
  152. package/dist/dsfr/DsfrRadio.svelte +1307 -0
  153. package/dist/dsfr/DsfrRadio.svelte.d.ts +37 -0
  154. package/dist/dsfr/DsfrRadiosGroup.svelte +1629 -0
  155. package/dist/dsfr/DsfrRadiosGroup.svelte.d.ts +76 -0
  156. package/dist/dsfr/DsfrRange.svelte +1329 -0
  157. package/dist/dsfr/DsfrRange.svelte.d.ts +77 -0
  158. package/dist/dsfr/DsfrSearch.svelte +2015 -0
  159. package/dist/dsfr/DsfrSearch.svelte.d.ts +51 -0
  160. package/dist/dsfr/DsfrSegmented.svelte +422 -0
  161. package/dist/dsfr/DsfrSegmented.svelte.d.ts +34 -0
  162. package/dist/dsfr/DsfrSelect.svelte +1068 -0
  163. package/dist/dsfr/DsfrSelect.svelte.d.ts +86 -0
  164. package/dist/dsfr/DsfrShare.svelte +2228 -0
  165. package/dist/dsfr/DsfrShare.svelte.d.ts +40 -0
  166. package/dist/dsfr/DsfrSideMenu.svelte +1211 -0
  167. package/dist/dsfr/DsfrSideMenu.svelte.d.ts +34 -0
  168. package/dist/dsfr/DsfrSkipLink.svelte +990 -0
  169. package/dist/dsfr/DsfrSkipLink.svelte.d.ts +13 -0
  170. package/dist/dsfr/DsfrStepper.svelte +340 -0
  171. package/dist/dsfr/DsfrStepper.svelte.d.ts +18 -0
  172. package/dist/dsfr/DsfrTable.svelte +829 -0
  173. package/dist/dsfr/DsfrTable.svelte.d.ts +202 -0
  174. package/dist/dsfr/DsfrTabnav.svelte +1149 -0
  175. package/dist/dsfr/DsfrTabnav.svelte.d.ts +36 -0
  176. package/dist/dsfr/DsfrTabs.svelte +926 -0
  177. package/dist/dsfr/DsfrTabs.svelte.d.ts +28 -0
  178. package/dist/dsfr/DsfrTag.svelte +1269 -0
  179. package/dist/dsfr/DsfrTag.svelte.d.ts +59 -0
  180. package/dist/dsfr/DsfrTagsGroup.svelte +1351 -0
  181. package/dist/dsfr/DsfrTagsGroup.svelte.d.ts +37 -0
  182. package/dist/dsfr/DsfrTextarea.svelte +1385 -0
  183. package/dist/dsfr/DsfrTextarea.svelte.d.ts +72 -0
  184. package/dist/dsfr/DsfrTile.svelte +7645 -0
  185. package/dist/dsfr/DsfrTile.svelte.d.ts +79 -0
  186. package/dist/dsfr/DsfrToggle.svelte +1453 -0
  187. package/dist/dsfr/DsfrToggle.svelte.d.ts +56 -0
  188. package/dist/dsfr/DsfrTooltip.svelte +396 -0
  189. package/dist/dsfr/DsfrTooltip.svelte.d.ts +36 -0
  190. package/dist/dsfr/DsfrTranscription.svelte +2962 -0
  191. package/dist/dsfr/DsfrTranscription.svelte.d.ts +39 -0
  192. package/dist/dsfr/DsfrTranslate.svelte +1384 -0
  193. package/dist/dsfr/DsfrTranslate.svelte.d.ts +19 -0
  194. package/dist/dsfr/DsfrUser.svelte +736 -0
  195. package/dist/dsfr/DsfrUser.svelte.d.ts +65 -0
  196. package/dist/index.d.ts +79 -0
  197. package/dist/index.js +79 -0
  198. package/dist/styles/apparence-bouton.scss +154 -0
  199. package/dist/styles/dsfr-icons.css +1 -0
  200. package/dist/styles/dsfr-icons.scss +4 -0
  201. package/dist/styles/dsfr-variables.scss +28 -0
  202. package/dist/styles/mixins-dsfr.scss +226 -0
  203. package/dist/styles/mixins.scss +51 -0
  204. package/dist/types/commun.d.ts +63 -0
  205. package/dist/types/commun.js +1 -0
  206. package/dist/types/global.d.ts +24 -0
  207. package/dist/types/global.js +9 -0
  208. package/dist/types/index.d.ts +2 -0
  209. package/dist/types/index.js +1 -0
  210. package/dist/ui-kit-components.json +142 -100
  211. package/dist/utilitaires/createFormValidation.svelte.d.ts +34 -0
  212. package/dist/utilitaires/createFormValidation.svelte.js +183 -0
  213. package/dist/utilitaires/icons-stylesheet.d.ts +370 -0
  214. package/dist/utilitaires/icons-stylesheet.js +33 -0
  215. package/dist/utilitaires/index.d.ts +14 -0
  216. package/dist/utilitaires/index.js +26 -0
  217. package/dist/web-types.json +149 -101
  218. package/dist/webcomponents/lab-anssi-ui-kit.iife.js +36 -9
  219. package/dist/webcomponents/lab-anssi-ui-kit.jsx.d.ts +42 -24
  220. package/package.json +49 -43
  221. package/dist/index.html +0 -0
@@ -0,0 +1,36 @@
1
+ import type { Action, Image } from "../../../types";
2
+ interface Props {
3
+ titre?: string;
4
+ raisons: string[];
5
+ action?: Action | undefined;
6
+ illustration: Image;
7
+ }
8
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
9
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
10
+ $$bindings?: Bindings;
11
+ } & Exports;
12
+ (internal: unknown, props: Props & {
13
+ $$events?: Events;
14
+ $$slots?: Slots;
15
+ }): Exports & {
16
+ $set?: any;
17
+ $on?: any;
18
+ };
19
+ z_$$bindings?: Bindings;
20
+ }
21
+ type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
22
+ default: any;
23
+ } ? Props extends Record<string, never> ? any : {
24
+ children?: any;
25
+ } : {});
26
+ declare const RejoindreLaCommunaute: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<Props, {
27
+ titre: {};
28
+ default: {};
29
+ }>, {
30
+ [evt: string]: CustomEvent<any>;
31
+ }, {
32
+ titre: {};
33
+ default: {};
34
+ }, {}, "">;
35
+ type RejoindreLaCommunaute = InstanceType<typeof RejoindreLaCommunaute>;
36
+ export default RejoindreLaCommunaute;
@@ -0,0 +1,18 @@
1
+ <svg width="32" height="33" viewBox="0 0 32 33" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <g>
3
+ <g>
4
+ <path
5
+ d="M13.3327 4.625H18.666C21.495 4.625 24.2081 5.74881 26.2085 7.74919C28.2089 9.74958 29.3327 12.4627 29.3327 15.2917C29.3327 18.1206 28.2089 20.8338 26.2085 22.8341C24.2081 24.8345 21.495 25.9583 18.666 25.9583V30.625C11.9993 27.9583 2.66602 23.9583 2.66602 15.2917C2.66602 12.4627 3.78982 9.74958 5.79021 7.74919C7.7906 5.74881 10.5037 4.625 13.3327 4.625ZM15.9993 23.2917H18.666C19.7166 23.2917 20.7569 23.0847 21.7275 22.6827C22.6981 22.2807 23.58 21.6914 24.3229 20.9485C25.0657 20.2057 25.655 19.3237 26.0571 18.3531C26.4591 17.3825 26.666 16.3422 26.666 15.2917C26.666 14.2411 26.4591 13.2008 26.0571 12.2302C25.655 11.2596 25.0657 10.3777 24.3229 9.63481C23.58 8.89194 22.6981 8.30267 21.7275 7.90063C20.7569 7.49859 19.7166 7.29167 18.666 7.29167H13.3327C11.211 7.29167 9.17612 8.13452 7.67583 9.63481C6.17554 11.1351 5.33268 13.1699 5.33268 15.2917C5.33268 20.105 8.61535 23.2463 15.9993 26.5983V23.2917Z"
6
+ fill="#FFFFFF"
7
+ />
8
+ <path
9
+ d="M15.5993 19.9583L12.7357 15.2917L15.5993 10.625H12.5084L9.59935 15.2917L12.5084 19.9583H15.5993ZM21.5993 19.9583L18.7357 15.2917L21.5993 10.625H18.5084L15.5993 15.2917L18.5084 19.9583H21.5993Z"
10
+ fill="#FFFFFF"
11
+ />
12
+ </g>
13
+ </g>
14
+ </svg>
15
+
16
+ <style>svg path {
17
+ fill: var(--brique-temoignages-icone-couleur);
18
+ }</style>
@@ -0,0 +1,26 @@
1
+ export default IconeTemoignage;
2
+ type IconeTemoignage = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const IconeTemoignage: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -0,0 +1,168 @@
1
+ <svelte:options
2
+ customElement={{
3
+ tag: "lab-anssi-temoignages",
4
+ props: {
5
+ titre: { reflect: false, type: "String", attribute: "titre" },
6
+ temoignages: { reflect: false, type: "Array", attribute: "temoignages" },
7
+ size: { reflect: false, type: "String", attribute: "size" },
8
+ },
9
+ }}
10
+ />
11
+
12
+ <script lang="ts">import { setThemeable } from "../../../../utilitaires";
13
+ import Brique from "../Brique.svelte";
14
+ import "../../../../dsfr/DsfrButton.svelte";
15
+ import "../../../../dsfr/DsfrQuote.svelte";
16
+ import "../../../carrousel-tuiles/IconeFlecheGauche.svelte";
17
+ import "../../../carrousel-tuiles/IconeFlecheDroite.svelte";
18
+ setThemeable($host());
19
+ let { titre = "Les avis de nos utilisateurs", temoignages = [], size = "xl" } = $props();
20
+ let elementCarrousel = $state();
21
+ const scrollVers = (direction) => {
22
+ if (!elementCarrousel) return;
23
+ const declageCourant = elementCarrousel.scrollLeft;
24
+ const largeurCarte = elementCarrousel.children[0].clientWidth;
25
+ elementCarrousel.scrollLeft = declageCourant + largeurCarte * direction;
26
+ };
27
+ </script>
28
+
29
+ <Brique variation="transparent">
30
+ <div class="brique-temoignages">
31
+ {#if titre}
32
+ <h3>{titre}</h3>
33
+ {/if}
34
+ <div class="carrousel-temoignages">
35
+ <div class="conteneur-carrousel" bind:this={elementCarrousel}>
36
+ {#each temoignages as temoignage, idx (idx)}
37
+ <div class="temoignage">
38
+ <dsfr-quote
39
+ text={temoignage.citation}
40
+ has-author={!!temoignage.auteur}
41
+ author={temoignage.auteur}
42
+ has-details={true}
43
+ sources={[temoignage.source]}
44
+ {size}
45
+ ></dsfr-quote>
46
+ </div>
47
+ {/each}
48
+ </div>
49
+ {#if temoignages.length > 1}
50
+ <div class="conteneur-actions" class:deux-ou-moins={temoignages.length <= 2}>
51
+ <dsfr-button
52
+ label="Précédent"
53
+ kind="tertiary-no-outline"
54
+ has-icon
55
+ icon="arrow-left-line"
56
+ role="button"
57
+ tabindex="0"
58
+ onclick={() => scrollVers(Direction.GAUCHE)}
59
+ onkeydown={(event: KeyboardEvent) => {
60
+ if (event.key === "Enter" || event.key === " ") {
61
+ event.preventDefault();
62
+ scrollVers(Direction.GAUCHE);
63
+ }
64
+ }}
65
+ ></dsfr-button>
66
+ <dsfr-button
67
+ label="Suivant"
68
+ kind="tertiary-no-outline"
69
+ has-icon
70
+ icon="arrow-right-line"
71
+ icon-place="right"
72
+ role="button"
73
+ tabindex="0"
74
+ onclick={() => scrollVers(Direction.DROITE)}
75
+ onkeydown={(event: KeyboardEvent) => {
76
+ if (event.key === "Enter" || event.key === " ") {
77
+ event.preventDefault();
78
+ scrollVers(Direction.DROITE);
79
+ }
80
+ }}
81
+ ></dsfr-button>
82
+ </div>
83
+ {/if}
84
+ </div>
85
+ </div>
86
+ </Brique>
87
+
88
+ <style>.brique-temoignages h3 {
89
+ color: var(--brique-temoignages-titre-couleur);
90
+ font-size: 1.75rem;
91
+ font-weight: 700;
92
+ line-height: 2.25rem;
93
+ }
94
+ @media (min-width: 576px) {
95
+ .brique-temoignages h3 {
96
+ font-size: 2rem;
97
+ line-height: 2.5rem;
98
+ }
99
+ }
100
+ .brique-temoignages .carrousel-temoignages {
101
+ display: flex;
102
+ flex-direction: column;
103
+ gap: 24px;
104
+ }
105
+ .brique-temoignages .carrousel-temoignages .conteneur-carrousel {
106
+ --gap-des-elements: 24px;
107
+ display: flex;
108
+ gap: var(--gap-des-elements);
109
+ overflow-x: auto;
110
+ scroll-behavior: smooth;
111
+ scroll-snap-type: x mandatory;
112
+ scrollbar-width: none;
113
+ -ms-overflow-style: none;
114
+ -webkit-overflow-scrolling: touch;
115
+ padding-bottom: 24px;
116
+ }
117
+ .brique-temoignages .carrousel-temoignages .temoignage {
118
+ width: 100%;
119
+ flex-shrink: 0;
120
+ scroll-snap-align: start;
121
+ }
122
+ @media (min-width: 768px) {
123
+ .brique-temoignages .carrousel-temoignages .temoignage {
124
+ width: calc(50% - var(--gap-des-elements));
125
+ }
126
+ }
127
+ .brique-temoignages .carrousel-temoignages .conteneur-actions {
128
+ display: flex;
129
+ margin-top: 32px;
130
+ justify-content: center;
131
+ gap: 24px;
132
+ }
133
+ @media (min-width: 768px) {
134
+ .brique-temoignages .carrousel-temoignages .conteneur-actions.deux-ou-moins {
135
+ display: none;
136
+ }
137
+ }
138
+ .brique-temoignages .carrousel-temoignages .conteneur-actions button {
139
+ position: relative;
140
+ background: none;
141
+ border: none;
142
+ color: var(--brique-carrousel-bouton-action-texte-couleur);
143
+ font-size: 1rem;
144
+ font-weight: 400;
145
+ line-height: 1.5rem;
146
+ cursor: pointer;
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 8px;
150
+ font-family: inherit;
151
+ }
152
+ .brique-temoignages .carrousel-temoignages .conteneur-actions button:hover:after {
153
+ bottom: -1px;
154
+ height: 2px;
155
+ }
156
+ .brique-temoignages .carrousel-temoignages .conteneur-actions button:after {
157
+ position: absolute;
158
+ left: 0;
159
+ bottom: 0;
160
+ content: "";
161
+ width: 100%;
162
+ height: 1px;
163
+ background: var(--brique-carrousel-bouton-action-texte-couleur);
164
+ }
165
+ .brique-temoignages .carrousel-temoignages .conteneur-actions .icone {
166
+ display: flex;
167
+ align-items: center;
168
+ }</style>
@@ -0,0 +1,13 @@
1
+ import type { Temoignage } from "../../../../types";
2
+ import "../../../../dsfr/DsfrButton.svelte";
3
+ import "../../../../dsfr/DsfrQuote.svelte";
4
+ import "../../../carrousel-tuiles/IconeFlecheGauche.svelte";
5
+ import "../../../carrousel-tuiles/IconeFlecheDroite.svelte";
6
+ interface Props {
7
+ titre?: string;
8
+ temoignages?: Temoignage[];
9
+ size?: "md" | "lg" | "xl";
10
+ }
11
+ declare const Temoignages: import("svelte").Component<Props, {}, "">;
12
+ type Temoignages = ReturnType<typeof Temoignages>;
13
+ export default Temoignages;
@@ -0,0 +1,32 @@
1
+ import type { Action } from "svelte/action";
2
+ export declare const clickOutside: Action<HTMLElement, () => void>;
3
+ export declare const pressEscape: Action<HTMLElement, () => void>;
4
+ export declare const stopPropagation: Action<HTMLElement>;
5
+ /**
6
+ * Action Svelte qui restreint le focus à l'intérieur d'un élément.
7
+ * Empêche la navigation au clavier (Tab) de sortir du conteneur en boucle le focus
8
+ * entre le premier et le dernier élément focusable.
9
+ *
10
+ * @param element - L'élément conteneur dans lequel piéger le focus.
11
+ */
12
+ export declare const trapFocus: Action<HTMLElement>;
13
+ /**
14
+ * Action Svelte : crée par programmation un élément <slot name="..."> à l'intérieur de l'élément.
15
+ *
16
+ * Cette action contourne la restriction de Svelte concernant les noms de slot dynamiques.
17
+ * Ne fait rien si slotName est nul.
18
+ */
19
+ export declare function createSlot(node: HTMLElement, slotName: string | null): {
20
+ update(newSlotName: string | null): void;
21
+ destroy(): void;
22
+ } | undefined;
23
+ /**
24
+ * Action Svelte qui applique l'état `indeterminate` à une case à cocher.
25
+ *
26
+ * @param node - L'élément input de type checkbox à mettre à jour.
27
+ * @param value - L'état initial indéterminé à appliquer.
28
+ * @returns Un objet avec une méthode `update` pour synchroniser les changements de valeur.
29
+ */
30
+ export declare function setIndeterminate(node: HTMLInputElement, value: boolean): {
31
+ update(newValue: boolean): void;
32
+ };
@@ -0,0 +1,158 @@
1
+ export const clickOutside = (element, callbackFunction) => {
2
+ const handleClick = (event) => {
3
+ if (!element.contains(event.target)) {
4
+ callbackFunction();
5
+ }
6
+ };
7
+ $effect(() => {
8
+ document.body.addEventListener("click", handleClick);
9
+ return () => {
10
+ document.body.removeEventListener("click", handleClick);
11
+ };
12
+ });
13
+ };
14
+ export const pressEscape = (element, callbackFunction) => {
15
+ const handleKeyDown = (event) => {
16
+ if (event.code === "Escape") {
17
+ callbackFunction();
18
+ }
19
+ };
20
+ $effect(() => {
21
+ document.body.addEventListener("keydown", handleKeyDown);
22
+ return () => {
23
+ document.body.removeEventListener("keydown", handleKeyDown);
24
+ };
25
+ });
26
+ };
27
+ export const stopPropagation = (element) => {
28
+ const handleClick = (event) => {
29
+ event.stopPropagation();
30
+ };
31
+ $effect(() => {
32
+ element.addEventListener("click", handleClick);
33
+ return () => {
34
+ element.removeEventListener("click", handleClick);
35
+ };
36
+ });
37
+ };
38
+ const FOCUSABLE_ELEMENTS = [
39
+ "a[href]",
40
+ "button:not([disabled])",
41
+ "input:not([disabled])",
42
+ "select:not([disabled])",
43
+ "textarea:not([disabled])",
44
+ "audio[controls]",
45
+ "video[controls]",
46
+ '[contenteditable]:not([contenteditable="false"])',
47
+ '[tabindex]:not([tabindex="-1"])',
48
+ ].join(",");
49
+ const isHTMLElement = (element) => element instanceof HTMLElement;
50
+ function getSlotChildren(slot) {
51
+ const assignedElements = slot.assignedElements({ flatten: true });
52
+ const children = assignedElements.length ? assignedElements : slot.children;
53
+ return Array.from(children).filter(isHTMLElement);
54
+ }
55
+ function getComposedChildren(root) {
56
+ return Array.from(root.children)
57
+ .filter(isHTMLElement)
58
+ .flatMap((element) => element instanceof HTMLSlotElement ? getSlotChildren(element) : [element]);
59
+ }
60
+ /**
61
+ * Récupère tous les éléments focusables contenus dans un élément donné.
62
+ * Parcourt l'élément et tous ses descendants pour collecter les éléments focusables.
63
+ *
64
+ * @param element - L'élément conteneur à analyser.
65
+ *
66
+ * @returns Un tableau contenant tous les éléments focusables trouvés.
67
+ */
68
+ function getFocusableElements(root) {
69
+ return getComposedChildren(root).flatMap((element) => {
70
+ const descendants = getFocusableElements(element.shadowRoot ?? element);
71
+ return element.matches(FOCUSABLE_ELEMENTS) ? [element, ...descendants] : descendants;
72
+ });
73
+ }
74
+ /**
75
+ * Action Svelte qui restreint le focus à l'intérieur d'un élément.
76
+ * Empêche la navigation au clavier (Tab) de sortir du conteneur en boucle le focus
77
+ * entre le premier et le dernier élément focusable.
78
+ *
79
+ * @param element - L'élément conteneur dans lequel piéger le focus.
80
+ */
81
+ export const trapFocus = (element) => {
82
+ const handleKeyDown = (event) => {
83
+ if (event.key !== "Tab")
84
+ return;
85
+ const focusables = getFocusableElements(element);
86
+ if (focusables.length === 0)
87
+ return;
88
+ const first = focusables[0];
89
+ const last = focusables[focusables.length - 1];
90
+ let active = document.activeElement;
91
+ while (active?.shadowRoot?.activeElement) {
92
+ active = active.shadowRoot.activeElement;
93
+ }
94
+ if (event.shiftKey) {
95
+ if (active === first || !focusables.includes(active)) {
96
+ event.preventDefault();
97
+ last.focus();
98
+ }
99
+ }
100
+ else {
101
+ if (active === last || !focusables.includes(active)) {
102
+ event.preventDefault();
103
+ first.focus();
104
+ }
105
+ }
106
+ };
107
+ $effect(() => {
108
+ element.addEventListener("keydown", handleKeyDown);
109
+ return () => {
110
+ element.removeEventListener("keydown", handleKeyDown);
111
+ };
112
+ });
113
+ };
114
+ /**
115
+ * Action Svelte : crée par programmation un élément <slot name="..."> à l'intérieur de l'élément.
116
+ *
117
+ * Cette action contourne la restriction de Svelte concernant les noms de slot dynamiques.
118
+ * Ne fait rien si slotName est nul.
119
+ */
120
+ export function createSlot(node, slotName) {
121
+ if (!slotName)
122
+ return;
123
+ const slot = document.createElement("slot");
124
+ slot.name = slotName;
125
+ // Déplace le contenu existant dans le slot comme contenu de secours
126
+ while (node.firstChild) {
127
+ slot.appendChild(node.firstChild);
128
+ }
129
+ node.appendChild(slot);
130
+ return {
131
+ update(newSlotName) {
132
+ if (newSlotName)
133
+ slot.name = newSlotName;
134
+ },
135
+ destroy() {
136
+ // Restaurer le contenu avant de supprimer l'élément slot
137
+ while (slot.firstChild) {
138
+ node.insertBefore(slot.firstChild, slot);
139
+ }
140
+ slot.remove();
141
+ },
142
+ };
143
+ }
144
+ /**
145
+ * Action Svelte qui applique l'état `indeterminate` à une case à cocher.
146
+ *
147
+ * @param node - L'élément input de type checkbox à mettre à jour.
148
+ * @param value - L'état initial indéterminé à appliquer.
149
+ * @returns Un objet avec une méthode `update` pour synchroniser les changements de valeur.
150
+ */
151
+ export function setIndeterminate(node, value) {
152
+ node.indeterminate = value;
153
+ return {
154
+ update(newValue) {
155
+ node.indeterminate = newValue;
156
+ },
157
+ };
158
+ }