codexmate 0.0.38 → 0.0.40

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.
Files changed (43) hide show
  1. package/cli/builtin-proxy.js +626 -207
  2. package/cli/config-bootstrap.js +6 -1
  3. package/cli/openai-bridge.js +541 -210
  4. package/cli.js +189 -4
  5. package/package.json +1 -1
  6. package/plugins/prompt-templates/computed.mjs +61 -3
  7. package/plugins/prompt-templates/manifest.mjs +3 -0
  8. package/web-ui/app.js +14 -3
  9. package/web-ui/modules/app.computed.main-tabs.mjs +39 -30
  10. package/web-ui/modules/app.methods.claude-config.mjs +111 -9
  11. package/web-ui/modules/app.methods.index.mjs +2 -0
  12. package/web-ui/modules/app.methods.openclaw-editing.mjs +48 -0
  13. package/web-ui/modules/app.methods.openclaw-persist.mjs +13 -7
  14. package/web-ui/modules/app.methods.providers.mjs +36 -10
  15. package/web-ui/modules/app.methods.runtime.mjs +76 -1
  16. package/web-ui/modules/app.methods.startup-claude.mjs +7 -0
  17. package/web-ui/modules/app.methods.tool-config-permissions.mjs +87 -0
  18. package/web-ui/modules/config-mode.computed.mjs +3 -3
  19. package/web-ui/modules/i18n/locales/en.mjs +1140 -0
  20. package/web-ui/modules/i18n/locales/ja.mjs +1130 -0
  21. package/web-ui/modules/i18n/locales/vi.mjs +239 -0
  22. package/web-ui/modules/i18n/locales/zh.mjs +1143 -0
  23. package/web-ui/modules/i18n.dict.mjs +9 -3195
  24. package/web-ui/modules/i18n.mjs +65 -16
  25. package/web-ui/partials/index/layout-header.html +16 -46
  26. package/web-ui/partials/index/modal-openclaw-config.html +135 -71
  27. package/web-ui/partials/index/modal-webhook.html +8 -8
  28. package/web-ui/partials/index/modals-basic.html +56 -16
  29. package/web-ui/partials/index/panel-config-claude.html +51 -21
  30. package/web-ui/partials/index/panel-config-codex.html +34 -5
  31. package/web-ui/partials/index/panel-config-openclaw.html +70 -64
  32. package/web-ui/partials/index/panel-dashboard.html +62 -77
  33. package/web-ui/partials/index/panel-settings.html +28 -7
  34. package/web-ui/partials/index/panel-trash.html +14 -14
  35. package/web-ui/res/web-ui-render.precompiled.js +1783 -1386
  36. package/web-ui/styles/controls-forms.css +99 -0
  37. package/web-ui/styles/dashboard.css +46 -14
  38. package/web-ui/styles/layout-shell.css +45 -0
  39. package/web-ui/styles/navigation-panels.css +3 -3
  40. package/web-ui/styles/openclaw-structured.css +383 -33
  41. package/web-ui/styles/responsive.css +68 -0
  42. package/web-ui/styles/sessions-usage.css +105 -9
  43. package/web-ui/styles/settings-panel.css +4 -0
@@ -1,9 +1,9 @@
1
1
  .quick-section {
2
2
  margin-top: var(--spacing-md);
3
- padding: var(--spacing-sm);
3
+ padding: 0;
4
4
  border-radius: var(--radius-lg);
5
- border: 1px solid var(--color-border-soft);
6
- background: linear-gradient(140deg, rgba(255, 252, 247, 0.95), rgba(255, 255, 255, 0.6));
5
+ border: none;
6
+ background: transparent;
7
7
  }
8
8
 
9
9
  .quick-header {
@@ -27,52 +27,128 @@
27
27
  gap: var(--spacing-xs);
28
28
  }
29
29
 
