@lab-anssi/ui-kit 1.12.2 → 1.12.4

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 (25) hide show
  1. package/README.md +1 -0
  2. package/dist/CentreAide.svelte +13 -6
  3. package/dist/generateurImagesPlaceholders.js +1 -1
  4. package/dist/lab/ResumePssi.svelte +43 -73
  5. package/dist/lab/icones/LienExterne.svelte +20 -0
  6. package/dist/lab/icones/LienExterne.svelte.d.ts +18 -0
  7. package/dist/lab/vitrines-produits/briques/Brique.svelte +6 -2
  8. package/dist/lab/vitrines-produits/briques/BriqueContenuADeuxColonnes.svelte +11 -10
  9. package/dist/lab/vitrines-produits/briques/BriqueHero.svelte +23 -2
  10. package/dist/lab/vitrines-produits/briques/BriqueTitreMultimedia.svelte +8 -6
  11. package/dist/lab/vitrines-produits/briques/CarrouselTuiles/CarrouselTuiles.svelte +12 -11
  12. package/dist/lab/vitrines-produits/briques/CarrouselTuiles/IconeFlecheDroite.svelte +7 -2
  13. package/dist/lab/vitrines-produits/briques/CarrouselTuiles/IconeFlecheGauche.svelte +7 -2
  14. package/dist/lab/vitrines-produits/briques/LecteurVideo.svelte +3 -13
  15. package/dist/lab/vitrines-produits/briques/PresentationANSSI.svelte +15 -6
  16. package/dist/lab/vitrines-produits/briques/RejoindreLaCommunaute.svelte +10 -9
  17. package/dist/lab/vitrines-produits/briques/Tuile.svelte +12 -2
  18. package/dist/lab/vitrines-produits/briques/marelle/Etape.svelte +17 -8
  19. package/dist/lab/vitrines-produits/briques/marelle/Marelle.svelte +21 -10
  20. package/dist/lab/vitrines-produits/briques/temoignages/IconeTemoignage.svelte +8 -2
  21. package/dist/lab/vitrines-produits/briques/temoignages/Temoignages.svelte +9 -13
  22. package/dist/pied-de-page/NavigationPiedDePage.svelte +1 -3
  23. package/dist/types.d.ts +2 -1
  24. package/dist/webcomponents/lab-anssi-ui-kit.iife.js +43 -47
  25. package/package.json +8 -2
