feat(app): add a checks display selector and name running services in the sidebar

Checks stopped being a toggle. Showing the icon without its word is a real
third answer rather than half of "off" — the state stays on the row for a
glance and a passing workspace stops paying a word for it on every line — so
it left the boolean row-item record instead of widening it, and a stored
`sidebarRowItems.checks === false` migrates to the new "none".

The services item narrowed to actual services. It used to fall back to any
running command, but a test watcher running says nothing about whether a
workspace is up, and the item now says "Services" so drawing a terminal glyph
under that label was a control lying about itself. It reports the name rather
than the port because the name is what you called it. `health` was already on
the wire and nothing in the sidebar read it, so a failed check now turns the
whole item danger; where several services run, the failing one takes the
single slot, since a healthy one is the unremarkable case and any of them
says "this is up".

That narrowing is why the rename went through the code and the persisted key
rather than stopping at the label: the concept genuinely changed, and a UI
saying "Services" over a `scripts` key is the synonym docs/glossary.md calls a
design error. Both key migrations are tagged COMPAT.

The rest is the sidebar row's geometry. The show-more and new-workspace rows
each carried their own smaller, inset, less-rounded version of a workspace row
— 24pt of left margin, a 14pt icon column, `borderRadius.md`, one fill for
hover and press — which under a column of real rows reads as a mistake rather
than a distinction. They now take the workspace row's geometry, and the
show-more row asks its caller whether it is ending an indented list, because
the two groupings disagree.

