diff --git a/.eslintrc.js b/.eslintrc.js index bc98721..438b16c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -3,7 +3,7 @@ const path = require('path'); const tsconfigPath = path.resolve(__dirname, './tsconfig.json'); /** @type {import("eslint").Linter.Config} */ -const defaultConfig = { +const config = { root: true, extends: ['next/core-web-vitals', 'prettier'], ignorePatterns: ['node_modules'], @@ -20,6 +20,7 @@ const defaultConfig = { ], reportUnusedDisableDirectives: true, rules: { + quotes: [2, 'single', { avoidEscape: true }], 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': 'off', 'typescript-sort-keys/interface': 'error', @@ -56,4 +57,4 @@ const defaultConfig = { }, }; -module.exports = defaultConfig; +module.exports = config; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 6ec1f07..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "root": true, - "extends": [ - "next/core-web-vitals", - "prettier" - ], - "plugins": [ - "prettier", - "@typescript-eslint", - "unused-imports" - ], - "rules": { - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": "off", - "unused-imports/no-unused-imports": "error", - "unused-imports/no-unused-vars": [ - "warn", - { - "vars": "all", - "varsIgnorePattern": "^_", - "args": "after-used", - "argsIgnorePattern": "^_" - } - ], - "import/order": [ - "warn", - { - "alphabetize": { - "order": "asc" - } - } - ], - "prettier/prettier": [ - "error", - { - "tabWidth": 4, - "trailingComma": "all", - "singleQuote": true, - "printWidth": 80, - "parser": "typescript", - "arrowParens": "avoid" - } - ] - } -} \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..b3f16b6 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,5 @@ +# Protect workflow files +.github/workflows/*.yml @socialgouv/sre +.github/CODEOWNERS @socialgouv/sre +.kontinuous/ @socialgouv/sre +Dockerfile @socialgouv/sre diff --git a/.github/renovate.json b/.github/renovate.json index c994fef..010732b 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,3 +1,3 @@ { "enabled": false -} \ No newline at end of file +} diff --git a/.github/workflows/tag-main.yml b/.github/workflows/tag-main.yml index 64d1ef3..ac4de43 100644 --- a/.github/workflows/tag-main.yml +++ b/.github/workflows/tag-main.yml @@ -2,7 +2,7 @@ name: Bump version and git tag main branch on: push: branches: - - main + - main jobs: tag-main: @@ -32,4 +32,4 @@ jobs: GIT_COMMITTER_NAME: ${{ secrets.SOCIALGROOVYBOT_NAME }} run: | npm version minor --sign-git-tag --message ":bookmark: release v%s" - git push --follow-tags origin \ No newline at end of file + git push --follow-tags origin diff --git a/.gitignore b/.gitignore index aa2cf3c..3b96912 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ npm-debug.log* yarn-debug.log* yarn-error.log* .pnpm-debug.log* +.yarn/ # local env files .env*.local @@ -38,3 +39,7 @@ yarn-error.log* .now .vercel .env +.idea + +# because of yarn +package-lock.json diff --git a/.kontinuous/config.yaml b/.kontinuous/config.yaml index 271a0ad..b3af4d9 100644 --- a/.kontinuous/config.yaml +++ b/.kontinuous/config.yaml @@ -3,6 +3,8 @@ projectName: archifiltre dependencies: fabrique: import: SocialGouv/kontinuous/plugins/fabrique + extends: + - name: ovh environmentPatterns: # prod: main diff --git a/.kontinuous/env/prod/values.yml b/.kontinuous/env/prod/values.yml index ef8accb..3c4673d 100644 --- a/.kontinuous/env/prod/values.yml +++ b/.kontinuous/env/prod/values.yml @@ -1,18 +1,19 @@ app: host: archifiltre.fr + ingress: + annotations: + cert-manager.io/cluster-issuer: letsencrypt-prod + kubernetes.io/tls-acme: "true" redirectFrom: - "{{ .Values.global.host }}" - autoscale: - enabled: true - minReplicas: 1 - maxReplicas: 3 + - archifiltre.fabrique.social.gouv.fr resources: requests: - cpu: 10m - memory: 256Mi + cpu: 100m + memory: 768Mi limits: - cpu: 40m - memory: 512Mi + cpu: 200m + memory: 1Gi jobs: runs: diff --git a/.kontinuous/templates/app.sealed-secrets.yml b/.kontinuous/templates/app.sealed-secrets.yml index 4c56ad3..3edf901 100644 --- a/.kontinuous/templates/app.sealed-secrets.yml +++ b/.kontinuous/templates/app.sealed-secrets.yml @@ -2,7 +2,7 @@ apiVersion: bitnami.com/v1alpha1 kind: SealedSecret metadata: annotations: - sealedsecrets.bitnami.com/cluster-wide: 'true' + sealedsecrets.bitnami.com/cluster-wide: "true" name: app spec: encryptedData: @@ -10,6 +10,6 @@ spec: template: metadata: annotations: - sealedsecrets.bitnami.com/cluster-wide: 'true' + sealedsecrets.bitnami.com/cluster-wide: "true" name: app type: Opaque diff --git a/.nvmrc b/.nvmrc index 8351c19..60495ee 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -14 +v18.19.1 diff --git a/.stylelintrc.json b/.stylelintrc.json index 626e3f9..dd4dc5c 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -1,11 +1,8 @@ { - "extends": [ - "stylelint-config-standard", - "stylelint-config-sass-guidelines" - ], - "rules": { - "max-nesting-depth": null, - "selector-max-id" : null, - "selector-class-pattern": null - } -} \ No newline at end of file + "extends": ["stylelint-config-standard", "stylelint-config-sass-guidelines"], + "rules": { + "max-nesting-depth": null, + "selector-max-id": null, + "selector-class-pattern": null + } +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json index f65abad..3323ddf 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -10,4 +10,4 @@ "esbenp.prettier-vscode", "eg2.tslint" ] -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json index cb64ef1..3d930b7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,10 +3,7 @@ "css.validate": false, "less.validate": false, "scss.validate": false, - "stylelint.validate": [ - "css", - "scss" - ], + "stylelint.validate": ["css", "scss"], "[css]": { "editor.defaultFormatter": "stylelint.vscode-stylelint" }, @@ -29,9 +26,7 @@ "cssModules.camelCase": true, "json.schemas": [ { - "fileMatch": [ - "renovate.json" - ], + "fileMatch": ["renovate.json"], "url": "https://docs.renovatebot.com/renovate-schema.json" } ], @@ -44,4 +39,4 @@ "files.associations": { ".env.dist": "dotenv" } -} \ No newline at end of file +} diff --git a/Dockerfile b/Dockerfile index 4dca9ca..657653e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Install dependencies only when needed -FROM node:16-alpine AS deps +FROM node:18-alpine AS deps WORKDIR /app ARG PRODUCTION @@ -8,7 +8,7 @@ RUN apk add --no-cache libc6-compat COPY package.json yarn.lock ./ RUN yarn install --frozen-lockfile -FROM node:16-alpine as builder +FROM node:18-alpine as builder WORKDIR /app ARG PRODUCTION @@ -17,7 +17,7 @@ COPY . . RUN yarn build -FROM node:16-alpine as runner +FROM node:18-alpine as runner WORKDIR /app ENV NODE_ENV production ARG PRODUCTION diff --git a/README.md b/README.md index f2b2ba0..319ee0b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Archifiltre Site v2 ## Init + ```sh yarn install ``` @@ -12,4 +13,5 @@ yarn dev ``` ## License + See license [Apache-2.0](LICENSE) diff --git a/TODO.md b/TODO.md index e07abdd..06d7288 100644 --- a/TODO.md +++ b/TODO.md @@ -1,12 +1,12 @@ -- [x] SEO (fin default + par page) -- [x] _error page -- [x] 404 page -- [x] fin style (title = quicksand, text = arial (or other)) + cassures positions titles -- [x] remplir mentions légales et politique de confidentialité +- [x] SEO (fin default + par page) +- [x] \_error page +- [x] 404 page +- [x] fin style (title = quicksand, text = arial (or other)) + cassures positions titles +- [x] remplir mentions légales et politique de confidentialité ----- +--- -- [ ] inline logo ? -- [ ] a11y ? -- [ ] switch sur CSSModules -- [ ] i18n +- [ ] inline logo ? +- [ ] a11y ? +- [ ] switch sur CSSModules +- [ ] i18n diff --git a/components/AnnouncementBanner/AnnouncementBanner.scss b/components/AnnouncementBanner/AnnouncementBanner.scss new file mode 100644 index 0000000..ae605b9 --- /dev/null +++ b/components/AnnouncementBanner/AnnouncementBanner.scss @@ -0,0 +1,14 @@ +.announcement-banner { + background-color: rgb(59, 117, 176); + color: white; + text-align: center; + font-size: 15px; + padding: 2rem; + width: 100%; + z-index: 2; + + .announcement-link { + color: rgb(243, 193, 90); + text-decoration: underline; + } +} diff --git a/components/AnnouncementBanner/AnnouncementBanner.tsx b/components/AnnouncementBanner/AnnouncementBanner.tsx new file mode 100644 index 0000000..666426d --- /dev/null +++ b/components/AnnouncementBanner/AnnouncementBanner.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +// import { getDownloadLink } from '../../utils'; + +const AnnouncementBanner = () => { + // const docsDownloadLink = getDownloadLink(undefined, 'docs'); + + return ( +
+ Attention : + Notre nouveau site va bientôt faire peau neuve. Nouvelle identité et + nouvelle URL +
+ ); +}; + +export default AnnouncementBanner; diff --git a/components/Legals/Legals.tsx b/components/Legals/Legals.tsx index 8a8b86b..a1342f2 100644 --- a/components/Legals/Legals.tsx +++ b/components/Legals/Legals.tsx @@ -1,52 +1,58 @@ export const Legals = () => (
-

Mentions légales

-

Editeur de la plateforme

+

Mentions légales – Archifiltre

+ +

Éditeur de la plateforme

- La Plateforme est éditée par la{' '} - - Fabrique des Ministères sociaux - {' '} - située : + La plateforme « Archifiltre » est éditée au sein de la Fabrique + numérique des ministères sociaux, située :

Tour Mirabeau

39-43 Quai André Citroën

-

75015 PARIS

-

Tél : 01 40 56 60 00

-

Directeur de la publication

-

Anne Jeanjean, Directrice du Numérique

-

Hébergement de la plateforme

-

Ce site est hébergé par :

-

Microsoft France

-

37 Quai du Président Roosevelt

-

92130 ISSY-LES-MOULINEAUX

-

Accessibilité

+

75739 Paris Cedex 15

+

France

+

Téléphone : 01 44 38 36 02

+ +

Directrice de la publication

- La conformité aux normes d’accessibilité numérique est un objectif - ultérieur mais nous tâchons de rendre ce site accessible à toutes et - à tous. + La directrice de publication est Madame Anne JEANJEAN, directrice du + numérique des ministères sociaux.

-

Signaler un dysfonctionnement

+ +

Hébergement de la plateforme

+

OVH SAS

+

2 rue Kellermann

+

59100 Roubaix

+

France

+ +

Accessibilité

+

- Si vous rencontrez un défaut d’accessibilité vous empêchant - d’accéder à un contenu ou une fonctionnalité du site, merci de nous - en faire part. Si vous n’obtenez pas de réponse rapide de notre - part, vous êtes en droit de faire parvenir vos doléances ou une - demande de saisine au Défenseur des droits. + La conformité aux normes d'accessibilité numérique est un + objectif ultérieur mais nous tâchons de rendre cette plateforme + accessible à toutes et à tous.

+

En savoir plus

- Pour en savoir plus sur la politique d’accessibilité numérique de - l’État :{' '} - - http://references.modernisation.gouv.fr/accessibilite-numerique + Pour en savoir plus sur la politique d'accessibilité numérique + de l'État :{' '} + + https://accessibilite.numerique.gouv.fr/ + .

-

Sécurité

+ +

Sécurité

- Le site est protégé par un certificat électronique, matérialisé pour - la grande majorité des navigateurs par un cadenas. Cette protection - participe à la confidentialité des échanges. + La plateforme est protégée par un certificat électronique, + matérialisé pour la grande majorité des navigateurs par un cadenas. + Cette protection participe à la confidentialité des échanges. +

+

+ En aucun cas, les services associés à la plateforme ne seront à + l'origine d'envoi de courriels pour demander la saisie + d'informations personnelles.

); diff --git a/components/Policy/Policy.tsx b/components/Policy/Policy.tsx index e1bda3b..13ce5e3 100644 --- a/components/Policy/Policy.tsx +++ b/components/Policy/Policy.tsx @@ -1,294 +1,61 @@ -import { ARCHIFILTRE_MAIL_ADDRESS } from '../../utils/constant'; - /* eslint-disable react/no-unescaped-entities */ export const Policy = () => (
-
-

Politique de confidentialité

-

- Traitement des données à caractère personnel -

-

- La présente plateforme Archifiltre est à l’initiative du - Ministère de la Santé et des solidarités. -

-

Finalité

-

- La plateforme peut collecter des données à caractère personnel - pour permettre le téléchargement des applications Archifiltre. -

-

- Données à caractère personnel traitées -

-

Sont traitées les données suivantes :

-
-

- Données de connexion (et notamment, les identifiants de - connexion, nature des opérations, date et heure de - l'opération) -

-

Cookies

-
-

- Base juridique du traitement de données -

-

- Les données traitées par la plateforme ont plusieurs fondements - juridiques : -

-
-

- L’obligation légale à laquelle est soumise le responsable de - traitements au sens de l’article 6-c du RGPD ; -

-

- L’exécution d’une mission d’intérêt public ou relevant de - l’exercice de l’autorité publique dont est investi le - responsable de traitement au sens de l’article 6-e du RPGD. -

-
-

- Ces fondements sont précisés ci-dessous : -

-

- - a) Données relatives aux utilisateurs du formdivaire de - déclaration - -

-

- Ce traitement est nécessaire à l’exécution d’une mission - d’intérêt public ou relevant de l’exercice de l’autorité - publique dont est investi le responsable de traitement au sens - de l’article 6-e du règlement (UE) 2016/679 du Parlement - européen et du Conseil du 27 avril 2016 relatif à la protection - des personnes physiques à l’égard du traitement des données à - caractère personnel et à la libre circdivation de ces données. -

-

- Cette mission d'intérêt public est notamment posée par les - articles D1142-2, D1142-2-1 et D1142-5 du code du travail. -

-

- b) Données de connexion -

-

- Ce traitement est nécessaire au respect d'une obligation légale - à laquelle le responsable de traitement est soumis au sens de - l'article 6-c du Règlement (UE) 2016/679 du Parlement européen - et du Conseil du 27 avril 2016 relatif à la protection des - personnes physiques à l'égard du traitement des données à - caractère personnel et à la libre circdivation de ces données. - L'obligation légale est posée par la loi LCEN n° 2004-575 du 21 - juin 2004 pour la confiance dans l'économie numérique et par - l'article 1 du décret n°2021-1363 du 20 octobre 2021. -

-

- c) Cookies -

