@lab-anssi/ui-kit 1.19.0 → 1.21.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.
package/README.md CHANGED
@@ -15,17 +15,40 @@
15
15
 
16
16
  ## Storybook des composants
17
17
 
18
- Le storybook des composants est disponible [ici](https://betagouv.github.io/lab-anssi-ui-kit/).
18
+ > Nous parlons de _Storybook_ car c'est le terme généralement employé, mais nous utilisons [Histoire](https://histoire.dev/).
19
+ > Nous avons fait ce choix car au moment de la création de notre repo, Storybook n'était pas compatible Svelte.
19
20
 
20
- Il est construit avec [Histoire](https://histoire.dev/)
21
+ Lors de la release d'une nouvelle version de l'UI Kit, le Storybook des composants [est déployé sur Github Pages : https://betagouv.github.io/lab-anssi-ui-kit/](https://betagouv.github.io/lab-anssi-ui-kit/).
21
22
 
22
23
  ## Architecture de build
23
24
 
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).
25
+ 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).
25
26
 
26
27
  L'architecture pour produire du Svelte utilise [SvelteKit](https://svelte.dev/docs/kit/packaging), configuré via le wizard `npx sv create`.
27
- C'est ce qui explique les nombreux fichiers de configuration Svelte (Prettier, Vitest, etc...) : Ils ont été rajoutés par le wizard.
28
+ C'est ce qui explique les nombreux fichiers de configuration Svelte (Prettier, Vitest, etc.) : ils ont été rajoutés par le wizard.
28
29
 
29
- Pour rajouter le build des Webcomponents, on rajoute manuellement un fichier de configuration [`vite.webcomponents.config.ts`](./vite.webcomponents.config.ts). et des appels à la commande `vite -c vite.webcomponents.config.ts build` lors des étapes de build du package.
30
+ Pour rajouter le build des WebComponents, on rajoute manuellement un fichier de configuration [`vite.webcomponents.config.ts`](./vite.webcomponents.config.ts) et des appels à la commande `vite -c vite.webcomponents.config.ts build` lors des étapes de build du package.
30
31
 
31
- Résultat : dans le repertoire `dist/` on retrouvera les composants Svelte et leurs équivalents Webcomponents. Tous le contenu de `dist/` est publié via `npm publish`.
32
+ Résultat : dans le repertoire `dist/` on retrouvera les composants Svelte et leurs équivalents Webcomponents.
33
+ Tout le contenu de `dist/` est publié via `npm publish`.
34
+
35
+ ## Développement en local
36
+
37
+ La commande principale pour le développement en local est `npm run story:dev`.
38
+ La sortie devrait ressembler à :
39
+
40
+ ```shell
41
+
42
+ $ npm run story:dev
43
+
44
+ @lab-anssi/ui-kit@1.19.0 story:dev
45
+ HISTOIRE_ENV=development histoire dev
46
+ Re-optimizing dependencies because lockfile has changed
47
+ Using 5 threads for story collection
48
+ Collect stories start all
49
+ ➜ Local: http://localhost:6006/
50
+ ➜ Network: use --host to expose
51
+ ```
52
+
53
+ Après cette commande, le Storybook local est disponible sur http://localhost:6006/.
54
+ Il devrait ressembler [au Storybook disponible en ligne](https://betagouv.github.io/lab-anssi-ui-kit/).
package/dist/index.d.ts CHANGED
@@ -19,3 +19,4 @@ export { default as ListeArticles } from "./lab/blog/ListeArticles.svelte";
19
19
  export { default as Icone } from "./lab/Icone.svelte";
20
20
  export { default as Bouton } from "./lab/Bouton.svelte";
21
21
  export { default as Lien } from "./lab/Lien.svelte";
22
+ export { default as Tag } from "./lab/Tag.svelte";
package/dist/index.js CHANGED
@@ -19,3 +19,4 @@ export { default as ListeArticles } from "./lab/blog/ListeArticles.svelte";
19
19
  export { default as Icone } from "./lab/Icone.svelte";
20
20
  export { default as Bouton } from "./lab/Bouton.svelte";
21
21
  export { default as Lien } from "./lab/Lien.svelte";
22
+ export { default as Tag } from "./lab/Tag.svelte";
@@ -0,0 +1,114 @@
1
+ <svelte:options
2
+ customElement={{
3
+ tag: "lab-anssi-tag",
4
+ props: {
5
+ couleurFond: { reflect: false, type: "String", attribute: "couleur-fond" },
6
+ couleurTexte: { reflect: false, type: "String", attribute: "couleur-texte" },
7
+ label: { reflect: false, type: "String", attribute: "label" },
8
+ taille: { reflect: false, type: "String", attribute: "taille" },
9
+ type: { reflect: false, type: "String", attribute: "type" },
10
+ },
11
+ }}
12
+ />
13
+
14
+ <script>export let label;
15
+ export let couleurTexte;
16
+ export let couleurFond;
17
+ export let taille = "sm";
18
+ export let type = "defaut";
19
+ let selectionne = false;
20
+ const bascule = () => {
21
+ selectionne = !selectionne;
22
+ };
23
+ </script>
24
+
25
+ {#if type === "defaut"}
26
+ <span class="tag {taille}" style:background={couleurFond} style:color={couleurTexte}>
27
+ {label}
28
+ </span>
29
+ {:else}
30
+ <button
31
+ class="tag {taille}"
32
+ aria-pressed={selectionne}
33
+ style:background={couleurFond}
34
+ style:color={couleurTexte}
35
+ on:click={bascule}
36
+ on:click
37
+ >
38
+ {label}
39
+ </button>
40
+ {/if}
41
+
42
+ <style>.tag {
43
+ color: var(--tag-couleur-texte);
44
+ background-color: var(--tag-couleur-fond);
45
+ font-family: Marianne;
46
+ font-weight: 400;
47
+ display: inline-block;
48
+ width: fit-content;
49
+ white-space: nowrap;
50
+ max-width: 100%;
51
+ box-sizing: border-box;
52
+ overflow: hidden;
53
+ text-overflow: ellipsis;
54
+ }
55
+ .tag.sm {
56
+ font-size: 0.75rem;
57
+ line-height: 1.25rem;
58
+ padding: 2px 8px;
59
+ border-radius: 12px;
60
+ }
61
+ .tag.md {
62
+ font-size: 0.875rem;
63
+ line-height: 1.5rem;
64
+ padding: 4px 12px;
65
+ border-radius: 16px;
66
+ }
67
+ .tag:focus {
68
+ outline: 2px solid #0a76f6;
69
+ outline-offset: 2px;
70
+ }
71
+
72
+ button.tag {
73
+ color: var(--tag-selectionnable-couleur-texte);
74
+ background-color: var(--tag-selectionnable-couleur-fond);
75
+ border: none;
76
+ display: inline-flex;
77
+ position: relative;
78
+ overflow: visible;
79
+ }
80
+ button.tag:hover {
81
+ background-color: var(--tag-selectionnable-couleur-fond-survol);
82
+ }
83
+ button.tag:active {
84
+ background-color: var(--tag-selectionnable-couleur-fond-clique);
85
+ }
86
+ button.tag[aria-pressed=true] {
87
+ color: var(--tag-selectionne-couleur-texte);
88
+ background-color: transparent;
89
+ background-image: radial-gradient(circle at 100% 0.25rem, transparent 0.578125rem, var(--tag-selectionne-couleur-fond) 0.625rem);
90
+ }
91
+ button.tag[aria-pressed=true]:hover {
92
+ background-image: radial-gradient(circle at 100% 0.25rem, transparent 0.578125rem, var(--tag-selectionne-couleur-fond-survol) 0.625rem);
93
+ }
94
+ button.tag[aria-pressed=true]:active {
95
+ background-image: radial-gradient(circle at 100% 0.25rem, transparent 0.578125rem, var(--tag-selectionne-couleur-fond-clique) 0.625rem);
96
+ }
97
+ button.tag[aria-pressed=true]::after {
98
+ -webkit-mask-image: url("https://lab-anssi-ui-kit-prod-s3-assets.cellar-c2.services.clever-cloud.com/icones/dsfr/system/checkbox-circle-line.svg");
99
+ mask-image: url("https://lab-anssi-ui-kit-prod-s3-assets.cellar-c2.services.clever-cloud.com/icones/dsfr/system/checkbox-circle-line.svg");
100
+ background-color: var(--tag-selectionnable-couleur-texte);
101
+ --icon-size: 1rem;
102
+ content: "";
103
+ display: inline-block;
104
+ flex: 0 0 auto;
105
+ height: var(--icon-size);
106
+ margin: -0.5rem;
107
+ -webkit-mask-size: 100% 100%;
108
+ mask-size: 100% 100%;
109
+ position: absolute;
110
+ right: 0;
111
+ top: 4px;
112
+ vertical-align: calc((0.75em - var(--icon-size)) * 0.5);
113
+ width: var(--icon-size);
114
+ }</style>
@@ -1,10 +1,15 @@
1
1
  import { SvelteComponent } from "svelte";
2
- import type { Tag } from "../../types";
3
2
  declare const __propDef: {
4
3
  props: {
5
- tag?: Tag;
4
+ label: string;
5
+ couleurTexte: string | undefined;
6
+ couleurFond: string | undefined;
7
+ taille?: "sm" | "md";
8
+ type?: "defaut" | "selectionnable";
6
9
  };
7
10
  events: {
11
+ click: MouseEvent;
12
+ } & {
8
13
  [evt: string]: CustomEvent<any>;
9
14
  };
10
15
  slots: {};
@@ -11,11 +11,11 @@
11
11
  />
12
12
 
13
13
  <script>import { estLien } from "../../types.js";
14
- import ComposantTag from "./Tag.svelte";
14
+ import Tag from "../Tag.svelte";
15
15
  export let titre;
16
16
  export let description = "";
17
17
  export let filAriane = [];
18
- export let tag = null;
18
+ export let infosTag = null;
19
19
  let filArianeVisible = window.matchMedia("(min-width: 576px)").matches;
20
20
  </script>
21
21
 
@@ -37,9 +37,13 @@ let filArianeVisible = window.matchMedia("(min-width: 576px)").matches;
37
37
  </div>
38
38
  {/if}
39
39
  <div class="conteneur-texte">
40
- {#if tag}
40
+ {#if infosTag}
41
41
  <div class="conteneur-tag">
42
- <ComposantTag {tag} />
42
+ <Tag
43
+ couleurFond={infosTag.couleurFond}
44
+ couleurTexte={infosTag.couleurTexte}
45
+ label={infosTag.label}
46
+ />
43
47
  </div>
44
48
  {/if}
45
49
  <div class="conteneur-corps">
@@ -1,11 +1,11 @@
1
1
  import { SvelteComponent } from "svelte";
2
- import { type NoeudFilAriane, type Tag } from "../../types.js";
2
+ import { type NoeudFilAriane, type InfosTag } from "../../types.js";
3
3
  declare const __propDef: {
4
4
  props: {
5
5
  titre: string;
6
6
  description?: string;
7
7
  filAriane?: NoeudFilAriane[];
8
- tag?: Tag | null;
8
+ infosTag?: InfosTag | null;
9
9
  };
10
10
  events: {
11
11
  [evt: string]: CustomEvent<any>;
@@ -1,4 +1,4 @@
1
- <script>import ComposantTag from "./Tag.svelte";
1
+ <script>import Tag from "../Tag.svelte";
2
2
  import Fleche from "../icones/Fleche.svelte";
3
3
  export let article;
4
4
  export let categorie;
@@ -6,7 +6,11 @@ export let categorie;
6
6
 
7
7
  <a class="carte-article" href={article.href}>
8
8
  <div class="conteneur-texte">
9
- <ComposantTag tag={categorie} />
9
+ <Tag
10
+ couleurFond={categorie.couleurFond}
11
+ couleurTexte={categorie.couleurTexte}
12
+ label={categorie.label}
13
+ />
10
14
  <p>{article.titre}</p>
11
15
  </div>
12
16
  <div class="conteneur-fleche">
@@ -1,9 +1,9 @@
1
1
  import { SvelteComponent } from "svelte";
2
- import type { ResumeArticle, Tag } from "../../types";
2
+ import type { ResumeArticle, InfosTag } from "../../types";
3
3
  declare const __propDef: {
4
4
  props: {
5
5
  article: ResumeArticle;
6
- categorie: Tag;
6
+ categorie: InfosTag;
7
7
  };
8
8
  events: {
9
9
  [evt: string]: CustomEvent<any>;
package/dist/types.d.ts CHANGED
@@ -41,7 +41,7 @@ type Feuille = {
41
41
  };
42
42
  export type NoeudFilAriane = Lien | Feuille;
43
43
  export declare const estLien: (noeud: NoeudFilAriane) => noeud is Lien;
44
- export type Tag = {
44
+ export type InfosTag = {
45
45
  label: string;
46
46
  couleurTexte: string;
47
47
  couleurFond: string;
@@ -56,5 +56,5 @@ export type ResumeArticle = {
56
56
  titre: string;
57
57
  href: string;
58
58
  };
59
- export type CategoriesArticle = Record<string, Tag>;
59
+ export type CategoriesArticle = Record<string, InfosTag>;
60
60
  export {};