.dataflow-page { position: relative; height: calc(100vh - 115px); min-width: 0; min-height: 0; padding: 0; overflow: hidden; color: var(--text); background: var(--bg); } .dataflow-page *, .dataflow-page *::before, .dataflow-page *::after { box-sizing: border-box; } .dataflow-shell { display: grid; grid-template-columns: minmax(250px, 300px) minmax(0, 1fr); width: 100%; height: 100%; min-width: 0; min-height: 0; overflow: hidden; border: var(--border-line); background: var(--panel); } .dataflow-pipeline-panel, .dataflow-workspace, .dataflow-editor, .dataflow-editor-surface, .dataflow-canvas, .dataflow-pipeline-list-frame { min-width: 0; min-height: 0; } .dataflow-pipeline-panel { display: flex; flex-direction: column; overflow: hidden; border-right: var(--border-line); background: var(--panel-soft); } .dataflow-panel-toolbar, .dataflow-workspace-toolbar, .dataflow-results-toolbar, .dataflow-sql-toolbar, .dataflow-panel-heading { display: flex; align-items: center; justify-content: space-between; gap: 10px; flex: 0 0 auto; border-bottom: var(--border-line); background: var(--panel-header); } .dataflow-panel-toolbar { min-height: 52px; padding: 8px 10px 8px 14px; } .dataflow-toolbar-actions, .dataflow-command-bar, .dataflow-identity-fields, .dataflow-results-toolbar .segmented-control { display: flex; align-items: center; gap: 7px; } .dataflow-pipeline-search { padding: 10px; border-bottom: var(--border-line); } .dataflow-pipeline-search input { min-height: 34px; padding: 7px 9px; } .dataflow-pipeline-list-frame { flex: 1 1 auto; overflow: hidden; } .dataflow-pipeline-list { height: 100%; overflow: auto; padding: 6px; } .dataflow-pipeline-list > button { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px; width: 100%; min-height: 56px; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--text); cursor: pointer; padding: 8px 9px; text-align: left; } .dataflow-pipeline-list > button:hover, .dataflow-pipeline-list > button:focus-visible { background: var(--primary-soft); outline: none; } .dataflow-pipeline-list > button.is-selected { background: var(--primary-soft-strong); box-shadow: inset 3px 0 0 var(--accent); } .dataflow-pipeline-list > button > span:first-child { min-width: 0; } .dataflow-pipeline-list strong, .dataflow-pipeline-list small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dataflow-definition-dialog { width: min(620px, calc(100vw - 32px)); } .dataflow-definition-fields, .dataflow-trigger-form { display: grid; gap: 12px; } .dataflow-definition-fields select, .dataflow-definition-fields input, .dataflow-trigger-form select, .dataflow-trigger-form input, .dataflow-trigger-form textarea { width: 100%; } .dataflow-definition-toggles { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 18px; } .dataflow-provenance, .dataflow-trigger-security { display: grid; gap: 6px; padding: 10px; border: var(--border-line); border-radius: var(--radius-sm); background: var(--panel-soft); } .dataflow-provenance span, .dataflow-provenance small, .dataflow-trigger-security small { color: var(--muted); font-size: 12px; } .dataflow-provenance code, .dataflow-trigger-security code { overflow: hidden; color: var(--text); font-size: 11px; text-overflow: ellipsis; } .dataflow-triggers-dialog { width: min(920px, calc(100vw - 32px)); } .dataflow-triggers-layout { display: grid; grid-template-columns: minmax(230px, 0.8fr) minmax(320px, 1.2fr); gap: 14px; min-height: 420px; } .dataflow-trigger-list { min-width: 0; overflow: auto; border-right: var(--border-line); padding-right: 10px; } .dataflow-trigger-list > button { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 8px; width: 100%; min-height: 52px; padding: 8px; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--text); text-align: left; } .dataflow-trigger-list > button:hover, .dataflow-trigger-list > button.is-selected { background: var(--primary-soft); } .dataflow-trigger-list span, .dataflow-trigger-list strong, .dataflow-trigger-list small { display: block; min-width: 0; } .dataflow-trigger-list small { margin-top: 4px; color: var(--muted); } .dataflow-trigger-form textarea { min-height: 88px; resize: vertical; } .dataflow-trigger-security .is-error { color: var(--danger); } @media (max-width: 760px) { .dataflow-triggers-layout, .dataflow-definition-toggles { grid-template-columns: 1fr; } .dataflow-trigger-list { max-height: 180px; border-right: 0; border-bottom: var(--border-line); padding: 0 0 10px; } } .dataflow-pipeline-list strong { color: var(--text-strong); font-size: 13px; } .dataflow-pipeline-list small { margin-top: 4px; color: var(--muted); font-size: 11px; } .dataflow-pipeline-list .status-badge { max-width: 74px; overflow: hidden; text-overflow: ellipsis; } .dataflow-pipeline-empty, .dataflow-inspector-empty, .dataflow-results-empty { display: grid; place-items: center; min-height: 100px; color: var(--muted); font-size: 13px; text-align: center; } .dataflow-workspace { position: relative; display: flex; flex-direction: column; overflow: hidden; background: var(--bg); } .dataflow-workspace-toolbar { min-height: 58px; padding: 8px 10px; } .dataflow-identity-fields { min-width: 260px; flex: 1 1 auto; } .dataflow-identity-fields input, .dataflow-identity-fields select { min-height: 34px; padding: 7px 9px; } .dataflow-name-input { max-width: 260px; color: var(--text-strong); font-weight: 700; } .dataflow-description-input { min-width: 140px; flex: 1 1 240px; } .dataflow-identity-fields select { width: 104px; flex: 0 0 104px; } .dataflow-command-bar { justify-content: flex-end; flex-wrap: wrap; } .dataflow-command-bar .btn, .dataflow-sql-toolbar .btn { display: inline-flex; align-items: center; gap: 6px; min-height: 34px; white-space: nowrap; } .dataflow-command-bar .segmented-control-option { display: inline-flex; align-items: center; gap: 5px; } .dataflow-command-bar .toggle-switch-row { min-height: 34px; white-space: nowrap; } .dataflow-editor { flex: 1 1 auto; display: grid; grid-template-columns: 210px minmax(0, 1fr) minmax(260px, 310px); min-height: 0; overflow: hidden; } .dataflow-editor.is-sql { grid-template-columns: minmax(0, 1fr) minmax(260px, 310px); } .dataflow-palette, .dataflow-inspector { min-width: 0; min-height: 0; overflow: hidden; background: var(--panel-soft); } .dataflow-palette { border-right: var(--border-line); } .dataflow-inspector { border-left: var(--border-line); } .dataflow-panel-heading { min-height: 44px; padding: 8px 10px 8px 12px; } .dataflow-panel-heading > span { min-width: 0; } .dataflow-panel-heading strong, .dataflow-panel-heading small { display: block; } .dataflow-panel-heading strong { color: var(--text-strong); font-size: 13px; } .dataflow-panel-heading small { overflow: hidden; margin-top: 2px; color: var(--muted); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } .dataflow-palette-items { display: grid; grid-auto-rows: max-content; align-content: start; gap: 4px; height: calc(100% - 44px); padding: 8px; overflow-x: hidden; overflow-y: auto; scrollbar-gutter: stable; } .dataflow-palette-group { display: grid; grid-auto-rows: max-content; align-content: start; gap: 2px; } .dataflow-palette-group + .dataflow-palette-group { margin-top: 6px; padding-top: 8px; border-top: var(--border-line); } .dataflow-palette-group h3 { margin: 0; color: var(--muted); font-size: 10px; font-weight: 700; letter-spacing: 0; padding: 3px 8px; text-transform: uppercase; } .dataflow-palette-items button { display: grid; grid-template-columns: 18px minmax(0, 1fr) 14px; align-items: center; gap: 7px; min-height: 38px; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--text); cursor: grab; font: inherit; font-size: 12px; padding: 7px 8px; text-align: left; } .dataflow-palette-items button:hover:not(:disabled), .dataflow-palette-items button:focus-visible:not(:disabled) { background: var(--primary-soft); color: var(--text-strong); outline: none; } .dataflow-palette-items button:active:not(:disabled) { cursor: grabbing; } .dataflow-palette-items button:disabled { cursor: default; opacity: .42; } .dataflow-palette-add { color: var(--accent); } .dataflow-editor-surface { position: relative; overflow: hidden; background: var(--bg); } .dataflow-canvas { position: absolute; inset: 0; } .dataflow-canvas .react-flow { background: var(--bg); } .dataflow-canvas .react-flow__background { color: var(--line-dark); } .dataflow-canvas .react-flow__controls, .dataflow-canvas .react-flow__minimap { overflow: hidden; border: var(--border-line); border-radius: var(--radius-sm); background: var(--panel); box-shadow: var(--shadow-xs); } .dataflow-canvas .react-flow__controls-button { border-bottom: var(--border-line); background: var(--panel); color: var(--text); } .dataflow-canvas .react-flow__minimap-mask { fill: color-mix(in srgb, var(--bg) 76%, transparent); } .dataflow-canvas .react-flow__edge-path { stroke: var(--line-dark); stroke-width: 2; } .dataflow-canvas .react-flow__edge.selected .react-flow__edge-path, .dataflow-canvas .react-flow__edge:hover .react-flow__edge-path { stroke: var(--accent); stroke-width: 3; } .dataflow-canvas .react-flow__edge.dataflow-edge-proximity .react-flow__edge-path { stroke: var(--accent); stroke-width: 3; stroke-dasharray: 7 6; } .dataflow-canvas .react-flow__connection-path { stroke: var(--accent); stroke-width: 3; } .dataflow-canvas-empty { position: absolute; inset: 0; display: grid; place-items: center; color: var(--muted); pointer-events: none; } .dataflow-node { position: relative; display: flex; align-items: center; gap: 9px; width: 180px; min-height: 54px; border: 1px solid var(--line-dark); border-left: 4px solid #3d6f9e; border-radius: 6px; background: var(--panel); box-shadow: var(--shadow-xs); padding: 8px 10px; } .dataflow-node-source-inline, .dataflow-node-source-reference { border-left-color: #2f7d6d; } .dataflow-node-filter { border-left-color: #b7791f; } .dataflow-node-combine-union, .dataflow-node-combine-join { min-height: 64px; border-left-color: #2f7d6d; } .dataflow-node-distinct { border-left-color: #b7791f; } .dataflow-node-derive, .dataflow-node-aggregate { border-left-color: #76569b; } .dataflow-node-sort { border-left-color: #3d6f9e; } .dataflow-node-output { border-left-color: #9d4e63; } .dataflow-node.is-selected { border-color: var(--accent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 24%, transparent), var(--shadow-xs); } .dataflow-node.has-error { border-color: var(--danger-text); } .dataflow-node-icon { display: grid; width: 28px; height: 28px; flex: 0 0 28px; place-items: center; border-radius: 5px; background: var(--panel-soft); color: var(--text-strong); } .dataflow-node-copy { min-width: 0; flex: 1 1 auto; } .dataflow-node-copy strong, .dataflow-node-copy small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dataflow-node-copy strong { color: var(--text-strong); font-size: 12px; } .dataflow-node-copy small { margin-top: 3px; color: var(--muted); font-size: 10px; } .dataflow-node-count { min-width: 22px; border-radius: 999px; background: var(--primary-soft); color: var(--text-strong); font-size: 10px; font-variant-numeric: tabular-nums; padding: 3px 5px; text-align: center; } .dataflow-node-handle { width: 13px; height: 13px; border: 3px solid var(--panel); background: var(--line-dark); } .dataflow-node-handle:hover, .dataflow-node-handle.connectingto, .dataflow-node-handle.valid { width: 17px; height: 17px; background: var(--accent); } .dataflow-node-port-label { position: absolute; left: 8px; max-width: 42px; overflow: hidden; color: var(--muted); font-size: 8px; line-height: 1; pointer-events: none; text-overflow: ellipsis; transform: translateY(-50%); white-space: nowrap; } .dataflow-node-combine-join .dataflow-node-icon { margin-left: 31px; } .dataflow-inspector-fields { display: grid; grid-auto-rows: max-content; align-content: start; gap: 12px; height: calc(100% - 44px); overflow-x: hidden; overflow-y: auto; padding: 12px; scrollbar-gutter: stable; } .dataflow-inspector-fields .form-field { min-width: 0; } .dataflow-inspector-fields input, .dataflow-inspector-fields select, .dataflow-inspector-fields textarea { margin-top: 5px; padding: 7px 8px; font-size: 12px; } .dataflow-json-editor { min-height: 190px; resize: vertical; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; line-height: 1.45; tab-size: 2; } .dataflow-expression-editor { min-height: 78px; resize: vertical; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; line-height: 1.45; } .dataflow-inspector-delete { color: var(--danger-text); } .dataflow-source-dialog { width: min(720px, calc(100vw - 32px)); } .dataflow-run-dialog { width: min(860px, calc(100vw - 32px)); } .dataflow-run-dialog-content { display: grid; gap: 14px; max-height: min(680px, calc(100vh - 210px)); overflow: hidden; } .dataflow-run-controls, .dataflow-run-history-heading { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .dataflow-run-revision, .dataflow-run-history-heading small { color: var(--muted); font-size: 11px; } .dataflow-run-publication-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; padding: 12px 0; border-top: var(--border-line); border-bottom: var(--border-line); } .dataflow-run-publication-fields input, .dataflow-run-publication-fields select { margin-top: 5px; padding: 7px 8px; } .dataflow-run-freeze { display: flex; min-height: 54px; align-items: end; padding-bottom: 4px; } .dataflow-run-history { display: flex; min-height: 190px; flex-direction: column; overflow: hidden; } .dataflow-run-history-heading { min-height: 36px; flex: 0 0 auto; border-bottom: var(--border-line); } .dataflow-run-history-heading strong { color: var(--text-strong); font-size: 12px; } .dataflow-run-history > div:last-child { min-height: 0; flex: 1 1 auto; overflow: auto; } .dataflow-run-history table { width: 100%; border-collapse: collapse; font-size: 11px; } .dataflow-run-history th, .dataflow-run-history td { max-width: 230px; border-bottom: var(--border-line); padding: 7px 9px; overflow: hidden; text-align: left; text-overflow: ellipsis; white-space: nowrap; } .dataflow-run-history th { position: sticky; z-index: 1; top: 0; background: var(--panel-soft); color: var(--text-strong); } .dataflow-run-history tbody tr:hover { background: var(--primary-soft); } .dataflow-source-dialog-fields { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } .dataflow-source-dialog-fields .alert, .dataflow-source-dialog-format, .dataflow-source-dialog-fields .form-field:last-child { grid-column: 1 / -1; } .dataflow-source-dialog-fields .dataflow-json-editor { width: 100%; min-height: 260px; } .dataflow-sql-workbench { display: flex; height: 100%; min-height: 0; flex-direction: column; } .dataflow-sql-toolbar { min-height: 44px; padding: 7px 10px 7px 14px; color: var(--text-strong); font-size: 12px; font-weight: 700; } .dataflow-sql-workbench > textarea { flex: 1 1 auto; min-height: 0; resize: none; border: 0; border-radius: 0; background: var(--bg); color: var(--text-strong); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 14px; line-height: 1.65; padding: 20px; tab-size: 2; } .dataflow-sql-workbench > textarea:focus { outline: 2px solid color-mix(in srgb, var(--accent) 46%, transparent); outline-offset: -2px; } .dataflow-results { flex: 0 0 clamp(190px, 28vh, 320px); display: flex; min-height: 0; flex-direction: column; overflow: hidden; border-top: var(--border-line-dark); background: var(--panel); } .dataflow-results-toolbar { min-height: 42px; padding: 5px 9px; flex-wrap: wrap; } .dataflow-results-toolbar .btn { min-height: 30px; } .dataflow-results-view-controls, .dataflow-inspector-actions { display: flex; align-items: center; gap: 7px; min-width: 0; } .dataflow-results-view-controls { flex-wrap: wrap; } .dataflow-preview-stage { max-width: min(36vw, 320px); overflow: hidden; color: var(--text-strong); font-size: 12px; font-weight: 650; text-overflow: ellipsis; white-space: nowrap; } .dataflow-preview-table-wrap, .dataflow-diagnostics-list { min-height: 0; flex: 1 1 auto; overflow: auto; } .dataflow-preview-table { width: 100%; min-width: max-content; border-collapse: collapse; font-size: 12px; } .dataflow-preview-table th, .dataflow-preview-table td { min-width: 130px; max-width: 360px; border-right: var(--border-line); border-bottom: var(--border-line); padding: 7px 10px; overflow: hidden; text-align: left; text-overflow: ellipsis; white-space: nowrap; } .dataflow-preview-table th { position: sticky; z-index: 2; top: 0; background: var(--panel-soft); color: var(--text-strong); } .dataflow-preview-table th span, .dataflow-preview-table th small { display: block; } .dataflow-preview-table th small { margin-top: 2px; color: var(--muted); font-size: 9px; font-weight: 500; } .dataflow-preview-table tbody tr:hover { background: var(--primary-soft); } .dataflow-preview-summary { position: sticky; bottom: 0; display: flex; flex-wrap: wrap; gap: 6px 16px; padding: 6px 10px; border-top: var(--border-line); background: var(--panel-header); color: var(--muted); font-size: 11px; } .dataflow-diagnostics-list { padding: 6px; } .dataflow-diagnostics-list > div { display: grid; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 8px; min-height: 44px; border-bottom: var(--border-line); padding: 6px 8px; } .dataflow-diagnostics-list > div.is-error { color: var(--danger-text); } .dataflow-diagnostics-list > div.is-warning { color: var(--warning-deep); } .dataflow-diagnostics-list span { min-width: 0; } .dataflow-diagnostics-list strong, .dataflow-diagnostics-list small { display: block; } .dataflow-diagnostics-list small { margin-top: 2px; color: var(--muted); } .dataflow-diagnostics-list code { max-width: 220px; overflow: hidden; color: var(--muted); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } .dataflow-workspace-empty { display: grid; place-content: center; justify-items: center; gap: 12px; height: 100%; color: var(--muted); } .dataflow-workspace-empty strong { color: var(--text-strong); } .dataflow-workspace-empty .btn { display: inline-flex; align-items: center; gap: 6px; } .dataflow-working-indicator { position: absolute; z-index: 20; right: 12px; bottom: 10px; border: var(--border-line-dark); border-radius: var(--radius-sm); background: var(--panel); box-shadow: var(--shadow-popover); color: var(--text-strong); font-size: 12px; padding: 7px 10px; } @media (max-width: 1180px) { .dataflow-shell { grid-template-columns: 240px minmax(0, 1fr); } .dataflow-workspace-toolbar { align-items: stretch; flex-direction: column; } .dataflow-command-bar { justify-content: flex-start; } .dataflow-editor { grid-template-columns: 180px minmax(0, 1fr) 270px; } .dataflow-editor.is-sql { grid-template-columns: minmax(0, 1fr) 270px; } } @media (max-width: 900px) { .dataflow-shell { grid-template-columns: 210px minmax(0, 1fr); } .dataflow-editor { grid-template-columns: 135px minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) minmax(170px, 32%); } .dataflow-editor.is-sql { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) minmax(170px, 32%); } .dataflow-inspector { grid-column: 1 / -1; border-top: var(--border-line); border-left: 0; } .dataflow-inspector-fields { grid-template-columns: repeat(3, minmax(0, 1fr)); height: calc(100% - 44px); } .dataflow-inspector-fields .alert, .dataflow-inspector-fields .dataflow-json-editor { grid-column: 1 / -1; } } @media (max-width: 680px) { .dataflow-page { height: calc(100vh - 94px); } .dataflow-shell { grid-template-columns: 1fr; grid-template-rows: minmax(150px, 24%) minmax(0, 1fr); } .dataflow-pipeline-panel { border-right: 0; border-bottom: var(--border-line); } .dataflow-identity-fields, .dataflow-command-bar { flex-wrap: wrap; } .dataflow-name-input, .dataflow-description-input { max-width: none; min-width: 180px; } .dataflow-editor { grid-template-columns: 1fr; grid-template-rows: auto minmax(0, 1fr) minmax(160px, 30%); } .dataflow-palette { border-right: 0; border-bottom: var(--border-line); } .dataflow-palette .dataflow-panel-heading { display: none; } .dataflow-palette-items { display: flex; overflow-x: auto; } .dataflow-palette-group { display: flex; flex: 0 0 auto; } .dataflow-palette-group + .dataflow-palette-group { margin-top: 0; padding-top: 0; padding-left: 6px; border-top: 0; border-left: var(--border-line); } .dataflow-palette-group h3 { display: none; } .dataflow-palette-items button { min-width: 128px; } .dataflow-inspector-fields { grid-template-columns: 1fr 1fr; } .dataflow-results { flex-basis: 220px; } .dataflow-run-publication-fields { grid-template-columns: 1fr; } }