package/README.md CHANGED
@@ -20,6 +20,7 @@ Le storybook des composants est disponible [ici](https://betagouv.github.io/lab-
20
20
  Il est construit avec [Histoire](https://histoire.dev/)
21
21
 
22
22
  ## Architecture de build
23
+
23
24
  Cette librairie a pour objectif de produire des composants Svelte et leurs équivalents [Webcomponent](https://developer.mozilla.org/en-US/docs/Web/API/Web_components).
24
25
 
25
26
  L'architecture pour produire du Svelte utilise [SvelteKit](https://svelte.dev/docs/kit/packaging), configuré via le wizard `npx sv create`.
@@ -10,7 +10,9 @@ let liensMisEnForme = [];
10
10
  $: {
11
11
  liensMisEnForme = JSON.parse(liens);
12
12
  if (!Array.isArray(liensMisEnForme) || liensMisEnForme.some((l) => !l.texte)) {
13
- throw new Error("Les liens doivent respecter le type : { texte: string; href?: string; preventDefault?: boolean; id?: string }[]");
13
+ throw new Error(
14
+ "Les liens doivent respecter le type : { texte: string; href?: string; preventDefault?: boolean; id?: string }[]"
15
+ );
14
16
  }
15
17
  }
16
18
  let ouvert = false;
@@ -52,11 +54,16 @@ let ouvert = false;
52
54
  </div>
53
55
  {#if liensMisEnForme}
54
56
  {#each liensMisEnForme as lien, id (id)}
55
- <a class="lien lien-principal" href={lien.href} target="_blank" id={lien.id} on:click={(e) =>{
56
- if(lien.preventDefault)
57
- e.preventDefault();
58
- emetEvenement('lienclique', { target: e.currentTarget });
59
- }}>{lien.texte}</a>
57
+ <a
58
+ class="lien lien-principal"
59
+ href={lien.href}
60
+ target="_blank"
61
+ id={lien.id}
62
+ on:click={(e) => {
63
+ if (lien.preventDefault) e.preventDefault();
64
+ emetEvenement("lienclique", { target: e.currentTarget });
65
+ }}>{lien.texte}</a
66
+ >
60
67
  {/each}
61
68
  {/if}
62
69
  <div class="message marge-haute">
@@ -1,3 +1,3 @@
1
1
  export const genereImageDePlaceholder = (largeur, longeur, texteAffiche) => {
2
- return `https://placehold.co/${largeur}x${longeur}${texteAffiche ? `?text=${encodeURIComponent(texteAffiche)}` : ''}`;
2
+ return `https://placehold.co/${largeur}x${longeur}${texteAffiche ? `?text=${encodeURIComponent(texteAffiche)}` : ""}`;
3
3
  };
@@ -5,111 +5,81 @@
5
5
 
6
6
  <p>
7
7
  {nomService} est hébergé chez
8
- <a
9
- href="https://www.clever-cloud.com/"
10
- rel="noopener"
11
- target="_blank"
12
- >
13
- Clever Cloud
14
- </a>
8
+ <a href="https://www.clever-cloud.com/" rel="noopener" target="_blank"> Clever Cloud </a>
15
9
  prenant appui sur
16
- <a
17
- href="https://www.cloud-temple.com/notre-approche-secnumcloud/"
18
- rel="noopener"
19
- target="_blank"
20
- >
10
+ <a href="https://www.cloud-temple.com/notre-approche-secnumcloud/" rel="noopener" target="_blank">
21
11
  Cloud Temple
22
12
  </a>
23
13
  qualifié SecNumCloud.
24
14
  </p>
25
15
  <p>
26
- L'ANSSI soumet {nomService} à un rythme d'homologation soutenu dans le
27
- cadre d'une démarche de renforcement continu de la sécurité du service
28
- numérique, dont plusieurs éléments clés mais non exhaustifs sont résumés
29
- ci-dessous.
30
- </p>
31
- <h2>
32
- Gouvernance
33
- </h2>
34
- <p>
35
- Nous auditons régulièrement nos fournisseurs en termes de configuration et
36
- d'architecture et maintenons un contact étroit avec eux pour améliorer en
37
- continu leur sécurité et donc celle de vos données.
16
+ L'ANSSI soumet {nomService} à un rythme d'homologation soutenu dans le cadre d'une démarche de renforcement
17
+ continu de la sécurité du service numérique, dont plusieurs éléments clés mais non exhaustifs sont
18
+ résumés ci-dessous.
38
19
  </p>
20
+ <h2>Gouvernance</h2>
39
21
  <p>
40
- Nous auditions également régulièrement nos services (audits de code et tests
41
- d'intrusion) par des prestataires qualifiés (PASSI).
22
+ Nous auditons régulièrement nos fournisseurs en termes de configuration et d'architecture et
23
+ maintenons un contact étroit avec eux pour améliorer en continu leur sécurité et donc celle de vos
24
+ données.
42
25
  </p>
43
26
  <p>
44
- Nous réalisons et tenons à jour une analyse de risques de nos services en
45
- prenant appui sur la méthode EBIOS Risk Manager.
27
+ Nous auditions également régulièrement nos services (audits de code et tests d'intrusion) par des
28
+ prestataires qualifiés (PASSI).
46
29
  </p>
47
30
  <p>
48
- Nous maintenons une classification de l'ensemble des données que nous
49
- conservons, selon leur sensibilité, afin d'assurer une protection adaptée.
31
+ Nous réalisons et tenons à jour une analyse de risques de nos services en prenant appui sur la
32
+ méthode EBIOS Risk Manager.
50
33
  </p>
51
34
  <p>
52
- Nous maintenons un dossier d’architecture technique détaillé de nos services
53
- et de leurs interconnexions.
35
+ Nous maintenons une classification de l'ensemble des données que nous conservons, selon leur
36
+ sensibilité, afin d'assurer une protection adaptée.
54
37
  </p>
55
38
  <p>
56
- Les membres de nos équipes sont sensibilisés aux bonnes pratiques de
57
- sécurité, quels que soient les profils (technique, produit, design,
58
- déploiement), au travers de formations en continu ou de la réalisation de
59
- campagnes anti-phishing.
39
+ Nous maintenons un dossier d’architecture technique détaillé de nos services et de leurs
40
+ interconnexions.
60
41
  </p>
61
- <h2>
62
- Protection
63
- </h2>
64
42
  <p>
65
- Vos données sont protégées par un chiffrement multi-couches, système et
66
- applicatif.
43
+ Les membres de nos équipes sont sensibilisés aux bonnes pratiques de sécurité, quels que soient
44
+ les profils (technique, produit, design, déploiement), au travers de formations en continu ou de
45
+ la réalisation de campagnes anti-phishing.
67
46
  </p>
47
+ <h2>Protection</h2>
48
+ <p>Vos données sont protégées par un chiffrement multi-couches, système et applicatif.</p>
68
49
  <p>
69
- Chaque membre de notre équipe est équipé de clés d'authentification
70
- matérielle et l’authentification multi-facteur est généralisée à tous les
71
- accès, permettant de mettre en œuvre une authentification forte sur
72
- l'ensemble de nos services.
50
+ Chaque membre de notre équipe est équipé de clés d'authentification matérielle et
51
+ l’authentification multi-facteur est généralisée à tous les accès, permettant de mettre en œuvre
52
+ une authentification forte sur l'ensemble de nos services.
73
53
  </p>
74
54
  <p>
75
- Nous limitons les accès au strict nécessaire et cloisonnons de façon
76
- rigoureuse les activités d'administration, en particulier au niveau
77
- technique&nbsp;: utilisation de comptes dédiés et séparés selon leurs
78
- usages&nbsp;; postes d'administration durcis et réservés à ce seul
55
+ Nous limitons les accès au strict nécessaire et cloisonnons de façon rigoureuse les activités
56
+ d'administration, en particulier au niveau technique&nbsp;: utilisation de comptes dédiés et
57
+ séparés selon leurs usages&nbsp;; postes d'administration durcis et réservés à ce seul
79
58
  usage&nbsp;; clés d’authentification nominatives.
80
59
  </p>
81
- <p>Nous n’installons et n’utilisons que les applications strictement
82
- nécessaires.
83
- </p>
84
- <p>
85
- Les droits des administrateurs techniques et métiers sont restreints au
86
- strict nécessaire.
87
- </p>
88
- <h2>
89
- Défense
90
- </h2>
60
+ <p>Nous n’installons et n’utilisons que les applications strictement nécessaires.</p>
61
+ <p>Les droits des administrateurs techniques et métiers sont restreints au strict nécessaire.</p>
62
+ <h2>Défense</h2>
91
63
  <p>
92
- La sécurité de nos services est surveillée en continu : détection de
93
- défiguration, scans automatisés, veille active sur les risques émergents.
64
+ La sécurité de nos services est surveillée en continu : détection de défiguration, scans
65
+ automatisés, veille active sur les risques émergents.
94
66
  </p>
95
67
  <p>
96
- L'ensemble des actions est historisé de façon nominative pour simplifier
97
- l'analyse en cas d'incident.
68
+ L'ensemble des actions est historisé de façon nominative pour simplifier l'analyse en cas
69
+ d'incident.
98
70
  </p>
99
71
  <p>
100
- Nous mettons en œuvre et testons régulièrement notre procédure de gestion des
101
- incidents de sécurité.
72
+ Nous mettons en œuvre et testons régulièrement notre procédure de gestion des incidents de
73
+ sécurité.
102
74
  </p>
103
- <h2>
104
- Résilience
105
- </h2>
75
+ <h2>Résilience</h2>
106
76
  <p>
107
- Vos données sont sauvegardées de façon sécurisée et pérenne sur un
108
- environnement totalement séparé de la plate-forme de production.
77
+ Vos données sont sauvegardées de façon sécurisée et pérenne sur un environnement totalement séparé
78
+ de la plate-forme de production.
109
79
  </p>
110
80
  <p>
111
- En cas d'incident majeur, nous sommes capables de reconstruire totalement
112
- l'application en production dans un délai très court.
81
+ En cas d'incident majeur, nous sommes capables de reconstruire totalement l'application en
82
+ production dans un délai très court.
113
83
  </p>
114
84
 
115
85
  <style>.visible-tablette {
@@ -149,4 +119,4 @@ a {
149
119
  text-decoration: underline;
150
120
  text-underline-offset: 4px;
151
121
  text-decoration-thickness: 1px;
152
- }</style>
122
+ }</style>
@@ -0,0 +1,20 @@
1
+ <script>export let couleur = void 0;
2
+ </script>
3
+
4
+ <svg
5
+ width="16"
6
+ height="16"
7
+ viewBox="0 0 16 16"
8
+ fill="currentColor"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ >
11
+ <g id="external-link">
12
+ <path
13
+ id="Ic&#195;&#180;ne"
14
+ fill-rule="evenodd"
15
+ clip-rule="evenodd"
16
+ d="M6.66667 4V5.33333H3.33333V12.6667H10.6667V9.33333H12V13.3333C12 13.7015 11.7015 14 11.3333 14H2.66667C2.29848 14 2 13.7015 2 13.3333V4.66667C2 4.29848 2.29848 4 2.66667 4H6.66667ZM14 2V8L11.4707 5.47133L7.47133 9.47133L6.52867 8.52867L10.528 4.52867L8 2H14Z"
17
+ fill={couleur}
18
+ />
19
+ </g>
20
+ </svg>
@@ -0,0 +1,18 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ couleur?: string | undefined;
5
+ };
6
+ events: {
7
+ [evt: string]: CustomEvent<any>;
8
+ };
9
+ slots: {};
10
+ exports?: {} | undefined;
11
+ bindings?: string | undefined;
12
+ };
13
+ export type LienExterneProps = typeof __propDef.props;
14
+ export type LienExterneEvents = typeof __propDef.events;
15
+ export type LienExterneSlots = typeof __propDef.slots;
16
+ export default class LienExterne extends SvelteComponent<LienExterneProps, LienExterneEvents, LienExterneSlots> {
17
+ }
18
+ export {};
@@ -3,7 +3,11 @@ export let sansMargeHaute = false;
3
3
  export let sansMargeLaterale = false;
4
4
  </script>
5
5
 
6
- <section class={variation} class:sans-marge-haute={sansMargeHaute} class:sans-marge-laterale={sansMargeLaterale}>
6
+ <section
7
+ class={variation}
8
+ class:sans-marge-haute={sansMargeHaute}
9
+ class:sans-marge-laterale={sansMargeLaterale}
10
+ >
7
11
  <div class="contenu-brique">
8
12
  <slot />
9
13
  </div>
@@ -76,4 +80,4 @@ section.secondaire {
76
80
  .contenu-brique {
77
81
  max-width: 1200px;
78
82
  margin: 0 auto;
79
- }</style>
83
+ }</style>
@@ -1,14 +1,15 @@
1
1
  <svelte:options
2
2
  customElement={{
3
- tag: 'lab-anssi-brique-contenu-a-deux-colonnes',
4
- props: {
5
- titre: { reflect: false, type: 'String', attribute: 'titre' },
6
- paragraphe: { reflect: false, type: 'String', attribute: 'paragraphe' },
7
- action: { reflect: false, type: 'Object', attribute: 'action' },
8
- ordre: { reflect: false, type: 'String', attribute: 'ordre' },
9
- illustration: { reflect: false, type: 'Object', attribute: 'illustration' }
10
- }
11
- }} />
3
+ tag: "lab-anssi-brique-contenu-a-deux-colonnes",
4
+ props: {
5
+ titre: { reflect: false, type: "String", attribute: "titre" },
6
+ paragraphe: { reflect: false, type: "String", attribute: "paragraphe" },
7
+ action: { reflect: false, type: "Object", attribute: "action" },
8
+ ordre: { reflect: false, type: "String", attribute: "ordre" },
9
+ illustration: { reflect: false, type: "Object", attribute: "illustration" },
10
+ },
11
+ }}
12
+ />
12
13
 
13
14
  <script>import Brique from "./Brique.svelte";
14
15
  export let titre;
@@ -162,4 +163,4 @@ export let illustration;
162
163
  .grille-contenu .illustration img {
163
164
  max-height: 330px;
164
165
  }
165
- }</style>
166
+ }</style>
@@ -14,6 +14,7 @@
14
14
  />
15
15
 
16
16
  <script>import Brique from "./Brique.svelte";
17
+ import LienExterne from "../../icones/LienExterne.svelte";
17
18
  export let titre;
18
19
  export let soustitre;
19
20
  export let illustration;
@@ -38,11 +39,27 @@ export let partenaires = [];
38
39
  <p>{soustitre}</p>
39
40
  </div>
40
41
  <div class="actions">
41
- <a role="button" class="action-gauche" href={actiongauche.lien} target="_blank">
42
+ <a
43
+ role="button"
44
+ class="action-gauche"
45
+ href={actiongauche.lien}
46
+ target={actiongauche.target ?? "_self"}
47
+ >
42
48
  {actiongauche.titre}
49
+ {#if actiongauche.target === "_blank"}
50
+ <LienExterne />
51
+ {/if}
43
52
  </a>
44
- <a role="button" class="action-droite" href={actiondroite.lien} target="_blank">
53
+ <a
54
+ role="button"
55
+ class="action-droite"
56
+ href={actiondroite.lien}
57
+ target={actiondroite.target ?? "_self"}
58
+ >
45
59
  {actiondroite.titre}
60
+ {#if actiondroite.target === "_blank"}
61
+ <LienExterne />
62
+ {/if}
46
63
  </a>
47
64
  </div>
48
65
  </div>
@@ -153,6 +170,7 @@ export let partenaires = [];
153
170
  grid-area: actions;
154
171
  display: flex;
155
172
  flex-direction: column;
173
+ flex-wrap: wrap;
156
174
  gap: 16px;
157
175
  }
158
176
  @media (min-width: 576px) {
@@ -220,6 +238,9 @@ export let partenaires = [];
220
238
  font-size: 1rem;
221
239
  line-height: 24px;
222
240
  border-radius: 4px;
241
+ display: flex;
242
+ align-items: center;
243
+ gap: 8px;
223
244
  }
224
245
  .hero a[role=button].action-gauche {
225
246
  background-color: var(--brique-hero-bouton-gauche-background);
@@ -1,11 +1,12 @@
1
1
  <svelte:options
2
2
  customElement={{
3
- tag: 'lab-anssi-titre-multimedia',
4
- props: {
5
- titre: { reflect: false, type: 'String', attribute: 'titre' },
6
- multimedia: { reflect: false, type: 'Object', attribute: 'multimedia' },
7
- }
8
- }} />
3
+ tag: "lab-anssi-titre-multimedia",
4
+ props: {
5
+ titre: { reflect: false, type: "String", attribute: "titre" },
6
+ multimedia: { reflect: false, type: "Object", attribute: "multimedia" },
7
+ },
8
+ }}
9
+ />
9
10
 
10
11
  <script>import Brique from "./Brique.svelte";
11
12
  import LecteurVideo from "./LecteurVideo.svelte";
@@ -67,6 +68,7 @@ export let multimedia;
67
68
  font-size: 28px;
68
69
  line-height: 36px;
69
70
  margin: 0;
71
+ text-align: center;
70
72
  }