Group spacing moved from margin to padding so a collapsed group gives it back
instead of staying spaced for content that is gone. SPACING gained a 0.5 rung
for the 2pt gap between rows.
This commit is contained in:
Mohamed Boudra
2026-08-05 21:42:07 +02:00
parent 211489c658
commit 5d0560d4c1
34 changed files with 651 additions and 262 deletions
+8 -2
View File
@@ -908,10 +908,15 @@ export const ar: TranslationResources = {
host: "المضيف",
changeRequest: "طلب السحب",
checks: "الفحوصات",
scripts: "البرامج النصية",
services: "الخدمات",
diff: "إحصائيات الفروق",
timestamp: "آخر نشاط",
},
checks: {
iconAndText: "أيقونة ونص",
icon: "أيقونة فقط",
none: "مخفي",
},
hostFilter: {
label: "المضيف",
all: "كل المضيفين",
@@ -984,7 +989,8 @@ export const ar: TranslationResources = {
},
workspace: {
status: {
scriptsAvailable: "البرامج النصية المتاحة",
serviceRunning: "الخدمة {{name}} قيد التشغيل",
serviceUnhealthy: "الخدمة {{name}} غير سليمة",
creating: "جارٍ الإنشاء...",
},
actions: {
+8 -2
View File
@@ -918,10 +918,15 @@ export const en = {
host: "Host",
changeRequest: "Pull request",
checks: "Checks",
scripts: "Scripts",
services: "Services",
diff: "Diff stats",
timestamp: "Last activity",
},
checks: {
iconAndText: "Icon and text",
icon: "Icon only",
none: "Hidden",
},
hostFilter: {
label: "Host",
all: "All hosts",
@@ -994,7 +999,8 @@ export const en = {
},
workspace: {
status: {
scriptsAvailable: "Scripts available",
serviceRunning: "Service {{name}} running",
serviceUnhealthy: "Service {{name}} unhealthy",
creating: "Creating...",
},
actions: {
+8 -2
View File
@@ -939,10 +939,15 @@ export const es: TranslationResources = {
host: "Host",
changeRequest: "Pull request",
checks: "Comprobaciones",
scripts: "Scripts",
services: "Servicios",
diff: "Estadísticas de cambios",
timestamp: "Última actividad",
},
checks: {
iconAndText: "Icono y texto",
icon: "Solo icono",
none: "Oculto",
},
hostFilter: {
label: "Host",
all: "Todos los hosts",
@@ -1015,7 +1020,8 @@ export const es: TranslationResources = {
},
workspace: {
status: {
scriptsAvailable: "Guiones disponibles",
serviceRunning: "Servicio {{name}} en ejecución",
serviceUnhealthy: "Servicio {{name}} con fallos",
creating: "Creando...",
},
actions: {
+8 -2
View File
@@ -938,10 +938,15 @@ export const fr: TranslationResources = {
host: "Hôte",
changeRequest: "Pull request",
checks: "Vérifications",
scripts: "Scripts",
services: "Services",
diff: "Statistiques de diff",
timestamp: "Dernière activité",
},
checks: {
iconAndText: "Icône et texte",
icon: "Icône seule",
none: "Masqué",
},
hostFilter: {
label: "Hôte",
all: "Tous les hôtes",
@@ -1014,7 +1019,8 @@ export const fr: TranslationResources = {
},
workspace: {
status: {
scriptsAvailable: "Scripts disponibles",
serviceRunning: "Service {{name}} en cours",
serviceUnhealthy: "Service {{name}} en échec",
creating: "Création...",
},
actions: {
+8 -2
View File
@@ -919,10 +919,15 @@ export const ja: TranslationResources = {
host: "ホスト",
changeRequest: "プルリクエスト",
checks: "チェック",
scripts: "スクリプト",
services: "サービス",
diff: "差分統計",
timestamp: "最終アクティビティ",
},
checks: {
iconAndText: "アイコンとテキスト",
icon: "アイコンのみ",
none: "非表示",
},
hostFilter: {
label: "ホスト",
all: "すべてのホスト",
@@ -995,7 +1000,8 @@ export const ja: TranslationResources = {
},
workspace: {
status: {
scriptsAvailable: "スクリプトが利用可能",
serviceRunning: "サービス {{name}} 実行中",
serviceUnhealthy: "サービス {{name}} 異常",
creating: "作成中...",
},
actions: {
+8 -2
View File
@@ -930,10 +930,15 @@ export const ptBR: TranslationResources = {
host: "Host",
changeRequest: "Pull request",
checks: "Verificações",
scripts: "Scripts",
services: "Serviços",
diff: "Estatísticas de diff",
timestamp: "Última atividade",
},
checks: {
iconAndText: "Ícone e texto",
icon: "Somente ícone",
none: "Oculto",
},
hostFilter: {
label: "Host",
all: "Todos os hosts",
@@ -1006,7 +1011,8 @@ export const ptBR: TranslationResources = {
},
workspace: {
status: {
scriptsAvailable: "Scripts disponíveis",
serviceRunning: "Serviço {{name}} em execução",
serviceUnhealthy: "Serviço {{name}} com falha",
creating: "Criando...",
},
actions: {
+8 -2
View File
@@ -930,10 +930,15 @@ export const ru: TranslationResources = {
host: "Хост",
changeRequest: "Pull request",
checks: "Проверки",
scripts: "Скрипты",
services: "Сервисы",
diff: "Статистика изменений",
timestamp: "Последняя активность",
},
checks: {
iconAndText: "Значок и текст",
icon: "Только значок",
none: "Скрыто",
},
hostFilter: {
label: "Хост",
all: "Все хосты",
@@ -1006,7 +1011,8 @@ export const ru: TranslationResources = {
},
workspace: {
status: {
scriptsAvailable: "Доступны скрипты",
serviceRunning: "Сервис {{name}} запущен",
serviceUnhealthy: "Сервис {{name}} неисправен",
creating: "Создание...",
},
actions: {
+8 -2
View File
@@ -900,10 +900,15 @@ export const zhCN: TranslationResources = {
host: "主机",
changeRequest: "拉取请求",
checks: "检查",
scripts: "脚本",
services: "服务",
diff: "差异统计",
timestamp: "最近活动",
},
checks: {
iconAndText: "图标和文字",
icon: "仅图标",
none: "隐藏",
},
hostFilter: {
label: "主机",
all: "所有主机",
@@ -974,7 +979,8 @@ export const zhCN: TranslationResources = {
},
workspace: {
status: {
scriptsAvailable: "有可用 scripts",
serviceRunning: "服务 {{name}} 运行中",
serviceUnhealthy: "服务 {{name}} 异常",
creating: "正在创建...",
},
actions: {