:root { font: 14px/1.5 Inter, "Segoe UI", "Microsoft YaHei", sans-serif; color: #263442; background: #edf1f5; --blue: #1764a0; --border: #cfd8e3; --muted: #647487; } * { box-sizing: border-box; } body { margin: 0; } button, input, select { font: inherit; } button, a { -webkit-tap-highlight-color: transparent; } button { cursor: pointer; color: #263442; border: 1px solid var(--border); background: #fff; border-radius: 4px; padding: 6px 12px; } button:hover { background: #f0f5fa; } button:disabled { cursor: default; opacity: .5; } button:focus-visible, a:focus-visible, input:focus-visible, summary:focus-visible { outline: 2px solid #247ec5; outline-offset: 3px; } a { color: var(--blue); text-decoration: none; } strong { font-weight: 600; } .topbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 18px; background: #fff; border-bottom: 1px solid var(--border); } .topbar strong { font-size: 16px; } .demo-tag { display: inline-block; margin-left: 14px; color: var(--muted); font-size: 12px; } .top-actions { display: flex; align-items: center; gap: 18px; } .workflow { display: flex; align-items: center; gap: 4px; padding: 7px 18px; background: #f8fafc; border-bottom: 1px solid var(--border); } .workflow button { display: flex; align-items: center; gap: 8px; background: transparent; border-color: transparent; padding: 8px 18px; } .workflow button span { display: inline-grid; place-items: center; width: 21px; height: 21px; border-radius: 50%; background: #e3e9ef; font-size: 12px; } .workflow button[aria-pressed="true"] { background: #e7f1fa; border-color: #b4cfe4; color: #155a94; } .workflow button[aria-pressed="true"] span { background: var(--blue); color: #fff; } .workflow-note { margin-left: auto; color: var(--muted); font-size: 12px; } .workspace { display: grid; grid-template-columns: minmax(0, 1fr) 310px; min-height: calc(100vh - 143px); } .canvas-pane { min-width: 0; display: flex; flex-direction: column; } .canvas-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 11px 16px; min-height: 55px; border-bottom: 1px solid var(--border); font-size: 12px; } .canvas-toolbar button { white-space: nowrap; font-size: 13px; } .canvas { position: relative; width: 100%; aspect-ratio: 1.8; min-height: 420px; max-height: 620px; background-color: #fff; background-image: radial-gradient(#d3dce5 .7px, transparent .7px); background-size: 20px 20px; } #wires { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; } .wire-line { fill: none; stroke: #8b9aaa; stroke-width: 2; stroke-dasharray: 6 4; vector-effect: non-scaling-stroke; pointer-events: none; } .wire-line.configured { stroke: #526c7c; stroke-dasharray: none; } .wire-line.selected { stroke: #1472bd; stroke-width: 3; } .wire-hit { fill: none; stroke: transparent; stroke-width: 20; pointer-events: stroke; cursor: pointer; } .wire-label { fill: #596f84; font: 13px "Segoe UI", "Microsoft YaHei", sans-serif; paint-order: stroke; stroke: #fff; stroke-width: 5px; stroke-linejoin: round; pointer-events: none; } .component { position: absolute; left: var(--x); top: var(--y); transform: translate(-50%, -50%); display: flex; flex-direction: column; align-items: center; pointer-events: none; } .component strong { position: absolute; top: calc(100% + 12px); white-space: nowrap; font-size: 13px; } .component small { position: absolute; top: calc(100% + 33px); color: var(--muted); white-space: nowrap; font-size: 11px; } .junction strong, .junction small { left: calc(100% + 18px); } .tank-symbol { width: 58px; height: 76px; border: 2px solid #506579; border-radius: 16px; background: #f8fafc; } .junction-symbol { width: 38px; height: 38px; position: relative; } .junction-symbol::before, .junction-symbol::after { content: ""; position: absolute; background: #344f68; } .junction-symbol::before { width: 38px; height: 3px; top: 17px; } .junction-symbol::after { width: 3px; height: 38px; left: 17px; } .valve-symbol { width: 58px; height: 43px; display: grid; place-items: center; font: 33px/1 sans-serif; border: 2px solid #506579; background: #f8fafc; } .plug-symbol { width: 24px; height: 8px; background: repeating-linear-gradient(130deg, #506579 0 2px, #fff 2px 5px); border-bottom: 2px solid #506579; } .plug strong { top: -5px; left: calc(100% + 12px); } .port { position: absolute; left: var(--x); top: var(--y); transform: translate(-50%, -50%); width: 27px; height: 27px; padding: 0; display: grid; place-items: center; border: 0; background: transparent; border-radius: 50%; } .port::before { content: ""; width: 9px; height: 9px; background: #fff; border: 2px solid #4c6d87; border-radius: 50%; } .port.pending { background: #e3effa; } .port.pending::before { background: #1472bd; border-color: #1472bd; } .port span { position: absolute; left: 23px; top: -4px; color: #516678; font-size: 10px; background: #fff; white-space: nowrap; pointer-events: none; } .port.reference::before { border-color: #b37621; } .port.reference span { color: #8d5d1b; } .canvas-caption { position: absolute; bottom: 10px; left: 14px; color: #738292; font-size: 11px; } .connection-strip { display: flex; flex-wrap: wrap; gap: 8px; padding: 13px 16px; border-top: 1px solid var(--border); background: #f8fafc; } .connection-strip button { font-size: 12px; display: flex; gap: 7px; align-items: center; } .connection-strip button[aria-pressed="true"] { color: var(--blue); border-color: #6299c5; background: #eaf3fb; } .dot { width: 6px; height: 6px; background: #adbac7; border-radius: 50%; } .dot.ready { background: #427e63; } .notice { margin-top: auto; padding: 13px 16px; color: #526679; font-size: 12px; border-top: 1px solid #dbe2e9; } .inspector { border-left: 1px solid var(--border); background: #fff; min-width: 0; } .inspector-title { display: flex; justify-content: space-between; padding: 14px 16px; background: #f5f7fa; border-bottom: 1px solid var(--border); } .inspector-title span { color: var(--muted); } .inspector-body { padding: 16px; } .secondary { font-size: 12px; color: var(--muted); } .endpoint { color: #435a6e; overflow-wrap: anywhere; padding: 0 0 14px; } .endpoint div + div { margin-top: 5px; } .section-label { font-size: 12px; color: var(--muted); margin: 16px 0 6px; } .model-name { font-size: 18px; font-weight: 600; margin: 0 0 5px; } .inspector-actions { display: flex; gap: 8px; flex-wrap: wrap; margin: 16px 0; } .primary { background: #1a68a6; border-color: #1a68a6; color: #fff; } .primary:hover { background: #145b94; } .inspector-body p { margin: 8px 0 14px; } .parameter-form { display: grid; gap: 12px; margin-top: 14px; } .parameter-form label { display: grid; gap: 5px; color: #405568; font-size: 12px; } .parameter-form input { width: 100%; border: 1px solid #bdcbd8; border-radius: 3px; padding: 7px 9px; font-size: 14px; color: #243849; } .parameter-form input[aria-invalid="true"] { border-color: #b46d22; } .parameter-state { font-size: 12px; padding: 8px 0; color: #7b5a2c; } .parameter-state.valid { color: #337055; } .check-list { display: grid; gap: 8px; } .check-item { padding: 10px; border: 1px solid #dce3e9; border-radius: 4px; } .check-item button { margin-top: 7px; font-size: 12px; } .check-item.complete { border-left: 3px solid #549375; } .check-summary { padding: 10px 0; font-weight: 600; } .check-summary.complete { color: #337055; } .statusbar { display: flex; gap: 12px; justify-content: space-between; padding: 8px 16px; background: #f8fafc; border-top: 1px solid var(--border); color: #657588; font-size: 12px; } dialog { width: min(620px, calc(100vw - 32px)); padding: 0; border: 1px solid #b6c4d1; border-radius: 7px; color: #263442; background: #fff; box-shadow: 0 16px 65px #182e4533; max-height: calc(100dvh - 32px); } dialog::backdrop { background: #1c304347; } .dialog-header { display: flex; align-items: start; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--border); padding: 17px 20px; } h1 { font-size: 17px; margin: 0 0 5px; font-weight: 600; } .icon-button { border: 0; font-size: 23px; padding: 0 8px; line-height: 1.3; } .dialog-content { padding: 16px 20px; } .selection-context { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 8px; margin-bottom: 10px; font-size: 12px; } .selection-context span { color: var(--muted); } #model-options { display: grid; gap: 8px; } .model-option { display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: 10px; align-items: start; border: 1px solid #d3dde6; border-radius: 5px; padding: 12px; cursor: pointer; } .model-option:has(input:checked) { border-color: #3382be; background: #f0f7fc; } .model-option input { margin: 4px 0 0; accent-color: var(--blue); } .model-option strong { display: inline-block; margin-right: 8px; } .model-option small { display: block; color: #566c80; margin-top: 4px; font-size: 12px; } .recommendation { font-size: 11px; color: #1f638f; font-weight: 400; } .choice-note { font-size: 12px; color: #5d6b7a; margin: 12px 0; } details { font-size: 12px; color: #5d6e80; } summary { cursor: pointer; padding: 5px 0; } #port-requirements { line-height: 1.8; margin: 7px 0; } .excluded-model { display: flex; justify-content: space-between; gap: 12px; padding: 7px 0; border-top: 1px solid #e5ebf1; } .dialog-footer { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; padding: 12px 20px; background: #f6f8fa; border-top: 1px solid var(--border); } @media(max-width: 1000px) { .workspace { grid-template-columns: minmax(0, 1fr) 275px; } .canvas { min-height: 390px; } .workflow button { padding: 7px 12px; } .workflow-note { display: none; } .component small { display: none; } } @media(max-width: 760px) { .workspace { display: block; } .canvas { min-height: 340px; } .inspector { border-left: 0; border-top: 1px solid var(--border); } .topbar { align-items: start; padding: 12px; } .demo-tag { display: block; margin: 3px 0 0; } .top-actions { gap: 10px; font-size: 12px; } .workflow { padding: 7px; justify-content: space-between; } .workflow button { padding: 7px 9px; gap: 5px; } .canvas-toolbar { align-items: start; } .canvas-caption { font-size: 10px; max-width: 90%; } .component strong { font-size: 11px; } .statusbar { flex-wrap: wrap; } } @media(pointer: coarse) { button, .port { min-height: 44px; } input[type="number"] { min-height: 44px; font-size: 16px; } }