-

- En application de l’article 5(3) de la directive 2002/58/CE - modifiée concernant le traitement des données à caractère - personnel et la protection de la vie privée dans le secteur des - communications électroniques, transposée à l’article 82 de la - loi n°78-17 du 6 janvier 1978 relative à l’informatique, aux - fichiers et aux libertés, les traceurs ou cookies suivent deux - régimes distincts. -

-

- Les cookies strictement nécessaires au service, ceux de - publicité non personnalisée ou n’ayant pas pour finalité - exclusive de faciliter la communication par voie électronique - sont dispensés de consentement préalable au titre de l’article - 82 de la loi n°78-17 du 6 janvier 1978. -

-

- Les autres cookies n’étant pas strictement nécessaires au - service ou n’ayant pas pour finalité exclusive de faciliter la - communication par voie électronique doivent être consenti par - l’utilisateur. -

-

- Ce consentement de la personne concernée pour une ou plusieurs - finalités spécifiques constitue une base légale au sens du RGPD - et doit être entendu au sens de l'article 6-a du Règlement (UE) - 2016/679 du Parlement européen et du Conseil du 27 avril 2016 - relatif à la protection des personnes physiques à l'égard du - traitement des données à caractère personnel et à la libre - circdivation de ces données. -

-

Durée de conservation

