diff --git a/web/hwlab-cloud-web/src/main.ts b/web/hwlab-cloud-web/src/main.ts
index 3914b190..e1931730 100644
--- a/web/hwlab-cloud-web/src/main.ts
+++ b/web/hwlab-cloud-web/src/main.ts
@@ -12,10 +12,11 @@ import { workbenchRuntimePolicy } from "@/config/workbench-runtime-policy";
import { installWebRum } from "@/utils/rum";
import "./styles/tokens.css";
import "./style.css";
-import "./styles/console-legacy.css";
+import "./styles/console-shell.css";
import "./styles/workbench.css";
import "./styles/console-pages.css";
import "./styles/console-foundation.css";
+import "./styles/console-r2.css";
function initThemeClass(): void {
const savedTheme = localStorage.getItem("theme");
diff --git a/web/hwlab-cloud-web/src/styles/console-r2.css b/web/hwlab-cloud-web/src/styles/console-r2.css
new file mode 100644
index 00000000..9b29dc4e
--- /dev/null
+++ b/web/hwlab-cloud-web/src/styles/console-r2.css
@@ -0,0 +1,724 @@
+/* SPEC: PJ2026-010405 云端控制台,MDTODO hwlab-web-product-experience/R2。 */
+/* Responsibility: 统一非 Workbench 页面的工业运营台壳层、密度、状态和响应式视觉。 */
+
+:root {
+ --console-canvas: #dfe5e2;
+ --console-surface: #f5f6f2;
+ --console-surface-raised: #fbfcf8;
+ --console-surface-muted: #edf0ec;
+ --console-border: #bcc7c4;
+ --console-border-strong: #8fa09c;
+ --console-shadow-sm: 0 1px 0 rgb(255 255 255 / 65%), 0 1px 3px rgb(8 20 22 / 9%);
+ --console-shadow-md: 0 18px 48px rgb(8 20 22 / 22%);
+ --console-sidebar-width: 256px;
+ --console-sidebar-collapsed-width: 68px;
+ --console-topbar-height: 46px;
+}
+
+body {
+ background:
+ linear-gradient(rgb(17 25 28 / 3%) 1px, transparent 1px),
+ linear-gradient(90deg, rgb(17 25 28 / 3%) 1px, transparent 1px),
+ var(--console-canvas);
+ background-size: 24px 24px;
+}
+
+.platform-shell {
+ grid-template-columns: var(--console-sidebar-width) minmax(0, 1fr);
+ background: transparent;
+}
+
+.platform-shell.is-sidebar-collapsed {
+ grid-template-columns: var(--console-sidebar-collapsed-width) minmax(0, 1fr);
+}
+
+.platform-sidebar {
+ gap: 14px;
+ border-right-color: #263538;
+ background:
+ linear-gradient(180deg, rgb(255 255 255 / 4%), transparent 120px),
+ #10191c;
+ padding: 14px 10px;
+ color: #dce7e4;
+ box-shadow: 8px 0 28px rgb(8 20 22 / 12%);
+}
+
+.brand-lockup {
+ min-height: 42px;
+ border-bottom: 1px solid #2b3b3e;
+ padding: 0 6px 12px;
+}
+
+.brand-mark {
+ width: 34px;
+ height: 34px;
+ border: 1px solid #37565a;
+ border-radius: 5px;
+ background: #18272a;
+ color: #59d0d0;
+ box-shadow: inset 0 0 0 1px rgb(255 255 255 / 3%);
+}
+
+.brand-lockup strong {
+ color: #f3f8f6;
+ font-family: var(--console-font-mono);
+ font-size: 13px;
+ letter-spacing: .08em;
+}
+
+.brand-lockup small {
+ color: #819492;
+ font-family: var(--console-font-mono);
+ font-size: 9px;
+ letter-spacing: .04em;
+ text-transform: uppercase;
+}
+
+.nav-groups {
+ gap: 10px;
+}
+
+.nav-section {
+ gap: 2px;
+}
+
+.nav-section h2 {
+ margin: 7px 8px 4px;
+ color: #718582;
+ font-family: var(--console-font-mono);
+ font-size: 9px;
+ letter-spacing: .11em;
+}
+
+.nav-item {
+ position: relative;
+ min-height: 34px;
+ gap: 9px;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ padding: 5px 8px;
+ color: #b7c6c3;
+ font-size: 12px;
+}
+
+.nav-item::before {
+ position: absolute;
+ top: 7px;
+ bottom: 7px;
+ left: -10px;
+ width: 2px;
+ background: transparent;
+ content: "";
+}
+
+.nav-item:hover {
+ border-color: #2f4346;
+ background: #172427;
+ color: #f0f6f4;
+}
+
+.nav-icon {
+ width: 22px;
+ height: 22px;
+ border: 0;
+ border-radius: 3px;
+ background: transparent;
+ color: #809793;
+}
+
+.nav-item[data-active="true"] {
+ border-color: #31565a;
+ background: #173135;
+ color: #eaf8f6;
+ box-shadow: inset 0 0 0 1px rgb(70 204 204 / 4%);
+}
+
+.nav-item[data-active="true"]::before {
+ background: #43c7c7;
+}
+
+.nav-item[data-active="true"] .nav-icon {
+ background: transparent;
+ color: #54d2d0;
+}
+
+.platform-main {
+ grid-template-rows: var(--console-topbar-height) minmax(0, 1fr);
+}
+
+.platform-topbar {
+ gap: 8px;
+ border-bottom-color: var(--console-border-strong);
+ background: rgb(245 247 244 / 94%);
+ padding: 0 14px;
+ backdrop-filter: blur(12px);
+}
+
+.platform-topbar .icon-button,
+.platform-topbar .btn {
+ min-height: 30px;
+ height: 30px;
+ border-radius: 4px;
+}
+
+.topbar-status {
+ gap: 8px;
+ font-family: var(--console-font-mono);
+}
+
+.topbar-status::before {
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ background: var(--console-green-700);
+ box-shadow: 0 0 0 3px var(--console-green-100);
+ content: "";
+}
+
+.topbar-status span {
+ color: var(--console-graphite-600);
+ font-size: 9px;
+ letter-spacing: .07em;
+ text-transform: uppercase;
+}
+
+.topbar-status strong {
+ overflow: hidden;
+ color: var(--console-graphite-800);
+ font-size: 11px;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.platform-content {
+ padding: 14px clamp(12px, 1.5vw, 24px) 24px;
+ scrollbar-gutter: stable;
+}
+
+.route-stack,
+.hwpod-console,
+.mdtodo-page {
+ gap: 12px;
+}
+
+.page-command-bar {
+ position: relative;
+ min-height: 76px;
+ align-items: center;
+ border: 1px solid var(--console-border);
+ border-radius: 6px;
+ background:
+ linear-gradient(90deg, rgb(0 131 138 / 6%), transparent 34%),
+ var(--console-surface-raised);
+ padding: 12px 14px 12px 18px;
+ box-shadow: var(--console-shadow-sm);
+}
+
+.page-command-bar::before {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ width: 4px;
+ border-radius: 5px 0 0 5px;
+ background: var(--console-cyan-600);
+ content: "";
+}
+
+.page-command-bar[data-sticky="true"] {
+ top: 8px;
+ border-bottom: 1px solid var(--console-border);
+ background: rgb(251 252 248 / 96%);
+}
+
+.page-command-copy {
+ gap: 2px;
+}
+
+.page-command-eyebrow {
+ color: var(--console-cyan-700);
+ font-size: 9px;
+ letter-spacing: .12em;
+}
+
+.page-command-title {
+ font-size: clamp(20px, 2vw, 26px);
+ font-weight: 720;
+ letter-spacing: -.018em;
+}
+
+.page-command-description {
+ color: var(--console-graphite-600);
+ font-size: 12px;
+}
+
+.console-status-strip {
+ gap: 0;
+ border-radius: 5px;
+ background: var(--console-surface-raised);
+ box-shadow: var(--console-shadow-sm);
+}
+
+.console-status-item {
+ position: relative;
+ min-width: 132px;
+ min-height: 46px;
+ border-right: 1px solid var(--console-border);
+ background: transparent;
+ padding: 7px 10px 7px 15px;
+}
+
+.console-status-item:last-child {
+ border-right: 0;
+}
+
+.console-status-item::before {
+ position: absolute;
+ top: 10px;
+ bottom: 10px;
+ left: 7px;
+ width: 2px;
+ height: auto;
+ border-radius: 0;
+}
+
+.console-status-item dt {
+ font-size: 9px;
+}
+
+.console-status-item dd {
+ font-family: var(--console-font-mono);
+ font-size: 12px;
+}
+
+.data-panel,
+.table-page-layout,
+.console-section-frame,
+.operations-workspace,
+.bounded-workspace,
+.entity-index,
+.operations-inspector-panel,
+.metric-card,
+.empty-state {
+ border-color: var(--console-border);
+ border-radius: 6px;
+ background: var(--console-surface-raised);
+ box-shadow: var(--console-shadow-sm);
+}
+
+.data-panel,
+.table-page-layout,
+.admin-crud-panel {
+ padding: 12px;
+}
+
+.panel-header,
+.table-page-header,
+.operations-inspector-header,
+.entity-index-toolbar {
+ border-bottom-color: var(--console-border);
+}
+
+.panel-header h2,
+.table-page-header h2,
+.operations-inspector-header h2 {
+ color: var(--console-graphite-900);
+ font-size: 13px;
+ font-weight: 760;
+}
+
+.btn,
+.icon-button,
+.table-action,
+.segmented-control,
+.segmented-control button,
+.view-mode-switch,
+.view-mode-switch button,
+.console-tabs,
+.console-tabs button {
+ border-radius: 4px;
+}
+
+.btn,
+.table-action,
+.segmented-control button,
+.view-mode-switch button,
+.console-tabs button {
+ font-family: var(--console-font-mono);
+ font-size: 10px;
+ letter-spacing: .02em;
+}
+
+.btn-primary,
+.table-action.primary {
+ border-color: #006b70;
+ background: #007b80;
+ color: #fff;
+}
+
+.btn-primary:hover,
+.table-action.primary:hover:not(:disabled) {
+ background: #00666b;
+}
+
+.btn-secondary,
+.icon-button,
+.table-action,
+.segmented-control button,
+.view-mode-switch button,
+.console-tabs button {
+ border-color: var(--console-border-strong);
+ background: var(--console-surface-raised);
+ color: var(--console-graphite-700);
+}
+
+.input,
+input:not([type="checkbox"]):not([type="radio"]),
+select,
+textarea {
+ border-color: var(--console-border-strong);
+ border-radius: 4px;
+ background: #fff;
+}
+
+.input:focus,
+input:focus,
+select:focus,
+textarea:focus,
+button:focus-visible,
+[tabindex]:focus-visible {
+ outline: 2px solid color-mix(in srgb, var(--console-focus) 55%, transparent);
+ outline-offset: 2px;
+}
+
+.console-data-grid-wrap,
+.data-table-wrap {
+ border-color: var(--console-border);
+ border-radius: 4px;
+}
+
+.console-data-grid,
+.data-table {
+ font-size: 11px;
+}
+
+.console-data-grid thead,
+.data-table thead {
+ background: #e5eae7;
+}
+
+.console-data-grid th,
+.data-table th {
+ color: var(--console-graphite-700);
+ font-family: var(--console-font-mono);
+ font-size: 9px;
+ font-weight: 760;
+ letter-spacing: .06em;
+ text-transform: uppercase;
+}
+
+.console-data-grid td,
+.console-data-grid th,
+.data-table td,
+.data-table th {
+ border-color: #d5dcda;
+}
+
+.console-data-grid tbody tr:nth-child(even),
+.data-table tbody tr:nth-child(even) {
+ background: #f5f7f4;
+}
+
+.console-data-grid tbody tr:hover,
+.data-table tbody tr:hover {
+ background: var(--console-cyan-100);
+}
+
+.resource-collection-items[data-view="cards"] {
+ grid-template-columns: repeat(auto-fill, minmax(min(300px, 100%), 1fr));
+}
+
+.entity-card-heading {
+ display: flex;
+ min-width: 0;
+ align-items: flex-start;
+ gap: 9px;
+}
+
+.entity-card-icon {
+ display: inline-grid;
+ width: 32px;
+ height: 32px;
+ flex: 0 0 auto;
+ place-items: center;
+ border: 1px solid #80aaa7;
+ border-radius: 4px;
+ background: #dcecea;
+ color: #146866;
+}
+
+.entity-card-meta {
+ display: flex;
+ min-width: 0;
+ flex-wrap: wrap;
+ gap: 5px 10px;
+ color: var(--console-graphite-600);
+ font-family: var(--console-font-mono);
+ font-size: 9px;
+}
+
+.resource-collection-virtual {
+ border: 1px solid var(--console-border);
+ border-radius: 4px;
+ background: var(--console-surface-raised);
+}
+
+.resource-collection-item--virtual {
+ height: 100%;
+ border-bottom: 1px solid #d8dfdd;
+ padding: 4px;
+}
+
+.resource-collection-item--virtual .entity-card {
+ height: 100%;
+ grid-template-columns: minmax(0, 1fr) auto;
+ align-items: center;
+ border: 0;
+ border-radius: 0;
+ box-shadow: none;
+ padding: 6px 9px;
+}
+
+.entity-card,
+.project-card,
+.skill-card,
+.provider-card,
+.api-key-card,
+.pcb-card,
+.node-card {
+ border-color: var(--console-border);
+ border-radius: 5px;
+ background:
+ linear-gradient(135deg, rgb(0 131 138 / 5%), transparent 46%),
+ var(--console-surface-raised);
+ box-shadow: var(--console-shadow-sm);
+}
+
+.entity-card[data-interactive="true"]:hover,
+.project-card:hover,
+.skill-card:hover,
+.provider-card:hover,
+.api-key-card:hover {
+ border-color: var(--console-cyan-600);
+ box-shadow: 0 8px 22px rgb(11 31 33 / 11%);
+ transform: translateY(-1px);
+}
+
+.empty-state {
+ min-height: 148px;
+ align-content: center;
+ justify-items: center;
+ padding: 24px;
+ text-align: center;
+}
+
+.empty-state-mark,
+.skill-glyph,
+.project-glyph,
+.api-key-glyph,
+.provider-glyph {
+ display: inline-grid;
+ width: 36px;
+ height: 36px;
+ place-items: center;
+ border: 1px solid #6faaa7;
+ border-radius: 5px;
+ background: #d9eeeb;
+ color: #126764;
+ font-size: 0;
+}
+
+.provider-glyph {
+ cursor: pointer;
+}
+
+.status-pill,
+.status-badge,
+.pm-status,
+.task-state,
+.stage-status {
+ border-radius: 3px;
+ font-family: var(--console-font-mono);
+ font-size: 9px;
+ letter-spacing: .04em;
+}
+
+.mini-log,
+.json-panel,
+.help-body,
+.content-viewer pre,
+.source-output,
+.report-markdown {
+ border-color: #334649;
+ border-radius: 4px;
+ background: #111b1e;
+ color: #d9e7e4;
+ font-family: var(--console-font-mono);
+}
+
+.hwpod-workspace,
+.mdtodo-workspace {
+ min-height: min(72vh, 760px);
+}
+
+.pcb-card {
+ position: relative;
+ overflow: hidden;
+}
+
+.pcb-card::after {
+ position: absolute;
+ right: -30px;
+ bottom: -34px;
+ width: 130px;
+ height: 100px;
+ border: 1px solid rgb(0 131 138 / 18%);
+ border-radius: 50%;
+ box-shadow: 0 0 0 16px rgb(0 131 138 / 4%), 0 0 0 32px rgb(0 131 138 / 3%);
+ content: "";
+ pointer-events: none;
+}
+
+.pcb-trace,
+.pcb-grid-line {
+ color: var(--console-cyan-600);
+}
+
+.mdtodo-workspace,
+.document-workspace,
+.report-viewer,
+.task-index {
+ border-color: var(--console-border-strong);
+ background: var(--console-surface-raised);
+}
+
+@media (max-width: 1100px) {
+ :root {
+ --console-sidebar-width: 224px;
+ }
+
+ .platform-content {
+ padding: 10px;
+ }
+
+ .page-command-bar {
+ grid-template-columns: minmax(0, 1fr);
+ }
+
+ .page-command-actions {
+ justify-content: flex-start;
+ }
+
+ .overview-grid,
+ .settings-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+@media (max-width: 760px) {
+ .platform-shell,
+ .platform-shell.is-sidebar-collapsed {
+ grid-template-columns: minmax(0, 1fr);
+ }
+
+ .platform-sidebar,
+ .desktop-sidebar-toggle {
+ display: none;
+ }
+
+ .platform-topbar {
+ padding: 0 8px;
+ }
+
+ .platform-content {
+ padding: 8px;
+ }
+
+ .page-command-bar {
+ min-height: 0;
+ padding: 10px 10px 10px 15px;
+ }
+
+ .page-command-title {
+ font-size: 19px;
+ }
+
+ .page-command-description {
+ font-size: 11px;
+ }
+
+ .console-status-item {
+ min-width: 118px;
+ }
+
+ .overview-grid,
+ .settings-grid,
+ .usage-panels,
+ .field-grid,
+ .form-grid {
+ grid-template-columns: minmax(0, 1fr);
+ }
+
+ .resource-collection-items[data-view="cards"] {
+ grid-template-columns: minmax(0, 1fr);
+ }
+
+ .hwpod-workspace,
+ .mdtodo-workspace {
+ min-height: 0;
+ }
+}
+
+@media (max-width: 430px) {
+ .topbar-status span,
+ .topbar-actions .btn span {
+ display: none;
+ }
+
+ .topbar-actions .btn {
+ padding: 0 8px;
+ }
+
+ .page-command-actions,
+ .page-command-filters,
+ .table-page-actions,
+ .table-actions-inline {
+ align-items: stretch;
+ }
+
+ .page-command-actions > *,
+ .page-command-filters > * {
+ max-width: 100%;
+ }
+
+ .console-status-strip {
+ scroll-snap-type: x proximity;
+ }
+
+ .console-status-item {
+ flex-basis: 136px;
+ scroll-snap-align: start;
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .entity-card,
+ .project-card,
+ .skill-card,
+ .provider-card,
+ .api-key-card,
+ .pcb-card,
+ .node-card {
+ transform: none !important;
+ }
+}
diff --git a/web/hwlab-cloud-web/src/styles/console-legacy.css b/web/hwlab-cloud-web/src/styles/console-shell.css
similarity index 99%
rename from web/hwlab-cloud-web/src/styles/console-legacy.css
rename to web/hwlab-cloud-web/src/styles/console-shell.css
index c5a787d5..413fad7d 100644
--- a/web/hwlab-cloud-web/src/styles/console-legacy.css
+++ b/web/hwlab-cloud-web/src/styles/console-shell.css
@@ -1,5 +1,5 @@
/* SPEC: PJ2026-010405 云端控制台. */
-/* Implementation reference: draft-2026-07-13-p0-cloud-console. */
+/* Responsibility: 应用壳、认证入口和 Workbench 共享诊断表面。 */
.platform-shell {
display: grid;
height: 100dvh;
diff --git a/web/hwlab-cloud-web/src/views/SkillsView.vue b/web/hwlab-cloud-web/src/views/SkillsView.vue
index ce013647..50582ae7 100644
--- a/web/hwlab-cloud-web/src/views/SkillsView.vue
+++ b/web/hwlab-cloud-web/src/views/SkillsView.vue
@@ -13,6 +13,7 @@ import type { DataGridColumn } from "@/components/common/DataGrid.vue";
import EmptyState from "@/components/common/EmptyState.vue";
import ResourceCollection from "@/components/common/ResourceCollection.vue";
import VirtualList from "@/components/common/VirtualList.vue";
+import ConsoleIcon from "@/components/console/ConsoleIcon.vue";
import PageCommandBar from "@/components/layout/PageCommandBar.vue";
import TablePageLayout from "@/components/layout/TablePageLayout.vue";
import { useForm } from "@/composables/useForm";
@@ -235,7 +236,7 @@ function routeFilePath(): string {
-
+
- 版本
- {{ row.version || row.commitId || '-' }}
- 文件
- {{ row.fileCount ?? 0 }} / {{ formatBytes(row.sizeBytes) }}
- 更新
- {{ displayDate(row.updatedAt || row.createdAt) }}
diff --git a/web/hwlab-cloud-web/src/views/admin/ProviderProfilesView.vue b/web/hwlab-cloud-web/src/views/admin/ProviderProfilesView.vue
index 07729765..9c695bd9 100644
--- a/web/hwlab-cloud-web/src/views/admin/ProviderProfilesView.vue
+++ b/web/hwlab-cloud-web/src/views/admin/ProviderProfilesView.vue
@@ -13,6 +13,7 @@ import DataGrid from "@/components/common/DataGrid.vue";
import type { DataGridColumn } from "@/components/common/DataGrid.vue";
import EmptyState from "@/components/common/EmptyState.vue";
import ResourceCollection from "@/components/common/ResourceCollection.vue";
+import ConsoleIcon from "@/components/console/ConsoleIcon.vue";
import PageCommandBar from "@/components/layout/PageCommandBar.vue";
import TablePageLayout from "@/components/layout/TablePageLayout.vue";
import { useForm } from "@/composables/useForm";
@@ -316,7 +317,7 @@ function restoreSelectedProfile(): void {
-
+
- Fingerprint
- key {{ row.credentialHashSuffix || '-' }} / cfg {{ row.configHashSuffix || '-' }}
- Bridge
- {{ row.bridgeText || '-' }}
- Validation
- {{ row.validationStatus || 'not run' }}{{ row.failureKind }}
diff --git a/web/hwlab-cloud-web/src/views/projects/ProjectsView.vue b/web/hwlab-cloud-web/src/views/projects/ProjectsView.vue
index 2e3f39b3..6f3b0232 100644
--- a/web/hwlab-cloud-web/src/views/projects/ProjectsView.vue
+++ b/web/hwlab-cloud-web/src/views/projects/ProjectsView.vue
@@ -10,6 +10,7 @@ import { projectManagementAPI, type MdtodoTaskRecord, type ProjectNavigationResp
import AsyncBoundary from "@/components/common/AsyncBoundary.vue";
import EmptyState from "@/components/common/EmptyState.vue";
import ResourceCollection from "@/components/common/ResourceCollection.vue";
+import ConsoleIcon from "@/components/console/ConsoleIcon.vue";
import BoundedWorkspace from "@/components/layout/BoundedWorkspace.vue";
import PageCommandBar from "@/components/layout/PageCommandBar.vue";
import StatusStrip from "@/components/layout/StatusStrip.vue";
@@ -258,14 +259,14 @@ function projectApiError(err: unknown): { error: string; apiError: ApiError | nu
- PJ{{ project.status || 'unknown' }}{{ projectTitle(project) }}
{{ project.projectId }}
+ {{ project.status || 'unknown' }}{{ projectTitle(project) }}
{{ project.projectId }}
{{ source.displayName || source.sourceId }} · {{ source.status || 'unknown' }}无可见 source
查看详情 →
- PJ{{ project.status || 'unknown' }}{{ projectTitle(project) }}
{{ project.projectId }}
+ {{ project.status || 'unknown' }}{{ projectTitle(project) }}
{{ project.projectId }}
{{ source.displayName || source.sourceId }} · {{ source.status || 'unknown' }}无可见 source
查看详情 →
diff --git a/web/hwlab-cloud-web/src/views/user/ApiKeysView.vue b/web/hwlab-cloud-web/src/views/user/ApiKeysView.vue
index bb687fde..b55f034b 100644
--- a/web/hwlab-cloud-web/src/views/user/ApiKeysView.vue
+++ b/web/hwlab-cloud-web/src/views/user/ApiKeysView.vue
@@ -9,6 +9,7 @@ import BaseDialog from "@/components/common/BaseDialog.vue";
import ConfirmDialog from "@/components/common/ConfirmDialog.vue";
import EmptyState from "@/components/common/EmptyState.vue";
import ResourceCollection from "@/components/common/ResourceCollection.vue";
+import ConsoleIcon from "@/components/console/ConsoleIcon.vue";
import BoundedWorkspace from "@/components/layout/BoundedWorkspace.vue";
import PageCommandBar from "@/components/layout/PageCommandBar.vue";
import StatusStrip from "@/components/layout/StatusStrip.vue";
@@ -197,7 +198,7 @@ function formatDate(value: unknown): string {
- KEY
+
{{ key.name || key.id }}{{ key.id }}
{{ key.prefix || '-' }}
{{ key.revokedAt ? 'revoked' : 'active' }}
@@ -207,7 +208,7 @@ function formatDate(value: unknown): string {
- KEY
+
{{ key.name || key.id }}{{ key.id }}
{{ key.prefix || '-' }}
{{ key.revokedAt ? 'revoked' : 'active' }}