styles.css 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. :root {
  2. --el-color-primary: #409eff;
  3. --el-color-primary-light-3: #79bbff;
  4. --el-color-primary-light-5: #a0cfff;
  5. --el-color-primary-light-7: #c6e2ff;
  6. --el-color-primary-light-9: #ecf5ff;
  7. --el-color-primary-dark-2: #337ecc;
  8. --el-border-radius-base: 4px;
  9. color: #303133;
  10. background: #f2f3f5;
  11. font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
  12. font-synthesis: none;
  13. text-rendering: optimizeLegibility;
  14. }
  15. * { box-sizing: border-box; }
  16. body {
  17. margin: 0;
  18. min-width: 320px;
  19. min-height: 100vh;
  20. color: #303133;
  21. background: #f2f3f5;
  22. }
  23. button, input, select { font: inherit; }
  24. button { cursor: pointer; }
  25. button:disabled, input:disabled, select:disabled { cursor: not-allowed; }
  26. h1, h2, p { margin: 0; }
  27. .app-shell { min-height: 100vh; background: #f2f3f5; }
  28. .login-shell { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 24px; background: linear-gradient(160deg, #304156 0%, #1d2b3a 100%); }
  29. .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); }
  30. .login-brand { display: flex; align-items: center; gap: 13px; margin-bottom: 6px; }
  31. .login-brand .brand-mark { flex-shrink: 0; }
  32. .login-brand h1 { color: #303133; }
  33. .login-brand .brand-kicker { color: #909399; }
  34. .login-hint { color: #909399; font-size: 13px; }
  35. .login-input { width: 100%; }
  36. .login-error { margin-top: 2px; }
  37. .login-button.el-button { width: 100%; height: 42px; margin: 6px 0 0; font-size: 15px; letter-spacing: .2em; }
  38. .header-logout.el-button { height: 32px; margin: 0; color: #d9e2ec; border-color: #7aa7d4; background: transparent; }
  39. .header-logout.el-button:hover { color: #fff; border-color: #f56c6c; background: rgba(245, 108, 108, .18); }
  40. .app-header {
  41. min-height: 72px;
  42. display: flex;
  43. align-items: center;
  44. justify-content: space-between;
  45. gap: 24px;
  46. padding: 14px clamp(18px, 4vw, 60px);
  47. color: #fff;
  48. background: #304156;
  49. border-bottom: 1px solid #253447;
  50. }
  51. .brand-lockup, .header-meta, .panel-heading, .chart-actions, .selection-controls, .time-strip-head, .time-strip-foot, .app-footer, .period-modal-head {
  52. display: flex;
  53. align-items: center;
  54. justify-content: space-between;
  55. }
  56. .brand-lockup { justify-content: flex-start; gap: 13px; }
  57. .brand-mark { width: 38px; height: 38px; display: flex; align-items: flex-end; gap: 3px; padding: 7px; background: #409eff; border-radius: 4px; }
  58. .brand-mark span { display: block; width: 5px; background: #fff; border-radius: 1px; }
  59. .brand-mark span:nth-child(1) { height: 11px; }
  60. .brand-mark span:nth-child(2) { height: 20px; }
  61. .brand-mark span:nth-child(3) { height: 26px; }
  62. .brand-kicker { margin-bottom: 3px; color: #a9c9e8; font-size: 10px; font-weight: 600; letter-spacing: .1em; }
  63. h1 { font-size: 18px; line-height: 1.35; font-weight: 600; }
  64. h2 { font-size: 18px; line-height: 1.35; font-weight: 600; }
  65. .header-meta { justify-content: flex-end; gap: 16px; color: #d9e2ec; font-size: 13px; }
  66. .live-indicator { display: inline-flex; align-items: center; gap: 7px; color: #cbd7e4; font-size: 12px; }
  67. .live-indicator i, .chart-status i { width: 7px; height: 7px; display: inline-block; border-radius: 50%; background: #67c23a; }
  68. .header-date { max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  69. .header-refresh.el-button { min-width: 68px; height: 32px; margin: 0; color: #fff; border-color: #7aa7d4; background: transparent; }
  70. .header-refresh.el-button:hover { color: #fff; border-color: #409eff; background: rgba(64, 158, 255, .18); }
  71. .spinning { animation: spin .8s linear infinite; }
  72. @keyframes spin { to { transform: rotate(360deg); } }
  73. .workspace {
  74. display: grid;
  75. grid-template-columns: minmax(0, 1fr) 292px;
  76. gap: 16px;
  77. width: min(1600px, calc(100% - 32px));
  78. margin: 20px auto 0;
  79. }
  80. .workspace-tabs { width: min(1600px, calc(100% - 32px)); margin: 0 auto; }
  81. .workspace-tabs > .el-tabs__header { margin: 18px 0 0; }
  82. .workspace-tabs .workspace { width: 100%; margin: 20px 0 0; }
  83. .heading-meta { display: flex; align-items: center; gap: 14px; }
  84. .heading-meta .live-indicator { color: #606266; }
  85. .heading-meta .header-date { color: #606266; }
  86. .heading-meta .header-refresh.el-button { height: 32px; margin: 0; color: #409eff; border-color: #a0cfff; background: transparent; }
  87. .heading-meta .header-refresh.el-button:hover { color: #fff; border-color: #409eff; background: #409eff; }
  88. .tab-empty-panel { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; min-height: 360px; margin: 20px 0 0; padding: 40px; color: #909399; background: #fff; border: 1px solid #ebeef5; border-radius: 4px; box-shadow: 0 2px 12px rgba(0, 0, 0, .04); }
  89. .tab-empty-panel h2 { color: #303133; }
  90. .alarm-page { display: flex; flex-direction: column; gap: 16px; margin: 20px 0 0; }
  91. .alarm-results, .alarm-algorithm { padding: 22px 24px 18px; }
  92. .alarm-query { display: flex; align-items: center; gap: 12px; }
  93. .alarm-query .query-control { width: 220px; }
  94. .alarm-table { margin-top: 14px; }
  95. .alarm-form { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 18px; margin-top: 6px; }
  96. .alarm-form .field { display: flex; flex-direction: column; }
  97. .alarm-form .query-control { width: 226px; }
  98. .alarm-form .field-hours { flex-direction: column; }
  99. .alarm-form .hours-row { display: flex; align-items: center; gap: 8px; }
  100. .alarm-form .field-hours .query-control { width: 150px; }
  101. .alarm-form .unit-text { color: #909399; font-size: 13px; }
  102. .alarm-scan-button { min-width: 116px; }
  103. .panel { background: #fff; border: 1px solid #ebeef5; border-radius: 4px; box-shadow: 0 2px 12px rgba(0, 0, 0, .04); }
  104. .query-panel { grid-column: 1; grid-row: 1; }
  105. .selection-panel { grid-column: 1; grid-row: 2; }
  106. .chart-panel { grid-column: 1 / -1; grid-row: 3; }
  107. .insight-panel { grid-column: 2; grid-row: 1 / span 2; align-self: stretch; }
  108. .query-panel { padding: 22px 24px 18px; }
  109. .panel-heading { align-items: flex-start; gap: 16px; }
  110. .compact-heading { margin-bottom: 18px; }
  111. .connection-badge.el-tag { height: 28px; padding: 0 10px; font-size: 12px; }
  112. .query-grid {
  113. display: grid;
  114. grid-template-columns: minmax(150px, 1.7fr) minmax(240px, 2fr) minmax(170px, 1.25fr) minmax(170px, 1.25fr) 120px;
  115. align-items: end;
  116. gap: 16px 12px;
  117. }
  118. .field { min-width: 0; }
  119. .window-field .field-label { white-space: nowrap; }
  120. .field-label { display: flex; align-items: baseline; gap: 7px; margin-bottom: 8px; color: #606266; font-size: 14px; font-weight: 500; line-height: 20px; }
  121. .field-label em { color: #909399; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 11px; font-style: normal; font-weight: 400; }
  122. .query-control { width: 100%; }
  123. .query-control.el-select, .query-control.el-date-editor { height: 40px; }
  124. .query-control.el-input-number { width: 100%; }
  125. .query-control .el-input__wrapper, .query-control.el-input-number { min-height: 40px; border-radius: 4px; }
  126. .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; }
  127. .query-control .el-tag { font-size: 13px; }
  128. .point-counts { color: #909399; }
  129. .point-counts .abnormal-count { color: #e05252; font-weight: 600; }
  130. .window-number .el-input__inner { text-align: center; }
  131. .query-button.el-button { width: 100%; height: 40px; margin: 0; border-radius: 4px; font-size: 14px; }
  132. .field-types .el-select__wrapper { flex-wrap: nowrap; }
  133. .field-types .el-select__tags { flex-wrap: nowrap; overflow: hidden; }
  134. .field-types .el-select__tags .el-tag { flex-shrink: 0; }
  135. .query-row-2 { display: contents; }
  136. .query-row-2 .field-check,
  137. .query-row-2 .field-second-group,
  138. .query-row-2 .window-field,
  139. .query-row-2 .field-time-range { min-height: 68px; }
  140. .query-row-2 .field-time-range { grid-column: span 2; }
  141. .field-check .field-label,
  142. .field-status .field-label,
  143. .field-first-cycle .field-label,
  144. .window-field .field-label,
  145. .field-time-range .field-label { white-space: nowrap; }
  146. .field-second-group { display: flex; align-items: flex-start; gap: 16px; min-width: 0; }
  147. .field-second-group .field-status { width: 120px; flex: 0 0 120px; }
  148. .field-second-group .field-first-cycle { flex: 1 1 auto; min-width: 0; }
  149. .query-checkbox.el-checkbox { height: 40px; margin-right: 20px; display: inline-flex; align-items: center; }
  150. .query-checkbox.el-checkbox:last-child { margin-right: 0; }
  151. .query-checkbox .el-checkbox__label { font-size: 14px; color: #303133; }
  152. .field-status { width: 120px; max-width: 100%; }
  153. .data-alert { margin-top: 16px; }
  154. .selection-panel { padding: 20px 24px 18px; }
  155. .time-strip { min-width: 0; }
  156. .time-strip-head { align-items: flex-start; margin-bottom: 12px; }
  157. .time-summary { padding-top: 4px; color: #909399; font-size: 13px; }
  158. .time-legend { display: inline-flex; align-items: center; gap: 4px; margin-right: 10px; color: #606266; font-size: 12px; }
  159. .time-legend i { width: 9px; height: 9px; display: inline-block; border-radius: 50%; }
  160. .legend-running { background: #2e7d32; }
  161. .legend-stopped { background: #c0c4cc; }
  162. .legend-fault { background: #f5c400; width: 3px; height: 12px; border-radius: 1px; }
  163. .legend-label { background: linear-gradient(90deg, #d4a017 0 33%, #e8792b 33% 66%, #d64545 66% 100%); }
  164. .time-summary .mono, .readout-number { color: #303133; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: 500; }
  165. .summary-divider { padding: 0 8px; color: #dcdfe6; }
  166. .timeline-canvas-host { position: relative; width: 100%; min-height: 210px; overflow: hidden; border: 1px solid #ebeef5; border-radius: 4px; background: #fff; }
  167. .timeline-canvas-host canvas { display: block; width: 100%; height: 210px; cursor: crosshair; }
  168. .timeline-canvas-host.is-loading { opacity: .7; }
  169. .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; }
  170. .time-strip-foot { gap: 16px; margin-top: 12px; }
  171. .time-foot-item { display: flex; flex-direction: column; gap: 3px; min-width: 100px; }
  172. .time-foot-item.align-right { text-align: right; }
  173. .foot-label { color: #909399; font-size: 12px; }
  174. .time-foot-item strong { color: #606266; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 13px; font-weight: 500; }
  175. .window-track { flex: 1; padding: 0 6px; }
  176. .window-track .el-slider { width: 100%; }
  177. .selection-controls { gap: 12px; margin-top: 14px; }
  178. .selection-readout { display: flex; align-items: center; gap: 8px; color: #606266; font-size: 14px; flex: 1; min-width: 0; }
  179. .selection-readout > span:last-child { line-height: 1.7; word-break: break-all; }
  180. .selection-actions { display: flex; gap: 8px; flex-shrink: 0; }
  181. .selection-readout strong { color: #303133; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-weight: 500; }
  182. .selection-accent { width: 7px; height: 7px; background: #409eff; border-radius: 50%; }
  183. .reference-badge {
  184. flex-shrink: 0;
  185. padding: 1px 8px;
  186. border: 1px solid #4d9e6f;
  187. border-radius: 10px;
  188. color: #2e7d32;
  189. background: #ecf7f1;
  190. font-size: 12px;
  191. white-space: nowrap;
  192. }
  193. .jump-select { width: 280px; }
  194. .jump-select .el-select__wrapper { min-height: 32px; }
  195. .ghost-button.chart-query { font-weight: 500; }
  196. .ghost-button.chart-query.is-dirty {
  197. border-color: #409eff;
  198. background: #ecf5ff;
  199. color: #409eff;
  200. box-shadow: 0 0 0 1px #409eff inset;
  201. }
  202. .ghost-button.el-button { height: 32px; padding: 0 14px; font-size: 13px; }
  203. .window-files { margin-top: 12px; border: 1px solid #ebeef5; border-radius: 4px; overflow: hidden; background: #fff; }
  204. .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; }
  205. .file-point-radio { margin-left: auto; }
  206. .window-files-table { width: 100%; border-collapse: collapse; font-size: 12px; }
  207. .window-files-table th, .window-files-table td { padding: 6px 10px; text-align: left; border-bottom: 1px solid #f0f2f5; white-space: nowrap; }
  208. .window-files-table th { color: #909399; font-weight: 500; background: #fafbfc; }
  209. .window-files-scroll { max-height: 180px; overflow-y: auto; }
  210. .window-files-scroll thead th { position: sticky; top: 0; z-index: 1; }
  211. .window-files-table td { color: #303133; }
  212. .window-files-table td.mono { color: #606266; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; }
  213. .window-files-table td.file-name { max-width: 280px; overflow: hidden; text-overflow: ellipsis; }
  214. .window-files-table tr:last-child td { border-bottom: 0; }
  215. .window-files-table td.actions { white-space: nowrap; }
  216. .window-files-table .file-action.el-button { height: 24px; margin: 0 2px; padding: 0 10px; font-size: 12px; }
  217. .chart-panel { min-height: 500px; padding: 22px 24px 15px; }
  218. .chart-heading { margin-bottom: 10px; }
  219. .chart-actions { gap: 15px; }
  220. .mode-switch.el-radio-group { display: inline-flex; }
  221. .mode-switch .el-radio-button__inner { font-size: 13px; }
  222. .annotation-width { display: inline-flex; align-items: baseline; gap: 5px; color: #909399; font-size: 13px; white-space: nowrap; }
  223. .annotation-width strong { color: #409eff; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 15px; font-weight: 600; }
  224. .sampling-switch { --el-switch-on-color: #409eff; }
  225. .chart-status { display: flex; align-items: center; gap: 8px; color: #909399; font-size: 13px; white-space: nowrap; }
  226. .chart-status i { width: 7px; height: 7px; }
  227. .chart-status i.busy { background: #e6a23c; animation: pulse 1s ease-in-out infinite alternate; }
  228. @keyframes pulse { to { opacity: .35; } }
  229. .wave-chart-shell { position: relative; }
  230. .chart-toolbar-note { display: flex; align-items: center; gap: 8px; height: 28px; color: #909399; font-size: 12px; }
  231. .chart-dot { width: 7px; height: 7px; border-radius: 50%; background: #409eff; }
  232. .chart-separator { width: 1px; height: 14px; margin: 0 3px; background: #dcdfe6; }
  233. .chart-point-count { margin-left: auto; color: #606266; font-weight: 500; }
  234. .wave-chart { width: 100%; height: 680px; }
  235. .pv-preview-shell { display: flex; flex-direction: column; gap: 6px; width: 100%; padding: 4px 0; }
  236. .pv-preview-row { position: relative; width: 100%; height: 204px; overflow: hidden; border: 1px solid #ebeef5; border-radius: 4px; background: #f8fafb; }
  237. .pv-preview-title { height: 24px; color: #788892; font-size: 11px; line-height: 24px; text-align: center; pointer-events: none; }
  238. .pv-preview-canvas { display: block; width: 100%; height: 180px; }
  239. .chart-empty-hint { margin-top: 7px; color: #e6a23c; font-size: 12px; }
  240. .annotation-nav { margin-top: 12px; padding: 10px 12px 12px; border: 1px solid #ebeef5; border-radius: 4px; background: #fafbfc; }
  241. .annotation-nav-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 9px; }
  242. .annotation-nav-title { color: #606266; font-size: 13px; font-weight: 600; }
  243. .annotation-nav-controls { display: flex; align-items: center; gap: 8px; }
  244. .annotation-nav-controls .el-button { height: 28px; padding: 0 12px; font-size: 12px; }
  245. .annotation-nav-counter { color: #606266; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; }
  246. .annotation-nav-track { position: relative; height: 16px; border-radius: 3px; background: #eef1f3; overflow: hidden; }
  247. .annotation-nav-seg { position: absolute; top: 2px; bottom: 2px; border-radius: 2px; cursor: pointer; }
  248. .annotation-nav-seg.normal { background: #67c23a; opacity: .75; }
  249. .annotation-nav-seg.abnormal { background: #f56c6c; opacity: .85; }
  250. .annotation-nav-seg.active { outline: 2px solid #409eff; outline-offset: 1px; }
  251. .annotation-nav-seg:hover { opacity: 1; }
  252. .annotation-nav-legend { display: flex; gap: 12px; margin-top: 8px; color: #909399; font-size: 12px; }
  253. .annotation-nav-legend span { display: inline-flex; align-items: center; gap: 5px; }
  254. .annotation-swatch { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }
  255. .annotation-swatch.normal { background: #67c23a; }
  256. .annotation-swatch.abnormal { background: #f56c6c; }
  257. .insight-panel { min-height: 0; padding: 16px; color: #303133; background: #fff; border-color: #ebeef5; }
  258. .insight-panel .compact-heading { margin-bottom: 10px; }
  259. .readout-number { color: #409eff; font-size: 23px; }
  260. .readout-grid { display: flex; flex-direction: column; gap: 8px; margin-top: 12px; }
  261. .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; }
  262. .readout-card span, .data-footprint span { color: #909399; font-size: 12px; }
  263. .readout-value { min-width: 0; display: flex; flex-direction: column; align-items: flex-end; gap: 2px; }
  264. .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; }
  265. .readout-card small { margin: 0; color: #909399; font-size: 10px; white-space: nowrap; }
  266. .data-footprint { display: grid; gap: 8px; margin-top: 14px; padding-top: 12px; border-top: 1px solid #ebeef5; }
  267. .data-footprint div { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
  268. .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; }
  269. .app-footer { width: min(1600px, calc(100% - 32px)); margin: 0 auto; padding: 17px 2px 22px; color: #909399; font-size: 11px; }
  270. .app-footer b { padding: 0 5px; color: #409eff; font-weight: 400; }
  271. .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); }
  272. .period-modal { position: relative; width: min(1180px, 100%); max-height: 92vh; overflow: auto; background: #fff; border-radius: 4px; box-shadow: 0 12px 32px rgba(0, 0, 0, .16); }
  273. .period-modal-head { align-items: flex-start; padding: 22px 25px 18px; color: #303133; background: #f5f7fa; border-bottom: 1px solid #ebeef5; }
  274. .period-modal-head .eyebrow { display: block; margin-bottom: 7px; color: #409eff; }
  275. .period-modal-head h2 { font-size: 21px; }
  276. .period-modal-head p { margin-top: 7px; color: #909399; font-size: 12px; }
  277. .icon-button { width: 29px; height: 29px; border: 0; color: #909399; background: transparent; font-size: 20px; line-height: 1; }
  278. .icon-button:hover { color: #409eff; }
  279. .period-stat-row { display: flex; flex-wrap: wrap; gap: 0; border-bottom: 1px solid #ebeef5; }
  280. .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; }
  281. .period-stat-row span { color: #909399; font-size: 11px; }
  282. .period-stat-row strong { color: #606266; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; font-weight: 500; }
  283. .period-side-notice { margin: 10px 20px 0; padding: 8px 10px; color: #8a6d3b; background: #fdf6ec; border: 1px solid #faecd8; border-radius: 4px; font-size: 12px; }
  284. .period-chart-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; padding: 12px 20px 18px; }
  285. .period-chart { width: 100%; height: clamp(420px, 58vh, 680px); min-width: 0; }
  286. .modal-loading { position: absolute; z-index: 2; top: 100px; bottom: 0; background: rgba(255, 255, 255, .82); }
  287. @media (max-width: 1300px) {
  288. .workspace { grid-template-columns: minmax(0, 1fr) 250px; }
  289. .query-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  290. .field-point { grid-column: span 2; }
  291. .field-types { grid-column: span 1; }
  292. .query-action { grid-column: span 1; }
  293. .query-row-2 .field-time-range { grid-column: 1 / -1; }
  294. }
  295. @media (max-width: 930px) {
  296. .workspace { display: flex; flex-direction: column; width: min(100% - 20px, 760px); }
  297. .insight-panel { order: 4; }
  298. .query-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  299. .field-point, .field-types, .query-action { grid-column: span 2; }
  300. .window-field,
  301. .query-row-2 .field-time-range { grid-column: 1 / -1; }
  302. .insight-panel { min-height: auto; }
  303. .readout-grid { grid-template-columns: repeat(2, 1fr); margin: 14px -16px 0; }
  304. .chart-heading { align-items: flex-start; flex-direction: column; }
  305. }
  306. @media (max-width: 620px) {
  307. .app-header { align-items: flex-start; flex-direction: column; gap: 13px; padding: 15px; }
  308. .header-meta { width: 100%; justify-content: space-between; gap: 8px; }
  309. .header-date { max-width: 150px; }
  310. .workspace { width: calc(100% - 16px); margin-top: 10px; gap: 10px; }
  311. .query-panel, .selection-panel, .chart-panel { padding: 17px 14px 14px; }
  312. .query-grid { grid-template-columns: 1fr; gap: 12px; }
  313. .field-point, .field-types, .query-action { grid-column: span 1; }
  314. .query-row-2 .window-field,
  315. .query-row-2 .field-time-range { grid-column: 1; }
  316. .time-summary { font-size: 12px; text-align: right; }
  317. .selection-controls { align-items: flex-start; flex-direction: column; }
  318. .chart-actions { width: 100%; align-items: flex-start; flex-direction: column; gap: 10px; }
  319. .chart-status { align-self: flex-end; }
  320. .wave-chart { height: 600px; }
  321. .pv-preview-row { height: 184px; }
  322. .pv-preview-canvas { height: 160px; }
  323. .chart-toolbar-note { font-size: 11px; }
  324. .chart-point-count { display: none; }
  325. .readout-grid { grid-template-columns: 1fr; }
  326. .app-footer { width: calc(100% - 20px); align-items: flex-start; flex-direction: column; gap: 8px; line-height: 1.4; }
  327. .modal-backdrop { align-items: flex-end; padding: 0; }
  328. .period-modal { max-height: 92vh; overflow: auto; }
  329. .period-stat-row > div { flex-basis: 50%; border-bottom: 1px solid #ebeef5; }
  330. .period-chart-grid { grid-template-columns: 1fr; padding: 10px 12px 14px; }
  331. .period-chart { height: clamp(360px, 62vh, 560px); }
  332. }
  333. .label-dialog .el-dialog__body { max-height: 620px; overflow-y: auto; }
  334. .label-form { display: flex; flex-direction: column; gap: 16px; }
  335. .label-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 24px; }
  336. .label-field { display: flex; align-items: center; gap: 10px; min-width: 0; }
  337. .label-field-wide { grid-column: 1 / -1; }
  338. .label-field-name { width: 64px; flex: 0 0 64px; color: #606266; font-size: 13px; font-weight: 600; }
  339. .label-field-value { flex: 1; min-width: 0; color: #303133; font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  340. .label-hour-delete { margin-left: auto; flex: 0 0 auto; }
  341. .label-field .el-date-editor,
  342. .label-field .el-input { flex: 1; min-width: 0; }
  343. .label-info-section { margin-top: 4px; }
  344. .label-info-title { color: #606266; font-size: 13px; font-weight: 600; margin-bottom: 8px; }
  345. .label-info-grid { display: grid; grid-template-columns: 120px 1fr 96px 1fr 96px 1fr; border-top: 1px solid #f0f0f0; border-left: 1px solid #f0f0f0; font-size: 12px; }
  346. .label-info-label,
  347. .label-info-value { padding: 6px 8px; border-right: 1px solid #f0f0f0; border-bottom: 1px solid #f0f0f0; min-width: 0; word-break: break-all; }
  348. .label-info-label { color: #666666; background: #fafafa; }
  349. .label-info-value { color: #1a1a1a; }
  350. .label-info-label.full { grid-column: 1; }
  351. .label-info-value.full { grid-column: 2 / -1; }
  352. .label-info-empty { color: #909399; font-size: 12px; padding: 18px 0; text-align: center; border: 1px solid #f0f0f0; border-radius: 4px; }
  353. .label-info-raw { margin: 0; max-height: 320px; overflow: auto; padding: 10px 12px; border: 1px solid #f0f0f0; border-radius: 4px; background: #fafafa; font-size: 11px; line-height: 1.55; white-space: pre-wrap; word-break: break-all; }
  354. .label-import-page { display: flex; flex-direction: column; gap: 16px; margin: 20px 0 0; }
  355. .label-import-panel { padding: 22px 24px 18px; }
  356. .label-import-note { margin: 6px 0 0; color: #909399; font-size: 12px; }
  357. .label-import-body { display: flex; flex-direction: column; gap: 16px; }
  358. .label-import-table { width: 100%; border-collapse: collapse; font-size: 13px; }
  359. .label-import-table th,
  360. .label-import-table td { padding: 10px 12px; border-bottom: 1px solid #ebeef5; text-align: left; vertical-align: middle; }
  361. .label-import-table th { color: #606266; background: #fafbfc; font-weight: 600; }
  362. .label-import-path,
  363. .label-import-mono { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; color: #303133; word-break: break-all; }
  364. .label-import-refresh.el-button { height: 32px; padding: 0 14px; font-size: 13px; border-radius: 4px; }
  365. .label-import-update.el-button { height: 40px; min-width: 120px; border-radius: 4px; font-size: 14px; }
  366. .label-import-actions { display: flex; align-items: center; gap: 12px; }
  367. .label-import-hint { color: #909399; font-size: 12px; }
  368. .label-import-progress { padding: 16px; border: 1px solid #ebeef5; border-radius: 4px; background: #fafbfc; display: flex; flex-direction: column; gap: 10px; }
  369. .label-import-stage { color: #606266; font-size: 13px; }
  370. .label-import-result { display: flex; flex-wrap: wrap; gap: 8px 24px; color: #303133; font-size: 13px; }
  371. .label-import-source { margin-right: 10px; }
  372. .label-import-error { color: #f56c6c; font-size: 13px; }
  373. .label-import-skip { color: #e6a23c; }