ec-web 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -16,7 +16,8 @@
16
16
  })();
17
17
  </script>
18
18
  <link rel="stylesheet" href="style.css">
19
- <script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
19
+ <script defer src="vendor/echarts-5.6.0.min.js"></script>
20
+ <script defer src="app.js"></script>
20
21
  </head>
21
22
  <body>
22
23
  <!-- 配对页 -->
@@ -47,7 +48,7 @@
47
48
 
48
49
  </nav>
49
50
  <span style="flex:1"></span>
50
- 2026-07-25 03:26
51
+ 2026-07-31 00:38
51
52
  <span id="conn-status" class="conn-status" data-i18n="status.connecting">连接中…</span>
52
53
  <button id="lang-btn" class="theme-btn" data-i18n-title="language.buttonTitle" title="切换语言">🌐</button>
53
54
  <button id="theme-btn" class="theme-btn" data-i18n-title="theme.buttonTitle" title="主题">🌗</button>
@@ -183,7 +184,7 @@
183
184
  </select>
184
185
  </label>
185
186
  </div>
186
- <div id="detail-result" style="margin-top:12px;max-height:400px;overflow-y:auto;">
187
+ <div id="detail-result" style="margin-top:12px;">
187
188
  <table id="detail-table" class="usage-table"></table>
188
189
  </div>
189
190
  <div class="detail-pagination">
@@ -251,7 +252,6 @@
251
252
  <option value="month" data-i18n="usage.explorer.filter.granularity.month">Month</option>
252
253
  </select>
253
254
  </label>
254
- <button id="exp-query-btn" data-i18n="action.query">Query</button>
255
255
  </div>
256
256
 
257
257
  <div id="usage-explorer-chart" class="usage-chart" style="height:260px"></div>
@@ -381,6 +381,5 @@
381
381
  </main>
382
382
  </div>
383
383
 
384
- <script src="app.js"></script>
385
384
  </body>
386
385
  </html>
@@ -313,6 +313,7 @@ tr:hover td { background: var(--bg2); }
313
313
  .msg-peers { width: 240px; border-right: 1px solid var(--border); flex-shrink: 0; }
314
314
  .msg-stream { flex: 1; padding: 0; }
315
315
  .msg-stream-body { padding: 12px; }
316
+ .msg-load-more, .sess-load-more { display: block; margin: 0 auto 14px; }
316
317
  .list-item {
317
318
  padding: 8px 12px; cursor: pointer; border-bottom: 1px solid var(--border);
318
319
  }
@@ -359,6 +360,28 @@ tr:hover td { background: var(--bg2); }
359
360
  .bubble.in .body { background: var(--user-bubble-bg); border-left: 2px solid var(--green); }
360
361
  .bubble.out .body { border-left: 2px solid var(--blue); }
361
362
  .msg-tag { display: inline-block; padding: 0 5px; border-radius: 3px; font-size: 10px; margin-left: 4px; background: var(--bg3); color: var(--magenta); font-weight: 400; line-height: 1.4; vertical-align: baseline; }
