| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331 |
- :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; }
- }
|