71
73
  @media (min-width: 932px) {
72
74
  .bloc-multimedia h2 {
@@ -1,9 +1,11 @@
1
- <svelte:options customElement={{
2
- tag: 'lab-anssi-carrousel-tuiles',
3
- props: {
4
- tuiles: { reflect: false, type: 'Array', attribute: 'tuiles' }
5
- }
6
- }} />
1
+ <svelte:options
2
+ customElement={{
3
+ tag: "lab-anssi-carrousel-tuiles",
4
+ props: {
5
+ tuiles: { reflect: false, type: "Array", attribute: "tuiles" },
6
+ },
7
+ }}
8
+ />
7
9
 
8
10
  <script>import Brique from "../Brique.svelte";
9
11
  import Tuile from "../Tuile.svelte";
@@ -115,13 +117,14 @@ const suivant = () => versDirection(1);
115
117
  background: none;
116
118
  border: none;
117
119
  color: var(--brique-carrousel-bouton-action-texte-couleur);
118
- font-size: 18px;
120
+ font-size: 1rem;
119
121
  font-weight: 400;
120
- line-height: 28px;
122
+ line-height: 1.5rem;
121
123
  cursor: pointer;
122
124
  display: flex;
123
125
  align-items: center;
124
126
  gap: 8px;
127
+ box-shadow: inset 0 -1px 0 var(--brique-carrousel-bouton-action-texte-couleur);
125
128
  }
126
129
 
127
130
  .conteneur-actions .precedent > .icone,
@@ -131,9 +134,7 @@ const suivant = () => versDirection(1);
131
134
  }