363
+ .msg-tag.msg-channel {
364
+ color: var(--msg-channel-color);
365
+ background: color-mix(in srgb, var(--msg-channel-color) 12%, transparent);
366
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--msg-channel-color) 20%, transparent);
367
+ font-weight: 500;
368
+ }
369
+ .msg-channel-aun { --msg-channel-color: #7655a6; }
370
+ .msg-channel-wechat { --msg-channel-color: #277a58; }
371
+ .msg-channel-wecom { --msg-channel-color: #1c7582; }
372
+ .msg-channel-feishu { --msg-channel-color: #376aa4; }
373
+ .msg-channel-dingtalk { --msg-channel-color: #2f7392; }
374
+ .msg-channel-qqbot { --msg-channel-color: #8b681f; }
375
+ .msg-channel-daemon,
376
+ .msg-channel-other { --msg-channel-color: #5f6f82; }
377
+ [data-theme="dark"] .msg-channel-aun { --msg-channel-color: #c3a6ea; }
378
+ [data-theme="dark"] .msg-channel-wechat { --msg-channel-color: #6bc99a; }
379
+ [data-theme="dark"] .msg-channel-wecom { --msg-channel-color: #63c4ce; }
380
+ [data-theme="dark"] .msg-channel-feishu { --msg-channel-color: #82b4e8; }
381
+ [data-theme="dark"] .msg-channel-dingtalk { --msg-channel-color: #79b9d6; }
382
+ [data-theme="dark"] .msg-channel-qqbot { --msg-channel-color: #d6b65f; }
383
+ [data-theme="dark"] .msg-channel-daemon,
384
+ [data-theme="dark"] .msg-channel-other { --msg-channel-color: #a8b6c6; }
362
385
 
363
386
  .msg-session-header { height: 44px; min-height: 44px; padding: 12px 16px; box-sizing: border-box; z-index: 2; }
364
387
  .msg-session-header .sh-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -379,7 +402,7 @@ tr:hover td { background: var(--bg2); }
379
402
  /* ── Sessions ── */
380
403
  .sess-list { width: 360px; border-right: 1px solid var(--border); flex-shrink: 0; display: flex; flex-direction: column; overflow: hidden; }
381
404
  .sess-filter { padding: 10px; border-bottom: 1px solid var(--border); display: flex; flex-direction: column; gap: 8px; flex-shrink: 0; }
382
- .sess-select-row { display: grid; grid-template-columns: minmax(92px, 0.72fr) minmax(0, 1.28fr); gap: 8px; }
405
+ .sess-select-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
383
406
  .sess-filter-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-height: 24px; }
384
407
  .sess-filter select {
385
408
  width: 100%; padding: 6px 8px; background: var(--bg); color: var(--fg);
@@ -402,6 +425,12 @@ tr:hover td { background: var(--bg2); }
402
425
  .bind-badge { display: inline-flex; align-items: center; gap: 3px; padding: 0 5px; border-radius: 3px; background: var(--bg3); color: var(--accent); font-size: 10px; }
403
426
  .bind-badge .dot { width: 6px; height: 6px; margin: 0; }
404
427
  .msg-count { color: var(--dim); }
428
+ .session-source-badge { display: inline-flex; align-items: center; min-height: 16px; padding: 0 5px; border-radius: 3px; background: var(--bg3); font-size: 10px; font-weight: 600; }
429
+ .session-source-badge.source-trigger { color: var(--orange); }
430
+ .session-source-badge.source-agent { color: var(--green); }
431
+ .session-source-badge.source-cli { color: var(--fg); }
432
+ .session-source-badge.source-user { color: var(--blue); }
433
+ .session-source-badge.source-unknown { color: var(--dim); }
405
434
 
406
435
  .sess-detail { flex: 1; padding: 0; overflow-y: auto; }
407
436
 
@@ -426,6 +455,7 @@ tr:hover td { background: var(--bg2); }
426
455
  .cat-chip.cat-tool_call .cat-swatch { background: var(--magenta); }
427
456
  .cat-chip.cat-tool_result .cat-swatch { background: var(--orange); }
428
457
  .cat-chip.cat-msg_send .cat-swatch { background: var(--cyan, #22d3a8); }
458
+ .cat-chip.cat-subtask .cat-swatch { background: var(--accent); }
429
459
 
430
460
  /* 视图切换位于会话信息栏内,不额外占用纵向空间 */
431
461
  .view-toggle { height: 26px; padding: 2px 11px; border-radius: 13px; border: 1px solid var(--border); background: var(--bg3); color: var(--fg); cursor: pointer; font-size: 12px; line-height: 1; font-family: inherit; white-space: nowrap; transition: background .16s ease, border-color .16s ease, color .16s ease; }
@@ -467,6 +497,7 @@ tr:hover td { background: var(--bg2); }
467
497
  .turn.cat-model_output { border-left-color: var(--blue); }
468
498
  .turn.cat-tool_call { border-left-color: var(--magenta); }
469
499
  .turn.cat-tool_result { border-left-color: var(--orange); }
500
+ .turn.cat-subtask { border-left-color: var(--accent); }
470
501
  .turn.cat-system { border-left-color: var(--dim); }
471
502
 
472
503
  .turn-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 6px; }
@@ -475,6 +506,7 @@ tr:hover td { background: var(--bg2); }
475
506
  .turn.cat-model_output .turn-role { color: var(--blue); }
476
507
  .turn.cat-tool_call .turn-role { color: var(--magenta); }
477
508
  .turn.cat-tool_result .turn-role { color: var(--orange); }
509
+ .turn.cat-subtask .turn-role { color: var(--accent); }
478
510
  .turn.cat-system .turn-role { color: var(--dim); }
479
511
  .turn-time { font-size: 11px; color: var(--dim); }
480
512
  .turn-usage { font-size: 11px; color: var(--dim); margin-left: auto; }
@@ -492,7 +524,9 @@ tr:hover td { background: var(--bg2); }
492
524
  .blk-tool { background: var(--bg2); border: 1px solid var(--border); border-radius: 8px; padding: 8px 10px; }
493
525
  .tool-head { cursor: pointer; font-size: 12px; }
494
526
  .blk-tool[open] .tool-head { margin-bottom: 4px; }
495
- .tool-params:empty { display: none; }
527
+ .tool-params { --collapse-fade-bg: var(--bg2); }
528
+ .tool-params-body { --collapse-preview-lines: 12; line-height: 1.5; }
529
+ .tool-params-body.is-collapsed { max-height: calc(var(--collapse-preview-lines) * 1.5em); }
496
530
  .tool-name { font-weight: 600; color: var(--accent); font-family: ui-monospace, "SF Mono", Consolas, monospace; }
497
531
  .tool-param { display: flex; gap: 8px; margin-top: 3px; font-size: 12px; align-items: baseline; }
498
532
  .tool-param .pk { color: var(--dim); flex-shrink: 0; min-width: 64px; }
@@ -502,17 +536,73 @@ tr:hover td { background: var(--bg2); }
502
536
  white-space: pre-wrap; display: block; flex: 1;
503
537
  }
504
538
 
505
- /* 工具结果块(默认展开,可折叠) */
539
+ /* 长结果与模型输出共用的折叠交互 */
506
540
  .blk-result { font-size: 12px; }
507
541
  .blk-result summary { cursor: pointer; color: var(--dim); }
508
542
  .blk-result.err summary { color: var(--red); }
543
+ .collapse-content { position: relative; }
544
+ .result-content { --collapse-fade-bg: var(--bg); margin-top: 6px; }
545
+ .collapse-content::after {
546
+ content: ''; position: absolute; right: 0; bottom: 0; left: 0; height: 36px;
547
+ display: none; pointer-events: none;
548
+ background: linear-gradient(to bottom, transparent, var(--collapse-fade-bg, var(--bg)));
549
+ }
550
+ .result-content::after { right: 1px; bottom: 1px; left: 1px; }
551
+ .collapse-content.is-collapsed::after { display: block; }
552
+ .collapse-body { overflow: hidden; transition: max-height .26s cubic-bezier(.2, .75, .25, 1); }
509
553
  .result-body {
510
- margin-top: 6px; padding: 8px 10px; background: var(--bg); border: 1px solid var(--border);
511
- border-radius: 6px; white-space: pre-wrap; word-break: break-word; max-height: 280px; overflow-y: auto;
554
+ --collapse-preview-lines: 12;
555
+ padding: 8px 10px; background: var(--bg); border: 1px solid var(--border);
556
+ border-radius: 6px; white-space: pre-wrap; word-break: break-word;
512
557
  font-family: ui-monospace, "SF Mono", Consolas, monospace; font-size: 11.5px; line-height: 1.5;
513
558
  }
559
+ .result-body.is-collapsed {
560
+ max-height: calc(var(--collapse-preview-lines) * 1.5em + 16px);
561
+ }
562
+ .model-output-body,
563
+ .user-input-body {
564
+ --collapse-preview-lines: 12;
565
+ white-space: pre-wrap; word-break: break-word; line-height: 1.55;
566
+ }
567
+ .model-output-body.is-collapsed,
568
+ .user-input-body.is-collapsed { max-height: calc(var(--collapse-preview-lines) * 1.55em); }
569
+ .chat-bubble.model-output-content { --collapse-fade-bg: var(--bg3); }
570
+ .chat-bubble.user-input-content { --collapse-fade-bg: var(--user-bubble-bg); }
571
+ .collapse-arrow-toggle {
572
+ position: absolute; bottom: 0; left: 42%; z-index: 1; display: inline-flex;
573
+ align-items: center; justify-content: center; width: 18px; height: 18px; padding: 0;
574
+ border: 0; border-radius: 50%; background: var(--collapse-fade-bg, var(--bg)); color: var(--dim); cursor: pointer;
575
+ box-shadow: 0 0 0 1px var(--collapse-fade-bg, var(--bg));
576
+ transition: color .16s ease, transform .16s ease;
577
+ }
578
+ .collapse-arrow-toggle:hover { color: var(--fg); }
579
+ .collapse-arrow-toggle:active { transform: translateY(1px); }
580
+ .collapse-arrow-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
581
+ .collapse-arrow-icon {
582
+ width: 6px; height: 6px; margin-top: -2px; border-right: 1.5px solid currentColor;
583
+ border-bottom: 1.5px solid currentColor; transform: rotate(45deg); transform-origin: center;
584
+ transition: transform .22s cubic-bezier(.2, .75, .25, 1);
585
+ }
586
+ .collapse-arrow-toggle[aria-expanded="true"] .collapse-arrow-icon { transform: rotate(225deg); }
514
587
  .blk-result.err .result-body { border-color: var(--red); }
515
588
 
589
+ @media (prefers-reduced-motion: reduce) {
590
+ .collapse-body, .collapse-arrow-toggle, .collapse-arrow-icon { transition: none; }
591
+ }
592
+
593
+ /* Runner 子任务:每个 task 聚合成一个实时更新的生命周期条目 */
594
+ .blk-subtask { padding: 9px 11px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg2); }
595
+ .subtask-main { display: grid; grid-template-columns: 8px max-content minmax(0, 1fr); align-items: center; gap: 8px; min-width: 0; }
596
+ .subtask-status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--orange); }
597
+ .status-completed .subtask-status-dot { background: var(--green); }
598
+ .status-failed .subtask-status-dot,
599
+ .status-killed .subtask-status-dot { background: var(--red); }
600
+ .status-stopped .subtask-status-dot { background: var(--dim); }
601
+ .subtask-status { color: var(--dim); font-size: 11px; white-space: nowrap; }
602
+ .subtask-title { min-width: 0; overflow-wrap: anywhere; color: var(--fg); font-size: 12px; font-weight: 600; }
603
+ .subtask-meta { display: flex; flex-wrap: wrap; gap: 6px; margin: 5px 0 0 16px; color: var(--dim); font-size: 11px; }
604
+ .subtask-progress { margin: 6px 0 0 16px; color: var(--dim); font-size: 12px; line-height: 1.45; overflow-wrap: anywhere; }
605
+
516
606
  /* ── Cache 视图 ── */
517
607
  #view-cache { padding: 16px 18px; }
518
608
  .cache-cards {
@@ -564,39 +654,51 @@ tr:hover td { background: var(--bg2); }
564
654
  .usage-subpanel.active { display: flex; flex-direction: column; }
565
655
  #usage-overview { overflow-y: auto; padding: 16px; }
566
656
  .overview-filters {
657
+ display: flex;
658
+ align-items: center;
659
+ gap: 10px;
660
+ flex-wrap: wrap;
567
661
  margin-bottom: 16px;
568
662
  padding: 12px;
569
663
  background: var(--bg2);
570
664
  border: 1px solid var(--border);
571
665
  border-radius: 8px;
572
666
  }
573
- .ov-range-tabs {
667
+ .ov-range-tabs,
668
+ .exp-range-tabs {
574
669
  display: flex;
575
- gap: 8px;
670
+ gap: 2px;
671
+ width: fit-content;
672
+ max-width: 100%;
673
+ padding: 2px;
576
674
  flex-wrap: wrap;
577
- }
578
- .ov-range-btn {
579
- padding: 6px 14px;
580
- font-size: 12px;
581
- border: 1px solid var(--border);
582
675
  background: var(--bg3);
583
- color: var(--fg);
676
+ border-radius: 6px;
677
+ }
678
+ .ov-range-btn,
679
+ .exp-range-btn {
680
+ padding: 4px 12px;
681
+ border: none;
584
682
  border-radius: 5px;
683
+ background: transparent;
684
+ color: var(--dim);
585
685
  cursor: pointer;
586
- transition: all 0.2s;
686
+ font-family: inherit;
687
+ font-size: 12px;
688
+ font-weight: 600;
689
+ line-height: 1.4;
690
+ white-space: nowrap;
691
+ transition: background .16s ease, color .16s ease;
587
692
  }
588
- .ov-range-btn:hover {
589
- border-color: var(--accent);
693
+ .ov-range-btn:hover,
694
+ .exp-range-btn:hover { color: var(--fg); }
695
+ .ov-range-btn.active,
696
+ .exp-range-btn.active {
697
+ background: var(--bg2);
590
698
  color: var(--accent);
591
699
  }
592
- .ov-range-btn.active {
593
- background: var(--accent);
594
- color: white;
595
- border-color: var(--accent);
596
- }
597
700
  .ov-custom-date {
598
701
  display: none;
599
- margin-top: 12px;
600
702
  gap: 10px;
601
703
  align-items: center;
602
704
  }
@@ -1111,6 +1213,13 @@ tr.ag-disabled .ag-name { color: var(--dim); }
1111
1213
  border-color: var(--accent);
1112
1214
  box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 14%, transparent);
1113
1215
  }
1216
+ .trig-baseagent-note {
1217
+ margin: -2px 0 12px;
1218
+ color: #c56600;
1219
+ font-size: 11px;
1220
+ line-height: 1.35;
1221
+ }
1222
+ [data-theme="dark"] .trig-baseagent-note { color: #f0a24a; }
1114
1223
  .ag-edit-channel-list {
1115
1224
  display: flex;
1116
1225
  flex-direction: column;
@@ -1446,6 +1555,8 @@ tr.ag-disabled .ag-name { color: var(--dim); }
1446
1555
  .ag-msg .text-out { color: var(--msg-out); font-weight: 500; }
1447
1556
  .ag-msg .mtag { display: inline-block; padding: 0 4px; margin: 0 2px; border-radius: 3px; font-size: 10px; background: var(--bg3); color: var(--magenta); vertical-align: middle; }
1448
1557
  .ag-msg .mtag-reply { color: var(--green); font-weight: 700; }
1558
+ /* 渠道标:非 AUN 渠道才渲染,用冷色和消息标记区分开 */
1559
+ .ag-msg .mtag-channel { color: var(--blue); font-weight: 600; }
1449
1560
  .ag-msg .mtags { color: var(--magenta); font-size: 10.5px; }
1450
1561
  .ag-path { font-family: ui-monospace, Consolas, monospace; font-size: 10.5px; color: var(--dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 70vw; }
1451
1562
 
@@ -1460,6 +1571,7 @@ tr.ag-disabled .ag-name { color: var(--dim); }
1460
1571
  .tip-kind { margin: 0 2px; font-weight: 600; }
1461
1572
  .tip-kind-reply { color: var(--green); font-weight: 700; }
1462
1573
  .tip-flag { margin: 0 2px; padding: 0 4px; border-radius: 3px; background: var(--bg3); color: var(--magenta); font-size: 10.5px; }
1574
+ .tip-flag-channel { color: var(--blue); font-weight: 600; }
1463
1575
  .tip-row b { color: var(--orange); font-weight: 600; }
1464
1576
 
1465
1577
 
@@ -1948,55 +2060,28 @@ tr.ag-disabled .ag-name { color: var(--dim); }
1948
2060
 
1949
2061
  /* ── Explorer time filters (类似总览的时间选择) ── */
1950
2062
  .exp-time-filters {
2063
+ display: flex;
2064
+ align-items: center;
2065
+ gap: 10px;
2066
+ flex-wrap: wrap;
1951
2067
  margin-bottom: 16px;
1952
2068
  padding: 12px;
1953
- background: var(--bg3);
2069
+ background: var(--bg2);
1954
2070
  border-radius: 8px;
1955
2071
  border: 1px solid var(--border);
1956
2072
  }
1957
2073
 
1958
- .exp-range-tabs {
1959
- display: flex;
1960
- gap: 8px;
1961
- flex-wrap: wrap;
1962
- margin-bottom: 8px;
1963
- }
1964
-
1965
- .exp-range-btn {
1966
- padding: 6px 12px;
1967
- font-size: 12px;
1968
- border: 1px solid var(--border);
1969
- background: var(--bg2);
1970
- color: var(--fg);
1971
- border-radius: 6px;
1972
- cursor: pointer;
1973
- transition: all 0.2s;
1974
- }
1975
-
1976
- .exp-range-btn:hover {
1977
- background: var(--bg3);
1978
- border-color: var(--accent);
1979
- }
1980
-
1981
- .exp-range-btn.active {
1982
- background: var(--accent);
1983
- color: white;
1984
- border-color: var(--accent);
1985
- }
1986
-
1987
2074
  .exp-custom-date {
1988
2075
  display: flex;
1989
- gap: 12px;
1990
- align-items: flex-end;
2076
+ gap: 10px;
2077
+ align-items: center;
1991
2078
  flex-wrap: wrap;
1992
- padding-top: 8px;
1993
- border-top: 1px solid var(--border);
1994
2079
  }
1995
2080
 
1996
2081
  .exp-custom-date label {
1997
2082
  display: flex;
1998
- flex-direction: column;
1999
- gap: 4px;
2083
+ align-items: center;
2084
+ gap: 6px;
2000
2085
  font-size: 12px;
2001
2086
  color: var(--dim);
2002
2087
  }
@@ -2026,6 +2111,11 @@ tr.ag-disabled .ag-name { color: var(--dim); }
2026
2111
  opacity: 0.9;
2027
2112
  }
2028
2113
 
2114
+ @media (max-width: 720px) {
2115
+ .ov-custom-date,
2116
+ .exp-custom-date { flex-basis: 100%; }
2117
+ }
2118
+
2029
2119
  /* ── Explorer filters (优化后的样式) ── */
2030
2120
  .explorer-filters {
2031
2121
  display: flex;
@@ -2034,7 +2124,7 @@ tr.ag-disabled .ag-name { color: var(--dim); }
2034
2124
  flex-wrap: wrap;
2035
2125
  margin-bottom: 16px;
2036
2126
  padding: 12px;
2037
- background: var(--bg3);
2127
+ background: var(--bg2);
2038
2128
  border-radius: 8px;
2039
2129
  border: 1px solid var(--border);
2040
2130
  }
@@ -2161,14 +2251,14 @@ tr.ag-disabled .ag-name { color: var(--dim); }
2161
2251
  .mon-toolbar { display: flex; align-items: center; gap: 12px; flex-shrink: 0; }
2162
2252
  .mon-toolbar-label { font-size: 12px; color: var(--dim); font-weight: 500; }
2163
2253
  .mon-range-tabs { display: flex; gap: 2px; background: var(--bg3); border-radius: 6px; padding: 2px; }
2164
- .mon-range { padding: 4px 12px; border: none; background: none; border-radius: 5px; font-size: 12px; font-family: inherit; color: var(--dim); cursor: pointer; }
2254
+ .mon-range { padding: 4px 12px; border: none; background: none; border-radius: 5px; font-family: inherit; font-size: 12px; font-weight: 600; line-height: 1.4; color: var(--dim); cursor: pointer; }
2165
2255
  .mon-range:hover { color: var(--fg); }
2166
- .mon-range.active { background: var(--accent); color: #fff; }
2167
- .mon-row2 { display: flex; gap: 14px; }
2256
+ .mon-range.active { background: var(--bg2); color: var(--accent); }
2257
+ .mon-row2 { display: flex; flex: 0 0 auto; gap: 14px; }
2168
2258
  .mon-chart { flex: 1; height: 250px; min-width: 0; background: var(--bg2); border: 1px solid var(--border); border-radius: 10px; padding: 6px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); }
2169
2259
  @media (max-width: 900px) {
2170
2260
  .mon-row2 { flex-direction: column; }
2171
- .mon-chart { height: 190px; }
2261
+ .mon-chart { flex: 0 0 190px; height: 190px; }
2172
2262
  .mon-toolbar { flex-wrap: wrap; }
2173
2263
  }
2174
2264