feat(web-console): rebuild intelligent cockpit sync interface

This commit is contained in:
vee
2026-08-18 13:24:36 +08:00
parent 344f662970
commit 9b24d5c8c9
30 changed files with 4100 additions and 12594 deletions
+389 -207
View File
@@ -7,15 +7,6 @@
[data-extension-type="mechanical"] { --extension-card-color: #758e94; }
[data-extension-type="other"] { --extension-card-color: #579a88; }
.console-v2[data-module="self-extension"] {
--v2-accent: #0e7773;
--v2-accent-strong: #095d5a;
--v2-accent-soft: #d8f4f1;
--v2-sidebar: #d8f4f2;
--v2-sidebar-deep: #c7eeeb;
--v2-line: rgba(18, 85, 83, 0.14);
}
.console-v2 .v2-extension-sidebar,
.console-v2 .v2-extension-footer,
.console-v2 .v2-self-extension,
@@ -23,39 +14,6 @@
display: none;
}
/* 自扩展不区分演示角色;admin/user 切换仅属于自编排。 */
.console-v2[data-module="self-extension"] .v2-role-select {
display: none;
}
.console-v2[data-module="self-extension"] .v2-extension-profile-title {
min-width: 0;
display: flex;
align-items: baseline;
gap: 5px;
color: #091c1e;
font-size: clamp(20px, 1.6vw, 26px);
font-weight: 900;
letter-spacing: -0.04em;
}
.console-v2[data-module="self-extension"] .v2-extension-profile-title strong {
color: inherit;
font: inherit;
}
.console-v2[data-module="self-extension"][data-demo-role="admin"] .v2-sidebar {
background:
radial-gradient(circle at 14% 3%, rgba(255, 255, 255, 0.8), transparent 24%),
linear-gradient(158deg, var(--v2-sidebar) 0%, #e8f8f6 60%, var(--v2-sidebar-deep) 130%);
}
.console-v2[data-module="self-extension"][data-demo-role="admin"] .v2-avatar {
background:
radial-gradient(circle at 28% 25%, rgba(255, 255, 255, 0.95), transparent 18%),
linear-gradient(135deg, #0b4d4b 3%, #70b7b1 49%, #d1efeb 52%, #276d69 100%);
}
.console-v2[data-module="self-extension"] .v2-control-section,
.console-v2[data-module="self-extension"] .v2-config-section,
.console-v2[data-module="self-extension"] .v2-sidebar > .v2-sidebar-footer:not(.v2-extension-footer),
@@ -98,34 +56,36 @@
.v2-extension-pet {
--pet-x: 0px;
--pet-y: 0px;
width: 126px;
height: 126px;
position: absolute;
right: 18px;
bottom: 16px;
width: clamp(154px, 15vw, 196px);
aspect-ratio: 1;
position: fixed;
right: max(18px, env(safe-area-inset-right));
bottom: max(18px, env(safe-area-inset-bottom));
z-index: 24;
display: grid;
place-items: end center;
display: block;
transform: translate3d(var(--pet-x), var(--pet-y), 0);
filter: drop-shadow(0 14px 16px rgba(9, 66, 63, 0.2));
filter: drop-shadow(0 12px 14px rgba(9, 66, 63, 0.18));
touch-action: none;
user-select: none;
}
.v2-extension-pet-bubble {
max-width: 158px;
position: absolute;
right: 54px;
bottom: 89px;
padding: 7px 9px;
right: calc(100% - 36px);
bottom: calc(100% - 42px);
width: 176px;
max-width: calc(100vw - 24px);
box-sizing: border-box;
padding: 10px 12px;
color: #285153;
background: rgba(255, 255, 255, 0.94);
border: 1px solid rgba(14, 119, 115, 0.18);
border-radius: 11px 11px 2px 11px;
box-shadow: 0 9px 24px rgba(22, 72, 70, 0.12);
font-size: 8px;
font-size: 13px;
font-weight: 800;
line-height: 1.45;
line-height: 1.5;
overflow-wrap: break-word;
opacity: 0;
transform: translateY(5px) scale(0.96);
transform-origin: right bottom;
@@ -141,191 +101,163 @@
}
.v2-extension-pet-body {
width: 76px;
height: 77px;
width: 100%;
height: 100%;
position: relative;
display: block;
padding: 0;
color: inherit;
background: linear-gradient(145deg, #f4fffd 0%, #bfe9e5 54%, #7bc3bd 100%);
border: 2px solid rgba(7, 86, 82, 0.48);
border-radius: 25px 25px 22px 22px;
box-shadow:
inset 0 3px 0 rgba(255, 255, 255, 0.82),
inset 0 -6px 12px rgba(9, 93, 89, 0.13),
0 6px 0 #326f6c;
background: transparent;
border: 0;
border-radius: 0;
box-shadow: none;
cursor: grab;
animation: extension-pet-float 3.2s ease-in-out infinite;
appearance: none;
}
.v2-extension-pet[data-dragging="true"] .v2-extension-pet-body {
cursor: grabbing;
animation-play-state: paused;
}
.v2-extension-pet-ear {
width: 22px;
height: 24px;
.v2-extension-pet-image {
width: 100%;
height: 100%;
display: block;
object-fit: contain;
pointer-events: none;
}
.v2-extension-pet-entrance-canvas {
width: 100%;
height: 100%;
position: absolute;
top: -12px;
z-index: -1;
background: linear-gradient(145deg, #dff8f5, #75bbb6);
border: 2px solid rgba(7, 86, 82, 0.48);
border-radius: 7px 15px 5px 13px;
inset: 0;
z-index: 4;
display: block;
opacity: 0;
pointer-events: none;
will-change: transform;
}
.v2-extension-pet-ear.left { left: 3px; transform: rotate(-20deg); }
.v2-extension-pet-ear.right { right: 3px; transform: scaleX(-1) rotate(-20deg); }
.v2-extension-pet[data-entering="true"] .v2-extension-pet-entrance-canvas {
opacity: 1;
}
.v2-extension-pet-antenna {
width: 2px;
height: 17px;
.v2-extension-pet[data-entering="true"] .v2-extension-pet-image,
.v2-extension-pet[data-entering="true"] .v2-extension-pet-tail-canvas,
.v2-extension-pet[data-entering="true"] .v2-extension-pet-blink,
.v2-extension-pet[data-entering="true"] .v2-extension-pet-mouth-closed {
opacity: 0;
}
.v2-extension-pet[data-entering="true"] .v2-extension-pet-bubble {
opacity: 0;
transform: translateY(5px) scale(0.96);
}
.v2-extension-pet[data-entering="true"] .v2-extension-pet-body {
cursor: default;
}
.v2-extension-pet-tail-canvas {
width: 100%;
height: 100%;
position: absolute;
top: -21px;
left: 50%;
background: #397f7b;
transform: translateX(-50%);
inset: 0;
z-index: 1;
display: block;
object-fit: contain;
opacity: 0;
pointer-events: none;
}
.v2-extension-pet-antenna i {
width: 8px;
height: 8px;
.v2-extension-pet[data-tail-waving="true"] .v2-extension-pet-tail-canvas {
opacity: 1;
}
.v2-extension-pet[data-tail-waving="true"] .v2-extension-pet-image {
opacity: 0;
}
.v2-extension-pet-blink {
position: absolute;
top: -5px;
left: -3px;
background: #ffbd62;
border: 1px solid #9f6630;
border-radius: 50%;
box-shadow: 0 0 0 4px rgba(255, 189, 98, 0.17);
animation: extension-pet-signal 1.8s ease-in-out infinite;
inset: 0;
z-index: 2;
opacity: 0;
pointer-events: none;
transition: opacity 28ms linear;
}
.v2-extension-pet-face {
width: 58px;
height: 34px;
.v2-extension-pet[data-blinking="true"] .v2-extension-pet-blink {
opacity: 1;
}
.v2-extension-pet-blink-eye {
position: absolute;
top: 9px;
left: 7px;
background: linear-gradient(180deg, #164e50, #0d383a);
border: 2px solid rgba(255, 255, 255, 0.65);
border-radius: 16px;
box-shadow: inset 0 4px 10px rgba(0, 0, 0, 0.2);
top: 31.3%;
height: 6.2%;
background: #919baa;
border-radius: 48%;
}
.v2-extension-pet-face .eye {
width: 8px;
height: 10px;
.v2-extension-pet-blink-eye.left {
left: 23.7%;
width: 4%;
}
.v2-extension-pet-blink-eye.right {
left: 35.9%;
width: 5.3%;
}
.v2-extension-pet-blink-eye::after {
content: "";
position: absolute;
top: 9px;
background: #bdfaf2;
border-radius: 50%;
box-shadow: 0 0 7px rgba(141, 255, 241, 0.72);
animation: extension-pet-blink 4.6s infinite;
top: 48%;
right: 12%;
left: 12%;
height: 27%;
border-top: 2px solid #050606;
border-radius: 50% 50% 0 0;
}
.v2-extension-pet-face .eye.left { left: 12px; }
.v2-extension-pet-face .eye.right { right: 12px; }
.v2-extension-pet-face b {
width: 6px;
height: 4px;
.v2-extension-pet-mouth-closed {
position: absolute;
top: 19px;
left: 50%;
background: #ffc17a;
border-radius: 50% 50% 65% 65%;
transform: translateX(-50%);
left: 27%;
top: 39.8%;
z-index: 3;
width: 7%;
height: 5.9%;
border-radius: 46%;
background:
linear-gradient(#050606, #050606) center top / 1.5px 34% no-repeat,
#fbfaf7;
pointer-events: none;
opacity: 1;
}
.v2-extension-pet-face em {
width: 13px;
height: 6px;
.v2-extension-pet-mouth-closed::before {
content: "";
position: absolute;
top: 22px;
left: 50%;
border-bottom: 2px solid #bdfaf2;
border-radius: 50%;
transform: translateX(-50%);
top: 13%;
left: 13%;
width: 38%;
height: 34%;
border-bottom: 1.5px solid #050606;
border-radius: 0 0 70% 70%;
transform: rotate(-7deg);
}
.v2-extension-pet[data-mood="happy"] .v2-extension-pet-face .eye {
height: 5px;
top: 13px;
background: transparent;
border-top: 2px solid #bdfaf2;
border-radius: 50%;
}
.v2-extension-pet-screen {
width: 36px;
height: 17px;
.v2-extension-pet-mouth-closed::after {
content: "";
position: absolute;
bottom: 7px;
left: 18px;
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
color: #eafffb;
background: #277c78;
border: 1px solid rgba(6, 79, 75, 0.5);
border-radius: 7px;
font: 900 6px Consolas, monospace;
}
.v2-extension-pet-screen i {
width: 5px;
height: 5px;
background: #80f0bd;
border-radius: 50%;
box-shadow: 0 0 5px rgba(128, 240, 189, 0.8);
}
.v2-extension-pet-foot {
width: 21px;
height: 10px;
position: absolute;
bottom: -12px;
background: #5ba5a0;
border: 2px solid #326f6c;
border-radius: 4px 4px 9px 9px;
}
.v2-extension-pet-foot.left { left: 8px; }
.v2-extension-pet-foot.right { right: 8px; }
.v2-extension-pet-tail {
width: 27px;
height: 11px;
position: absolute;
right: -21px;
bottom: 12px;
z-index: -1;
border: 5px solid #4d9994;
border-left: 0;
border-radius: 0 13px 13px 0;
transform-origin: left center;
animation: extension-pet-tail 1.1s ease-in-out infinite alternate;
}
@keyframes extension-pet-float {
0%, 100% { transform: translateY(0) rotate(-1deg); }
50% { transform: translateY(-5px) rotate(1deg); }
}
@keyframes extension-pet-blink {
0%, 45%, 49%, 100% { transform: scaleY(1); }
47% { transform: scaleY(0.12); }
}
@keyframes extension-pet-signal {
0%, 100% { opacity: 0.72; transform: scale(0.86); }
50% { opacity: 1; transform: scale(1.15); }
}
@keyframes extension-pet-tail {
from { transform: rotate(-14deg); }
to { transform: rotate(16deg); }
top: 13%;
right: 13%;
width: 38%;
height: 34%;
border-bottom: 1.5px solid #050606;
border-radius: 0 0 70% 70%;
transform: rotate(7deg);
}
.v2-extension-sidebar > .v2-field-caption {
@@ -2233,3 +2165,253 @@ form > .v2-extension-primary {
}
}
/* Unified extension capability mirror ------------------------------------ */
.v2-extension-sync-mount {
min-height: 0;
display: grid;
grid-template-rows: auto auto minmax(0, 1fr) auto;
gap: 6px;
padding: 10px;
overflow: hidden;
background: linear-gradient(145deg, #102b2d, #173c3d);
border: 1px solid rgba(40, 165, 154, 0.2);
border-radius: 17px;
box-shadow: 0 14px 34px rgba(17, 49, 50, 0.15);
}
.v2-extension-sync-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.v2-extension-sync-heading small {
color: #66bdb5;
font: 850 8px/1.2 "SFMono-Regular", Consolas, monospace;
letter-spacing: 0.14em;
}
.v2-extension-sync-heading h3 {
margin: 3px 0 0;
color: #f3fffd;
font-size: 14px;
}
.v2-extension-sync-heading > span {
display: inline-flex;
align-items: center;
gap: 6px;
color: #a9c3c0;
font-size: 8px;
font-weight: 800;
white-space: nowrap;
}
.v2-extension-sync-heading > span i {
width: 6px;
height: 6px;
background: #758e8c;
border-radius: 50%;
}
.v2-extension-sync-heading > span[data-state="online"] i {
background: #25c896;
box-shadow: 0 0 0 5px rgba(37, 200, 150, 0.1);
}
.v2-extension-sync-heading > span[data-state="listening"] i {
background: #e6b45f;
}
.v2-extension-gateway {
min-width: 0;
display: grid;
grid-template-columns: 34px minmax(0, 1fr) auto;
align-items: center;
gap: 9px;
padding: 8px;
background: rgba(255, 255, 255, 0.055);
border: 1px solid rgba(130, 210, 202, 0.09);
border-radius: 11px;
}
.v2-extension-gateway > span {
width: 34px;
height: 34px;
display: grid;
place-items: center;
color: #77d3c9;
background: rgba(77, 190, 179, 0.1);
border-radius: 10px;
}
.v2-extension-gateway > span svg {
width: 16px;
}
.v2-extension-gateway > div {
min-width: 0;
display: grid;
gap: 2px;
}
.v2-extension-gateway strong {
color: #effbf9;
font-size: 10px;
}
.v2-extension-gateway small {
overflow: hidden;
color: #91aaa8;
font-size: 8px;
text-overflow: ellipsis;
white-space: nowrap;
}
.v2-extension-gateway > b {
padding: 4px 6px;
color: #74c5bd;
background: rgba(90, 186, 177, 0.08);
border-radius: 6px;
font: 800 7px "SFMono-Regular", Consolas, monospace;
}
.v2-extension-device-list {
min-height: 0;
max-height: 124px;
overflow: auto;
}
.v2-extension-sync-mount[data-has-devices="true"] .v2-extension-gateway {
display: none;
}
.v2-extension-synced-device {
padding: 8px;
background: rgba(255, 255, 255, 0.045);
border-radius: 10px;
}
.v2-extension-synced-device header {
display: grid;
grid-template-columns: 28px minmax(0, 1fr) auto;
align-items: center;
gap: 8px;
}
.v2-extension-synced-device header > span {
width: 28px;
height: 28px;
display: grid;
place-items: center;
color: #76cfc6;
background: rgba(87, 191, 180, 0.1);
border-radius: 8px;
}
.v2-extension-synced-device header svg {
width: 14px;
}
.v2-extension-synced-device header > div {
display: grid;
gap: 1px;
}
.v2-extension-synced-device header strong {
color: #effaf8;
font-size: 9px;
}
.v2-extension-synced-device header small,
.v2-extension-synced-device header b {
color: #8da7a5;
font-size: 7px;
}
.v2-extension-synced-device > div {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-top: 7px;
}
.v2-extension-synced-device > div span {
padding: 3px 6px;
color: #b9d8d4;
background: rgba(95, 190, 180, 0.08);
border-radius: 999px;
font-size: 7px;
}
.v2-extension-sync-mount .v2-extension-empty {
display: flex;
align-items: center;
justify-content: center;
gap: 9px;
min-height: 34px;
color: #668986;
background: rgba(255, 255, 255, 0.035);
border: 0;
border-radius: 9px;
}
.v2-extension-empty > svg {
width: 19px;
}
.v2-extension-empty div {
display: grid;
gap: 2px;
}
.v2-extension-empty strong {
color: #bad0cd;
font-size: 9px;
}
.v2-extension-empty span {
font-size: 7px;
}
.v2-extension-linkage {
min-width: 0;
display: grid;
grid-template-columns: 25px minmax(0, 1fr) auto;
align-items: center;
gap: 7px;
padding-top: 7px;
border-top: 1px solid rgba(134, 203, 197, 0.1);
}
.v2-extension-linkage > svg {
width: 15px;
color: #6faaa5;
}
.v2-extension-linkage > div {
min-width: 0;
display: grid;
gap: 1px;
}
.v2-extension-linkage small {
color: #708f8c;
font-size: 7px;
}
.v2-extension-linkage strong {
overflow: hidden;
color: #c2d8d5;
font-size: 8px;
text-overflow: ellipsis;
white-space: nowrap;
}
.v2-extension-linkage > span {
color: #69bfb6;
font: 800 7px "SFMono-Regular", Consolas, monospace;
}