fix(a11y): silence live stats and make Select tags removable for screen readers

Ant Design's Spin wraps its content in aria-live="polite", so every
WebSocket tick on the dashboard, inbounds, clients and nodes pages was
announced, and only the changed number was read, with no label.
Pass aria-live="off" on every Spin that wraps content; aria-busy still
signals loading. Each vital tile is now a group named by its metric,
so "47.2 %" is read as CPU.

rc-select renders each tag's remove "x" as an aria-hidden span with no
tabIndex, so screen-reader users could only Backspace the last value
away, never remove one SNI or inbound from the middle.
selectTagRender swaps in a real button named "Remove <value>" and
moves focus to the next tag after removal. It is applied to every
tags/multiple Select. maxTagCount="responsive" is dropped because it
hid selected inbounds behind "+N", where no screen reader could reach
them.

Two oxlint rules (antd-a11y/spin-content-not-live and
antd-a11y/select-tag-remove) keep new code from regressing either fix.
This commit is contained in:
Alireza Ahmadi
2026-11-01 16:49:19 +01:00
parent cbf596d889
commit 1bdb517b88
73 changed files with 672 additions and 48 deletions
+1
View File
@@ -10,6 +10,7 @@
"create": "إنشاء",
"add": "إضافة",
"remove": "إزالة",
"removeItem": "إزالة {item}",
"update": "تحديث",
"copy": "نسخ",
"copied": "اتنسخ",
+1
View File
@@ -10,6 +10,7 @@
"create": "Create",
"add": "Add",
"remove": "Remove",
"removeItem": "Remove {item}",
"update": "Update",
"copy": "Copy",
"copied": "Copied",
+1
View File
@@ -10,6 +10,7 @@
"create": "Crear",
"add": "Añadir",
"remove": "Quitar",
"removeItem": "Quitar {item}",
"update": "Actualizar",
"copy": "Copiar",
"copied": "Copiado",
+1
View File
@@ -10,6 +10,7 @@
"create": "ایجاد",
"add": "افزودن",
"remove": "حذف",
"removeItem": "حذف {item}",
"update": "به‌روزرسانی",
"copy": "کپی",
"copied": "کپی شد",
+1
View File
@@ -10,6 +10,7 @@
"create": "Buat",
"add": "Tambah",
"remove": "Hapus",
"removeItem": "Hapus {item}",
"update": "Perbarui",
"copy": "Salin",
"copied": "Tersalin",
+1
View File
@@ -10,6 +10,7 @@
"create": "作成",
"add": "追加",
"remove": "削除",
"removeItem": "{item} を削除",
"update": "更新",
"copy": "コピー",
"copied": "コピー済み",
+1
View File
@@ -10,6 +10,7 @@
"create": "Criar",
"add": "Adicionar",
"remove": "Remover",
"removeItem": "Remover {item}",
"update": "Atualizar",
"copy": "Copiar",
"copied": "Copiado",
+1
View File
@@ -10,6 +10,7 @@
"create": "Создать",
"add": "Добавить",
"remove": "Удалить",
"removeItem": "Удалить {item}",
"update": "Обновить",
"copy": "Копировать",
"copied": "Скопировано",
+1
View File
@@ -10,6 +10,7 @@
"create": "Vytvoriť",
"add": "Pridať",
"remove": "Odstrániť",
"removeItem": "Odstrániť {item}",
"update": "Aktualizovať",
"copy": "Kopírovať",
"copied": "Skopírované",
+1
View File
@@ -10,6 +10,7 @@
"create": "Oluştur",
"add": "Ekle",
"remove": "Kaldır",
"removeItem": "{item} öğesini kaldır",
"update": "Güncelle",
"copy": "Kopyala",
"copied": "Kopyalandı",
+1
View File
@@ -10,6 +10,7 @@
"create": "Створити",
"add": "Додати",
"remove": "Видалити",
"removeItem": "Видалити {item}",
"update": "Оновити",
"copy": "Копіювати",
"copied": "Скопійовано",
+1
View File
@@ -10,6 +10,7 @@
"create": "Tạo",
"add": "Thêm",
"remove": "Xóa",
"removeItem": "Xóa {item}",
"update": "Cập nhật",
"copy": "Sao chép",
"copied": "Đã sao chép",
+1
View File
@@ -10,6 +10,7 @@
"create": "创建",
"add": "添加",
"remove": "移除",
"removeItem": "移除 {item}",
"update": "更新",
"copy": "复制",
"copied": "已复制",
+1
View File
@@ -10,6 +10,7 @@
"create": "建立",
"add": "新增",
"remove": "移除",
"removeItem": "移除 {item}",
"update": "更新",
"copy": "複製",
"copied": "已複製",