/* Plate lab components. Prefix: pl- */ :root { --pl-bg: #ffffff; --pl-panel: #f6f7f9; --pl-border: #d9dde3; --pl-text: #1c2430; --pl-muted: #5b6573; --pl-accent: #1f5fa8; --pl-warn: #a35a00; --pl-warn-bg: #fff4e0; --pl-error: #a11d2b; --pl-error-bg: #fde9eb; --pl-ok: #1f7a3a; --pl-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; --pl-font: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; } .pl-panel { background: var(--pl-panel); border: 1px solid var(--pl-border); border-radius: 6px; padding: 10px 12px; } .pl-panel h3 { margin: 0 0 8px; font-size: 13px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--pl-muted); } .pl-muted { color: var(--pl-muted); } .pl-small { font-size: 12px; } .pl-mono { font-family: var(--pl-mono); } .pl-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; } .pl-badge { display: inline-block; padding: 1px 7px; border-radius: 10px; font-size: 11px; font-weight: 600; } .pl-badge-ok { background: #e3f4e8; color: var(--pl-ok); } .pl-badge-warn { background: var(--pl-warn-bg); color: var(--pl-warn); } .pl-badge-error { background: var(--pl-error-bg); color: var(--pl-error); } .pl-badge-info { background: #e6eef9; color: var(--pl-accent); } .pl-note { padding: 6px 8px; border-left: 3px solid var(--pl-warn); background: var(--pl-warn-bg); font-size: 12px; margin: 4px 0; } .pl-error { padding: 8px 10px; border-left: 3px solid var(--pl-error); background: var(--pl-error-bg); font-family: var(--pl-mono); font-size: 12px; white-space: pre-wrap; } button.pl-btn { font: inherit; padding: 5px 12px; border-radius: 5px; border: 1px solid var(--pl-border); background: #fff; cursor: pointer; color: var(--pl-text); } button.pl-btn:hover { border-color: var(--pl-accent); } button.pl-btn:disabled { opacity: 0.5; cursor: default; } button.pl-btn-primary { background: var(--pl-accent); color: #fff; border-color: var(--pl-accent); } button.pl-btn-danger { background: #fff; color: var(--pl-error); border-color: var(--pl-error); } /* Parameter panel */ .pl-params { display: flex; flex-direction: column; gap: 10px; } .pl-group { border: 1px solid var(--pl-border); border-radius: 6px; padding: 8px 10px; background: #fff; } .pl-group > summary, .pl-group-title { font-weight: 600; font-size: 13px; cursor: pointer; margin-bottom: 6px; } .pl-field { display: grid; grid-template-columns: 1fr 100px 46px; gap: 6px; align-items: center; font-size: 12px; margin: 3px 0; } .pl-field label { color: var(--pl-text); } .pl-field input, .pl-field select, .pl-select { font: inherit; font-size: 12px; padding: 3px 5px; border: 1px solid var(--pl-border); border-radius: 4px; width: 100%; box-sizing: border-box; } .pl-field input.pl-invalid { border-color: var(--pl-error); background: var(--pl-error-bg); } .pl-field .pl-unit { color: var(--pl-muted); font-size: 11px; } .pl-field-wide { grid-template-columns: 1fr 2fr; } .pl-slider { display: grid; grid-template-columns: 1fr 70px; gap: 8px; align-items: center; font-size: 12px; } .pl-slider input[type=range] { width: 100%; } .pl-issue { font-size: 11px; color: var(--pl-error); margin: 2px 0 4px; } .pl-issue-warning { color: var(--pl-warn); } .pl-disabled { opacity: 0.55; } .pl-gpu { margin-top: 8px; padding-top: 6px; border-top: 1px dashed var(--pl-border); } .pl-check { display: flex; gap: 6px; align-items: center; font-size: 12px; cursor: pointer; } .pl-check input { margin: 0; } /* Code view */ .pl-code { display: flex; flex-direction: column; border: 1px solid var(--pl-border); border-radius: 6px; overflow: hidden; background: #fff; min-height: 0; } .pl-code-tabs { display: flex; flex-wrap: wrap; gap: 2px; padding: 4px 6px; background: var(--pl-panel); border-bottom: 1px solid var(--pl-border); } .pl-code-tab { font: inherit; font-size: 12px; font-family: var(--pl-mono); padding: 3px 8px; border: 1px solid transparent; background: transparent; border-radius: 4px; cursor: pointer; color: var(--pl-muted); } .pl-code-tab.pl-active { background: #fff; border-color: var(--pl-border); color: var(--pl-text); } .pl-code-tab.pl-modified::after { content: " *"; color: var(--pl-warn); } .pl-code-toolbar { display: flex; gap: 8px; align-items: center; padding: 4px 8px; font-size: 12px; border-bottom: 1px solid var(--pl-border); color: var(--pl-muted); } .pl-code-editor { flex: 1; min-height: 200px; overflow: auto; } .pl-code-editor .cm-editor { height: 100%; font-size: 12.5px; } .pl-code-editor .cm-scroller { font-family: var(--pl-mono); } /* Field view */ .pl-fieldview { display: flex; flex-direction: column; gap: 6px; } .pl-fieldview-head { display: flex; justify-content: space-between; align-items: baseline; font-size: 12px; } .pl-fieldview-body { display: grid; grid-template-columns: 1fr 56px; gap: 8px; align-items: start; } .pl-fieldview canvas { width: 100%; height: auto; display: block; image-rendering: auto; border: 1px solid var(--pl-border); background: #fff; } .pl-colorbar { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; font-size: 10px; color: var(--pl-muted); text-align: left; } .pl-colorbar canvas { width: 14px; height: 100%; min-height: 0; border: 1px solid var(--pl-border); } .pl-player { display: grid; grid-template-columns: auto 1fr auto auto; gap: 8px; align-items: center; font-size: 12px; } .pl-player input[type=range] { width: 100%; } /* Plots */ .pl-plot { position: relative; } .pl-plot canvas { width: 100%; height: auto; display: block; } .pl-plot-title { font-size: 12px; font-weight: 600; margin-bottom: 2px; } .pl-legend { display: flex; gap: 12px; font-size: 11px; color: var(--pl-muted); flex-wrap: wrap; } .pl-legend span::before { content: ""; display: inline-block; width: 12px; height: 3px; margin-right: 4px; vertical-align: middle; background: var(--c); } /* Equations */ .pl-equations { display: flex; flex-direction: column; gap: 10px; } .pl-equation { font-size: 13px; } .pl-equation .katex-display { margin: 4px 0; overflow-x: auto; overflow-y: hidden; } .pl-equation-caption { font-size: 12px; color: var(--pl-muted); } /* Status */ .pl-status { font-size: 12px; display: flex; flex-direction: column; gap: 6px; } .pl-status table { border-collapse: collapse; } .pl-status td { padding: 1px 10px 1px 0; vertical-align: top; } .pl-status td:first-child { color: var(--pl-muted); } .pl-log { font-family: var(--pl-mono); font-size: 11px; white-space: pre-wrap; max-height: 120px; overflow: auto; background: #fff; border: 1px solid var(--pl-border); padding: 4px 6px; } .pl-progress { height: 4px; background: var(--pl-border); border-radius: 2px; overflow: hidden; } .pl-progress > div { height: 100%; background: var(--pl-accent); animation: pl-indeterminate 1.2s infinite ease-in-out; width: 30%; } @keyframes pl-indeterminate { 0% { margin-left: -30%; } 100% { margin-left: 100%; } } /* Compare */ .pl-metrics { border-collapse: collapse; font-size: 12px; } .pl-metrics th, .pl-metrics td { text-align: right; padding: 2px 10px; border-bottom: 1px solid var(--pl-border); } .pl-metrics th:first-child, .pl-metrics td:first-child { text-align: left; } /* Plot interaction */ .pl-linkbtn { font: inherit; font-size: 11px; font-weight: 400; margin-left: 8px; border: 0; background: none; color: var(--pl-accent); cursor: pointer; text-decoration: underline; padding: 0; } .pl-hint { margin-left: auto; font-style: italic; } .pl-legend .pl-hint::before { display: none; }