-
-
{{ error }}
+
+
+
+
{{ t('logs.loadFailed') }}
+
+ {{ t('common.errorDetails') }}
+ {{ error }}
+
+
+
+
+
-
-
-
-
-
-
-
+
{{ t('logs.autoUpdating') }}
- {{ t('logs.empty') || 'No logs' }}
+ {{ t('logs.empty') }}
diff --git a/apps/client-web/src/components/peer/peerCard/peerCard.md b/apps/client-web/src/components/peer/peerCard/peerCard.md
index b420f764..f4c8c6df 100644
--- a/apps/client-web/src/components/peer/peerCard/peerCard.md
+++ b/apps/client-web/src/components/peer/peerCard/peerCard.md
@@ -1,5 +1,6 @@
# peerCard
-Displays one technical Peer while retaining the product-facing “client” language. Name and
+Displays one Peer using the same product and technical language. Name and
owner config are editable shared facts;online status comes from database-time lease filtering,
-not an ad-hoc health endpoint。
+not an ad-hoc health endpoint。配置编辑使用与 SourceForm 相同的 schema 表单/JSON 草稿组合;
+无法可视化呈现的 schema 仍可通过 JSON 编辑,只有当前草稿完成校验才可保存。
diff --git a/apps/client-web/src/components/peer/peerCard/peerCard.scss b/apps/client-web/src/components/peer/peerCard/peerCard.scss
index 0383e509..3ceb8825 100644
--- a/apps/client-web/src/components/peer/peerCard/peerCard.scss
+++ b/apps/client-web/src/components/peer/peerCard/peerCard.scss
@@ -13,9 +13,28 @@
min-width: 0;
display: flex;
flex-direction: column;
+ align-items: flex-start;
gap: sys-var(space, xs);
}
+ &__heading {
+ display: flex;
+ align-items: center;
+ gap: sys-var(space, sm);
+ flex-wrap: wrap;
+ }
+
+ &__version,
+ &__current {
+ @include apply-font(label-md);
+ color: sys-var(color, text, subtle);
+ }
+
+ &__current {
+ padding-inline-start: sys-var(space, sm);
+ border-inline-start: 1px solid sys-var(color, border, base);
+ }
+
&__item-id {
@include apply-font(label-md, $mono: true);
color: sys-var(color, text, subtle);
@@ -26,24 +45,33 @@
color: sys-var(color, text, subtle);
}
+ &__actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: sys-var(space, xs);
+ }
+
+ &__details {
+ @include apply-font(body-sm);
+ max-width: 100%;
+ summary {
+ cursor: pointer;
+ }
+ p {
+ margin: sys-var(space, xs) 0;
+ }
+ pre {
+ max-width: 100%;
+ overflow-x: auto;
+ }
+ }
+
&__item-status {
@include apply-font(label-md);
padding: sys-var(space, xs) sys-var(space, sm);
border-radius: sys-var(radius, none);
- &--online {
- background-color: sys-var(color, surface, subtle);
- color: sys-var(color, feedback, success);
- }
-
- &--offline {
- background-color: sys-var(color, surface, subtle);
- color: sys-var(color, feedback, error);
- }
-
- &--unknown {
- background-color: sys-var(color, surface, subtle);
- color: sys-var(color, text, subtle);
- }
+ background-color: sys-var(color, surface, subtle);
+ color: sys-var(color, text, subtle);
}
}
diff --git a/apps/client-web/src/components/peer/peerCard/peerCard.ts b/apps/client-web/src/components/peer/peerCard/peerCard.ts
index aaa03bd2..e1f6eb8b 100644
--- a/apps/client-web/src/components/peer/peerCard/peerCard.ts
+++ b/apps/client-web/src/components/peer/peerCard/peerCard.ts
@@ -3,6 +3,7 @@ import { Peer } from '@inkcre/core'
export const peerCardProps = {
peer: { type: Object as PropType
, required: true },
+ current: { type: Boolean, default: false },
status: {
type: String as PropType<'online' | 'offline' | 'unknown'>,
required: true,
diff --git a/apps/client-web/src/components/peer/peerCard/peerCard.vue b/apps/client-web/src/components/peer/peerCard/peerCard.vue
index d5aac541..c387d214 100644
--- a/apps/client-web/src/components/peer/peerCard/peerCard.vue
+++ b/apps/client-web/src/components/peer/peerCard/peerCard.vue
@@ -1,15 +1,11 @@