-

Les données à caractère personnel sont conservées :

-

Données conservées par l’hébergeur : 12 mois

-

Article 1 du Décret n° 2021-1363 du 20 octobre 2021.

-

- Cookies : 13 mois maximum, ou jusqu’à l’opposition de la - personne concernée. -

-

- Droit des personnes concernées -

-

- Vous disposez des droits suivants concernant vos données à - caractère personnel : -

-
-

Droit d’information et droit d’accès des données.

-

- Droit de rectification et le cas échéant de suppression des - données. -

-
-

- Pour les exercer, faites-nous parvenir une demande en précisant - la date et l’heure précise de la requête - ces éléments sont - indispensables pour nous permettre de retrouver votre - recherche : -

-

- Par voie électronique à l’adresse suivante :  - - {ARCHIFILTRE_MAIL_ADDRESS} - -

-

- Par voie postale : Direction du Numérique des ministères sociaux -

-

Ministère des solidarités et de la santé

-

39-43 Quai André Citroën

-

75015 PARIS

-

- En raison de l’obligation de sécurité et de confidentialité dans - le traitement des données à caractère personnel qui incombe au - responsable de traitement, votre demande ne sera traitée que si - vous apportez la preuve de votre identité. Pour vous aider dans - votre démarche, vous trouverez ici{' '} - - https://www.cnil.fr/fr/modele/courrier/exercer-son-droit-dacces - - , un modèle de courrier élaboré par la Cnil. Nous nous engageons - à ne jamais céder ces informations à des tiers. -

