:root { --el-color-primary: #409eff; --el-color-primary-light-3: #79bbff; --el-color-primary-light-5: #a0cfff; --el-color-primary-light-7: #c6e2ff; --el-color-primary-light-9: #ecf5ff; --el-color-primary-dark-2: #337ecc; --el-border-radius-base: 4px; color: #303133; background: #f2f3f5; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; font-synthesis: none; text-rendering: optimizeLegibility; } * { box-sizing: border-box; } body { margin: 0; min-width: 320px; min-height: 100vh; color: #303133; background: #f2f3f5; } button, input, select { font: inherit; } button { cursor: pointer; } button:disabled, input:disabled, select:disabled { cursor: not-allowed; } h1, h2, p { margin: 0; } .app-shell { min-height: 100vh; background: #f2f3f5; } .login-shell { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 24px; background: linear-gradient(160deg, #304156 0%, #1d2b3a 100%); } .login-card { width: min(420px, 100%); display: flex; flex-direction: column; gap: 14px; padding: 34px 32px 30px; background: #fff; border-radius: 8px; box-shadow: 0 18px 48px rgba(0, 0, 0, .28); } .login-brand { display: flex; align-items: center; gap: 13px; margin-bottom: 6px; } .login-brand .brand-mark { flex-shrink: 0; } .login-brand h1 { color: #303133; } .login-brand .brand-kicker { color: #909399; } .login-hint { color: #909399; font-size: 13px; } .login-input { width: 100%; } .login-error { margin-top: 2px; } .login-button.el-button { width: 100%; height: 42px; margin: 6px 0 0; font-size: 15px; letter-spacing: .2em; } .header-logout.el-button { height: 32px; margin: 0; color: #d9e2ec; border-color: #7aa7d4; background: transparent; } .header-logout.el-button:hover { color: #fff; border-color: #f56c6c; background: rgba(245, 108, 108, .18); } .app-header { min-height: 72px; display: flex; align-items: center; justify-content: space-between; gap: 24px; padding: 14px clamp(18px, 4vw, 60px); color: #fff; background: #304156; border-bottom: 1px solid #253447; } .brand-lockup, .header-meta, .panel-heading, .chart-actions, .selection-controls, .time-strip-head, .time-strip-foot, .app-footer, .period-modal-head { display: flex; align-items: center; justify-content: space-between; } .brand-lockup { justify-content: flex-start; gap: 13px; } .brand-mark { width: 38px; height: 38px; display: flex; align-items: flex-end; gap: 3px; padding: 7px; background: #409eff; border-radius: 4px; } .brand-mark span { display: block; width: 5px; background: #fff; border-radius: 1px; } .brand-mark span:nth-child(1) { height: 11px; } .brand-mark span:nth-child(2) { height: 20px; } .brand-mark span:nth-child(3) { height: 26px; } .brand-kicker { margin-bottom: 3px; color: #a9c9e8; font-size: 10px; font-weight: 600; letter-spacing: .1em; } h1 { font-size: 18px; line-height: 1.35; font-weight: 600; } h2 { font-size: 18px; line-height: 1.35; font-weight: 600; } .header-meta { justify-content: flex-end; gap: 16px; color: #d9e2ec; font-size: 13px; } .live-indicator { display: inline-flex; align-items: center; gap: 7px; color: #cbd7e4; font-size: 12px; } .live-indicator i, .chart-status i { width: 7px; height: 7px; display: inline-block; border-radius: 50%; background: #67c23a; } .header-date { max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .header-refresh.el-button { min-width: 68px; height: 32px; margin: 0; color: #fff; border-color: #7aa7d4; background: transparent; } .header-refresh.el-button:hover { color: #fff; border-color: #409eff; background: rgba(64, 158, 255, .18); } .spinning { animation: spin .8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .workspace { display: grid; grid-template-columns: minmax(0, 1fr) 292px; gap: 16px; width: min(1600px, calc(100% - 32px)); margin: 20px auto 0; } .panel { background: #fff; border: 1px solid #ebeef5; border-radius: 4px; box-shadow: 0 2px 12px rgba(0, 0, 0, .04); } .query-panel { grid-column: 1; grid-row: 1; } .selection-panel { grid-column: 1; grid-row: 2; } .chart-panel { grid-column: 1 / -1; grid-row: 3; } .insight-panel { grid-column: 2; grid-row: 1 / span 2; align-self: stretch; } .query-panel { padding: 22px 24px 18px; } .panel-heading { align-items: flex-start; gap: 16px; } .compact-heading { margin-bottom: 18px; } .connection-badge.el-tag { height: 28px; padding: 0 10px; font-size: 12px; } .query-grid { display: grid; grid-template-columns: minmax(150px, 1.7fr) minmax(240px, 2fr) minmax(170px, 1.25fr) minmax(170px, 1.25fr) 120px; align-items: end; gap: 16px 12px; } .field { min-width: 0; } .window-field .field-label { white-space: nowrap; } .field-label { display: flex; align-items: baseline; gap: 7px; margin-bottom: 8px; color: #606266; font-size: 14px; font-weight: 500; line-height: 20px; } .field-label em { color: #909399; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 11px; font-style: normal; font-weight: 400; } .query-control { width: 100%; } .query-control.el-select, .query-control.el-date-editor { height: 40px; } .query-control.el-input-number { width: 100%; } .query-control .el-input__wrapper, .query-control.el-input-number { min-height: 40px; border-radius: 4px; } .query-control .el-input__inner, .query-control .el-select__placeholder, .query-control .el-select__selected-item, .query-control .el-date-editor__placeholder { font-size: 14px; } .query-control .el-tag { font-size: 13px; } .point-counts { color: #909399; } .point-counts .abnormal-count { color: #e05252; font-weight: 600; } .window-number .el-input__inner { text-align: center; } .query-button.el-button { width: 100%; height: 40px; margin: 0; border-radius: 4px; font-size: 14px; } .field-types .el-select__wrapper { flex-wrap: nowrap; } .field-types .el-select__tags { flex-wrap: nowrap; overflow: hidden; } .field-types .el-select__tags .el-tag { flex-shrink: 0; } .query-row-2 { display: contents; } .query-row-2 .field-check, .query-row-2 .field-second-group, .query-row-2 .window-field, .query-row-2 .field-time-range { min-height: 68px; } .query-row-2 .field-time-range { grid-column: span 2; } .field-check .field-label, .field-status .field-label, .field-first-cycle .field-label, .window-field .field-label, .field-time-range .field-label { white-space: nowrap; } .field-second-group { display: flex; align-items: flex-start; gap: 16px; min-width: 0; } .field-second-group .field-status { width: 120px; flex: 0 0 120px; } .field-second-group .field-first-cycle { flex: 1 1 auto; min-width: 0; } .query-checkbox.el-checkbox { height: 40px; margin-right: 20px; display: inline-flex; align-items: center; } .query-checkbox.el-checkbox:last-child { margin-right: 0; } .query-checkbox .el-checkbox__label { font-size: 14px; color: #303133; } .field-status { width: 120px; max-width: 100%; } .data-alert { margin-top: 16px; } .selection-panel { padding: 20px 24px 18px; } .time-strip { min-width: 0; } .time-strip-head { align-items: flex-start; margin-bottom: 12px; } .time-summary { padding-top: 4px; color: #909399; font-size: 13px; } .time-legend { display: inline-flex; align-items: center; gap: 4px; margin-right: 10px; color: #606266; font-size: 12px; } .time-legend i { width: 9px; height: 9px; display: inline-block; border-radius: 50%; } .legend-running { background: #2e7d32; } .legend-stopped { background: #c0c4cc; } .time-summary .mono, .readout-number { color: #303133; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: 500; } .summary-divider { padding: 0 8px; color: #dcdfe6; } .timeline-canvas-host { position: relative; width: 100%; min-height: 210px; overflow: hidden; border: 1px solid #ebeef5; border-radius: 4px; background: #fff; } .timeline-canvas-host canvas { display: block; width: 100%; height: 210px; cursor: crosshair; } .timeline-canvas-host.is-loading { opacity: .7; } .canvas-loading, .chart-loading, .modal-loading { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; color: #909399; background: rgba(255, 255, 255, .82); font-size: 13px; } .time-strip-foot { gap: 16px; margin-top: 12px; } .time-foot-item { display: flex; flex-direction: column; gap: 3px; min-width: 100px; } .time-foot-item.align-right { text-align: right; } .foot-label { color: #909399; font-size: 12px; } .time-foot-item strong { color: #606266; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 13px; font-weight: 500; } .window-track { flex: 1; padding: 0 6px; } .window-track .el-slider { width: 100%; } .selection-controls { gap: 12px; margin-top: 14px; } .selection-readout { display: flex; align-items: center; gap: 8px; color: #606266; font-size: 14px; flex: 1; min-width: 0; } .selection-readout > span:last-child { line-height: 1.7; word-break: break-all; } .selection-actions { display: flex; gap: 8px; flex-shrink: 0; } .selection-readout strong { color: #303133; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: 500; } .selection-accent { width: 7px; height: 7px; background: #409eff; border-radius: 50%; } .reference-badge { flex-shrink: 0; padding: 1px 8px; border: 1px solid #4d9e6f; border-radius: 10px; color: #2e7d32; background: #ecf7f1; font-size: 12px; white-space: nowrap; } .jump-select { width: 280px; } .jump-select .el-select__wrapper { min-height: 32px; } .ghost-button.chart-query { font-weight: 500; } .ghost-button.chart-query.is-dirty { border-color: #409eff; background: #ecf5ff; color: #409eff; box-shadow: 0 0 0 1px #409eff inset; } .ghost-button.el-button { height: 32px; padding: 0 14px; font-size: 13px; } .window-files { margin-top: 12px; border: 1px solid #ebeef5; border-radius: 4px; overflow: hidden; background: #fff; } .window-files-title { display: flex; align-items: center; gap: 10px; padding: 8px 12px; color: #606266; font-size: 12px; font-weight: 600; background: #f5f7fa; border-bottom: 1px solid #ebeef5; } .file-point-radio { margin-left: auto; } .window-files-table { width: 100%; border-collapse: collapse; font-size: 12px; } .window-files-table th, .window-files-table td { padding: 6px 10px; text-align: left; border-bottom: 1px solid #f0f2f5; white-space: nowrap; } .window-files-table th { color: #909399; font-weight: 500; background: #fafbfc; } .window-files-scroll { max-height: 180px; overflow-y: auto; } .window-files-scroll thead th { position: sticky; top: 0; z-index: 1; } .window-files-table td { color: #303133; } .window-files-table td.mono { color: #606266; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; } .window-files-table td.file-name { max-width: 280px; overflow: hidden; text-overflow: ellipsis; } .window-files-table tr:last-child td { border-bottom: 0; } .window-files-table td.actions { white-space: nowrap; } .window-files-table .file-action.el-button { height: 24px; margin: 0 2px; padding: 0 10px; font-size: 12px; } .chart-panel { min-height: 500px; padding: 22px 24px 15px; } .chart-heading { margin-bottom: 10px; } .chart-actions { gap: 15px; } .mode-switch.el-radio-group { display: inline-flex; } .mode-switch .el-radio-button__inner { font-size: 13px; } .annotation-width { display: inline-flex; align-items: baseline; gap: 5px; color: #909399; font-size: 13px; white-space: nowrap; } .annotation-width strong { color: #409eff; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 15px; font-weight: 600; } .sampling-switch { --el-switch-on-color: #409eff; } .chart-status { display: flex; align-items: center; gap: 8px; color: #909399; font-size: 13px; white-space: nowrap; } .chart-status i { width: 7px; height: 7px; } .chart-status i.busy { background: #e6a23c; animation: pulse 1s ease-in-out infinite alternate; } @keyframes pulse { to { opacity: .35; } } .wave-chart-shell { position: relative; } .chart-toolbar-note { display: flex; align-items: center; gap: 8px; height: 28px; color: #909399; font-size: 12px; } .chart-dot { width: 7px; height: 7px; border-radius: 50%; background: #409eff; } .chart-separator { width: 1px; height: 14px; margin: 0 3px; background: #dcdfe6; } .chart-point-count { margin-left: auto; color: #606266; font-weight: 500; } .wave-chart { width: 100%; height: 680px; } .wave-chart.is-merge { height: 560px; } .pv-preview-shell { display: flex; flex-direction: column; gap: 6px; width: 100%; padding: 4px 0; } .pv-preview-row { position: relative; width: 100%; height: 132px; overflow: hidden; border: 1px solid #ebeef5; border-radius: 4px; background: #f8fafb; } .pv-preview-title { position: absolute; z-index: 1; top: 3px; left: 10px; color: #8b9aa2; font-size: 11px; pointer-events: none; } .pv-preview-canvas { display: block; width: 100%; height: 132px; } .chart-empty-hint { margin-top: 7px; color: #e6a23c; font-size: 12px; } .annotation-nav { margin-top: 12px; padding: 10px 12px 12px; border: 1px solid #ebeef5; border-radius: 4px; background: #fafbfc; } .annotation-nav-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 9px; } .annotation-nav-title { color: #606266; font-size: 13px; font-weight: 600; } .annotation-nav-controls { display: flex; align-items: center; gap: 8px; } .annotation-nav-controls .el-button { height: 28px; padding: 0 12px; font-size: 12px; } .annotation-nav-counter { color: #606266; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; } .annotation-nav-track { position: relative; height: 16px; border-radius: 3px; background: #eef1f3; overflow: hidden; } .annotation-nav-seg { position: absolute; top: 2px; bottom: 2px; border-radius: 2px; cursor: pointer; } .annotation-nav-seg.normal { background: #67c23a; opacity: .75; } .annotation-nav-seg.abnormal { background: #f56c6c; opacity: .85; } .annotation-nav-seg.active { outline: 2px solid #409eff; outline-offset: 1px; } .annotation-nav-seg:hover { opacity: 1; } .annotation-nav-legend { display: flex; gap: 12px; margin-top: 8px; color: #909399; font-size: 12px; } .annotation-nav-legend span { display: inline-flex; align-items: center; gap: 5px; } .annotation-swatch { width: 9px; height: 9px; border-radius: 2px; display: inline-block; } .annotation-swatch.normal { background: #67c23a; } .annotation-swatch.abnormal { background: #f56c6c; } .insight-panel { min-height: 0; padding: 16px; color: #303133; background: #fff; border-color: #ebeef5; } .insight-panel .compact-heading { margin-bottom: 10px; } .readout-number { color: #409eff; font-size: 23px; } .readout-grid { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; } .readout-card { min-height: 46px; display: flex; flex-direction: row; align-items: center; justify-content: space-between; gap: 8px; padding: 9px 12px; border: 1px solid #ebeef5; border-radius: 4px; background: #fff; } .readout-card span, .data-footprint span { color: #909399; font-size: 12px; } .readout-value { min-width: 0; display: flex; flex-direction: column; align-items: flex-end; gap: 2px; } .readout-card strong { margin: 0; color: #303133; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 13px; font-weight: 500; text-align: right; } .readout-card small { margin: 0; color: #909399; font-size: 10px; white-space: nowrap; } .data-footprint { display: grid; gap: 8px; margin-top: 14px; padding-top: 12px; border-top: 1px solid #ebeef5; } .data-footprint div { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; } .data-footprint strong { max-width: 170px; overflow: hidden; color: #606266; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; font-weight: 500; text-align: right; text-overflow: ellipsis; white-space: nowrap; } .app-footer { width: min(1600px, calc(100% - 32px)); margin: 0 auto; padding: 17px 2px 22px; color: #909399; font-size: 11px; } .app-footer b { padding: 0 5px; color: #409eff; font-weight: 400; } .modal-backdrop { position: fixed; z-index: 20; inset: 0; display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(0, 0, 0, .45); backdrop-filter: blur(2px); } .period-modal { position: relative; width: min(1060px, 100%); min-height: 600px; overflow: hidden; background: #fff; border-radius: 4px; box-shadow: 0 12px 32px rgba(0, 0, 0, .16); } .period-modal-head { align-items: flex-start; padding: 22px 25px 18px; color: #303133; background: #f5f7fa; border-bottom: 1px solid #ebeef5; } .period-modal-head .eyebrow { display: block; margin-bottom: 7px; color: #409eff; } .period-modal-head h2 { font-size: 21px; } .period-modal-head p { margin-top: 7px; color: #909399; font-size: 12px; } .icon-button { width: 29px; height: 29px; border: 0; color: #909399; background: transparent; font-size: 20px; line-height: 1; } .icon-button:hover { color: #409eff; } .period-stat-row { display: flex; flex-wrap: wrap; gap: 0; border-bottom: 1px solid #ebeef5; } .period-stat-row > div { flex: 1 1 140px; min-height: 68px; display: flex; flex-direction: column; justify-content: center; gap: 5px; padding: 9px 18px; border-right: 1px solid #ebeef5; } .period-stat-row span { color: #909399; font-size: 11px; } .period-stat-row strong { color: #606266; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; font-weight: 500; } .modal-tabs { display: flex; gap: 18px; padding: 17px 25px 0; } .modal-tabs button { border: 0; border-bottom: 2px solid transparent; padding: 0 0 8px; color: #909399; background: transparent; font-size: 13px; } .modal-tabs button.active { color: #409eff; border-bottom-color: #409eff; } .period-chart { width: 100%; height: 440px; } .modal-loading { position: absolute; z-index: 2; top: 100px; bottom: 0; background: rgba(255, 255, 255, .82); } @media (max-width: 1300px) { .workspace { grid-template-columns: minmax(0, 1fr) 250px; } .query-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } .field-point { grid-column: span 2; } .field-types { grid-column: span 1; } .query-action { grid-column: span 1; } .query-row-2 .field-time-range { grid-column: 1 / -1; } } @media (max-width: 930px) { .workspace { display: flex; flex-direction: column; width: min(100% - 20px, 760px); } .insight-panel { order: 4; } .query-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .field-point, .field-types, .query-action { grid-column: span 2; } .window-field, .query-row-2 .field-time-range { grid-column: 1 / -1; } .insight-panel { min-height: auto; } .readout-grid { grid-template-columns: repeat(2, 1fr); margin: 14px -16px 0; } .chart-heading { align-items: flex-start; flex-direction: column; } } @media (max-width: 620px) { .app-header { align-items: flex-start; flex-direction: column; gap: 13px; padding: 15px; } .header-meta { width: 100%; justify-content: space-between; gap: 8px; } .header-date { max-width: 150px; } .workspace { width: calc(100% - 16px); margin-top: 10px; gap: 10px; } .query-panel, .selection-panel, .chart-panel { padding: 17px 14px 14px; } .query-grid { grid-template-columns: 1fr; gap: 12px; } .field-point, .field-types, .query-action { grid-column: span 1; } .query-row-2 .window-field, .query-row-2 .field-time-range { grid-column: 1; } .time-summary { font-size: 12px; text-align: right; } .selection-controls { align-items: flex-start; flex-direction: column; } .chart-actions { width: 100%; align-items: flex-start; flex-direction: column; gap: 10px; } .chart-status { align-self: flex-end; } .wave-chart { height: 600px; } .wave-chart.is-merge { height: 520px; } .pv-preview-row, .pv-preview-canvas { height: 118px; } .chart-toolbar-note { font-size: 11px; } .chart-point-count { display: none; } .readout-grid { grid-template-columns: 1fr; } .app-footer { width: calc(100% - 20px); align-items: flex-start; flex-direction: column; gap: 8px; line-height: 1.4; } .modal-backdrop { align-items: flex-end; padding: 0; } .period-modal { max-height: 92vh; overflow: auto; } .period-stat-row > div { flex-basis: 50%; border-bottom: 1px solid #ebeef5; } .period-chart { height: 300px; } }