Files
linuxcncWebWASM/web/react/src/styles.css
wangdequan db29ae625f 按关节槽位驱动 13 个五轴案例的三维模型
关节契约扩为槽位制:以 LinuxCNC 联合号标识关节,轴字母降为槽位属性,
重复轴(bridge-mill 的两个 Y)、并联杆长(hexapod/pentapod)和被动槽位
(max5 第 6 关节)都能表达。v1 规则保持不变并合成 jointOrder,已保存
GLB 与既有测试不受影响。

13 个结构 GLB 由 scripts/generate_physical_case_glbs.mjs 统一重建,
可动关节均为按槽位命名的 Group 并写 userData.linuxcncJoint,共 71 个
关节,槽位数与运行目录的 joint_count 逐条一致。

新增 machine-visual-bindings.json 与纯函数模块,以 machine id 为键:
坐标字母不能作键,因为三个案例共用 XYZAB、三个共用 XYZABC。主界面切换
案例时自动装载对应模型,失败时保留内置模型并显式提示。

消除前端五关节截断:visual 适配器的 joints 改为数组并新增
jointsAuthoritative;allHomed 按 joint_count 判断;面板按 worker 断言的
machine id 查找机型。

管理器解锁:坐标与案例下拉以"存在完整视觉绑定"为启用条件,13 案例全部
可选;machine-urdf.ts 新增 generic-wasm/1 profile,AC/BC 严格校验路径
不变;新增 machine-kinematics-specs.json 保存逐关节限位,INI 未声明的
限位保持 null 而不编造。

修复三个真实缺陷:构建漏发 woodpecker/gmoccapy/qtdragon 配置目录(
DEFECT-02 根因);案例切换沿用"装载需要已上电"的门控,导致关机状态下
第二次切换被静默拒绝;重复轴机型上 React 列表键冲突。

验收:13 案例逐个切换装载成功、槽位键与绑定定义逐一一致、浏览器错误 0;
typecheck 与生产构建通过;视觉绑定、GLB 命名、关节契约、投影、store、
双画布、运动学规格漂移、11 案例 Worker 闭环、管理器浏览器回归全部通过。
证据在 coverage/glb-machine-manager/physical-drive/。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-30 06:09:12 +08:00