132
135
 
133
136
  .conteneur-actions button:hover {
134
- text-decoration: underline;
135
- text-underline-offset: 4px;
136
- text-decoration-thickness: 2px;
137
+ box-shadow: inset 0 -2px 0 var(--brique-carrousel-bouton-action-texte-couleur);
137
138
  }
138
139
 
139
140
  @media (min-width: 932px) {
@@ -1,5 +1,10 @@
1
1
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path fill-rule="evenodd" clip-rule="evenodd" d="M5.21875 7.33336H13.3334V8.6667H5.21875L8.79475 12.2427L7.85208 13.1854L2.66675 8.00003L7.85208 2.8147L8.79475 3.75736L5.21875 7.33336Z" fill="#042794"/>
2
+ <path
3
+ fill-rule="evenodd"
4
+ clip-rule="evenodd"
5
+ d="M5.21875 7.33336H13.3334V8.6667H5.21875L8.79475 12.2427L7.85208 13.1854L2.66675 8.00003L7.85208 2.8147L8.79475 3.75736L5.21875 7.33336Z"
6
+ fill="#042794"
7
+ />
3
8
  </svg>
4
9
 
5
10
  <style>.visible-tablette {
@@ -38,4 +43,4 @@ svg {
38
43
 
39
44
  svg path {
40
45
  fill: var(--brique-carrousel-bouton-action-texte-couleur);
41
- }</style>
46
+ }</style>
@@ -1,5 +1,10 @@
1
1
  <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path fill-rule="evenodd" clip-rule="evenodd" d="M5.21875 7.33336H13.3334V8.6667H5.21875L8.79475 12.2427L7.85208 13.1854L2.66675 8.00003L7.85208 2.8147L8.79475 3.75736L5.21875 7.33336Z" fill="#042794"/>
2
+ <path
3
+ fill-rule="evenodd"
4
+ clip-rule="evenodd"
5
+ d="M5.21875 7.33336H13.3334V8.6667H5.21875L8.79475 12.2427L7.85208 13.1854L2.66675 8.00003L7.85208 2.8147L8.79475 3.75736L5.21875 7.33336Z"
6
+ fill="#042794"
7
+ />
3
8
  </svg>
4
9
 
5
10
  <style>.visible-tablette {
@@ -34,4 +39,4 @@
34
39
 
35
40
  svg path {
36
41
  fill: var(--brique-carrousel-bouton-action-texte-couleur);
37
- }</style>
42
+ }</style>
@@ -4,19 +4,9 @@ export let imageDeCouverture = "";
4
4
  export let classe = "";
5
5
  </script>
6
6
 
7
- <video
8
- controls
9
- class={classe}
10
- src={source}
11
- poster={imageDeCouverture}
12
- >
7
+ <video controls class={classe} src={source} poster={imageDeCouverture}>
13
8
  <source src={source} type="video/mp4" />
14
- <track
15
- src={sourceSousTitres}
16
- kind="captions"
17
- srclang="fr"
18
- label="Français"
19
- />
9
+ <track src={sourceSousTitres} kind="captions" srclang="fr" label="Français" />
20
10
  Votre navigateur ne supporte pas la fonctionnalité de lecture de vidéos.
21
11
  </video>
22
12
 
@@ -54,4 +44,4 @@ video {
54
44
  width: 100%;
55
45
  max-width: 792px;
56
46
  max-height: 446px;
57
- }</style>
47
+ }</style>
@@ -1,10 +1,12 @@
1
1
  <svelte:options
2
2
  customElement={{
3
- tag: 'lab-anssi-presentation-anssi',
4
- }} />
3
+ tag: "lab-anssi-presentation-anssi",
4
+ }}
5
+ />
5
6
 
