Skip to content

Commit

Permalink
feat: implement a theme for mastodon v4
Browse files Browse the repository at this point in the history
  • Loading branch information
sneko committed Nov 22, 2023
1 parent b2003d1 commit 394ecbf
Show file tree
Hide file tree
Showing 20 changed files with 1,190 additions and 19 deletions.
40 changes: 21 additions & 19 deletions apps/docs/stories/introduction.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,25 +12,27 @@ Ci-dessous les différents frameworks/outils supportés (ou non). **Ils sont pre

<div className="fr-table">

| Framework UI / Outil | Version | Code technique | Statut | Aperçu |
| ----------------------------------------- | ------------------------------------- | -------------- | ---------------------------------- | ------------------------------------------------------------------------- |
| Bootstrap | v5.x.x | `bootstrap-v5` | 🎨 Implémenté (perfectible) | [Voir](./?path=/story/bootstrap-v5_gallery-components-accordion--default) |
| Vuetify | v3.x.x | `vuetify-v3` | 🎨 Implémenté (perfectible) | [Voir](./?path=/story/vuetify-v3_gallery-v-form-misc-vuelidate--default) |
| MUI | v5.x.x | `mui-v5` | 🎨 Implémenté (perfectible) | [Voir](./?path=/story/mui-v5_gallery-buttons-buttonsizes--default) |
| Storybook | v7.x.x _(sûrement compatible v6.x.x)_ | `storybook-v7` | 🎨 Implémenté | _Appliqué sur ce Storybook_ |
| Infima _**(utilisé pour Docusaurus v2)**_ | v1.x.x _(actuellement v0.x.x)_ | `infima-v1` | 🎨 Implémenté (perfectible) | [Voir](./?path=/story/infima-v1_gallery-components-alert--default) |
| Email | | `email` | 📍 Aucune nomenclature officielle | [Voir les conseils](./?path=/docs/dsfr-connect-utilisation-email--docs) |
| PDF | | `pdf` | 📍 Dépend des technologies backend | [Voir les conseils](./?path=/docs/dsfr-connect-utilisation-pdf--docs) |
| GitBook | SaaS version | `gitbook-saas` | 🚧 En cours |
| Tailwind | | | 💡 Planifié |
| Bulma | | | 💡 Planifié |
| SemanticUI | | | 💡 Planifié |
| HeadlessUI | | | 💡 Planifié |
| Foundation | | | 💡 Planifié |
| Ant Design | | | 💡 Planifié |
| ChakraUI | | | 💡 Planifié |

{/* work in progress 🚧 | approved ✅ */}
| Name | Version | Code technique | Statut | Link |
| ------------------------------------------------------------------------------ | ------------------------------------- | -------------- | ---------------------------------- | ---------------------------------------------------------------------------------- |
| <span title="Framework UI">🖼️ Bootstrap</span> | v5.x.x | `bootstrap-v5` | 🎨 Implémenté (perfectible) | [Voir le rendu](./?path=/story/bootstrap-v5_gallery-components-accordion--default) |
| <span title="Framework UI">🖼️ Vuetify</span> | v3.x.x | `vuetify-v3` | 🎨 Implémenté (perfectible) | [Voir le rendu](./?path=/story/vuetify-v3_gallery-v-form-misc-vuelidate--default) |
| <span title="Framework UI">🖼️ MUI</span> | v5.x.x | `mui-v5` | 🎨 Implémenté (perfectible) | [Voir le rendu](./?path=/story/mui-v5_gallery-buttons-buttonsizes--default) |
| <span title="Tool">⚙️ Storybook</span> | v7.x.x _(sûrement compatible v6.x.x)_ | `storybook-v7` | 🎨 Implémenté | _Appliqué sur ce Storybook_ |
| <span title="Framework UI">🖼️ Infima</span> _**(utilisé pour Docusaurus v2)**_ | v1.x.x _(actuellement v0.x.x)_ | `infima-v1` | 🎨 Implémenté (perfectible) | [Voir le rendu](./?path=/story/infima-v1_gallery-components-alert--default) |
| <span title="Other type">🌈 Email</span> | | `email` | 📍 Aucune nomenclature officielle | [Voir les conseils](./?path=/docs/dsfr-connect-utilisation-email--docs) |
| <span title="Other type">🌈 PDF</span> | | `pdf` | 📍 Dépend des technologies backend | [Voir les conseils](./?path=/docs/dsfr-connect-utilisation-pdf--docs) |
| <span title="Tool">⚙️ Mastodon</span> | v4.x.x | `mastodon-v4` | 🎨 Implémenté (perfectible) | [Voir la mise en place](./?path=/docs/dsfr-connect-utilisation-mastodon-v4--docs) |
| <span title="Tool">⚙️ GitBook</span> | SaaS version | `gitbook-saas` | 🚧 En cours |
| <span title="Framework UI">🖼️ Tailwind</span> | | | 💡 Planifié |
| <span title="Framework UI">🖼️ Bulma</span> | | | 💡 Planifié |
| <span title="Framework UI">🖼️ SemanticUI</span> | | | 💡 Planifié |
| <span title="Framework UI">🖼️ HeadlessUI</span> | | | 💡 Planifié |
| <span title="Framework UI">🖼️ Foundation</span> | | | 💡 Planifié |
| <span title="Framework UI">🖼️ Ant</span> Design | | | 💡 Planifié |
| <span title="Framework UI">🖼️ ChakraUI</span> | | | 💡 Planifié |