30
- .quick-steps {
30
+ /* Accordion Stepper */
31
+ .quick-accordion {
31
32
  display: flex;
32
- flex-wrap: wrap;
33
- gap: var(--spacing-xs);
34
- margin-bottom: var(--spacing-sm);
33
+ flex-direction: column;
34
+ gap: 8px;
35
+ margin-top: 16px;
35
36
  }
36
37
 
37
- .quick-step {
38
- display: inline-flex;
39
- align-items: center;
40
- gap: 6px;
41
- padding: 4px 10px;
42
- border-radius: 999px;
43
- border: 1px dashed var(--color-border-soft);
38
+ .accordion-panel {
44
39
  background: var(--color-surface);
45
- font-size: var(--font-size-caption);
46
- color: var(--color-text-secondary);
40
+ border: 1px solid var(--color-border-soft);
41
+ border-radius: var(--radius-md);
42
+ overflow: hidden;
43
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
44
+ }
45
+
46
+ .accordion-panel.active {
47
+ border-color: rgba(200, 121, 99, 0.25);
48
+ box-shadow: 0 2px 12px rgba(200, 121, 99, 0.08);
49
+ }
50
+
51
+ .accordion-panel.completed {
52
+ border-color: rgba(90, 139, 106, 0.2);
53
+ }
54
+
55
+ .accordion-trigger {
56
+ width: 100%;
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 12px;
60
+ padding: 12px 16px;
61
+ background: transparent;
62
+ border: none;
63
+ cursor: pointer;
64
+ transition: background-color 0.15s ease;
65
+ text-align: left;
66
+ font-family: inherit;
67
+ }
68
+
69
+ .accordion-trigger:hover {
70
+ background: rgba(200, 121, 99, 0.04);
47
71
  }
48
72
 
49
- .step-badge {
50
- width: 20px;
51
- height: 20px;
52
- border-radius: 999px;
53
- display: inline-flex;
73
+ .accordion-step-badge {
74
+ width: 24px;
75
+ height: 24px;
76
+ border-radius: 50%;
77
+ display: flex;
54
78
  align-items: center;
55
79
  justify-content: center;
80
+ background: var(--color-border-soft);
81
+ color: var(--color-text-secondary);
82
+ font-size: 12px;
83
+ font-weight: 600;
84
+ flex-shrink: 0;
85
+ transition: all 0.2s ease;
86
+ }
87
+
88
+ .accordion-panel.active .accordion-step-badge {
56
89
  background: var(--color-brand);
57
90
  color: #fff;
58
- font-size: 12px;
59
- font-weight: var(--font-weight-secondary);
60
91
  }
61
92
 
62
- .quick-grid {
63
- display: grid;
64
- gap: var(--spacing-sm);
65
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
93
+ .accordion-panel.completed .accordion-step-badge {
94
+ background: rgba(90, 139, 106, 0.2);
95
+ color: var(--color-success);
66
96
  }
67
97
 
68
- .quick-card {
69
- background: var(--color-surface);
70
- border: 1px solid var(--color-border-soft);
71
- border-radius: var(--radius-sm);
72
- padding: var(--spacing-sm);
73
- box-shadow: var(--shadow-subtle);
98
+ .accordion-title {
99
+ font-size: 13px;
100
+ font-weight: 500;
101
+ color: var(--color-text-primary);
102
+ flex: 1;
103
+ }
104
+
105
+ .accordion-status {
106
+ font-size: 11px;
107
+ color: var(--color-text-tertiary);
108
+ max-width: 200px;
109
+ overflow: hidden;
110
+ text-overflow: ellipsis;
111
+ white-space: nowrap;
112
+ }
113
+
114
+ .accordion-chevron {
115
+ width: 16px;
116
+ height: 16px;
117
+ color: var(--color-text-muted);
118
+ transition: transform 0.2s ease;
119
+ flex-shrink: 0;
120
+ }
121
+
122
+ .accordion-panel.active .accordion-chevron {
123
+ transform: rotate(180deg);
124
+ }
125
+
126
+ .accordion-content {
127
+ padding: 0 16px 16px;
128
+ animation: accordionSlide 0.2s ease;
129
+ }
130
+
131
+ @keyframes accordionSlide {
132
+ from {
133
+ opacity: 0;
134
+ transform: translateY(-8px);
135
+ }
136
+ to {
137
+ opacity: 1;
138
+ transform: translateY(0);
139
+ }
74
140
  }
75
141
 
142
+ .accordion-actions {
143
+ display: flex;
144
+ justify-content: space-between;
145
+ gap: 8px;
146
+ margin-top: 16px;
147
+ padding-top: 16px;
148
+ border-top: 1px solid var(--color-border-soft);
149
+ }
150
+
151
+ /* Quick option checkboxes in accordion */
76
152
  .quick-option {
77
153
  display: flex;
78
154
  align-items: center;
@@ -80,10 +156,23 @@
80
156
  font-size: var(--font-size-caption);
81
157
  color: var(--color-text-secondary);
82
158
  margin-bottom: 6px;
159
+ cursor: pointer;
83
160
  }
84
161
 
85
162
  .quick-option input {
86
163
  accent-color: var(--color-brand);
164
+ width: 16px;
165
+ height: 16px;
166
+ }
167
+
168
+ /* Form hint error state */
169
+ .form-hint.hint-error {
170
+ color: var(--color-error);
171
+ }
172
+
173
+ /* Form hint error state */
174
+ .form-hint.hint-error {
175
+ color: var(--color-error);
87
176
  }
88
177
 
89
178
  .structured-section {
@@ -264,3 +353,264 @@
264
353
  word-break: break-all;
265
354
  }
266
355
 
356
+
357
+ /* OpenClaw config tab: align with current settings/card system */
358
+ .openclaw-layout {
359
+ display: grid;
360
+ gap: 10px;
361
+ padding: 0;
362
+ width: 100%;
363
+ }
364
+
365
+ .openclaw-workspace-card.settings-card,
366
+ .openclaw-configs-card {
367
+ margin: 0;
368
+ padding: 0;
369
+ width: 100%;
370
+ align-items: stretch;
371
+ border: 0;
372
+ border-radius: 0;
373
+ background: transparent;
374
+ box-shadow: none;
375
+ }
376
+
377
+ .openclaw-workspace-card.settings-card:hover,
378
+ .openclaw-configs-card:hover {
379
+ border-color: transparent;
380
+ box-shadow: none;
381
+ }
382
+
383
+ .openclaw-workspace-card.settings-card > .settings-card-body,
384
+ .openclaw-configs-card > .settings-card-body {
385
+ width: 100%;
386
+ min-width: 0;
387
+ }
388
+
389
+ /* Nested workspace card - distinguish from outer section */
390
+ .openclaw-workspace-card.settings-card > .settings-card-body > .openclaw-workspace-card {
391
+ display: flex;
392
+ flex-direction: column;
393
+ justify-content: center;
394
+ gap: 8px;
395
+ min-height: 70px;
396
+ padding: 14px 16px;
397
+ border: 1px solid rgba(137, 111, 94, 0.12);
398
+ border-radius: var(--radius-lg);
399
+ background: rgba(255, 255, 255, 0.76);
400
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
401
+ }
402
+
403
+ /* Workspace tool button */
404
+ .openclaw-tools-grid {
405
+ display: grid;
406
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
407
+ gap: 8px;
408
+ align-items: stretch;
409
+ }
410
+
411
+ .openclaw-tool-btn {
412
+ min-width: 0;
413
+ display: flex;
414
+ align-items: center;
415
+ gap: 12px;
416
+ min-height: 70px;
417
+ padding: 14px 16px;
418
+ width: 100%;
419
+ border-radius: var(--radius-lg);
420
+ border: 1px solid rgba(137, 111, 94, 0.12);
421
+ background: rgba(255, 255, 255, 0.76);
422
+ cursor: pointer;
423
+ transition: all 0.2s ease;
424
+ text-align: left;
425
+ font-family: inherit;
426
+ }
427
+
428
+ .openclaw-tool-btn:hover:not(:disabled) {
429
+ border-color: rgba(137, 111, 94, 0.18);
430
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
431
+ transform: translateY(-1px);
432
+ }
433
+
434
+ .openclaw-tool-btn:disabled {
435
+ opacity: 0.6;
436
+ cursor: not-allowed;
437
+ }
438
+
439
+ .tool-icon {
440
+ width: 40px;
441
+ height: 40px;
442
+ display: flex;
443
+ align-items: center;
444
+ justify-content: center;
445
+ font-size: 20px;
446
+ background: rgba(200, 121, 99, 0.08);
447
+ border-radius: var(--radius-md);
448
+ flex-shrink: 0;
449
+ }
450
+
451
+ .tool-content {
452
+ flex: 1;
453
+ min-width: 0;
454
+ display: flex;
455
+ flex-direction: column;
456
+ gap: 2px;
457
+ }
458
+
459
+ .tool-title {
460
+ font-size: 14px;
461
+ font-weight: 500;
462
+ color: var(--color-text-primary);
463
+ }
464
+
465
+ .tool-meta {
466
+ font-size: 11px;
467
+ color: var(--color-text-tertiary);
468
+ line-height: 1.45;
469
+ }
470
+
471
+ .tool-chevron {
472
+ width: 18px;
473
+ height: 18px;
474
+ color: var(--color-text-muted);
475
+ flex-shrink: 0;
476
+ }
477
+
478
+ .workspace-label {
479
+ font-size: 13px;
480
+ font-weight: 500;
481
+ color: var(--color-text-primary);
482
+ }
483
+
484
+ .workspace-input-group {
485
+ display: grid;
486
+ grid-template-columns: minmax(0, 1fr) max-content;
487
+ gap: 8px;
488
+ align-items: center;
489
+ width: 100%;
490
+ }
491
+
492
+ .workspace-input-group .form-input {
493
+ min-height: 36px;
494
+ width: 100%;
495
+ }
496
+
497
+ .workspace-input-group .btn-tool {
498
+ white-space: nowrap;
499
+ }
500
+
501
+ .workspace-meta {
502
+ font-size: 11px;
503
+ color: var(--color-text-tertiary);
504
+ line-height: 1.45;
505
+ }
506
+
507
+ .openclaw-card-list {
508
+ margin-bottom: 0;
509
+ }
510
+
511
+ .openclaw-card-list .card {
512
+ width: 100%;
513
+ min-height: 70px;
514
+ flex-direction: row;
515
+ align-items: center;
516
+ gap: 14px;
517
+ padding: 14px 16px;
518
+ }
519
+
520
+ .openclaw-card-list .card-icon {
521
+ display: none;
522
+ }
523
+
524
+ .openclaw-card-list .card-leading {
525
+ flex: 1 1 auto;
526
+ min-width: 0;
527
+ }
528
+
529
+ .openclaw-card-list .card-content {
530
+ flex: 1;
531
+ }
532
+
533
+ .openclaw-card-list .card-title {
534
+ white-space: normal;
535
+ overflow: visible;
536
+ }
537
+
538
+ .openclaw-card-list .card-subtitle {
539
+ white-space: normal;
540
+ overflow: visible;
541
+ }
542
+
543
+ .openclaw-card-list .card-trailing {
544
+ width: auto;
545
+ min-width: max-content;
546
+ grid-auto-flow: column;
547
+ grid-auto-columns: max-content;
548
+ align-items: center;
549
+ justify-content: end;
550
+ }
551
+
552
+ .openclaw-card-list .card {
553
+ background: rgba(255, 255, 255, 0.76);
554
+ border-color: rgba(137, 111, 94, 0.12);
555
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
556
+ }
557
+
558
+ .openclaw-card-list .card-subtitle {
559
+ white-space: normal;
560
+ display: -webkit-box;
561
+ -webkit-box-orient: vertical;
562
+ -webkit-line-clamp: 2;
563
+ overflow-wrap: anywhere;
564
+ }
565
+
566
+ @media (min-width: 1200px) {
567
+ .tool-icon {
568
+ width: 42px;
569
+ height: 42px;
570
+ font-size: 21px;
571
+ }
572
+ }
573
+
574
+ @media (max-width: 820px) {
575
+ .openclaw-tools-grid {
576
+ grid-template-columns: 1fr;
577
+ }
578
+
579
+ .workspace-input-group {
580
+ grid-template-columns: 1fr;
581
+ }
582
+
583
+ .workspace-input-group .btn-tool {
584
+ width: 100%;
585
+ }
586
+ }
587
+
588
+ @media (max-width: 520px) {
589
+ .openclaw-layout {
590
+ gap: 12px;
591
+ padding-top: 0;
592
+ }
593
+
594
+ .openclaw-tool-btn {
595
+ padding: 14px;
596
+ }
597
+
598
+ .tool-icon {
599
+ width: 36px;
600
+ height: 36px;
601
+ font-size: 18px;
602
+ }
603
+
604
+ .openclaw-card-list .card {
605
+ align-items: center;
606
+ flex-direction: row;
607
+ gap: 10px;
608
+ }
609
+
610
+ .openclaw-card-list .card-trailing {
611
+ width: auto;
612
+ min-width: max-content;
613
+ grid-auto-flow: column;
614
+ justify-content: end;
615
+ }
616
+ }
@@ -382,6 +382,10 @@ textarea:focus-visible {
382
382
  display: none;
383
383
  }
384
384
 
385
+ .openclaw-card-list .card-trailing .pill {
386
+ display: block;
387
+ }
388
+
385
389
  .auth-profile-item {
386
390
  padding: 10px;
387
391
  }
@@ -431,3 +435,67 @@ textarea:focus-visible {
431
435
  font-size: 11px;
432
436
  }
433
437
  }
438
+
439
+ @media (max-width: 820px) {
440
+ .container {
441
+ display: flex;
442
+ flex-direction: column;
443
+ height: 100vh;
444
+ min-height: 100vh;
445
+ overflow: hidden;
446
+ }
447
+
448
+ .app-shell {
449
+ grid-template-columns: 1fr;
450
+ flex: 1 1 auto;
451
+ min-height: 0;
452
+ height: auto;
453
+ overflow: hidden;
454
+ }
455
+
456
+ .side-rail {
457
+ display: none !important;
458
+ }
459
+
460
+ .lang-fab {
461
+ display: none !important;
462
+ }
463
+
464
+ .top-tabs {
465
+ display: flex !important;
466
+ flex: 0 0 auto;
467
+ width: 100%;
468
+ max-width: 100%;
469
+ margin: 8px 0 10px;
470
+ padding: 0 max(18px, calc(env(safe-area-inset-right, 0px) + 14px)) 4px max(10px, calc(env(safe-area-inset-left, 0px) + 10px));
471
+ gap: 5px;
472
+ overflow-x: auto;
473
+ overflow-y: hidden;
474
+ scroll-padding-inline: 10px 18px;
475
+ background: rgba(255, 248, 241, 0.96);
476
+ position: relative;
477
+ z-index: 30;
478
+ }
479
+
480
+ .top-tab:last-child {
481
+ margin-right: 8px;
482
+ }
483
+
484
+ .main-panel {
485
+ padding: 0 12px 16px;
486
+ height: 100%;
487
+ min-height: 0;
488
+ overflow-y: auto;
489
+ -webkit-overflow-scrolling: touch;
490
+ }
491
+
492
+ .main-panel-topbar {
493
+ position: sticky;
494
+ top: 0;
495
+ z-index: 20;
496
+ margin: 0 0 10px;
497
+ padding: 0 0 8px;
498
+ background: rgba(255, 248, 241, 0.96);
499
+ backdrop-filter: blur(14px) saturate(130%);
500
+ }
501
+ }
@@ -135,10 +135,10 @@
135
135
  .usage-hero::before {
136
136
  content: '';
137
137
  position: absolute;
138
- top: -50%;
139
- right: -20%;
140
- width: 400px;
141
- height: 400px;
138
+ top: -72px;
139
+ right: 0;
140
+ width: min(320px, 62%);
141
+ height: min(320px, 62%);
142
142
  background: radial-gradient(circle, rgba(200, 121, 99, 0.06) 0%, transparent 70%);
143
143
  pointer-events: none;
144
144
  }
@@ -175,10 +175,14 @@
175
175
  .usage-hero-active-label {
176
176
  font-weight: 600;
177
177
  color: var(--color-text-primary);
178
+ min-width: 0;
179
+ overflow-wrap: anywhere;
178
180
  }
179
181
 
180
182
  .usage-hero-active-stat {
181
183
  color: var(--color-text-tertiary);
184
+ min-width: 0;
185
+ overflow-wrap: anywhere;
182
186
  }
183
187
 
184
188
  .usage-hero-active-stat::before {
@@ -221,6 +225,15 @@
221
225
  justify-content: center;
222
226
  gap: 14px;
223
227
  flex-wrap: wrap;
228
+ min-width: 0;
229
+ overflow-wrap: anywhere;
230
+ text-align: center;
231
+ }
232
+
233
+ .usage-hero-sub > span {
234
+ min-width: 0;
235
+ max-width: 100%;
236
+ overflow-wrap: anywhere;
224
237
  }
225
238
 
226
239
  .usage-hero-delta {
@@ -372,6 +385,7 @@
372
385
  border: none;
373
386
  background: transparent;
374
387
  padding: 0;
388
+ min-width: 0;
375
389
  }
376
390
 
377
391
  .hourly-heatmap-wrapper {
@@ -380,6 +394,8 @@
380
394
  gap: 3px;
381
395
  margin-top: 14px;
382
396
  min-width: 500px;
397
+ max-width: 100%;
398
+ box-sizing: border-box;
383
399
  padding: 16px;
384
400
  border-radius: 18px;
385
401
  background: linear-gradient(135deg, rgba(255,255,255,0.8), rgba(252,248,241,0.6));
@@ -656,10 +672,14 @@
656
672
  /* ---- 图表网格 (加大间距) ---- */
657
673
  .usage-chart-grid {
658
674
  display: grid;
659
- grid-template-columns: repeat(2, 1fr);
675
+ grid-template-columns: repeat(2, minmax(0, 1fr));
660
676
  gap: 20px;
661
677
  }
662
678
 
679
+ .usage-chart-grid > * {
680
+ min-width: 0;
681
+ }
682
+
663
683
  /* 为非 paths 卡片添加容器 */
664
684
  .usage-chart-grid > .usage-card:not(.usage-paths-section):not(.usage-wave-section):not(.usage-card-hourly-heatmap) {
665
685
  padding: 16px;
@@ -704,10 +724,13 @@
704
724
  }
705
725
 
706
726
  /* ---- 响应式 ---- */
707
- @media (max-width: 960px) {
727
+ @media (max-width: 1100px) {
708
728
  .usage-chart-grid {
709
729
  grid-template-columns: 1fr;
710
730
  }
731
+ }
732
+
733
+ @media (max-width: 960px) {
711
734
 
712
735
  .usage-hero-main {
713
736
  font-size: 44px;
@@ -726,12 +749,26 @@
726
749
  }
727
750
 
728
751
  .usage-hero {
729
- padding: 24px 20px;
752
+ padding: 22px 16px;
730
753
  min-height: 140px;
754
+ gap: 16px;
755
+ }
756
+
757
+ .usage-hero::before {
758
+ top: -56px;
759
+ right: 0;
760
+ width: 220px;
761
+ height: 220px;
762
+ }
763
+
764
+ .usage-hero-active {
765
+ padding: 10px 12px;
766
+ gap: 8px 10px;
731
767
  }
732
768
 
733
769
  .usage-hero-main {
734
- font-size: 38px;
770
+ font-size: clamp(32px, 10vw, 38px);
771
+ line-height: 1.08;
735
772
  }
736
773
 
737
774
  .usage-wave-chart {
@@ -743,11 +780,70 @@
743
780
  }
744
781
 
745
782
  .hourly-heatmap-wrapper {
783
+ width: 100%;
746
784
  min-width: 100%;
747
- overflow-x: auto;
785
+ max-width: 100%;
786
+ overflow-x: visible;
787
+ padding: 12px;
788
+ gap: 2px;
789
+ }
790
+
791
+ .usage-card-hourly-heatmap {
792
+ overflow-x: visible;
793
+ }
794
+
795
+ .hourly-heatmap-header,
796
+ .hourly-heatmap-row {
797
+ gap: 2px;
798
+ }
799
+
800
+ .hourly-heatmap-corner,
801
+ .hourly-heatmap-weekday-label {
802
+ width: 28px;
803
+ }
804
+
805
+ .hourly-heatmap-weekday-label {
806
+ font-size: 10px;
807
+ padding-right: 4px;
808
+ }
809
+
810
+ .hourly-heatmap-hour-label {
811
+ font-size: 8px;
812
+ line-height: 12px;
813
+ }
814
+
815
+ .hourly-heatmap-cell {
816
+ height: 8px;
817
+ border-radius: 3px;
748
818
  }
749
819
 
750
820
  .usage-chart-grid {
751
821
  gap: 16px;
752
822
  }
753
823
  }
824
+
825
+ @media (max-width: 420px) {
826
+ .hourly-heatmap-wrapper {
827
+ padding: 10px;
828
+ gap: 1px;
829
+ }
830
+
831
+ .hourly-heatmap-header,
832
+ .hourly-heatmap-row {
833
+ gap: 1px;
834
+ }
835
+
836
+ .hourly-heatmap-corner,
837
+ .hourly-heatmap-weekday-label {
838
+ width: 24px;
839
+ }
840
+
841
+ .hourly-heatmap-weekday-label {
842
+ font-size: 9px;
843
+ padding-right: 3px;
844
+ }
845
+
846
+ .hourly-heatmap-hour-label {
847
+ font-size: 7px;
848
+ }
849
+ }