582 lines
54 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@import "tailwindcss";
:root {
font-family: Arial, Helvetica, sans-serif;
color: #202020;
background: #cfcfcf;
font-size: 13px;
--face: #d8d8d8;
--face-light: #ededed;
--border: #8b8b8b;
--border-dark: #666;
--ink: #202020;
--muted: #5a5a5a;
--blue: #c8d7e8;
--focus: #356ca8;
}
* { box-sizing: border-box; }
html, body, #root { min-height: 100%; margin: 0; overflow-x: hidden; }
body { min-width: 320px; background: #cfcfcf; color: var(--ink); }
button, input, select, textarea { font: inherit; }
button { color: inherit; }
.axis-app { min-height: 100vh; display: flex; flex-direction: column; padding: 0; background: var(--face); }
.axis-window-header { display: flex; align-items: center; justify-content: space-between; min-height: 32px; padding: 3px 8px; border-bottom: 1px solid #777; background: #bcbcbc; }
.axis-brand { display: flex; align-items: center; gap: 6px; }
.axis-brand img { width: 24px; height: 24px; image-rendering: auto; }
.axis-brand strong { font-size: 15px; letter-spacing: .04em; }
.axis-brand span { color: #4b4b4b; font-size: 12px; }
.connection-state { padding: 2px 6px; border: 1px solid #777; background: #d6d6d6; font: 11px ui-monospace, monospace; }
.connection-state.ready, .connection-state.running { color: #185c1d; }
.connection-state.error, .connection-state.blocked { color: #8b1010; background: #f3d2d2; }
.axis-menubar { display: flex; align-items: stretch; min-width: 0; min-height: 27px; padding-left: 3px; position: relative; z-index: 30; overflow: visible; border-bottom: 1px solid #888; background: #d3d3d3; }
.axis-menu-item { position: relative; }
.axis-menu-item summary { padding: 5px 10px; cursor: pointer; list-style: none; user-select: none; }
.axis-menu-item summary::-webkit-details-marker { display: none; }
.axis-menu-item[open] summary, .axis-menu-item summary:hover { background: #b8cbe0; }
.axis-menu-popup { position: absolute; z-index: 20; top: 100%; left: 0; min-width: 220px; padding: 2px; border: 1px solid #777; box-shadow: 2px 2px 4px #777; background: #ededed; }
.axis-menu-popup button { display: flex; justify-content: space-between; width: 100%; padding: 5px 8px; border: 0; background: transparent; text-align: left; cursor: pointer; }
.axis-menu-popup button:hover, .axis-menu-popup button:focus-visible { outline: 1px solid var(--focus); background: #c8d7e8; }
.axis-menu-popup kbd { margin-left: 22px; color: #555; font: 11px ui-monospace, monospace; }
.axis-toolbar { display: flex; align-items: center; width: 100%; min-width: 0; min-height: 35px; padding: 3px 5px; overflow-x: auto; border-bottom: 1px solid #8a8a8a; background: #d9d9d9; }
.axis-tool-button { display: inline-grid; width: 29px; height: 29px; flex: 0 0 29px; place-items: center; padding: 2px; border: 1px solid transparent; border-radius: 2px; background: transparent; cursor: pointer; }
.axis-tool-button img { width: 24px; height: 24px; object-fit: contain; pointer-events: none; }
.axis-tool-button:hover, .axis-tool-button:focus-visible { border-color: #6a8db6; background: #c8d7e8; outline: none; }
.axis-tool-button.pressed { border-color: #777; border-right-color: #eee; border-bottom-color: #eee; background: #c0c0c0; }
.axis-tool-button.danger { margin-right: 1px; }
.axis-tool-button:disabled { cursor: not-allowed; opacity: .48; }
.axis-toolbar-separator { width: 1px; height: 26px; flex: 0 0 1px; margin: 0 5px; border-left: 1px solid #969696; border-right: 1px solid #eee; }
.axis-case-strip { display: flex; flex-wrap: wrap; align-items: center; width: 100%; min-width: 0; gap: 7px; min-height: 34px; padding: 4px 8px; border-bottom: 1px solid #999; background: #c7c7c7; }
.axis-case-strip label { display: inline-flex; align-items: center; min-width: 0; flex: 0 0 auto; gap: 5px; font-size: 12px; }
.axis-case-strip select { width: min(420px, 46vw); max-width: 100%; min-height: 24px; border: 1px solid var(--border-dark); background: white; }
.axis-case-strip > .axis-text-button { flex: 0 0 auto; min-width: max-content; white-space: nowrap; }
.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; }
.preview-load-indicator progress { width: 124px; height: 12px; flex: 0 0 124px; accent-color: #9a6a13; }
.preview-load-indicator output { min-width: 4ch; color: #5a430f; text-align: right; }
.preview-load-indicator.ready { color: #185c1d; }
.preview-load-indicator.ready progress { accent-color: #3d7d45; }
.preview-load-indicator.ready output { color: #185c1d; }
.preview-load-indicator.error { color: #8b1010; }
.preview-load-indicator.error progress { accent-color: #a83232; }
.preview-load-indicator.error output { color: #8b1010; }
.machine-sequence { display: flex; align-items: center; gap: 12px; min-width: 0; padding: 6px 9px; border-bottom: 1px solid #858585; background: #cfcfcf; }
.machine-sequence-heading { display: grid; gap: 2px; min-width: 148px; }
.machine-sequence-heading strong { font-size: 12px; }
.machine-sequence-heading span { color: #555; font: 10px ui-monospace, monospace; }
.machine-sequence-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; min-width: 0; padding: 8px; border-bottom: 1px solid #aaa; }
.machine-sequence-actions .axis-text-button { min-height: 28px; }
.machine-sequence-actions .axis-text-button:first-child { border-color: #9b4a4a; }
.xyzac-control-band { display: grid; grid-template-columns: minmax(330px, .8fr) minmax(470px, 1.5fr); gap: 12px; padding: 7px 10px; border-bottom: 1px solid #858585; background: #d5d5d5; }
.xyzac-kinematics, .xyzac-manual-summary { min-width: 0; }
.xyzac-section-title { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 5px; font-size: 11px; }
.xyzac-section-title strong { font-size: 12px; }
.xyzac-section-title span { overflow: hidden; color: #555; font: 10px ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }
.xyzac-segments { display: grid; grid-template-columns: repeat(3, minmax(86px, 1fr)); min-height: 38px; }
.xyzac-segments button { display: grid; place-content: center; min-width: 0; min-height: 38px; padding: 3px 7px; border: 1px solid #777; border-right-width: 0; border-radius: 0; background: #ededed; cursor: pointer; }
.xyzac-segments button:first-child { border-radius: 3px 0 0 3px; }
.xyzac-segments button:last-child { border-right-width: 1px; border-radius: 0 3px 3px 0; }
.xyzac-segments button.active { color: #fff; background: #315f8b; box-shadow: inset 0 0 0 1px #173b5e; }
.xyzac-segments button:disabled { color: #777; cursor: not-allowed; background: #c9c9c9; }
.xyzac-segments button span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.xyzac-segments button small { font: 9px ui-monospace, monospace; }
.xyzac-clear { min-height: 24px; margin-top: 5px; padding: 2px 9px; border: 1px solid #858585; border-radius: 2px; background: #eee; cursor: pointer; }
.xyzac-position-grid { display: grid; grid-template-columns: repeat(5, minmax(74px, 1fr)); border: 1px solid #909090; background: #f4f4f4; }
.xyzac-position-grid > div { display: grid; grid-template-columns: 18px 1fr; align-items: baseline; min-width: 0; padding: 4px 6px; border-right: 1px solid #aaa; }
.xyzac-position-grid > div:last-child { border-right: 0; }
.xyzac-position-grid b { grid-row: span 2; font-size: 12px; }
.xyzac-position-grid output { overflow: hidden; font-size: 13px; text-overflow: ellipsis; }
.xyzac-position-grid small { overflow: hidden; color: #666; font: 9px ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }
.xyzac-offset-row { display: flex; gap: 12px; margin-top: 5px; color: #555; font: 10px ui-monospace, monospace; }
.xyzac-live-parameters { margin: 0 5px 5px; padding: 5px 8px; border: 1px solid var(--border-dark); background: #dedede; }
.xyzac-live-parameters .xyzac-section-title { margin: 0 0 4px; }
.xyzac-parameter-grid { display: grid; grid-template-columns: repeat(6, minmax(120px, 1fr)); gap: 5px; }
.xyzac-parameter-grid > div { display: grid; grid-template-columns: auto 1fr; align-items: baseline; gap: 2px 6px; min-width: 0; padding: 4px 6px; border-left: 2px solid #7894aa; background: #f7f7f7; }
.xyzac-parameter-grid b { color: #36434c; font-size: 11px; }
.xyzac-parameter-grid output { grid-column: 2; color: #111; font-size: 13px; white-space: nowrap; }
.xyzac-parameter-grid small { grid-column: 1 / -1; overflow: hidden; color: #666; font: 10px ui-monospace, monospace; text-overflow: ellipsis; white-space: nowrap; }
.xyzac-program { display: contents; }
.xyzac-program > header { display: flex; align-items: center; gap: 14px; min-height: 25px; margin: 0 5px; padding: 3px 8px; border: 1px solid #888; border-bottom: 0; background: #d4d4d4; font-size: 11px; }
.xyzac-program > header code { margin-left: auto; color: #4d4d4d; }
.xyzac-diagnostics { display: grid; gap: 8px; padding: 10px; border-top: 1px solid #aaa; background: #ededed; font-size: 11px; }
.xyzac-diagnostics h3 { margin: 0 0 3px; font-size: 11px; }
.xyzac-diagnostic-summary, .xyzac-diagnostic-row, .xyzac-error { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.xyzac-diagnostic-summary code, .xyzac-diagnostic-row span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.xyzac-diagnostic-row code { min-width: 128px; }
.xyzac-error { padding: 5px; color: #7b1111; border: 1px solid #bd8585; background: #f7dddd; }
.axis-top-pane { display: grid; grid-template-columns: minmax(360px, .48fr) minmax(430px, 1fr); height: clamp(360px, calc(100vh - 415px), 680px); min-height: 360px; flex: 0 0 auto; padding: 5px; gap: 5px; }
.axis-notebook { min-width: 0; min-height: 0; display: flex; flex-direction: column; border: 1px solid var(--border-dark); background: var(--face-light); }
.axis-notebook > [role="tabpanel"] { min-width: 0; min-height: 0; flex: 1; overflow: auto; }
.axis-notebook > [role="tabpanel"] > .manual-control,
.axis-notebook > [role="tabpanel"] > .mdi-control,
.axis-notebook > [role="tabpanel"] > .dro-view,
.axis-notebook > [role="tabpanel"] > .axis-preview { height: 100%; min-height: 0; }
.notebook-tabs { display: flex; align-items: end; min-height: 29px; padding: 3px 3px 0; border-bottom: 1px solid #777; background: #c5c5c5; }
.notebook-tabs button { min-height: 26px; padding: 4px 12px; border: 1px solid transparent; border-bottom: 0; background: transparent; cursor: pointer; }
.notebook-tabs button.active { margin-bottom: -1px; border-color: #777; background: var(--face-light); font-weight: 700; }
.notebook-tabs button:hover { background: #dfe8f2; }
.manual-control, .mdi-control, .dro-view { min-height: 0; flex: 1; padding: 11px; overflow: auto; }
.manual-grid { display: grid; grid-template-columns: minmax(118px, .7fr) minmax(220px, 1.35fr); gap: 10px 14px; }
.manual-grid h3, .mdi-control h3 { margin: 0 0 6px; font-size: 13px; font-weight: 400; }
.manual-axis-block { grid-row: span 2; }
.axis-radio-grid { display: grid; grid-template-columns: repeat(3, 48px); gap: 5px; }
.axis-radio { display: inline-flex; align-items: center; gap: 3px; min-height: 26px; padding: 2px 3px; border: 1px solid transparent; cursor: pointer; }
.axis-radio input { margin: 0; }
.axis-radio.selected { border-color: #6685a5; background: var(--blue); }
.jog-row, .spindle-row, .manual-action-row { display: flex; align-items: center; flex-wrap: wrap; gap: 5px; }
.manual-action-row { margin-top: 8px; }
.manual-jog-block select { min-height: 25px; min-width: 104px; border: 1px solid var(--border-dark); background: white; }
.axis-text-button { min-height: 26px; padding: 3px 9px; border: 1px solid #858585; border-radius: 2px; background: linear-gradient(#f4f4f4, #d6d6d6); box-shadow: inset 1px 1px #fff; cursor: pointer; }
.axis-header-actions { display: flex; align-items: center; gap: 6px; }
/* 使用说明书入口:在新标签页打开单文件 HTML,样式与标题栏的 Connection 指示一致。 */
.axis-manual-link { padding: 2px 8px; border: 1px solid #2f5d78; border-radius: 2px; color: #fff; background: linear-gradient(#3f7fa5, #2a5f81); font: 11px Arial, Helvetica, sans-serif; text-decoration: none; white-space: nowrap; }
.axis-manual-link:hover { background: linear-gradient(#4a90b8, #31698c); }
.axis-text-button:hover:not(:disabled), .axis-text-button:focus-visible { border-color: var(--focus); background: #d8e5f3; outline: none; }
.axis-text-button:active:not(:disabled), .axis-text-button.danger { background: #c3c3c3; box-shadow: inset 1px 1px #999; }
.axis-text-button:disabled { cursor: not-allowed; opacity: .5; }
.check-line { display: inline-flex; align-items: center; gap: 4px; min-height: 25px; margin-top: 6px; }
.check-line input { margin: 0; }
.manual-spindle-block, .manual-coolant-block { min-width: 0; }
.manual-device-block { grid-column: 1 / -1; padding-top: 8px; border-top: 1px solid #b0b0b0; }
.manual-device-block h3 { display: inline; margin-right: 10px; }
.axis-about-backdrop { position: fixed; inset: 0; z-index: 50; display: grid; place-items: center; background: #0006; }
.axis-about-dialog { width: min(420px, calc(100vw - 32px)); padding: 18px; border: 1px solid #555; background: #ddd; box-shadow: 0 8px 32px #0008; text-align: center; }
.axis-about-dialog img { width: 24px; height: 24px; }
.axis-about-dialog h2 { margin: 8px 0; font-size: 18px; letter-spacing: 0; }
.axis-about-dialog p { margin: 8px 0 16px; }
.device-status { color: #555; font: 11px ui-monospace, monospace; }
.manual-coolant-block { grid-column: 1; }
.manual-coolant-block .check-line { margin-right: 10px; }
.spindle-row .axis-tool-button { width: 28px; height: 28px; }
.spindle-row .axis-tool-button img { width: 16px; height: 16px; }
.manual-sliders { display: grid; grid-template-columns: repeat(2, minmax(180px, 1fr)); gap: 6px 16px; margin-top: 13px; padding-top: 9px; border-top: 1px solid #b0b0b0; }
.manual-sliders label, .axis-slider label { display: grid; grid-template-columns: auto 46px; align-items: center; gap: 4px; }
.manual-sliders input, .axis-slider input { grid-column: 1 / -1; width: 100%; accent-color: #527ba2; }
output { font: 12px ui-monospace, monospace; text-align: right; }
.mdi-control { max-width: 540px; }
.mdi-label { display: grid; gap: 5px; }
.mdi-label input { min-height: 29px; padding: 4px 6px; border: 1px solid #777; background: white; font: 14px ui-monospace, monospace; }
.mdi-control > .axis-text-button { margin-top: 7px; min-width: 74px; }
.mdi-control h3 { margin-top: 18px; padding-bottom: 5px; border-bottom: 1px solid #aaa; }
.mdi-control ol { max-height: 220px; margin: 0; padding-left: 28px; overflow: auto; font: 12px ui-monospace, monospace; }
.mdi-control li button { border: 0; background: transparent; cursor: pointer; }
.mdi-control li button:hover { color: #245d91; text-decoration: underline; }
.empty-history { color: var(--muted); }
.axis-preview { display: flex; min-height: 0; flex: 1; padding: 4px; overflow: hidden; background: #000; }
.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: 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; }
.trt-geometry header output { margin-left: auto; color: #276557; }
.trt-geometry[data-dirty="true"] header output { color: #955015; }
.trt-geometry-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin: 5px 0; }
.trt-geometry fieldset { border: 0; padding: 0; min-width: 0; }
.trt-geometry legend { color: #586467; padding: 0 0 3px; }
.trt-geometry label { display: grid; grid-template-columns: minmax(0, 1fr) 66px; align-items: center; gap: 3px; margin: 3px 0; }
.trt-geometry label span { overflow-wrap: anywhere; }
.trt-geometry input { width: 100%; min-width: 0; height: 24px; padding: 2px 3px; border: 1px solid #a1adae; background: #fff; color: #202829; }
.trt-geometry input:disabled { color: #879293; background: #e4e8e8; }
.trt-geometry footer button { display: inline-flex; align-items: center; justify-content: center; gap: 4px; height: 27px; min-width: 28px; padding: 3px 5px; }
.trt-geometry button img { width: 18px; height: 18px; object-fit: contain; }
.trt-geometry footer output { flex: 1 1 100px; min-width: 0; overflow-wrap: anywhere; }
.axis-preview-pane > .three-viewer { min-width: 0; min-height: 0; }
.three-viewer { position: relative; width: 100%; height: 100%; min-height: 0; flex: 1; overflow: hidden; border: 1px solid #303030; background: #000; }
.three-viewer canvas { display: block; width: 100%; height: 100%; }
.axis-preview-hud { position: absolute; z-index: 1; top: 11px; left: 34px; margin: 0; color: #f2f2f2; font: 12px/1.45 ui-monospace, monospace; white-space: pre; pointer-events: none; text-shadow: 0 1px #000; }
.xyzac-view-controller { position: absolute; z-index: 2; top: 8px; right: 8px; display: grid; grid-template-columns: repeat(2, 27px); gap: 3px; padding: 4px; border: 1px solid #68747c; background: rgba(12, 18, 22, .88); box-shadow: 0 1px 4px #0008; }
.xyzac-view-controller button { width: 27px; height: 25px; padding: 0; border: 1px solid #93a1a8; background: #e6ebed; color: #182126; font: 700 14px/1 ui-monospace, monospace; cursor: pointer; }
.xyzac-view-controller button:hover, .xyzac-view-controller button:focus-visible { background: #fff; outline: 2px solid #e7b84b; outline-offset: 1px; }
.xyzac-controller-divider { width: 100%; height: 1px; grid-column: 1 / -1; background: #68747c; }
.xyzac-machine-hud { top: 12px; left: 12px; padding: 5px 7px; background: #252b2cde; font-size: 11px; line-height: 1.5; }
.xyzac-machine-controller { top: auto; bottom: 10px; right: 10px; grid-template-columns: repeat(4, 30px); background: #252b2cef; border-color: #6d7b7b; }
.xyzac-machine-controller button { display: grid; place-items: center; width: 30px; height: 29px; font-size: 18px; }
.xyzac-machine-controller img { width: 18px; height: 18px; object-fit: contain; }
.dro-view { background: #ececec; }
.dro-mode-row, .dro-column-headings, .dro-row { display: grid; grid-template-columns: 42px repeat(3, minmax(100px, 1fr)); align-items: center; gap: 9px; }
.dro-mode-row { padding: 5px 6px; border-bottom: 1px solid #888; color: #555; font-size: 11px; }
.dro-mode-row span { text-align: right; }
.dro-column-headings { padding: 7px 7px 0; color: #555; font: 10px ui-monospace, monospace; text-align: right; }
.dro-table { margin-top: 9px; border: 1px solid #888; background: #fafafa; }
.dro-row { min-height: 38px; padding: 4px 7px; border-bottom: 1px solid #c6c6c6; }
.dro-row:last-child { border-bottom: 0; }
.dro-row strong { font-size: 15px; }
.dro-row output { color: #111; font-size: 17px; }
.dro-footer { display: flex; justify-content: space-between; gap: 10px; margin-top: 12px; color: #555; font: 11px ui-monospace, monospace; }
.axis-metrics { padding: 4px 9px; border-top: 1px solid #999; background: #cecece; }
.axis-slider { display: grid; grid-template-columns: repeat(3, minmax(170px, 1fr)); gap: 12px; }
.axis-slider label { grid-template-columns: minmax(0, 1fr) max-content; }
@media (max-width: 900px) { .xyzac-parameter-grid { grid-template-columns: repeat(3, minmax(120px, 1fr)); } }
@media (max-width: 560px) { .xyzac-parameter-grid { grid-template-columns: repeat(2, minmax(120px, 1fr)); } }
.axis-program-pane { display: grid; grid-template-columns: minmax(0, 1fr) 230px; grid-template-rows: minmax(0, 1fr); flex: 0 0 430px; height: 430px; min-height: 430px; margin: 0 5px 5px; border: 2px solid #777; background: #f7f7f7; }
.axis-diagnostics { display: grid; gap: 8px; padding: 10px; min-height: 190px; overflow: auto; background: #f7f7f7; font-size: 12px; }
.diagnostic-summary, .diagnostic-error, .diagnostic-row { display: flex; gap: 10px; align-items: baseline; flex-wrap: wrap; }
.diagnostic-summary { padding-bottom: 6px; border-bottom: 1px solid #b3b3b3; }
.diagnostic-error { padding: 6px; color: #7b1111; border: 1px solid #c28d8d; background: #f8e0e0; }
.diagnostic-section { display: grid; gap: 3px; }
.diagnostic-section h3 { margin: 0; font-size: 12px; }
.diagnostic-row code { min-width: 160px; color: #26384a; }
.program-main-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); grid-column: 1; grid-row: 1; min-width: 0; min-height: 0; }
.program-editor-wrap { display: grid; grid-template-columns: 34px minmax(0, 1fr); min-width: 0; min-height: 0; }
.program-gutter { min-width: 0; padding: 6px 6px 6px 0; overflow-x: hidden; overflow-y: auto; border-right: 1px solid #c2c2c2; color: #888; background: #e4e4e4; font: 12px/1.45 ui-monospace, monospace; user-select: none; scrollbar-width: none; }
.program-gutter::-webkit-scrollbar { width: 0; height: 0; }
.program-gutter-content { position: relative; width: 100%; }
.program-gutter span { position: absolute; right: 0; left: 0; height: 17.4px; text-align: right; }
.program-gutter span.current-line { color: #5a4100; background: #ffe066; font-weight: 700; }
.program-gutter span.completed-line { color: #666; background: #e6e6e6; }
.program-editor-input { position: relative; min-width: 0; min-height: 0; overflow: hidden; background: #fff; }
.program-line-highlights { position: absolute; top: 0; right: 0; left: 0; z-index: 0; padding: 6px 8px; overflow: hidden; pointer-events: none; font: 12px/1.45 ui-monospace, monospace; }
.program-line-highlights span { position: absolute; right: 0; left: 0; display: block; height: 17.4px; margin: 0 -8px; }
.program-line-highlights span.program-highlights-spacer { position: static; height: 100%; margin: 0; }
.program-line-highlights span.completed-line { background: #eeeeee; }
.program-line-highlights span.current-line { background: #ffe066; }
.program-editor-input textarea { position: relative; z-index: 1; width: 100%; height: 100%; min-height: 180px; padding: 6px 8px; overflow: auto; resize: none; border: 0; outline: none; background: transparent; color: #111; font: 12px/1.45 ui-monospace, monospace; tab-size: 4; white-space: pre; scrollbar-gutter: stable both-edges; }
.program-execution-panel { display: grid; grid-template-rows: auto minmax(0, 1fr); grid-column: 2; grid-row: 1; min-width: 0; min-height: 0; border-left: 1px solid #9aa8b4; background: #f4f7fa; }
.program-execution-line { display: flex; grid-column: 1; grid-row: 1; align-items: baseline; gap: 10px; min-width: 0; padding: 5px 8px; overflow-x: auto; overflow-y: hidden; border-top: 1px solid #9aa8b4; border-bottom: 1px solid #9aa8b4; background: #ffe066; color: #3f2d00; font: 12px/1.35 ui-monospace, monospace; scrollbar-gutter: stable; }
.program-execution-line span { font-weight: 700; white-space: nowrap; }
.program-execution-line code { flex: 0 0 auto; min-width: max-content; overflow: visible; color: #111; white-space: pre; }
.program-execution-trace { display: grid; grid-template-rows: auto minmax(0, 1fr); grid-column: 1; grid-row: 2; min-width: 0; min-height: 0; padding: 7px 8px; overflow: hidden; border-bottom: 1px solid #9aa8b4; background: #f4f7fa; color: #253746; font: 11px/1.35 ui-monospace, monospace; }
.program-execution-trace strong { display: block; margin-bottom: 2px; font-size: 11px; }
.program-trace-scroll { min-width: 0; min-height: 0; overflow: auto; scrollbar-gutter: stable both-edges; }
.program-execution-trace ol { position: relative; display: block; width: max-content; min-width: 100%; max-width: none; max-height: none; margin: 0; padding: 0; overflow: visible; list-style: none; }
.program-execution-trace li { display: grid; grid-template-columns: 42px max-content; gap: 8px; width: max-content; min-width: max-content; box-sizing: border-box; }
.program-execution-trace li span { color: #174d84; font-weight: 700; }
.program-execution-trace li code { min-width: max-content; overflow: visible; white-space: pre; }
.program-execution-trace li.completed-line { padding: 3px 6px; border-left: 3px solid #b8b8b8; background: #e8e8e8; color: #666; }
.program-execution-trace li.executing-line { padding: 3px 6px; border-left: 3px solid #d09b00; background: #ffe066; color: #111; font-weight: 700; }
.program-execution-trace li.executing-line span { color: #6b4b00; }
.program-execution-trace strong span { color: #60717e; font-weight: 400; }
.program-editor-input textarea::-webkit-scrollbar, .program-execution-line::-webkit-scrollbar, .program-trace-scroll::-webkit-scrollbar { width: 11px; height: 11px; }
.program-editor-input textarea::-webkit-scrollbar-track, .program-execution-line::-webkit-scrollbar-track, .program-trace-scroll::-webkit-scrollbar-track { background: #d7dde2; }
.program-editor-input textarea::-webkit-scrollbar-thumb, .program-execution-line::-webkit-scrollbar-thumb, .program-trace-scroll::-webkit-scrollbar-thumb { border: 2px solid #d7dde2; background: #7f8d98; }
.program-side { display: flex; grid-column: 2; grid-row: 1; flex-direction: column; gap: 12px; min-width: 0; min-height: 0; padding: 8px; border-left: 1px solid #aaa; background: #d9d9d9; }
.program-actions { display: flex; flex-wrap: wrap; gap: 5px; }
.active-gcodes-label { display: grid; gap: 5px; color: #333; }
.active-gcodes-label textarea { width: 100%; min-height: 84px; resize: vertical; border: 1px solid #999; background: white; color: #222; font: 11px/1.35 ui-monospace, monospace; }
.program-diagnostic { display: block; padding: 4px; color: #8b1010; background: #f2d6d6; font: 11px ui-monospace, monospace; overflow-wrap: anywhere; }
.visually-hidden-file-input { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
.axis-layer-controls { display: flex; flex-wrap: wrap; gap: 8px 12px; margin-top: 4px; color: #4d4d4d; font-size: 11px; }
.axis-layer-controls input { margin: 0; }
@media (max-width: 900px) {
.xyzac-control-band { grid-template-columns: 1fr; }
.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 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; }
.program-execution-panel { grid-column: 1; grid-row: 2; border-top: 1px solid #9aa8b4; border-left: 0; }
.program-side { grid-column: 1; grid-row: 2; border-top: 1px solid #aaa; border-left: 0; }
.active-gcodes-label textarea { min-height: 58px; }
}
@media (max-width: 620px) {
.axis-brand span { display: none; }
.axis-case-strip { flex-wrap: wrap; }
.axis-case-strip select { max-width: 62vw; }
.preview-load-indicator { min-width: min(100%, 360px); flex-basis: 100%; }
.command-status { margin-left: 0; width: 100%; }
.machine-sequence { align-items: flex-start; flex-direction: column; gap: 5px; }
.machine-sequence-heading { min-width: 0; }
.xyzac-control-band { padding: 6px; }
.xyzac-position-grid { grid-template-columns: repeat(5, minmax(54px, 1fr)); }
.xyzac-position-grid > div { grid-template-columns: 14px 1fr; padding: 3px; }
.xyzac-position-grid output { font-size: 10px; }
.xyzac-offset-row { flex-wrap: wrap; gap: 4px 9px; }
.xyzac-program > header { flex-wrap: wrap; gap: 4px 10px; }
.xyzac-program > header code { width: 100%; margin-left: 0; }
.manual-grid, .manual-sliders, .axis-slider { grid-template-columns: 1fr; }
.manual-axis-block, .manual-coolant-block { grid-row: auto; grid-column: auto; }
.dro-mode-row, .dro-column-headings, .dro-row { grid-template-columns: 27px repeat(3, minmax(0, 1fr)); gap: 4px; }
.dro-mode-row { font-size: 9px; }
.dro-row output { font-size: 13px; }
.dro-footer { flex-direction: column; gap: 3px; }
}
.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-shell { position: relative; min-width: 0; min-height: 430px; }
.machine-manager-preview { width: 100%; height: 100%; min-width: 0; min-height: 430px; border: 1px solid #52666a; background: #263438; overflow: hidden; }
.machine-manager-preview canvas { display: block; width: 100%; height: 100%; }
.machine-manager-webgl-fault { position: absolute; inset: 12px; display: grid; place-items: center; padding: 16px; background: #fff0e8ed; color: #7b231b; border: 1px solid #a94a3e; text-align: center; }
.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-tree, .machine-tree ul { margin: 0; padding: 0; list-style: none; }
.machine-tree ul { margin-left: 14px; padding-left: 8px; border-left: 1px solid #a6b8ba; }
.machine-tree li { min-width: 0; }
.machine-tree-row { display: grid; grid-template-columns: 22px minmax(0, 1fr); align-items: center; }
.machine-tree-toggle { width: 22px; height: 25px; padding: 0; border: 0; background: transparent; color: #315d61; cursor: pointer; }
.machine-tree-toggle:disabled { color: #829092; cursor: default; }
.machine-tree [data-axis-control="machine-tree-node"] { display: grid; grid-template-columns: minmax(110px, 1fr) auto auto; align-items: center; gap: 4px; width: 100%; min-height: 25px; padding: 2px 5px; border: 1px solid transparent; background: transparent; text-align: left; cursor: grab; }
.machine-tree [data-axis-control="machine-tree-node"]:hover { background: #e4efed; border-color: #9db4b5; }
.machine-tree [data-axis-control="machine-tree-node"].selected { background: #cfe5e2; border-color: #27585d; }
.machine-tree [data-axis-control="machine-tree-node"]:active { cursor: grabbing; }
.machine-tree [data-axis-control="machine-tree-node"] > span:first-child { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.machine-tree [data-axis-control="machine-tree-node"] small { color: #66787b; font: 10px ui-monospace, monospace; white-space: nowrap; }
.machine-tree [data-axis-control="machine-tree-node"] em { padding: 1px 4px; background: #2c6669; color: #fff; font-size: 9px; font-style: normal; }
.machine-tree .mesh { color: #397a80; }
.machine-tree-origin { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 10px; padding: 7px; margin-bottom: 8px; border: 1px solid #9db4b5; background: #e8f2f0; }
.machine-tree-origin strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.machine-tree-origin span { color: #536467; }
.machine-tree-origin output { grid-column: 1 / -1; text-align: left; }
.machine-part-editor > label { display: grid; grid-template-columns: 82px minmax(0, 1fr); align-items: center; gap: 8px; margin: 6px 0; }
.machine-part-editor > header, .machine-motion-test > header { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.machine-part-editor > header button { color: #8b2d24; }
.machine-part-editor select { height: 30px; min-width: 0; }
.machine-transform-reference { margin: 8px 0; color: #536467; font-size: 11px; line-height: 1.45; }
.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; }
.machine-motion-test { margin-top: 10px; padding: 8px; border: 1px solid #779092; background: #eaf2f1; }
.machine-motion-test h3 { margin: 0; font-size: 13px; }
.machine-motion-test > div { display: grid; grid-template-columns: repeat(5, minmax(88px, 1fr)); gap: 8px; margin-top: 8px; }
.machine-motion-test label { display: grid; grid-template-columns: 16px minmax(0, 1fr) auto; align-items: center; gap: 4px; }
.machine-motion-test input { width: 100%; min-width: 0; height: 28px; }
.machine-motion-test small { color: #536467; }
.machine-motion-test output { display: block; margin-top: 6px; 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; }
.machine-motion-test > div { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* Machine manager workbench: a stable viewport with independently scrolling panels. */
.machine-manager-dialog { width: min(1440px, calc(100vw - 24px)); height: min(940px, calc(100dvh - 24px)); }
.machine-manager-dialog > .machine-dialog-body { flex: 1; min-height: 0; padding: 10px; overflow: hidden; }
.machine-manager-workbench { height: 100%; display: flex; flex-direction: column; gap: 8px; min-height: 0; }
.machine-manager-toolbar { margin: 0; flex: 0 0 auto; }
.machine-manager-toolbar button, .machine-preview-tools button, .machine-tree-tools button, .machine-editor-tabs button, .machine-axis-overview button { border: 1px solid #9babad; background: #fff; padding: 6px 10px; border-radius: 4px; min-height: 32px; cursor: pointer; }
.machine-manager-dialog button:disabled { opacity: .48; cursor: not-allowed; }
.machine-manager-dialog input, .machine-manager-dialog select { background: #fff; border: 1px solid #9babad; border-radius: 3px; padding: 4px 6px; color: #203b3f; }
.machine-manager-dialog input:focus-visible, .machine-manager-dialog select:focus-visible { outline: 2px solid #2b858a; outline-offset: 1px; }
.machine-manager-dialog input:disabled, .machine-manager-dialog select:disabled { background: #e7edec; color: #596d6f; }
.machine-save-state { margin-left: auto; padding: 5px 9px; border-radius: 20px; background: #dbeae7; font-size: 12px; }
.machine-axis-overview { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 6px; flex: 0 0 auto; }
.machine-axis-overview button { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 7px; text-align: left; align-items: center; }
.machine-axis-overview button.bound { border-color: #74a7a0; background: #e4f1ed; }
.machine-axis-overview button.missing { border-style: dashed; color: #71511e; background: #fff9ec; }
.machine-axis-overview strong { font-size: 17px; }
.machine-axis-overview span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; }
.machine-axis-overview small { font: 11px ui-monospace, monospace; }
.machine-manager-layout { flex: 1; min-height: 0; grid-template-columns: minmax(0, 1.25fr) minmax(370px, 1fr); gap: 10px; overflow: hidden; }
.machine-preview-area { position: relative; display: flex; flex-direction: column; min-height: 0; min-width: 0; border: 1px solid #52666a; border-radius: 5px; overflow: hidden; background: #263438; }
.machine-preview-tools { display: flex; align-items: center; gap: 5px; flex: 0 0 auto; padding: 6px; background: #e3eceb; flex-wrap: wrap; }
.machine-preview-tools small { margin-left: auto; font-size: 11px; }
.machine-manager-preview-shell { position: relative; flex: 1; min-height: 0; }
.machine-manager-preview { position: absolute; inset: 0; min-height: 0; height: 100%; border: 0; }
.machine-preview-hint { flex: 0 0 auto; color: #d1e2df; font-size: 11px; margin: 0; padding: 6px 10px; }
.machine-preview-empty { position: absolute; inset: 48px 16px 40px; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 12px; color: #e3eeeb; pointer-events: none; }
.machine-preview-empty strong { font-size: 18px; }
.machine-preview-empty button { pointer-events: auto; background: #e3f3ef; border: 1px solid #90bbb3; border-radius: 5px; padding: 9px 18px; color: #254c4e; }
.machine-preview-empty p { margin: 0; line-height: 1.7; }
.machine-manager-editor { display: flex; flex-direction: column; min-width: 0; min-height: 0; overflow: hidden; gap: 8px; }
.machine-editor-tabs { display: flex; gap: 4px; flex: 0 0 auto; }
.machine-editor-tabs button { flex: 1; white-space: nowrap; }
.machine-editor-tabs [aria-selected="true"] { background: #27585d; color: #fff; border-color: #27585d; }
.machine-manager-dialog [hidden] { display: none !important; }
.machine-structure-panel { display: grid; grid-template-rows: minmax(125px, .9fr) minmax(190px, 1.1fr); gap: 8px; min-height: 0; flex: 1; }
.machine-part-list { display: flex; flex-direction: column; overflow: auto; border-radius: 4px; }
.machine-part-list > header { display: flex; justify-content: space-between; gap: 8px; }
.machine-part-list > header span { color: #617576; font-size: 11px; }
.machine-part-list > .machine-tree { flex: 1 0 90px; min-height: 90px; overflow: auto; }
.machine-part-list > header, .machine-part-list > .machine-tree-tools, .machine-part-list > .glb-five-axis-analysis { flex-shrink: 0; }
.machine-model-list { display: grid; flex: 0 0 auto; gap: 4px; margin: 5px 0 7px; max-height: 116px; overflow: auto; }
.machine-model-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px; align-items: stretch; border: 1px solid #c5d7d3; border-radius: 4px; background: #fff; }
.machine-model-row.selected { border-color: #338187; box-shadow: inset 3px 0 #338187; background: #edf7f4; }
.machine-model-row button:focus-visible { outline: 2px solid #2b858a; outline-offset: -2px; }
.machine-model-row > button:first-child { min-width: 0; padding: 5px 7px; text-align: left; background: transparent; }
.machine-model-row > button:first-child strong, .machine-model-row > button:first-child span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.machine-model-row > button:first-child strong { color: #245b5e; font-size: 11px; }
.machine-model-row > button:first-child span { margin-top: 2px; color: #627777; font-size: 10px; }
.machine-model-row > button:last-child { align-self: center; margin: 4px; padding: 3px 6px; border: 1px solid #d3aba1; border-radius: 3px; color: #8b2d24; background: #fff; font-size: 10px; }
.glb-five-axis-analysis { margin: 6px 0 8px; padding: 7px; border: 1px solid #9fc3bd; border-radius: 4px; background: #edf6f3; color: #315d5f; font-size: 11px; }
.glb-five-axis-analysis > header { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
.glb-five-axis-analysis h3 { margin: 0; color: #245e60; font-size: 12px; }
.glb-five-axis-analysis button { padding: 3px 6px; border: 1px solid #9abcb5; border-radius: 3px; background: #fff; color: #245e60; font-size: 11px; }
.glb-analysis-summary { margin: 5px 0; font-weight: 600; }
.glb-analysis-grid, .glb-analysis-axes { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 4px; }
.glb-analysis-grid span { padding: 4px; background: #fff; border: 1px solid #c5dcd7; border-radius: 3px; }
.glb-analysis-grid strong { display: block; margin-top: 2px; color: #163f43; font-size: 11px; overflow-wrap: anywhere; }
.glb-analysis-axes { grid-template-columns: repeat(6, minmax(0, 1fr)); margin-top: 5px; }
.glb-analysis-axes > span { min-width: 0; padding: 4px 2px; text-align: center; border-radius: 3px; background: #fff; border: 1px solid #c5dcd7; }
.glb-analysis-axes > span.detected { border-color: #4a9990; background: #e1f2ed; }
.glb-analysis-axes > span.missing { opacity: .6; }
.glb-analysis-axes b { display: block; color: #1b5659; font-size: 13px; }
.glb-analysis-axes small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 9px; }
.glb-five-axis-analysis details { margin-top: 5px; }
.glb-five-axis-analysis details p { margin: 4px 0; }
.glb-five-axis-analysis details ul { margin: 4px 0 0; padding-left: 16px; }
.machine-tree-tools { display: flex; gap: 4px; margin-bottom: 6px; }
.machine-tree-tools input { width: 100%; min-width: 0; }
.machine-tree-tools button { white-space: nowrap; padding: 3px 7px; }
.machine-tree .machine-tree-row button { min-height: 28px; }
.machine-tree [data-axis-control="machine-tree-node"] { grid-template-columns: minmax(90px, 1fr) auto; }
.machine-tree [data-axis-control="machine-tree-node"] small { display: none; }
.machine-tree [data-axis-control="machine-tree-node"]:focus-visible { outline: 2px solid #2b858a; outline-offset: -2px; }
.machine-part-editor { border-radius: 4px; }
.machine-part-editor > header h3 { min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.machine-part-editor > header h3 small { display: block; color: #627777; font-size: 11px; font-weight: 400; margin-top: 3px; }
.machine-part-editor > header button { white-space: nowrap; font-size: 11px; border: 1px solid #d3aba1; border-radius: 3px; padding: 4px 6px; }
.machine-part-editor > label { grid-template-columns: 120px minmax(0, 1fr); }
.machine-origin-details { margin: 8px 0; }
.machine-origin-details summary { cursor: pointer; color: #36595c; padding: 4px 0; }
.machine-parent-note { margin: 8px 0; color: #627777; font-size: 11px; }
.machine-selection-empty { align-self: start; padding: 14px; color: #627777; }
.machine-number-field { display: block; min-width: 0; }
.machine-number-field input { width: 100%; min-width: 0; height: 30px; font: 12px ui-monospace, monospace; }
.machine-manager-dialog input[aria-invalid="true"] { border: 2px solid #ad4538; background: #fff0ec; }
.machine-field-error { display: block; color: #9c3024; font-size: 11px; }
.machine-manager-editor > .machine-motion-test, .machine-manager-editor > .machine-manager-calibration { flex: 1; min-height: 0; overflow: auto; margin: 0; padding: 12px; border-radius: 4px; }
.machine-motion-test > label { display: flex; align-items: center; }
.machine-motion-test > label > input { width: auto; }
.machine-motion-test > div { grid-template-columns: 1fr; gap: 12px; }
.machine-motion-test > div > label { grid-template-columns: 22px minmax(80px, 1fr) 35px; }
.machine-motion-test details { margin-top: 16px; color: #536467; font-size: 11px; }
.machine-motion-test p { line-height: 1.7; color: #536467; }
.machine-manager-editor > .machine-manager-calibration { display: block; }
.machine-manager-calibration .machine-vector { border: 1px solid #b7c9c5; border-radius: 4px; padding: 10px; margin: 12px 0; }
.machine-manager-calibration .machine-vector label { grid-template-columns: 18px minmax(60px, 1fr); flex: 1 1 105px; }
.machine-validation { flex: 0 0 auto; padding: 7px 10px; border-radius: 4px; font-size: 12px; line-height: 1.5; }
.machine-validation.ready { background: #e1efe7; color: #285d42; }
.machine-validation.needs-attention { background: #fff2d9; color: #74501e; }
.machine-validation button { margin-left: 10px; text-decoration: underline; }
.machine-manager-footer { flex: 0 0 auto; margin: 0; gap: 6px; }
.machine-manager-footer > button { padding: 6px 10px; border: 1px solid #8aa3a4; border-radius: 4px; background: #fff; }
.machine-manager-footer > button:first-child { background: #27585d; color: #fff; }
.machine-manager-footer output { margin: 0; font-size: 11px; color: #536467; flex-basis: 280px; }
@media (max-width: 850px) {
.machine-manager-layout { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(160px, .65fr) minmax(240px, 1fr); overflow: auto; }
.machine-axis-overview button { grid-template-columns: auto 1fr; padding: 4px 6px; }
.machine-axis-overview small { display: none; }
.machine-axis-overview span { font-size: 10px; }
.machine-save-state { margin-left: 0; }
.machine-preview-tools small { display: none; }
.machine-preview-hint { display: none; }
}
@media (max-height: 600px) and (min-width: 851px) {
.machine-structure-panel { grid-template-rows: minmax(85px, .6fr) minmax(100px, 1fr); }
.machine-manager-dialog { height: calc(100dvh - 16px); }
.machine-manager-workbench { gap: 4px; }
}
.machine-joint-step { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin: 8px 0; }
.machine-joint-step > label { display: flex; align-items: center; gap: 6px; }
.machine-joint-step button { padding: 5px 9px; border: 1px solid #9babad; border-radius: 3px; background: #fff; }
.machine-type-step { display: flex; flex: 0 0 auto; align-items: center; gap: 18px; flex-wrap: wrap; padding: 8px 10px; background: #e1efed; border: 1px solid #90b4ad; border-radius: 5px; }
.machine-type-step > label { display: flex; align-items: center; gap: 10px; }
.machine-type-step strong { color: #27585d; white-space: nowrap; }
.machine-type-step select { min-height: 32px; max-width: 100%; }
.machine-type-step > div { display: flex; flex-direction: column; gap: 4px; font-size: 12px; }
.machine-type-step small { color: #536467; }
@media(max-width:850px) { .machine-type-step { gap: 5px; padding: 6px; } .machine-type-step > div > span { display: none; } }
.machine-document-panel { flex: 1; min-height: 0; overflow: auto; background: #f6f9f8; padding: 12px; border: 1px solid #9babad; border-radius: 4px; }
.machine-document-panel > label { display: grid; gap: 5px; margin: 10px 0; }
.machine-document-panel textarea { min-height: 70px; width: 100%; resize: vertical; padding: 6px; border: 1px solid #9babad; background: #fff; border-radius: 3px; }
.machine-document-panel h3 { font-size: 14px; margin: 10px 0; }
.machine-save-location { padding: 10px; background: #e5f0ed; border: 1px solid #adc8c1; border-radius: 4px; font-size: 12px; line-height: 1.55; }
.machine-save-location p { margin: 7px 0; }
.machine-library-tools { display: flex; gap: 8px; }
.machine-library-tools input { flex: 1; min-width: 0; }
.machine-library-list { list-style: none; margin: 10px 0; padding: 0; }
.machine-library-list li { display: grid; gap: 5px; padding: 10px; border: 1px solid #afc3bd; border-radius: 4px; margin-bottom: 8px; background: #fff; overflow-wrap: anywhere; }
.machine-library-list span, .machine-library-list time, .machine-library-list small { font-size: 11px; color: #526c6d; }
.machine-library-list li > div { display: flex; gap: 6px; }
.machine-library-list button, .machine-library-tools button { padding: 5px 8px; border: 1px solid #9babad; border-radius: 3px; background: #eaf2f0; }
.machine-case-catalog { margin: 12px 0; padding: 10px; border: 1px solid #adc8c1; border-radius: 4px; background: #edf5f3; }
.machine-case-catalog > header { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.machine-case-catalog > header h3 { margin: 0; }
.machine-case-catalog > header span { color: #526c6d; font-size: 11px; }
.machine-case-catalog > p { margin: 7px 0; color: #526c6d; font-size: 11px; line-height: 1.5; }
.machine-case-catalog ul { display: grid; gap: 6px; margin: 8px 0; padding: 0; list-style: none; }
.machine-case-catalog li { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; padding: 8px; border: 1px solid #c1d2ce; border-radius: 4px; background: #fff; }
.machine-case-catalog li.active { border-color: #398187; box-shadow: inset 3px 0 #398187; }
.machine-case-catalog li > div { display: grid; gap: 3px; min-width: 0; }
.machine-case-catalog li strong { overflow-wrap: anywhere; }
.machine-case-catalog li span, .machine-case-catalog li small { color: #526c6d; font-size: 11px; line-height: 1.45; }
.machine-case-catalog li em { align-self: start; padding: 3px 6px; border-radius: 12px; background: #dcebe8; color: #285d5c; font-size: 10px; font-style: normal; white-space: nowrap; }
.machine-case-catalog li em.machine-case-status-adapter-required { background: #fff0d4; color: #78521c; }
.machine-case-catalog li em.machine-case-status-identity-only { background: #e8e8e8; color: #5d6262; }
.machine-case-catalog details { grid-column: 1 / -1; color: #526c6d; font-size: 11px; }
.machine-case-catalog details code { display: block; margin: 5px 0; padding: 6px; overflow: auto; white-space: pre-wrap; background: #f2f6f5; color: #315d61; }
.machine-case-catalog details small { display: block; }
.machine-case-catalog > small a { color: #246c73; }