From 063f5e928b4376ead7f129eeb8756cb8780c9994 Mon Sep 17 00:00:00 2001 From: Johan LEROY Date: Mon, 20 Jul 2026 21:30:57 +0200 Subject: [PATCH] =?UTF-8?q?feat(web):=20refonte=20visuelle=20=C2=AB=20Emer?= =?UTF-8?q?ald=20=C2=BB=20(th=C3=A8me=20clair/sombre,=20polices,=20tokens)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adopte le langage visuel du design system Emerald dans l'IDE web : neutres zinc + accent emerald, polices auto-hébergées Inter + JetBrains Mono, radii/pills mono, points de statut, motif terminal, halo/grain. Refonte purement visuelle et additive (layout, routing, stores, protocole inchangés). - style.css : défauts sombres dans @theme + override clair sous html[data-theme=light] ; accent scindé (bright #34d399 / solid #059669 / hover) ; tokens border-soft/info/warn/danger/coffee ; idiomes globaux (focus/selection accent, scrollbars fines, jl-pulse/jl-blink, classes .chip/.status/.eyebrow/.label-mono/.caret/.halo/.grain, .btn*/.badge pill). - lib/theme.ts : singleton themeMode/resolvedTheme (dark/light/system, persistedRef arb.theme) + application dataset.theme/metas ; script anti-FOUC inline dans index.html ; toggle ActivityBar + Réglages. - Thèmes Monaco + xterm dark/light réactifs (palette ANSI + coloration syntaxique) ; fonts.ready + remeasureFonts pour l'alignement des glyphes. - status-tokens : tons sémantiques tokenisés ; balayage des ~340 couleurs Tailwind brutes vers les tokens sur tout components/* et views/* (exceptions assumées commentées). - GroupSummary.color exploité : icône de groupe teintée + ColorSwatchPicker (lib/group-colors.ts) dans les modals de groupe. - Polices via @fontsource-variable/{inter,jetbrains-mono} (offline). --- package-lock.json | 20 ++ packages/web/index.html | 21 ++ packages/web/package.json | 2 + .../web/src/components/CloneRepoModal.vue | 36 +-- .../web/src/components/CommandPalette.vue | 22 +- packages/web/src/components/DialogPrompt.vue | 10 +- .../web/src/components/DirectoryPicker.vue | 16 +- .../web/src/components/GroupSessionModal.vue | 30 +- .../web/src/components/LanguageSwitcher.vue | 2 +- .../web/src/components/NewProjectModal.vue | 18 +- .../web/src/components/SessionStateBadge.vue | 6 +- packages/web/src/components/TerminalView.vue | 31 +- .../web/src/components/ToastContainer.vue | 8 +- .../web/src/components/ide/ActivityBar.vue | 37 ++- .../web/src/components/ide/AttentionList.vue | 6 +- .../web/src/components/ide/ContextMenu.vue | 4 +- .../web/src/components/ide/EditorArea.vue | 17 +- .../web/src/components/ide/EditorTabs.vue | 4 +- .../web/src/components/ide/GroupsPanel.vue | 9 +- .../web/src/components/ide/ProjectTree.vue | 2 +- .../src/components/ide/ProjectTreeNode.vue | 2 +- .../web/src/components/ide/SessionsPanel.vue | 6 +- packages/web/src/components/ide/StatusBar.vue | 6 +- .../src/components/ide/TerminalDockTabs.vue | 11 +- .../components/ide/modals/ConfirmModal.vue | 2 +- .../ide/modals/GroupCreateModal.vue | 15 +- .../components/ide/modals/GroupEditModal.vue | 22 +- .../components/ide/modals/NewSessionModal.vue | 2 +- .../ide/modals/WorktreeCreateModal.vue | 2 +- .../components/ide/overlays/HelpOverlay.vue | 2 +- .../ide/overlays/SettingsOverlay.vue | 2 +- .../web/src/components/layout/PageHeader.vue | 4 +- .../web/src/components/layout/WsBanner.vue | 2 +- .../settings/GitConnectionsSection.vue | 30 +- .../web/src/components/settings/ServerRow.vue | 6 +- packages/web/src/components/ui/BaseBadge.vue | 4 +- packages/web/src/components/ui/BaseButton.vue | 19 +- .../src/components/ui/ColorSwatchPicker.vue | 34 +++ packages/web/src/components/ui/EmptyState.vue | 24 +- .../src/components/ui/SegmentedControl.vue | 6 +- .../web/src/components/ui/SkeletonRow.vue | 2 +- .../src/components/workspace/CommitPanel.vue | 38 +-- .../src/components/workspace/DiffViewer.vue | 34 +-- .../web/src/components/workspace/FileRow.vue | 14 +- .../web/src/components/workspace/FileTree.vue | 10 +- .../src/components/workspace/FileTreeNode.vue | 10 +- .../components/workspace/GitStatusBadge.vue | 14 +- packages/web/src/i18n/en.ts | 8 + packages/web/src/i18n/fr.ts | 8 + packages/web/src/lib/group-colors.ts | 12 + packages/web/src/lib/monaco-setup.ts | 71 ++++- packages/web/src/lib/status-tokens.ts | 34 +-- packages/web/src/lib/terminal-theme.ts | 64 ++++- packages/web/src/lib/theme.ts | 58 ++++ packages/web/src/main.ts | 6 + packages/web/src/style.css | 265 ++++++++++++++++-- packages/web/src/views/HelpView.vue | 14 +- packages/web/src/views/LoginView.vue | 67 +++-- packages/web/src/views/SettingsView.vue | 121 ++++---- 59 files changed, 986 insertions(+), 366 deletions(-) create mode 100644 packages/web/src/components/ui/ColorSwatchPicker.vue create mode 100644 packages/web/src/lib/group-colors.ts create mode 100644 packages/web/src/lib/theme.ts diff --git a/package-lock.json b/package-lock.json index 258d0ca..84c41e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -980,6 +980,24 @@ "ws": "^8.16.0" } }, + "node_modules/@fontsource-variable/inter": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", + "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource-variable/jetbrains-mono": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/jetbrains-mono/-/jetbrains-mono-5.3.0.tgz", + "integrity": "sha512-F32xpS2NsGYoQi2ADSkKTgpJj7ozajsGgDJ8woTnqjmIB+dxDIqImjl4pXZVEExu8UFZ2ndhmX18EBS/hdz3Lw==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, "node_modules/@fontsource/jetbrains-mono": { "version": "5.2.8", "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.2.8.tgz", @@ -8505,6 +8523,8 @@ "version": "0.1.0", "dependencies": { "@arboretum/shared": "*", + "@fontsource-variable/inter": "^5.0.0", + "@fontsource-variable/jetbrains-mono": "^5.0.0", "@lucide/vue": "^1.21.0", "@xterm/addon-fit": "^0.11.0", "@xterm/addon-webgl": "^0.19.0", diff --git a/packages/web/index.html b/packages/web/index.html index e35a8a9..b14ee5c 100644 --- a/packages/web/index.html +++ b/packages/web/index.html @@ -5,6 +5,27 @@ + + diff --git a/packages/web/package.json b/packages/web/package.json index 4eaf41f..141f6ad 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -10,6 +10,8 @@ }, "dependencies": { "@arboretum/shared": "*", + "@fontsource-variable/inter": "^5.0.0", + "@fontsource-variable/jetbrains-mono": "^5.0.0", "@lucide/vue": "^1.21.0", "@xterm/addon-fit": "^0.11.0", "@xterm/addon-webgl": "^0.19.0", diff --git a/packages/web/src/components/CloneRepoModal.vue b/packages/web/src/components/CloneRepoModal.vue index dbb387b..ab1af05 100644 --- a/packages/web/src/components/CloneRepoModal.vue +++ b/packages/web/src/components/CloneRepoModal.vue @@ -1,19 +1,19 @@