6
7
  <script>import Brique from "./Brique.svelte";
7
8
  import { srcAsset } from "../../../assets/assets.js";
9
+ import LienExterne from "../../icones/LienExterne.svelte";
8
10
  </script>
9
11
 
10
12
  <Brique variation="transparent">
@@ -15,21 +17,25 @@ import { srcAsset } from "../../../assets/assets.js";
15
17
  <div class="contenu">
16
18
  <h2>Qu'est ce que l'ANSSI ?</h2>
17
19
  <p>
18
- Créée en 2009, l’Agence nationale de la sécurité des systèmes d’information (ANSSI) est l’autorité nationale en matière de cybersécurité et de cyberdéfense.
20
+ Créée en 2009, l’Agence nationale de la sécurité des systèmes d’information (ANSSI) est
21
+ l’autorité nationale en matière de cybersécurité et de cyberdéfense.
19
22
  <br />
20
23
  <br />
21
24
  <b>
22
- Son action pour la protection de la Nation face aux cyberattaques se traduit en quatre grandes missions : défendre, connaître, partager, accompagner.
25
+ Son action pour la protection de la Nation face aux cyberattaques se traduit en quatre
26
+ grandes missions : défendre, connaître, partager, accompagner.
23
27
  </b>
24
28
  </p>
