chore(typo): retire tous les tirets cadratins/demi-cadratins + garde CI
Some checks failed
CI / Build & test (Node 24) (push) Has been cancelled
CI / Pack & boot smoke (Node 22) (push) Has been cancelled
CI / No em/en dashes (push) Has been cancelled
CI / Build & test (Node 22) (push) Has been cancelled
Deploy site (production) / build-and-deploy (push) Successful in 20s

Remplace les 547 tirets cadratins (U+2014) et demi-cadratins (U+2013) des fichiers versionnés par la ponctuation contextuelle adaptée (point médian, deux-points, virgule, parenthèses ; tiret simple pour les plages), sur 122 fichiers (appli, vitrine, doc, tests, workflows, scripts).

Ajoute le job CI « lint-dashes » (git grep -P) qui échoue si un tiret cadratin/demi-cadratin réapparaît, hors logo binaire et captures brutes du terminal (fidélité des fixtures de détection de dialogue).
This commit is contained in:
2026-07-17 16:44:00 +02:00
parent 985531a986
commit 65ef616867
122 changed files with 538 additions and 521 deletions

View File

@@ -26,7 +26,7 @@ watch(
{ immediate: true },
);
// Grain de fond + halo emerald (décoratifs) portés tels quels du design.
// Grain de fond + halo emerald (décoratifs) : portés tels quels du design.
const grainStyle = {
position: 'fixed',
inset: '0',

View File

@@ -21,7 +21,7 @@ const { t } = useI18n();
style="filter: grayscale(1) brightness(1.5); opacity: 0.4"
/>
<span class="font-mono text-sm text-zinc-300">git-arboretum.com</span>
<span class="ml-1 text-[13px] text-zinc-600"> {{ t('footTag') }}</span>
<span class="ml-1 text-[13px] text-zinc-600">· {{ t('footTag') }}</span>
</div>
<div class="flex items-center gap-[22px] text-sm">
<a :href="REPO" target="_blank" rel="noopener" class="inline-flex items-center gap-1.5 text-zinc-400 no-underline transition-colors hover:text-emerald-400">

View File

@@ -34,7 +34,7 @@ const { t } = useI18n();
</template>
<span class="text-sky-300">{{ t('busy') }}</span> ·
<span class="text-amber-300">{{ t('waiting') }}</span> ·
<span class="text-emerald-400">{{ t('idle') }}</span> {{ t('feat3Desc') }}
<span class="text-emerald-400">{{ t('idle') }}</span> · {{ t('feat3Desc') }}
</FeatureCard>
<FeatureCard :title="t('feat4Title')">

View File

@@ -35,7 +35,7 @@ const termLines = computed(() =>
anim.value.lines.map((l) => ({ text: l.text, color: LINE_COLORS[l.k] ?? '#d4d4d8' })),
);
// Options du dialogue de permission reproduit DialogPrompt (boutons numérotés + Deny).
// Options du dialogue de permission : reproduit DialogPrompt (boutons numérotés + Deny).
const dlgOptions = computed(() =>
DLG_OPTS[locale.value as AppLocale].map((txt, i) => ({
num: anim.value.ans === i ? '✓' : String(i + 1),

View File

@@ -1,4 +1,4 @@
// Listes structurées (FAQ, options de dialogue) gardées hors des messages
// Listes structurées (FAQ, options de dialogue) : gardées hors des messages
// vue-i18n et indexées par locale, pour rester du texte pur typé (pas d'innerHTML).
import type { AppLocale } from './index';
@@ -11,7 +11,7 @@ export const FAQS: Record<AppLocale, FaqItem[]> = {
en: [
{
q: 'How is this different from running Claude Code in a terminal?',
a: 'It runs the very same interactive claude CLI Arboretum just wraps it in a managed terminal you reach from a browser. What you gain on top: a worktree-first dashboard across all your repos, live busy / waiting / available states, a multi-terminal grid, push notifications, and the ability to answer a prompt from your phone. It supervises your sessions; it does not change how Claude Code works.',
a: 'It runs the very same interactive claude CLI. Arboretum just wraps it in a managed terminal you reach from a browser. What you gain on top: a worktree-first dashboard across all your repos, live busy / waiting / available states, a multi-terminal grid, push notifications, and the ability to answer a prompt from your phone. It supervises your sessions; it does not change how Claude Code works.',
},
{
q: 'Does it need the cloud?',
@@ -19,7 +19,7 @@ export const FAQS: Record<AppLocale, FaqItem[]> = {
},
{
q: 'How do I access it remotely?',
a: 'Through Tailscale Serve. Expose the dashboard to your tailnet and reach it securely from any device no port forwarding, no public endpoint.',
a: 'Through Tailscale Serve. Expose the dashboard to your tailnet and reach it securely from any device: no port forwarding, no public endpoint.',
},
{
q: 'Does it work on mobile?',
@@ -31,11 +31,11 @@ export const FAQS: Record<AppLocale, FaqItem[]> = {
},
{
q: 'Can I edit files directly?',
a: 'Yes. The /workspace view is a real IDE: a file tree, a full Monaco editor with inline diffs, and the correlated session terminal. Stage changes file by file, write a commit message, amend, then push all from the browser, on any device.',
a: 'Yes. The /workspace view is a real IDE: a file tree, a full Monaco editor with inline diffs, and the correlated session terminal. Stage changes file by file, write a commit message, amend, then push, all from the browser, on any device.',
},
{
q: 'Can I connect GitHub, GitLab or Gitea and clone?',
a: 'Yes. Add a connection with a personal access token or app password — credentials are encrypted at rest (AES-256-GCM) and never returned in clear by the API. Then browse remote repos and clone over HTTPS with live progress.',
a: 'Yes. Add a connection with a personal access token or app password. Credentials are encrypted at rest (AES-256-GCM) and never returned in clear by the API. Then browse remote repos and clone over HTTPS with live progress.',
},
{
q: 'What happens to old sessions?',
@@ -45,7 +45,7 @@ export const FAQS: Record<AppLocale, FaqItem[]> = {
fr: [
{
q: 'En quoi est-ce différent de lancer Claude Code dans un terminal ?',
a: "C'est exactement le même CLI claude interactif Arboretum l'enveloppe simplement dans un terminal managé accessible depuis un navigateur. Ce que vous gagnez en plus : un dashboard worktree-first sur tous vos repos, les états occupée / en attente / disponible en direct, une grille multi-terminaux, des notifications push, et la possibilité de répondre à une question depuis votre téléphone. Il supervise vos sessions ; il ne change rien au fonctionnement de Claude Code.",
a: "C'est exactement le même CLI claude interactif. Arboretum l'enveloppe simplement dans un terminal managé accessible depuis un navigateur. Ce que vous gagnez en plus : un dashboard worktree-first sur tous vos repos, les états occupée / en attente / disponible en direct, une grille multi-terminaux, des notifications push, et la possibilité de répondre à une question depuis votre téléphone. Il supervise vos sessions ; il ne change rien au fonctionnement de Claude Code.",
},
{
q: 'A-t-il besoin du cloud ?',
@@ -53,7 +53,7 @@ export const FAQS: Record<AppLocale, FaqItem[]> = {
},
{
q: 'Comment y accéder à distance ?',
a: "Via Tailscale Serve. Exposez le dashboard à votre tailnet et accédez-y en sécurité depuis n'importe quel appareil sans redirection de port ni endpoint public.",
a: "Via Tailscale Serve. Exposez le dashboard à votre tailnet et accédez-y en sécurité depuis n'importe quel appareil : sans redirection de port ni endpoint public.",
},
{
q: 'Fonctionne-t-il sur mobile ?',
@@ -65,11 +65,11 @@ export const FAQS: Record<AppLocale, FaqItem[]> = {
},
{
q: 'Puis-je éditer les fichiers directement ?',
a: "Oui. La vue /workspace est un vrai IDE : un arbre de fichiers, un éditeur Monaco complet avec les diffs inline, et le terminal de la session corrélée. Indexez les changements fichier par fichier, rédigez un message de commit, amendez, puis poussez le tout depuis le navigateur, sur n'importe quel appareil.",
a: "Oui. La vue /workspace est un vrai IDE : un arbre de fichiers, un éditeur Monaco complet avec les diffs inline, et le terminal de la session corrélée. Indexez les changements fichier par fichier, rédigez un message de commit, amendez, puis poussez, le tout depuis le navigateur, sur n'importe quel appareil.",
},
{
q: 'Puis-je connecter GitHub, GitLab ou Gitea et cloner ?',
a: "Oui. Ajoutez une connexion avec un token d'accès personnel ou un app password — les identifiants sont chiffrés au repos (AES-256-GCM) et jamais renvoyés en clair par l'API. Parcourez ensuite les repos distants et clonez en HTTPS avec progression en direct.",
a: "Oui. Ajoutez une connexion avec un token d'accès personnel ou un app password. Les identifiants sont chiffrés au repos (AES-256-GCM) et jamais renvoyés en clair par l'API. Parcourez ensuite les repos distants et clonez en HTTPS avec progression en direct.",
},
{
q: "Qu'advient-il des anciennes sessions ?",

View File

@@ -1,4 +1,4 @@
// Messages EN copie fidèle du dict() du design Arboretum.dc.html.
// Messages EN : copie fidèle du dict() du design Arboretum.dc.html.
export default {
navFeatures: 'Features',
navWorkspace: 'Workspace',
@@ -9,16 +9,16 @@ export default {
heroBadge: 'Mission control for AI coding agents',
heroTitle: 'Mission control for your AI coding agents',
heroSub:
'Run many Claude Code sessions across every git worktree and supervise them from any device, even your phone.',
'Run many Claude Code sessions across every git worktree, and supervise them from any device, even your phone.',
getStarted: 'Get started',
probKicker: 'The problem',
probTitle: "Many agents across worktrees is chaos and you're chained to one terminal.",
probTitle: "Many agents across worktrees is chaos, and you're chained to one terminal.",
probBody:
'Sessions scattered across tabs. No idea which agent is waiting on you. Step away from the desk and everything stalls. Arboretum is the single pane of glass.',
featKicker: 'Everything in one view',
featTitle: 'Built to supervise agents working in parallel',
feat1Title: 'Worktree-first',
feat1Desc: 'Work on your main branch or spin up an isolated worktree then commit, push or promote a branch to main, without opening a terminal. Branches, not chaos.',
feat1Desc: 'Work on your main branch or spin up an isolated worktree, then commit, push or promote a branch to main, without opening a terminal. Branches, not chaos.',
feat2Title: 'Many sessions, one view',
feat2Desc: 'Run parallel Claude Code agents side by side in a single live grid.',
feat3Title: 'Fine-grained states',
@@ -38,22 +38,22 @@ export default {
feat10Title: 'New project in one click',
feat10Desc: 'Create a project folder anywhere (optional git init) and start a Claude session in it, from any device.',
scAKicker: 'Worktree-first dashboard',
scATitle: 'See what needs you before anything stalls',
scATitle: 'See what needs you, before anything stalls',
scABody:
'A live list of every worktree and its session state. The Needs attention rail floats the agents waiting on a decision to the top, so nothing sits blocked while you are heads-down elsewhere. Commit, push or promote a branch to main straight from the card, and hide the noisy history left by past terminal sessions so the list stays actionable.',
scBKicker: 'Multi-terminal grid',
scBTitle: "Every agent's output, streaming live",
scBBody:
'Watch all your sessions at once real terminal output, color-coded by state, updating in real time. Click any pane to take over in a fullscreen terminal prompt pinned to the bottom, full scrollback above answer a prompt, or stop a run.',
'Watch all your sessions at once: real terminal output, color-coded by state, updating in real time. Click any pane to take over in a fullscreen terminal (prompt pinned to the bottom, full scrollback above), answer a prompt, or stop a run.',
scCKicker: 'On your phone',
scCTitle: 'Unblock an agent from the kitchen',
scCBody:
'Install the PWA and get a Web Push the second a session needs you. Tap the notification, read the prompt, answer the dialog — your agent keeps moving while you are away.',
'Install the PWA and get a Web Push the second a session needs you. Tap the notification, read the prompt, answer the dialog. Your agent keeps moving while you are away.',
grpHub: '1 session',
grpKicker: 'Work groups · cross-repo',
grpTitle: 'Drive every repo from one Claude session',
grpBody:
'Group the repos that move together a service, its client, its docs. Launch a single Claude session that spans all of them at once: one conversation, one shared context working across every repo instead of juggling one agent per repo.',
'Group the repos that move together: a service, its client, its docs. Launch a single Claude session that spans all of them at once: one conversation, one shared context working across every repo, instead of juggling one agent per repo.',
howKicker: 'How it works',
howTitle: 'Zero install. Three steps.',
step1Title: 'Launch the daemon',
@@ -64,7 +64,7 @@ export default {
step3Desc: 'Start Claude Code sessions on your main branch or any worktree, and watch them from anywhere.',
secKicker: 'Security',
secTitle: 'A web terminal you can actually trust',
secIntro: 'Built local-first. Nothing is exposed unless you choose to and even then, on your terms.',
secIntro: 'Built local-first. Nothing is exposed unless you choose to, and even then, on your terms.',
sec1Title: 'Localhost by default',
sec1Desc: 'Binds to 127.0.0.1. Nothing leaves your machine unless you say so.',
sec2Title: 'Hashed tokens',
@@ -72,7 +72,7 @@ export default {
sec3Title: 'Strict origin checks',
sec3Desc: 'Every request is origin-validated. No cross-site surprises.',
sec4Title: 'Remote via Tailscale',
sec4Desc: 'Reach it over Tailscale Serve no public port, no port forwarding.',
sec4Desc: 'Reach it over Tailscale Serve: no public port, no port forwarding.',
faqTitle: 'Questions, answered',
ctaTitle: 'Take command of your agents',
ctaBody: 'One command to launch. Supervise everything from one place.',
@@ -110,21 +110,21 @@ export default {
// New feature cards (P7→P12: IDE worktree)
feat11Title: 'A real IDE for every worktree',
feat11Desc: 'Browse the file tree, edit in a full Monaco editor, and read changes as inline diffs all in the /workspace view.',
feat11Desc: 'Browse the file tree, edit in a full Monaco editor, and read changes as inline diffs, all in the /workspace view.',
feat12Title: 'Diff & selective staging',
feat12Desc: 'Stage, unstage or discard file by file, then commit (all or staged), amend, fetch and pull without leaving the dashboard.',
feat12Desc: 'Stage, unstage or discard file by file, then commit (all or staged), amend, fetch and pull, without leaving the dashboard.',
feat13Title: 'Remote git services',
feat13Desc: 'Connect GitHub, GitLab or Gitea with a PAT or app password credentials encrypted at rest and clone over HTTPS with live progress.',
feat13Desc: 'Connect GitHub, GitLab or Gitea with a PAT or app password (credentials encrypted at rest) and clone over HTTPS with live progress.',
feat14Title: 'Auto-archive sessions',
feat14Desc: 'Finished sessions are archived automatically after a configurable retention window (30 days by default), keeping the list clean.',
feat15Title: 'Real-time file sync',
feat15Desc: 'A filesystem watcher streams changes the moment a file moves on disk diffs and status update live, no refresh needed.',
feat15Desc: 'A filesystem watcher streams changes the moment a file moves on disk: diffs and status update live, no refresh needed.',
// Workspace IDE showcase
wsKicker: 'The worktree IDE',
wsTitle: 'A full IDE for every worktree, in the browser',
wsBody:
'Open any worktree in /workspace: a file tree on the left, a Monaco editor and inline diff in the center, and the correlated session terminal on the right. Stage changes file by file, write a commit message, push all without leaving the page, on any device.',
'Open any worktree in /workspace: a file tree on the left, a Monaco editor and inline diff in the center, and the correlated session terminal on the right. Stage changes file by file, write a commit message, push, all without leaving the page, on any device.',
wsEditor: 'Editor',
wsDiff: 'Diff',
wsFiles: 'Files',

View File

@@ -1,4 +1,4 @@
// Messages FR copie fidèle du dict() du design Arboretum.dc.html.
// Messages FR : copie fidèle du dict() du design Arboretum.dc.html.
export default {
navFeatures: 'Fonctionnalités',
navWorkspace: 'Workspace',
@@ -9,16 +9,16 @@ export default {
heroBadge: 'Poste de commandement pour agents de code IA',
heroTitle: 'Le poste de commandement de vos agents de code IA',
heroSub:
"Lancez plusieurs sessions Claude Code à travers chaque worktree git et supervisez-les depuis n'importe quel appareil, même votre téléphone.",
"Lancez plusieurs sessions Claude Code à travers chaque worktree git, et supervisez-les depuis n'importe quel appareil, même votre téléphone.",
getStarted: 'Commencer',
probKicker: 'Le problème',
probTitle: "Plein d'agents à travers les worktrees, c'est le chaos et vous êtes cloué à un seul terminal.",
probTitle: "Plein d'agents à travers les worktrees, c'est le chaos, et vous êtes cloué à un seul terminal.",
probBody:
"Des sessions éparpillées dans des onglets. Aucune idée de quel agent vous attend. Vous quittez le bureau et tout se fige. Arboretum, c'est la vitre unique.",
featKicker: 'Tout dans une seule vue',
featTitle: 'Conçu pour superviser des agents qui travaillent en parallèle',
feat1Title: "Worktree d'abord",
feat1Desc: 'Travaillez sur votre branche principale ou créez un worktree isolé puis commitez, poussez ou passez une branche en principal, sans ouvrir de terminal. Des branches, pas du chaos.',
feat1Desc: 'Travaillez sur votre branche principale ou créez un worktree isolé, puis commitez, poussez ou passez une branche en principal, sans ouvrir de terminal. Des branches, pas du chaos.',
feat2Title: 'Plusieurs sessions, une vue',
feat2Desc: 'Lancez des agents Claude Code en parallèle, côte à côte dans une seule grille en direct.',
feat3Title: 'États fins',
@@ -38,22 +38,22 @@ export default {
feat10Title: 'Nouveau projet en un clic',
feat10Desc: "Créez un dossier de projet où vous voulez (git init optionnel) et lancez-y une session Claude, depuis n'importe quel appareil.",
scAKicker: 'Dashboard worktree-first',
scATitle: 'Voyez ce qui vous attend avant que ça ne bloque',
scATitle: 'Voyez ce qui vous attend, avant que ça ne bloque',
scABody:
"Une liste en direct de chaque worktree et de l'état de sa session. Le bandeau À traiter fait remonter les agents en attente d'une décision, pour que rien ne reste bloqué pendant que vous êtes concentré ailleurs. Commitez, poussez ou passez une branche en principal directement depuis la carte, et masquez l'historique encombrant laissé par vos anciennes sessions terminal pour garder la liste actionnable.",
scBKicker: 'Grille multi-terminaux',
scBTitle: 'La sortie de chaque agent, en direct',
scBBody:
"Surveillez toutes vos sessions en même temps vraie sortie terminal, couleur selon l'état, mise à jour en temps réel. Cliquez sur un panneau pour reprendre la main dans un terminal plein écran invite ancrée en bas, historique défilable au-dessus répondre, ou arrêter une exécution.",
"Surveillez toutes vos sessions en même temps : vraie sortie terminal, couleur selon l'état, mise à jour en temps réel. Cliquez sur un panneau pour reprendre la main dans un terminal plein écran (invite ancrée en bas, historique défilable au-dessus), répondre, ou arrêter une exécution.",
scCKicker: 'Sur votre téléphone',
scCTitle: 'Débloquez un agent depuis la cuisine',
scCBody:
"Installez la PWA et recevez un Web Push dès qu'une session a besoin de vous. Touchez la notification, lisez la question, répondez au dialogue — votre agent continue pendant que vous êtes loin du bureau.",
"Installez la PWA et recevez un Web Push dès qu'une session a besoin de vous. Touchez la notification, lisez la question, répondez au dialogue. Votre agent continue pendant que vous êtes loin du bureau.",
grpHub: '1 session',
grpKicker: 'Work groups · cross-repo',
grpTitle: 'Pilotez tous vos repos depuis une seule session Claude',
grpBody:
'Regroupez les repos qui avancent ensemble un service, son client, sa doc. Lancez une seule session Claude qui les couvre tous à la fois : une conversation, un contexte partagé travaillant à travers chaque repo au lieu de jongler avec un agent par repo.',
'Regroupez les repos qui avancent ensemble : un service, son client, sa doc. Lancez une seule session Claude qui les couvre tous à la fois : une conversation, un contexte partagé travaillant à travers chaque repo, au lieu de jongler avec un agent par repo.',
howKicker: 'Comment ça marche',
howTitle: 'Zéro install. Trois étapes.',
step1Title: 'Lancez le daemon',
@@ -64,7 +64,7 @@ export default {
step3Desc: "Démarrez des sessions Claude Code sur votre branche principale ou n'importe quel worktree, et surveillez-les de partout.",
secKicker: 'Sécurité',
secTitle: 'Un terminal web en qui vous pouvez avoir confiance',
secIntro: "Conçu local-first. Rien n'est exposé sauf si vous le décidez et toujours selon vos règles.",
secIntro: "Conçu local-first. Rien n'est exposé sauf si vous le décidez, et toujours selon vos règles.",
sec1Title: 'Localhost par défaut',
sec1Desc: 'Se lie à 127.0.0.1. Rien ne quitte votre machine sans votre accord.',
sec2Title: 'Tokens hashés',
@@ -72,7 +72,7 @@ export default {
sec3Title: "Vérification d'origine stricte",
sec3Desc: 'Chaque requête est validée par origine. Pas de surprise cross-site.',
sec4Title: 'Distant via Tailscale',
sec4Desc: 'Accédez-y via Tailscale Serve aucun port public, aucune redirection de port.',
sec4Desc: 'Accédez-y via Tailscale Serve : aucun port public, aucune redirection de port.',
faqTitle: 'Vos questions, les réponses',
ctaTitle: 'Prenez le commandement de vos agents',
ctaBody: 'Une commande pour lancer. Tout superviser depuis un seul endroit.',
@@ -110,21 +110,21 @@ export default {
// Nouvelles cartes de fonctionnalités (P7→P12 : IDE worktree)
feat11Title: 'Un vrai IDE pour chaque worktree',
feat11Desc: "Parcourez l'arbre de fichiers, éditez dans un éditeur Monaco complet, et lisez les changements en diff inline le tout dans la vue /workspace.",
feat11Desc: "Parcourez l'arbre de fichiers, éditez dans un éditeur Monaco complet, et lisez les changements en diff inline, le tout dans la vue /workspace.",
feat12Title: 'Diff & staging sélectif',
feat12Desc: 'Indexez, désindexez ou annulez fichier par fichier, puis commitez (tout ou indexé), amendez, fetchez et pullez sans quitter le dashboard.',
feat12Desc: 'Indexez, désindexez ou annulez fichier par fichier, puis commitez (tout ou indexé), amendez, fetchez et pullez, sans quitter le dashboard.',
feat13Title: 'Services git distants',
feat13Desc: 'Connectez GitHub, GitLab ou Gitea avec un PAT ou un app password identifiants chiffrés au repos et clonez en HTTPS avec progression en direct.',
feat13Desc: 'Connectez GitHub, GitLab ou Gitea avec un PAT ou un app password (identifiants chiffrés au repos) et clonez en HTTPS avec progression en direct.',
feat14Title: 'Archivage auto des sessions',
feat14Desc: 'Les sessions terminées sont archivées automatiquement après une rétention configurable (30 jours par défaut), pour garder la liste propre.',
feat15Title: 'Synchro fichiers temps réel',
feat15Desc: "Un watcher du système de fichiers pousse les changements dès qu'un fichier bouge sur le disque diffs et statut se mettent à jour en direct, sans rafraîchir.",
feat15Desc: "Un watcher du système de fichiers pousse les changements dès qu'un fichier bouge sur le disque : diffs et statut se mettent à jour en direct, sans rafraîchir.",
// Showcase IDE workspace
wsKicker: "L'IDE worktree",
wsTitle: 'Un IDE complet pour chaque worktree, dans le navigateur',
wsBody:
"Ouvrez n'importe quel worktree dans /workspace : un arbre de fichiers à gauche, un éditeur Monaco et le diff inline au centre, et le terminal de la session corrélée à droite. Indexez les changements fichier par fichier, rédigez un message de commit, poussez sans quitter la page, depuis n'importe quel appareil.",
"Ouvrez n'importe quel worktree dans /workspace : un arbre de fichiers à gauche, un éditeur Monaco et le diff inline au centre, et le terminal de la session corrélée à droite. Indexez les changements fichier par fichier, rédigez un message de commit, poussez, sans quitter la page, depuis n'importe quel appareil.",
wsEditor: 'Éditeur',
wsDiff: 'Diff',
wsFiles: 'Fichiers',

View File

@@ -1,4 +1,4 @@
// URLs externes du site vitrine source unique de vérité.
// URLs externes du site vitrine : source unique de vérité.
// Le dépôt Gitea est « arboretum » (et non « git-arboretum », qui est le nom du
// paquet npm `@johanleroy/git-arboretum`). Centralisé ici pour ne plus dériver.
export const REPO = 'https://git.lidge.fr/johanleroy/arboretum';

View File

@@ -1,5 +1,5 @@
import { createApp } from 'vue';
// Polices self-host (subset latin) bundlées par Vite, aucune requête Google Fonts.
// Polices self-host (subset latin) : bundlées par Vite, aucune requête Google Fonts.
import '@fontsource/jetbrains-mono/latin-400.css';
import '@fontsource/jetbrains-mono/latin-500.css';
import '@fontsource/jetbrains-mono/latin-600.css';