feat: integrate vehicle CAN control into self-expand console

This commit is contained in:
Miayui
2026-08-07 17:16:52 +08:00
parent cd3f68a8f7
commit f0e359698f
17 changed files with 3639 additions and 48 deletions
+109
View File
@@ -39,3 +39,112 @@ dialog{margin:auto;padding:0;border:0;color:var(--ink);background:#fff}dialog::b
.modal-header p,.no-input-note,.centered-page>p,.danger-modal>p,.connection-overview p{font-size:11px}.modal-header h2{font-size:22px}.modal-close{font-size:20px}.type-choice strong{font-size:12px}.type-choice small,.preset-preview>span,.preset-preview i{font-size:9px}.hardware-name-field,.bridge-field{font-size:11px}.modal-primary,.modal-secondary,.danger-primary{font-size:11px}.stepper{font-size:11px}.learn-target-card small{font-size:10px}.learn-target-card strong{font-size:14px}.advanced-fields summary{font-size:11px}.advanced-fields label{font-size:9px}.cancel-link{font-size:10px}.danger-modal label{font-size:10px}.connection-overview strong{font-size:12px}.connection-overview button{font-size:10px}.connection-facts span{font-size:9px}.connection-facts b{font-size:11px}.toast{font-size:11px}
@media(max-width:1260px){body{min-width:1060px}.topbar{grid-template-columns:225px 1fr auto;padding:0 16px}.intelligence-badge{padding:0 9px}.intelligence-badge>span{display:none}.dashboard-grid{grid-template-columns:minmax(650px,1fr) 335px}.command-strip{grid-template-columns:330px minmax(440px,1fr) 88px;gap:12px}.command-heading h1{font-size:18px}.peripheral-board{padding:14px}.hardware-card.type-region{padding:9px}.type-region .hardware-icon{width:32px;height:32px;flex-basis:32px}.type-region .hardware-progress{display:none}.type-region .preset-action{padding:6px}.type-region .action-main strong{font-size:9px}.vehicle-board{padding:13px}.vehicle-card{padding:8px}.vehicle-action{font-size:8px}}
@media(max-height:720px){.topbar{height:66px}.screen-shell{height:calc(100dvh - 66px);grid-template-rows:80px minmax(0,1fr) auto;padding-top:8px}.command-strip{height:76px}.command-orbit{width:45px;height:45px}.command-composer{min-height:51px}.command-composer textarea,.voice-button,.execute-button{height:37px}.peripheral-board{grid-template-rows:61px minmax(0,1fr);padding:12px}.hardware-card.type-region{padding:7px}.type-region .hardware-head{margin-bottom:5px}.type-region .preset-action{padding:4px}.type-region .learn-action,.type-region .emit-action{height:20px}.type-card-footer{margin-top:3px}.vehicle-board{padding:11px}.vehicle-intro{margin-bottom:6px}.vehicle-card{padding:6px}.vehicle-action{min-height:25px}}
/* v7:去除固定最小宽度,在中小窗口中改为可滚动的纵向工作台。 */
html,body{max-width:100%;min-width:0}.topbar,.topbar-actions,.command-strip,.command-heading,.command-composer,.dashboard-grid,.peripheral-board,.vehicle-board{min-width:0}.command-heading div{min-width:0}.command-heading h1{line-height:1.18;white-space:normal}.command-composer textarea{width:100%;min-width:0}.dashboard-grid{width:100%}.vehicle-intro{line-height:1.5}
@media(max-width:1180px){
html,body{height:auto;min-height:100%;overflow-x:hidden;overflow-y:auto}
body{min-width:0}
.topbar{position:sticky;top:0;z-index:40;grid-template-columns:minmax(180px,1fr) auto;height:auto;min-height:66px;padding:9px 16px}
.scope-tabs{display:none}
.topbar-actions{justify-self:end}
.intelligence-badge>span{display:none}
.screen-shell{grid-template-rows:auto auto auto;gap:12px;height:auto;min-height:calc(100dvh - 66px);padding:14px 16px 22px}
.command-strip{grid-template-areas:"heading session" "composer composer";grid-template-columns:minmax(0,1fr) auto;gap:12px 14px;height:auto}
.command-heading{grid-area:heading}
.command-composer{grid-area:composer}
.session-chip{grid-area:session;min-width:96px}
.dashboard-grid{grid-template-columns:minmax(0,1fr);gap:12px}
.peripheral-board{grid-template-rows:auto auto;padding:16px}
.board-heading{gap:16px;margin-bottom:14px}
.board-heading p{max-width:640px;line-height:1.5}
.hardware-grid{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:none;grid-auto-rows:minmax(268px,auto);gap:12px}
.hardware-card.type-region{min-height:268px;padding:12px}
.type-region .hardware-head{margin-bottom:9px}
.type-region .preset-action{min-height:70px;padding:7px}
.type-region .action-main strong{font-size:11px}
.type-region .action-main small{font-size:9px}
.type-region .learn-action,.type-region .emit-action{min-width:40px;height:27px;font-size:9px}
.type-card-footer{font-size:9px}
.vehicle-board{grid-template-rows:auto auto auto;padding:16px}
.vehicle-grid{grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:none;grid-auto-rows:minmax(150px,auto);gap:10px}
.vehicle-card{min-height:150px;padding:11px}
.vehicle-action{min-height:32px;font-size:10px}
.execution-bar{grid-template-columns:auto minmax(130px,.5fr) minmax(0,1fr) auto}
}
@media(max-width:760px){
.topbar{grid-template-columns:minmax(0,1fr) auto;padding:8px 12px}
.brand{gap:9px}.brand-mark{width:39px;height:39px;border-radius:12px;font-size:18px}.brand strong{font-size:16px}.brand small{display:none}
.topbar-actions{gap:6px}
.intelligence-badge,.connection-button,.reset-button,.settings-button{width:39px;height:39px;padding:0;justify-content:center}
.intelligence-badge i{width:27px;height:27px}
.connection-button #connectionLabel{display:none}
.reset-button{font-size:0}
.reset-button::before{content:"↻";font-size:18px}
.screen-shell{padding:12px}
.command-strip{grid-template-areas:"heading" "composer" "session";grid-template-columns:minmax(0,1fr);gap:10px}
.command-heading h1{font-size:19px}
.command-composer{grid-template-columns:minmax(0,1fr) 43px auto}
.session-chip{display:flex;gap:7px;align-items:baseline;min-width:0;padding:9px 12px}
.session-chip span{grid-column:auto}.session-chip strong{font-size:22px}
.board-heading{align-items:center}
.board-heading p{font-size:10px}
.hardware-total{min-width:94px}
.vehicle-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
.execution-bar{grid-template-columns:auto minmax(0,1fr) auto}.run-plan{display:none}
}
@media(max-width:620px){
.screen-shell{padding:10px}
.command-heading{align-items:flex-start}.command-orbit{width:43px;height:43px;flex:0 0 43px;border-radius:14px}.command-heading h1{font-size:17px}
.command-composer{grid-template-columns:39px minmax(118px,1fr)}.command-composer textarea{grid-column:1/-1;height:48px}.voice-button{grid-column:1;width:39px;height:39px}.execute-button{grid-column:2;width:100%;height:39px;min-width:0}
.board-heading{align-items:flex-start}.board-heading h2,.vehicle-heading h2{font-size:19px}.board-heading p{max-width:360px}
.hardware-total{padding:8px 9px}.hardware-total strong{font-size:18px}
.hardware-grid{grid-template-columns:minmax(0,1fr);grid-auto-rows:minmax(270px,auto)}
.vehicle-grid{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(145px,auto)}
.type-chooser{grid-template-columns:repeat(2,minmax(0,1fr))}
.advanced-fields>div{grid-template-columns:1fr}
.connection-facts{grid-template-columns:1fr}
.learn-target-card{grid-template-columns:auto 1fr}.learn-target-card>i{display:none}.target-action{grid-column:1/-1;padding:11px 0 0;border-top:1px solid var(--line);border-left:0}
}
@media(max-width:430px){
.brand strong{font-size:14px}.topbar-actions{gap:4px}.intelligence-badge{display:none}
.command-heading div>span{font-size:8px}.command-heading h1{font-size:16px}
.board-heading{display:grid;grid-template-columns:minmax(0,1fr) auto}.board-heading p{grid-column:1/-1}
.vehicle-heading{gap:8px}.future-badge{white-space:nowrap}
.vehicle-grid{grid-template-columns:minmax(0,1fr)}
.modal{width:calc(100% - 20px)}.modal-header{padding:16px}.add-hardware-modal form,.learn-page{padding:16px}.type-chooser{grid-template-columns:1fr}
}
@media(max-width:1180px) and (max-height:720px){
.topbar{height:auto;min-height:62px}
.screen-shell{grid-template-rows:auto auto auto;height:auto;padding-top:10px}
.command-strip{height:auto}
.peripheral-board{grid-template-rows:auto auto}
}
/* v11:车端动作显示真实执行阶段和反馈层级。 */
.vehicle-card{grid-template-rows:auto minmax(0,1fr) auto;transition:border-color .18s ease,box-shadow .18s ease,background .18s ease}
.vehicle-feedback{display:block;min-height:1.25em;margin-top:6px;overflow:hidden;color:#81928f;font-size:7px;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}
.vehicle-card[data-state=pending]{border-color:#d8c68e;background:#fffdf5}.vehicle-card[data-state=running]{border-color:#71bfb1;box-shadow:0 0 0 2px rgba(18,129,112,.08)}
.vehicle-card[data-state=confirmed]{border-color:#78c2a8;background:#f1faf6}.vehicle-card[data-state=accepted]{border-color:#d5bd78;background:#fffaf0}.vehicle-card[data-state=validated]{border-color:#9eb8cb;background:#f4f8fb}.vehicle-card[data-state=failed]{border-color:#db9ca4;background:#fff5f6}
.vehicle-card[data-state=running] .vehicle-state{color:var(--teal)}.vehicle-card[data-state=confirmed] .vehicle-state{color:#18745a}.vehicle-card[data-state=accepted] .vehicle-state{color:#946318}.vehicle-card[data-state=validated] .vehicle-state{color:#4e728c}.vehicle-card[data-state=failed] .vehicle-state{color:var(--red)}
.vehicle-action:disabled{cursor:wait;opacity:.52}
@media(max-width:1180px){.vehicle-feedback{font-size:8px}}
/* v9:浏览器缩放或低高度宽屏下,不再压缩卡片内容,改为完整高度并纵向滚动。 */
@media(min-width:1181px) and (max-height:840px){
html,body{height:auto;min-height:100%;overflow-x:hidden;overflow-y:auto}
.topbar{position:sticky;top:0;z-index:40}
.screen-shell{grid-template-rows:auto auto auto;gap:10px;height:auto;min-height:calc(100dvh - 66px);padding-bottom:20px}
.command-strip{height:auto;min-height:76px}
.dashboard-grid{min-height:675px}
.peripheral-board{grid-template-rows:68px minmax(0,1fr);min-height:675px}
.hardware-grid{grid-template-rows:repeat(2,minmax(270px,1fr))}
.hardware-card.type-region{min-height:270px}
.vehicle-board{min-height:675px}
.vehicle-grid{grid-template-rows:repeat(3,minmax(170px,1fr))}
}