25
29
  </div>
26
30
  <div class="encart-action">
27
- <a class="action" role="button" href="https://cyber.gouv.fr/" target="_blank">En savoir plus</a>
31
+ <a class="action" role="button" href="https://cyber.gouv.fr/" target="_blank">
32
+ En savoir plus
33
+ <LienExterne />
34
+ </a>
28
35
  </div>
29
36
  </div>
30
37
  </Brique>
31
38
 
32
-
33
39
  <style>.visible-tablette {
34
40
  display: none !important;
35
41
  }
@@ -133,6 +139,9 @@ import { srcAsset } from "../../../assets/assets.js";
133
139
  text-decoration: none;
134
140
  font-family: Marianne, sans-serif;
135
141
  padding: 8px 16px;
142
+ display: flex;
143
+ align-items: center;
144
+ gap: 8px;
136
145
  text-align: center;
137
146
  font-weight: 500;
138
147
  font-size: 1rem;
@@ -1,13 +1,14 @@
1
1
  <svelte:options
2
2
  customElement={{
3
- tag: 'lab-anssi-brique-rejoindre-la-communaute',
4
- props: {
5
- titre: { reflect: false, type: 'String', attribute: 'titre' },
6
- raisons: { reflect: false, type: 'Array', attribute: 'raisons' },
7
- action: { reflect: false, type: 'Object', attribute: 'action' },
8
- illustration: { reflect: false, type: 'Object', attribute: 'illustration' }
9
- }
10
- }} />
3
+ tag: "lab-anssi-brique-rejoindre-la-communaute",
4
+ props: {
5
+ titre: { reflect: false, type: "String", attribute: "titre" },
6
+ raisons: { reflect: false, type: "Array", attribute: "raisons" },
7
+ action: { reflect: false, type: "Object", attribute: "action" },
8
+ illustration: { reflect: false, type: "Object", attribute: "illustration" },
9
+ },
10
+ }}
11
+ />
11
12
 
