Add AC/BC RTCP programs and 3D machine manager

This commit is contained in:
2026-09-20 12:31:12 +08:00
parent 1c1e5f9672
commit 8aab531b02
363 changed files with 53213 additions and 58 deletions

View File

@@ -57,6 +57,23 @@ button { color: inherit; }
.case-status, .command-status { overflow: hidden; color: #4d4d4d; font: 11px ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }
.case-status { min-width: 0; flex: 1 1 auto; }
.case-status.loading { color: #805400; font-weight: 700; }
.rtcp-program-library { flex: 0 0 auto; }
.rtcp-program-library > button { min-height: 26px; padding: 3px 8px; border: 1px solid #7c8e91; background: #f7fbfa; color: #203d40; cursor: pointer; }
.rtcp-program-summary { display: flex; flex-wrap: wrap; gap: 8px 18px; padding-bottom: 10px; border-bottom: 1px solid #b5c3c4; }
.rtcp-program-scope, .rtcp-program-select { display: grid; grid-template-columns: 74px minmax(0, 1fr); align-items: center; gap: 8px; margin: 12px 0; }
.rtcp-program-scope select, .rtcp-program-select select { min-width: 0; height: 32px; }
.rtcp-program-meta { display: grid; gap: 6px; margin: 10px 0; }
.rtcp-program-meta div { display: grid; grid-template-columns: 58px minmax(0, 1fr); gap: 8px; }
.rtcp-program-meta dt { font-weight: 700; }
.rtcp-program-meta dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
.rtcp-compatible { color: #176237; font-weight: 700; }
.rtcp-incompatible { color: #8a4c00; }
.rtcp-program-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 12px 0; }
.rtcp-program-actions button, .rtcp-program-actions a { min-height: 30px; padding: 5px 10px; border: 1px solid #7c8e91; background: #f7fbfa; color: #203d40; font: inherit; text-decoration: none; cursor: pointer; }
.rtcp-program-actions button:disabled { cursor: not-allowed; opacity: .55; }
.rtcp-program-dialog { width: min(900px, calc(100vw - 16px)); }
.rtcp-program-dialog output { display: block; min-height: 1.4em; text-align: left; }
.rtcp-program-source { width: 100%; min-height: 320px; max-height: 48vh; margin-top: 8px; resize: vertical; white-space: pre; tab-size: 2; font: 12px/1.35 ui-monospace, monospace; }
.command-status { margin-left: auto; }
.preview-load-indicator { display: flex; align-items: center; min-width: min(360px, 30vw); max-width: 420px; flex: 1 1 260px; gap: 6px; color: #805400; font: 10px ui-monospace, monospace; }
.preview-load-indicator span { min-width: 0; overflow: hidden; flex: 1 1 auto; text-overflow: ellipsis; white-space: nowrap; }
@@ -174,7 +191,7 @@ output { font: 12px ui-monospace, monospace; text-align: right; }
.axis-preview-split { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px; width: 100%; min-width: 0; min-height: 0; }
.axis-preview-pane { display: flex; min-width: 0; min-height: 0; overflow: hidden; }
.axis-preview-machine { flex-direction: column; }
.axis-preview-machine > .three-viewer { height: auto; min-height: 220px; }
.axis-preview-machine > .three-viewer { height: 0; flex: 1 1 0; min-height: 0; }
.trt-geometry { flex: 0 0 auto; background: #edf0f0; color: #202829; padding: 6px; font-size: 11px; border-top: 1px solid #899596; }
.trt-geometry header, .trt-geometry footer { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.trt-geometry header strong { overflow-wrap: anywhere; }
@@ -275,7 +292,7 @@ output { font: 12px ui-monospace, monospace; text-align: right; }
.axis-top-pane { grid-template-columns: 1fr; height: auto; min-height: 0; flex: 0 0 auto; }
.axis-notebook { min-height: 330px; }
.axis-preview { min-height: 732px; }
.axis-preview-split { grid-template-columns: 1fr; grid-template-rows: 360px 550px; align-self: start; }
.axis-preview-split { grid-template-columns: 1fr; grid-template-rows: 360px 420px; align-self: start; }
.axis-program-pane { flex: 0 0 auto; height: 740px; min-height: 740px; grid-template-columns: 1fr; grid-template-rows: minmax(0, 1fr) 140px; }
.program-main-layout { grid-template-columns: 1fr; grid-template-rows: minmax(0, 1fr) minmax(0, 1fr); grid-column: 1; grid-row: 1; overflow: hidden; }
.program-editor-wrap { grid-column: 1; grid-row: 1; }
@@ -308,3 +325,66 @@ output { font: 12px ui-monospace, monospace; text-align: right; }
.machine-status { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 18px; padding: 6px 8px; border-bottom: 1px solid #999; min-width: 0; }
.machine-status-dimensions { display: flex; flex: 1 1 auto; flex-wrap: wrap; gap: 6px 18px; }
.machine-status-dimensions output { font-weight: bold; margin-left: 5px; }
.machine-import { padding: .55rem .7rem; border-top: 1px solid #b5c3c4; background: #eff5f4; color: #233f43; font-size: .78rem; }
.machine-import header, .machine-import-actions { display: flex; gap: .6rem; align-items: center; flex-wrap: wrap; }
.machine-import header span { overflow-wrap: anywhere; min-width: 0; }
.machine-import-actions { margin: .4rem 0; }
.machine-import-actions span { display: inline-flex; gap: .35rem; align-items: center; }
.machine-import button { padding: .22rem .5rem; }
.machine-import a { color: #09676a; text-decoration: underline; }
.machine-import output { display: block; margin-top: .3rem; overflow-wrap: anywhere; }
.machine-import details p { margin: .25rem 0; }
/* Keep forms out of the model's flex layout. Native dialogs render in the top layer. */
.machine-preview-actions { flex: 0 0 auto; display: flex; flex-wrap: wrap; gap: 5px; padding: 5px 7px; background: #edf3f2; border: 1px solid #899596; }
.machine-preview-actions > section { padding: 0; border: 0; flex: 0 0 auto; background: transparent; }
.machine-import-toolbar button, .trt-geometry-toolbar button, .machine-manager > button { min-height: 28px; padding: 3px 10px; border: 1px solid #7c8e91; background: #f7fbfa; color: #203d40; cursor: pointer; font-size: 12px; }
.machine-dialog { position: fixed; inset: auto; margin: 0; padding: 0; width: min(580px, calc(100vw - 16px)); max-width: calc(100vw - 16px); max-height: calc(100dvh - 16px); border: 1px solid #52666a; background: #edf3f2; color: #202829; box-shadow: 0 12px 34px #0008; overflow: hidden; }
.machine-dialog[open] { display: flex; flex-direction: column; }
.machine-dialog::backdrop { background: rgba(10, 18, 20, .25); }
.machine-dialog .machine-dialog-titlebar { display: flex; flex: 0 0 auto; align-items: center; justify-content: space-between; gap: 16px; padding: 8px 10px; background: #27585d; color: #fff; cursor: move; user-select: none; touch-action: none; }
.machine-dialog-titlebar strong { min-width: 0; font-size: 14px; }
.machine-dialog-titlebar button { flex: 0 0 auto; width: 30px; height: 28px; border: 1px solid #c4d9d9; background: #e8f0ef; color: #18373a; font-size: 21px; line-height: 1; cursor: pointer; }
.machine-dialog-body { min-height: 0; overflow: auto; padding: 14px; font-size: 13px; }
.machine-dialog-body > header { margin-bottom: 12px; }
.machine-dialog-body output { display: block; margin-top: 9px; overflow-wrap: anywhere; }
.geometry-dialog .trt-geometry-fields { gap: 16px; margin: 6px 0 16px; }
.geometry-dialog .trt-geometry-fields label { grid-template-columns: minmax(0, 1fr) 90px; gap: 8px; margin: 8px 0; }
.geometry-dialog input { height: 30px; }
.machine-dialog button:focus-visible { outline: 2px solid #bf8b17; outline-offset: 2px; }
@media (max-width: 620px) {
.geometry-dialog .trt-geometry-fields { grid-template-columns: 1fr; gap: 12px; }
}
.machine-manager-dialog { width: min(1180px, calc(100vw - 16px)); }
.machine-manager-toolbar, .machine-manager-footer { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
.machine-manager-toolbar { margin-bottom: 10px; }
.machine-manager-toolbar button[aria-pressed="true"] { background: #27585d; color: #fff; }
.machine-manager-layout { display: grid; grid-template-columns: minmax(380px, 1.35fr) minmax(330px, .9fr); gap: 12px; min-height: 430px; }
.machine-manager-preview { min-width: 0; min-height: 430px; border: 1px solid #52666a; background: #10191d; overflow: hidden; }
.machine-manager-preview canvas { display: block; width: 100%; height: 100%; }
.machine-manager-editor { display: grid; grid-template-rows: minmax(120px, .7fr) minmax(260px, 1.3fr); min-height: 0; gap: 8px; }
.machine-part-list, .machine-part-editor, .machine-manager-calibration { border: 1px solid #9babad; background: #f6f9f8; padding: 8px; min-height: 0; overflow: auto; }
.machine-part-list h3, .machine-part-editor h3, .machine-manager-calibration h3 { margin: 0 0 7px; font-size: 13px; }
.machine-part-list > div { display: grid; grid-template-columns: minmax(0, 1fr) 30px; margin: 3px 0; }
.machine-part-list > div > button:first-child { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 8px; text-align: left; min-width: 0; }
.machine-part-list > div.selected > button:first-child { background: #d6e9e6; border-color: #27585d; }
.machine-part-list small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.machine-part-editor > label { display: grid; grid-template-columns: 82px minmax(0, 1fr); align-items: center; gap: 8px; margin: 6px 0; }
.machine-part-editor select { height: 30px; min-width: 0; }
.machine-part-flags { display: flex; gap: 16px; margin: 8px 0; }
.machine-vector { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; padding: 6px; }
.machine-vector legend { font-weight: 700; }
.machine-vector label { display: grid; grid-template-columns: 16px 76px; align-items: center; gap: 3px; }
.machine-vector input { min-width: 0; height: 28px; }
.machine-manager-calibration { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-top: 10px; overflow: visible; }
.machine-manager-calibration h3 { grid-column: 1 / -1; }
.machine-manager-footer { margin-top: 10px; }
.machine-manager-footer button { min-height: 32px; }
.machine-manager-footer output { flex: 1 1 320px; text-align: left; }
@media (max-width: 850px) {
.machine-manager-layout { grid-template-columns: 1fr; }
.machine-manager-preview { min-height: 360px; }
.machine-manager-calibration { grid-template-columns: 1fr; }
}