-

Délais de réponse

-

- Le responsable de traitement s’engage à répondre dans un délai - raisonnable qui ne saurait dépasser 1 mois à compter de la - réception de votre demande. -

-

Destinataires des données

-

- Le responsable de traitement s’engage à ce que les données à - caractères personnels soient traitées par les sedives personnes - autorisées. -

-

Sous-traitants

-

- Certaines des données sont envoyées à des sous-traitants pour - réaliser certaines missions. Le responsable de traitement s’est - assuré de la mise en œuvre par ses sous-traitants de garanties - adéquates et du respect de conditions strictes de - confidentialité, d’usage et de protection des données. -

- - - - - - - - - - - - - - - - - -
PartenairePays destinataireTraitement réaliséGaranties
Microsoft AzureFranceHébergement de la plateforme - - Politique de confidentialité - -
-

- Sécurité et confidentialité des données -

-

- Le responsable de traitements ne conserve pas de données à - caractère personnel sur le réseau. Elles sont conservées sur la - machine locale de l’utilisateur. Dès lors il en a la maîtrise, - et est le sediv à même d’en garantir la sécurité et - confidentialité. -

-

- Utilisation de témoins de connexion (« cookies ») -

-

- Un cookie est un fichier déposé sur votre terminal lors de la - visite d’un site. Il a pour but de collecter des informations - relatives à votre navigation et de vous adresser des services - adaptés à votre terminal (ordinateur, mobile ou tablette). -