12
13
  <script>import Brique from "./Brique.svelte";
13
14
  export let titre;
@@ -166,4 +167,4 @@ export let illustration;
166
167
  width: 364px;
167
168
  height: 282px;
168
169
  }
169
- }</style>
170
+ }</style>
@@ -77,13 +77,23 @@ export let position = null;
77
77
  margin-right: 0;
78
78
  }
79
79
  }
80
+ .tuile .conteneur-image img {
81
+ max-width: 96px;
82
+ max-height: 96px;
83
+ }
80
84
 
81
85
  p {
82
86
  margin: 0;
83
- font-size: 22px;
87
+ font-size: 18px;
88
+ line-height: 24px;
84
89
  font-style: normal;
85
90
  font-weight: 700;
86
- line-height: 28px;
91
+ }
92
+ @media (min-width: 768px) {
93
+ p {
94
+ font-size: 20px;
95
+ line-height: 28px;
96
+ }
87
97
  }
88
98
 
89
99
  span {
@@ -1,4 +1,5 @@
1
- <script>export let index;
1
+ <script>import LienExterne from "../../../icones/LienExterne.svelte";
2
+ export let index;
2
3
  export let etapeMarelle;
3
4
  </script>
4
5
 
@@ -15,9 +16,12 @@ export let etapeMarelle;
15
16
  <h4>{etapeMarelle.titre}</h4>
16
17
  <p>{etapeMarelle.description}</p>
17
18
  {#if etapeMarelle.lien}
18
- <a href={etapeMarelle.lien.href} target={etapeMarelle.lien.target}
19
- >{etapeMarelle.lien.texte}</a
20
- >
19
+ <a href={etapeMarelle.lien.href} target={etapeMarelle.lien.target}>
20
+ {etapeMarelle.lien.texte}
21
+ {#if etapeMarelle.lien.target === "_blank"}
22
+ <LienExterne />
23
+ {/if}
24
+ </a>
21
25
  {/if}
22
26
  </div>
23
27
  </div>
@@ -153,10 +157,15 @@ export let etapeMarelle;
153
157
  }
154
158
 
155
159
  .marelle-etape > div > a {
160
+ width: fit-content;
156
161
  color: var(--brique-marelle-etapes-lien-couleur);
157
- display: inline-flex;
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 8px;
158
165
  border: none;
159
- text-decoration: underline;
160
- text-underline-offset: 4px;
161
- text-decoration-thickness: 1px;
166
+ text-decoration: none;
167
+ box-shadow: inset 0 -1px 0 var(--brique-marelle-etapes-lien-couleur);
168
+ }
169
+ .marelle-etape > div > a:hover {
170
+ box-shadow: inset 0 -2px 0 var(--brique-marelle-etapes-lien-couleur);
162
171
  }</style>