From 9a496abd00ae4d54f4b0711c4766da3084872161 Mon Sep 17 00:00:00 2001 From: Johan LEROY Date: Fri, 17 Jul 2026 16:50:58 +0200 Subject: [PATCH] =?UTF-8?q?feat(web):=20couche=20de=20tokens=20de=20design?= =?UTF-8?q?=20centralis=C3=A9e=20(surfaces,=20statuts,=20terminal)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduit une couche sémantique dans style.css (@theme) : surfaces (surface-0..3), bordures, texte (fg/muted/subtle) et accent, aliasant la palette Tailwind (rendu identique, vérifié dans le CSS produit). Ajoute les métriques du chrome IDE (--ide-*) pour la refonte à venir. Centralise deux sources uniques : lib/terminal-theme.ts (thème + police xterm) et lib/status-tokens.ts (tons de statut, dédupliqués entre BaseBadge et SessionStateBadge). Définit le thème Monaco « arboretum-dark ». Remplace les #09090b épars des composants par bg-surface-0 (ne restent que index.html et les renderers exigeant un hex concret). --- .../web/src/components/SessionStateBadge.vue | 14 ++--- packages/web/src/components/TerminalCell.vue | 2 +- packages/web/src/components/TerminalView.vue | 12 ++--- packages/web/src/components/ui/BaseBadge.vue | 25 ++------- packages/web/src/components/ui/BaseButton.vue | 8 +-- .../src/components/workspace/MonacoEditor.vue | 2 +- packages/web/src/lib/monaco-setup.ts | 11 ++++ packages/web/src/lib/status-tokens.ts | 38 +++++++++++++ packages/web/src/lib/terminal-theme.ts | 16 ++++++ packages/web/src/style.css | 54 +++++++++++++++---- packages/web/src/views/SessionView.vue | 2 +- packages/web/src/views/WorkspaceView.vue | 2 +- 12 files changed, 129 insertions(+), 57 deletions(-) create mode 100644 packages/web/src/lib/status-tokens.ts create mode 100644 packages/web/src/lib/terminal-theme.ts diff --git a/packages/web/src/components/SessionStateBadge.vue b/packages/web/src/components/SessionStateBadge.vue index 40343b0..235eb6c 100644 --- a/packages/web/src/components/SessionStateBadge.vue +++ b/packages/web/src/components/SessionStateBadge.vue @@ -13,6 +13,7 @@ import { computed } from 'vue'; import { useI18n } from 'vue-i18n'; import type { SessionSummary } from '@arboretum/shared'; +import { TONE_BADGE, TONE_DOT, activityTone, activityPulses } from '../lib/status-tokens'; const props = defineProps<{ session: SessionSummary }>(); const { t } = useI18n(); @@ -20,14 +21,7 @@ const { t } = useI18n(); // activity (P3-B, managées) prime ; registryStatus (P2, découvertes) en repli. const activity = computed(() => props.session.activity ?? props.session.registryStatus ?? null); const label = computed(() => (activity.value ? t(`sessions.registryStatus.${activity.value}`) : t('sessions.live'))); -const badgeClass = computed(() => ({ - 'bg-amber-950 text-amber-300': activity.value === 'waiting', - 'bg-sky-950 text-sky-300': activity.value === 'busy', - 'bg-emerald-950 text-emerald-400': activity.value === 'idle' || activity.value === null, -})); -const dotClass = computed(() => ({ - 'bg-amber-300 animate-pulse': activity.value === 'waiting', - 'bg-sky-300 animate-pulse': activity.value === 'busy', - 'bg-emerald-400': activity.value === 'idle' || activity.value === null, -})); +const tone = computed(() => activityTone(activity.value)); +const badgeClass = computed(() => TONE_BADGE[tone.value]); +const dotClass = computed(() => [TONE_DOT[tone.value], activityPulses(activity.value) ? 'animate-pulse' : '']); diff --git a/packages/web/src/components/TerminalCell.vue b/packages/web/src/components/TerminalCell.vue index 6ea2c07..e90ecd4 100644 --- a/packages/web/src/components/TerminalCell.vue +++ b/packages/web/src/components/TerminalCell.vue @@ -1,6 +1,6 @@