{/* type: framework ui 🖼️ | tool ⚙️ | other 🌈 */}
{/* status: 🎨 implemented | 📍 specific implemented | work in progress 🚧 | planified 💡 */}

</div>

Expand Down
2 changes: 2 additions & 0 deletions apps/docs/stories/prerequisites.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ Sachez que toutes les fonts sont fournies dans le package NPM du DSFR :
@gouvfr/dsfr/dist/fonts/*
```

_Si vous êtes dans le cas où vous n'avez pas directement accès au package NPM, vous pouvez les télécharger [sur le site du DSFR](https://www.systeme-de-design.gouv.fr/elements-d-interface/fondamentaux-de-l-identite-de-l-etat/typographie/)._

Il est conseillé au moment de compiler votre projet de les rendre disponibles via une URL du type `/assets/fonts`.

Quelques plugins pour vous aider en fonction de votre bundler :
Expand Down
94 changes: 94 additions & 0 deletions apps/docs/stories/usage/mastodon-v4.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import { Meta } from '@storybook/blocks';

import adminPreview from '@dsfrc/docs/stories/usage/mastodon-v4_admin_preview.png';
import darkAdminPreview from '@dsfrc/docs/stories/usage/mastodon-v4_dark_admin_preview.png';
import darkHomePreview from '@dsfrc/docs/stories/usage/mastodon-v4_dark_home_preview.png';
import homePreview from '@dsfrc/docs/stories/usage/mastodon-v4_home_preview.png';

<Meta title="dsfr-connect/Utilisation/mastodon-v4" />

# mastodon-v4

Si vous avez une instance [Mastodon](https://github.com/mastodon/mastodon) nous vous proposons un thème DSFR accessible pour prendre en charge le `light` et `dark` mode en fonction de la configuration système du visiteur. Pour vous donner un aperçu du thème :

<p float="left">
<img src={homePreview} width="50%" />
<img src={darkHomePreview} width="50%" />
</p>

<p float="left">
<img src={adminPreview} width="50%" />
<img src={darkAdminPreview} width="50%" />
</p>

**Mastodon ne propose pas de manière simple d'installer un thème avec les polices associées... Donc nous allons vous décrire ci-dessous 2 méthodes possibles.**

## Prérequis communs

Comme indiqué dans [les prérequis généraux](/?path=/docs/dsfr-connect-prérequis--docs) il peut être bon de mettre les assets d'un thème sur "votre propre serveur". En l'occurence du fait de la génération particulière du thème Mastodon, vous êtes obligés de le faire car sinon les polices officielles du DSFR ne seront pas chargées.

Pour commencer, Si vous ne les avez pas déjà téléchargez les polices [sur le site du DSFR](https://www.systeme-de-design.gouv.fr/elements-d-interface/fondamentaux-de-l-identite-de-l-etat/typographie/).

Ensuite, allez sur l'instance Mastodon et créez le dossier `/public/assets/fonts/` pour y mettre toutes les polices. Vous devriez avoir au final :

```
/public/assets/fonts/Marianne-Bold_Italic.woff
/public/assets/fonts/Marianne-Bold_Italic.woff2
/public/assets/fonts/Marianne-Bold.woff
/public/assets/fonts/Marianne-Bold.woff2
/public/assets/fonts/Marianne-Light_Italic.woff
/public/assets/fonts/Marianne-Light_Italic.woff2
/public/assets/fonts/Marianne-Light.woff
/public/assets/fonts/Marianne-Light.woff2
/public/assets/fonts/Marianne-Medium_Italic.woff
/public/assets/fonts/Marianne-Medium_Italic.woff2
/public/assets/fonts/Marianne-Medium.woff
/public/assets/fonts/Marianne-Medium.woff2
/public/assets/fonts/Marianne-Regular_Italic.woff
/public/assets/fonts/Marianne-Regular_Italic.woff2
/public/assets/fonts/Marianne-Regular.woff
/public/assets/fonts/Marianne-Regular.woff2
/public/assets/fonts/Spectral-ExtraBold.woff
/public/assets/fonts/Spectral-ExtraBold.woff2
/public/assets/fonts/Spectral-Regular.woff
/public/assets/fonts/Spectral-Regular.woff2
```

## Méthodes d'installation du thème

### Installation avec les privilèges administrateur **(recommandée)**

_Par "privilèges administrateur" nous voulons dire que vous êtes en mesure d'accéder aux fichiers de votre instance Mastodon et d'y exécuter des commandes._

Téléchargez le fichier https://unpkg.com/dsfr-connect@latest/dist/mastodon-v4/index.css puis renommez-le en `dsfr.css` pour le mettre dans votre instance Mastodon à l'emplacement suivant :
`/app/javascript/styles/dsfr.css`

Ensuite il faut dire à votre instance Mastodon d'indexer ce nouveau thème. Allez dans le fichier `/config/theme.yml` et ajoutez la dernière ligne pour avoir le contenu du fichier similaire à :

```yaml
default: styles/application.scss
contrast: styles/contrast.scss
mastodon-light: styles/mastodon-light.scss
dsfr: styles/dsfr.css
```
_À noter qu'une fois configuré entièrement vous pourriez a priori supprimer `default`, `contrast` et `mastodon-light` mais cela enlèvera la possibilité aux utilisateurs de changer de thème s'ils sont plus à l'aise avec un autre. Et cela pourrait vous causer problème si vous faites une erreur de configuration du thème DSFR._

Maintenant il faut recompiler les assets Mastodon pour que l'indexation se fasse :
`RAILS_ENV=production OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder bundle exec rails assets:precompile`

La dernière étape est d'appliquer ce thème à tous les utilisateurs du site. Allez dans `Préférences > Administration > Paramètres serveur > Apparence` (ou directement via https://mon-instance-mastodon-xxxxx.com/admin/settings/appearance) puis configurer `Thème du site` sur la valeur `dsfr`.

_Si votre instance ne liste pas le thème nommé `dsfr`, n'hésitez pas à redémarrer l'instance comme vous le faites d'habitude (cela varie en fonction de votre installation initiale)._

### Installation sans privilège **(déconseillée)**

Si vous n'avez pas la possibilité d'exécuter des commandes sur instance Mastodon, il est toujours possible de s'approcher d'une configuration complète en configurant un style CSS via l'interface. Mais il faut garder à l'esprit que c'est comme faire un "patch" par-dessus le thème actuel :

- Il peut y avoir des conflits de style avec le thème utilisé par votre instance Mastodon
- Cela peut diminuer les performances et temps de chargement comparé à l'autre méthode

Tout d'abord allez dans `Préférences > Administration > Paramètres serveur > Apparence` (ou directement via https://mon-instance-mastodon-xxxxx.com/admin/settings/appearance), puis :

1. Veuillez à configurer le thème par défaut sur `Mastodon (Dark)` _(le thème DSFR est basé sur celui-ci, donc en "patchant" celui-ci nous évitons de potentiels conflits avec le style des autres thèmes)_
2. Dans le champ `CSS personnalisé` veuillez y copier-coller le contenu du fichier https://unpkg.com/dsfr-connect@latest/dist/mastodon-v4/index.css
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,15 @@
"@storybook/manager-api": "7.0.17",
"@storybook/theming": "7.0.17",
"@storybook/types": "7.0.17",
"@types/adm-zip": "^0.5.0",
"@types/fs-extra": "^11.0.1",
"@types/react": "18.2.9",
"@types/react-dom": "18.2.4",
"adm-zip": "^0.5.10",
"concurrently": "^8.0.1",
"fs-extra": "^11.1.1",
"http-server": "^14.1.1",
"node-fetch-native": "^1.1.1",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"sass": "^1.62.1",
Expand Down
2 changes: 2 additions & 0 deletions packages/dsfr-connect/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
/builder-dist/
/dist/
/src/mastodon-v4/mastodon/
/src/mastodon-v4/mastodon-repository.zip
4 changes: 4 additions & 0 deletions packages/dsfr-connect/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"module": "./dist/index.js",
"types": "./dist/index.d.ts",
"scripts": {
"postinstall": "ts-node -r tsconfig-paths/register ./scripts/setup.ts",
"build": "pnpm run build:script && pnpm run build:json && pnpm run build:style",
"build:script": "tsup",
"build:style": "ts-node -r tsconfig-paths/register ./compile-style-files.ts",
Expand All @@ -41,11 +42,13 @@
"@mui/x-date-pickers": "^6.6.0",
"@storybook/blocks": "7.0.17",
"@storybook/theming": "7.0.17",
"@types/adm-zip": "^0.5.0",
"@types/fs-extra": "^11.0.1",
"@types/jest": "^29.4.0",
"@types/node": "^17.0.45",
"@types/react": "18.2.9",
"@types/react-dom": "18.2.4",
"adm-zip": "^0.5.10",
"bootstrap": "^5.3.0-alpha3",
"codecov": "^3.8.3",
"commitizen": "^4.3.0",
Expand All @@ -60,6 +63,7 @@
"jest": "^29.3.1",
"jest-environment-jsdom": "^29.3.1",
"jest-resolver-tsconfig-paths": "^0.14.4",
"node-fetch-native": "^1.1.1",
"sass": "^1.62.1",
"sass-alias": "^2.0.1",
"semantic-release": "^21.0.2",
Expand Down
44 changes: 44 additions & 0 deletions packages/dsfr-connect/scripts/setup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import AdmZip from 'adm-zip';
import fs from 'fs-extra';
import fetch from 'node-fetch-native';
import path from 'path';

import { mastodonVersion } from '@dsfrc/dsfr-connect/src/mastodon-v4/settings';

export async function downloadFile(url: string, destination: string): Promise<void> {
const response = await fetch(url);

if (!response.ok) {
throw new Error(`Failed to download file: ${response.status} ${response.statusText}`);
}

const content = await response.arrayBuffer();
await fs.outputFile(destination, new Uint8Array(content));
}

async function prepareMastodonV4() {
const zipUrl = `https://github.com/mastodon/mastodon/archive/refs/tags/${mastodonVersion}.zip`;
const zipDestination = path.resolve(__dirname, '../src/mastodon-v4/mastodon-repository.zip');
const extractionFolderPath = path.resolve(__dirname, '../src/mastodon-v4/mastodon');

if (!(await fs.pathExists(zipDestination))) {
await downloadFile(zipUrl, zipDestination);
}

const zip = new AdmZip(zipDestination);

for (const entry of zip.getEntries()) {
// Only extract the part we need to work with
if (entry.isDirectory && entry.entryName.includes('/app/javascript/styles/mastodon/')) {
zip.extractEntryTo(entry.entryName, extractionFolderPath, false, true);

break;
}
}
}

async function main() {
await prepareMastodonV4();
}

main();
Loading

0 comments on commit 394ecbf

Please sign in to comment.