-

- Nous collectons donc des données par l’intermédiaire de - dispositifs appelés “cookies” permettant d’établir des mesures - statistiques. -

-

- Le site dépose des cookies de mesure d’audience (nombre de - visites, pages consdivtées), respectant les conditions - d’exemption du consentement de l’internaute définies par la - recommandation « Cookies » de la Commission nationale - informatique et libertés (CNIL). Cela signifie, notamment, que - ces cookies ne servent qu’à la production de statistiques - anonymes et ne permettent pas de suivre la navigation de - l’internaute sur d’autres sites. Le site dépose également des - cookies de navigation, aux fins strictement techniques, qui ne - sont pas conservés. La consdivtation de la plateforme n’est pas - affectée lorsque les utilisateurs utilisent des navigateurs - désactivant les cookies. -

-

- Nous utilisons pour cela Matomo, un outil de - mesure d’audience web libre, paramétré pour être en conformité - avec la recommandation « Cookies » de la CNIL. Cela signifie que - votre adresse IP, par exemple, est anonymisée avant d’être - enregistrée. Il est donc impossible d’associer vos visites sur - ce site à votre personne. -

-

Il convient d’indiquer que :

-
-

- Les données collectées ne sont pas recoupées avec d’autres - traitements. -

-

- Les cookies ne permettent pas de suivre la navigation de - l’internaute sur d’autres sites. -

-
-

Vous pouvez tout de même désactiver cet outil :

+

Politique de confidentialité – Archifiltre

+ +

+ Archifiltre est à l'initiative de la Direction des finances, + achats et des services au sein de la Fabrique numérique des + ministères sociaux. +

+

Quel est l'objectif d'Archifiltre ?

+

+ Proposer aux utilisateurs de fichiers bureautiques un outil de + visualisation d'arborescences pour analyse, audit, tri des documents + sur lesquels ils travaillent au quotidien dans les domaines variés + constitutifs de leurs missions, que ces documents comportent ou non + des données à caractère personnel. Les fichiers (documents de + travail de l'utilisateur notamment) sont in fine versés dans un + système d'archivage électronique. +

+ +

Confidentialité

+

+ Aucune donnée à caractère personnel n'est traitée ou remontée. + Toutes les données sont maintenues dans l'appareil en local de + l'utilisateur. Par ailleurs, nous ne sommes pas en mesure + d'identifier les personnes concernées. +

+ +

Sous-traitants

-

- À tout moment, vous pouvez refuser l’utilisation des cookies et - désactiver le dépôt sur votre ordinateur en utilisant la - fonction dédiée de votre navigateur (fonction disponible - notamment sur Microsoft Internet Explorer 11, Google Chrome, - Mozilla Firefox, Apple Safari et Opera). Pour aller plus loin, - vous pouvez consdivter les fiches proposées par la Commission - Nationale de l’Informatique et des Libertés (CNIL) : -

-

- - Cookies & traceurs : que dit la loi ? - -

-

- - Cookies : les outils pour les maîtriser - -

-
+ + + + + + + + + + + + + + + + + + + +
Sous-traitantPays destinataireTraitement réaliséGaranties
OVHFranceHébergement + + https://us.ovhcloud.com/legal/data-processing-agreement/ + +
TallyBelgiqueHébergement des données de questionnaires + + https://nextcloud.fabrique.social.gouv.fr/s/bPtSaxaL8cP9ymx + +
); diff --git a/components/common/Button.tsx b/components/common/Button.tsx index c2cf650..a8bbca7 100644 --- a/components/common/Button.tsx +++ b/components/common/Button.tsx @@ -13,25 +13,12 @@ interface ButtonCircleProps extends WithChildrenProps { export const ButtonLink = ({ label, url, className }: ButtonLinkProps) => { return ( - - - {label} - - - ); -}; -export const ButtonDownloadLink = ({ - label, - className, - onClick, -}: ButtonLinkProps & { onClick?: () => void }) => { - return ( - + ); }; diff --git a/components/common/Footer.tsx b/components/common/Footer.tsx index a99b3f6..433d634 100644 --- a/components/common/Footer.tsx +++ b/components/common/Footer.tsx @@ -1,4 +1,3 @@ -import Image from 'next/image'; import Link from 'next/link'; import { ARCHIFILTRE_MAIL_ADDRESS } from '../../utils/constant'; @@ -7,76 +6,71 @@ export const Footer = () => (
© {new Date().getFullYear()} Archifiltre - - Fabrique des ministères sociaux - -
-
- - vercel-logo - + Fabrique des ministères sociaux
diff --git a/components/common/Header.tsx b/components/common/Header.tsx index 82774ba..c864048 100644 --- a/components/common/Header.tsx +++ b/components/common/Header.tsx @@ -6,23 +6,32 @@ export const Header = () => (