openclacky 1.5.7 → 1.5.9

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +71 -0
  3. data/README.md +3 -3
  4. data/README_CN.md +2 -2
  5. data/README_JA.md +2 -2
  6. data/lib/clacky/agent.rb +2 -3
  7. data/lib/clacky/agent_config.rb +40 -18
  8. data/lib/clacky/brand_config.rb +12 -7
  9. data/lib/clacky/cli.rb +0 -1
  10. data/lib/clacky/default_extensions/ext-studio/ext.yml +1 -1
  11. data/lib/clacky/default_extensions/ext-studio/panels/studio/view.js +27 -14
  12. data/lib/clacky/default_extensions/ext-studio/skills/ext-develop/SKILL.md +22 -5
  13. data/lib/clacky/default_extensions/general/ext.yml +1 -1
  14. data/lib/clacky/extension/api_loader.rb +4 -11
  15. data/lib/clacky/extension/packager.rb +1 -1
  16. data/lib/clacky/extension/scaffold/templates/hello/test/handler_test.rb.erb +22 -0
  17. data/lib/clacky/extension/verifier.rb +1 -1
  18. data/lib/clacky/media/generator.rb +3 -3
  19. data/lib/clacky/message_format/anthropic.rb +19 -2
  20. data/lib/clacky/message_format/bedrock.rb +8 -3
  21. data/lib/clacky/message_history.rb +1 -1
  22. data/lib/clacky/providers.rb +159 -105
  23. data/lib/clacky/server/channel/adapters/feishu/ws_client.rb +6 -0
  24. data/lib/clacky/server/http_server.rb +67 -79
  25. data/lib/clacky/session_manager.rb +7 -0
  26. data/lib/clacky/skill_loader.rb +4 -0
  27. data/lib/clacky/tools/base.rb +11 -1
  28. data/lib/clacky/tools/edit.rb +28 -0
  29. data/lib/clacky/tools/terminal.rb +5 -0
  30. data/lib/clacky/tools/trash_manager.rb +1 -1
  31. data/lib/clacky/ui2/components/inline_input.rb +1 -0
  32. data/lib/clacky/ui2/components/input_area.rb +1 -0
  33. data/lib/clacky/ui2/components/modal_component.rb +0 -1
  34. data/lib/clacky/ui2/components/todo_area.rb +1 -0
  35. data/lib/clacky/ui2/line_editor.rb +1 -0
  36. data/lib/clacky/ui2/markdown_renderer.rb +5 -1
  37. data/lib/clacky/ui2/ui_controller.rb +1 -0
  38. data/lib/clacky/utils/model_pricing.rb +62 -27
  39. data/lib/clacky/utils/string_matcher.rb +29 -2
  40. data/lib/clacky/version.rb +1 -1
  41. data/lib/clacky/web/app.css +278 -221
  42. data/lib/clacky/web/components/chat-navigator.js +1 -1
  43. data/lib/clacky/web/features/billing/store.js +3 -3
  44. data/lib/clacky/web/features/billing/view.js +5 -61
  45. data/lib/clacky/web/features/extensions/store.js +65 -41
  46. data/lib/clacky/web/features/extensions/view.js +74 -10
  47. data/lib/clacky/web/features/new-session/view.js +24 -0
  48. data/lib/clacky/web/features/version/view.js +2 -2
  49. data/lib/clacky/web/i18n.js +36 -22
  50. data/lib/clacky/web/index.html +17 -17
  51. data/lib/clacky/web/projects.js +83 -285
  52. data/lib/clacky/web/sessions.js +151 -17
  53. data/lib/clacky/web/settings.js +6 -1
  54. metadata +2 -1
@@ -30,7 +30,7 @@
30
30
  --color-border-strong: #d4d4ce; /* hover / active outline */
31
31
 
32
32
  /* Text — 4-tier hierarchy */
33
- --color-text-primary: #1a1b1e; /* titles, important content */
33
+ --color-text-primary: #344054; /* titles, important content */
34
34
  --color-text-secondary: #56585e; /* body text */
35
35
  --color-text-tertiary: #8a8d94; /* captions, meta */
36
36
  --color-text-muted: #a8abb2; /* placeholders, disabled */
@@ -55,6 +55,7 @@
55
55
  --color-warning: #f59e0b;
56
56
  --color-warning-bg: #fffbeb;
57
57
  --color-warning-border: #fcd34d;
58
+ --color-warning-text: #92400e;
58
59
 
59
60
  --color-info: #0ea5e9;
60
61
  --color-secondary: #10b981;
@@ -113,7 +114,7 @@
113
114
  --color-border-secondary: #1e2229;
114
115
  --color-border-strong: #3a3f4a;
115
116
 
116
- --color-text-primary: #e8eaee;
117
+ --color-text-primary: #c2cad1;
117
118
  --color-text-secondary: #a4a9b4;
118
119
  --color-text-tertiary: #6b707b;
119
120
  --color-text-muted: #565b66;
@@ -137,6 +138,7 @@
137
138
  --color-warning: #fbbf24;
138
139
  --color-warning-bg: #2d1f00;
139
140
  --color-warning-border: #4d3200;
141
+ --color-warning-text: #fcd34d;
140
142
 
141
143
  --color-info: #38bdf8;
142
144
  --color-secondary: #34d399;
@@ -190,6 +192,7 @@
190
192
  --color-warning: #fbbf24;
191
193
  --color-warning-bg: #2d1f00;
192
194
  --color-warning-border: #4d3200;
195
+ --color-warning-text: #fcd34d;
193
196
 
194
197
  --color-info: #38bdf8;
195
198
  --color-secondary: #34d399;
@@ -242,6 +245,7 @@
242
245
  --color-warning: #f59e0b;
243
246
  --color-warning-bg: #fffbeb;
244
247
  --color-warning-border: #fcd34d;
248
+ --color-warning-text: #92400e;
245
249
 
246
250
  --color-info: #0ea5e9;
247
251
  --color-secondary: #10b981;
@@ -294,6 +298,7 @@
294
298
  --color-warning: #fbbf24;
295
299
  --color-warning-bg: #2d1f00;
296
300
  --color-warning-border: #4d3200;
301
+ --color-warning-text: #fcd34d;
297
302
 
298
303
  --color-info: #38bdf8;
299
304
  --color-secondary: #34d399;
@@ -644,7 +649,6 @@ body {
644
649
  }
645
650
  #header-cmdbar:hover {
646
651
  border-color: var(--color-accent-primary);
647
- background: var(--color-bg-hover);
648
652
  color: var(--color-text-secondary);
649
653
  }
650
654
  #header-cmdbar svg {
@@ -807,7 +811,11 @@ body {
807
811
  margin-bottom: 6px;
808
812
  border-bottom: 1px solid var(--color-border-secondary);
809
813
  }
810
- #ext-slot-sidebar-nav { padding: 10px 0 0px; }
814
+ #ext-slot-sidebar-nav {
815
+ margin-top: 10px;
816
+ padding: 10px 0 0px;
817
+ border-top: 1px solid var(--color-border-secondary);
818
+ }
811
819
  #ext-slot-sidebar-nav-bottom {
812
820
  padding: 8px 0 10px;
813
821
  margin-top: 6px;
@@ -821,7 +829,7 @@ body {
821
829
  gap: 8px;
822
830
  padding: 14px 8px 7px;
823
831
  font-family: var(--font-mono);
824
- font-size: 0.65625rem;
832
+ font-size: 0.75rem;
825
833
  font-weight: 500;
826
834
  color: var(--color-text-tertiary);
827
835
  text-transform: uppercase;
@@ -835,6 +843,11 @@ body {
835
843
  white-space: nowrap;
836
844
  flex: 0 0 auto;
837
845
  }
846
+ .sidebar-divider [data-group-title] {
847
+ display: inline-flex;
848
+ align-items: center;
849
+ gap: 0.25rem;
850
+ }
838
851
  /* Pure label dividers (Config / My Data / Creator) get a trailing rule line */
839
852
  .sidebar-divider:not(:has(.sidebar-divider-actions))::after {
840
853
  content: "";
@@ -1511,8 +1524,7 @@ body {
1511
1524
  display: flex;
1512
1525
  align-items: center;
1513
1526
  gap: 0.25rem;
1514
- color: var(--color-text-primary);
1515
- font-size: 0.8125rem;
1527
+ font-size: 0.8325rem;
1516
1528
  font-weight: 400;
1517
1529
  transition: color var(--transition-fast), font-weight var(--transition-fast);
1518
1530
  }
@@ -1523,6 +1535,13 @@ body {
1523
1535
  text-overflow: ellipsis;
1524
1536
  white-space: nowrap;
1525
1537
  }
1538
+ .session-item .session-name .session-cron-icon {
1539
+ flex-shrink: 0;
1540
+ margin-top: 0.0625rem;
1541
+ }
1542
+ .session-item .session-name .session-group-icon {
1543
+ flex-shrink: 0;
1544
+ }
1526
1545
  .session-item .session-name .session-badge {
1527
1546
  flex-shrink: 0;
1528
1547
  }
@@ -1677,6 +1696,86 @@ body {
1677
1696
  color: var(--color-error);
1678
1697
  }
1679
1698
 
1699
+ /* Submenu for "Move to Project" */
1700
+ .session-actions-menu-item--has-submenu {
1701
+ position: relative;
1702
+ }
1703
+ .session-actions-menu-item--has-submenu.active {
1704
+ background: var(--color-bg-hover);
1705
+ }
1706
+ .session-actions-menu-arrow {
1707
+ margin-left: auto;
1708
+ display: inline-flex;
1709
+ align-items: center;
1710
+ color: var(--color-text-tertiary);
1711
+ flex-shrink: 0;
1712
+ }
1713
+ .session-actions-submenu {
1714
+ background: var(--color-bg-secondary);
1715
+ border: 1px solid var(--color-border-primary);
1716
+ border-radius: 8px;
1717
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08), 0 2px 6px rgba(0, 0, 0, 0.04);
1718
+ padding: 0.25rem;
1719
+ min-width: 10rem;
1720
+ max-height: 18rem;
1721
+ overflow-y: auto;
1722
+ z-index: 1002;
1723
+ animation: fadeIn 0.15s ease;
1724
+ }
1725
+ [data-theme="dark"] .session-actions-submenu {
1726
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5), 0 2px 6px rgba(0, 0, 0, 0.3);
1727
+ }
1728
+ .session-actions-submenu-item {
1729
+ display: flex;
1730
+ align-items: center;
1731
+ gap: 0.5rem;
1732
+ padding: 0.375rem 0.625rem;
1733
+ border-radius: 5px;
1734
+ cursor: pointer;
1735
+ color: var(--color-text-primary);
1736
+ font-size: 0.8125rem;
1737
+ line-height: 1.4;
1738
+ transition: background .12s ease;
1739
+ user-select: none;
1740
+ }
1741
+ .session-actions-submenu-icon {
1742
+ display: inline-flex;
1743
+ align-items: center;
1744
+ justify-content: center;
1745
+ width: 0.875rem;
1746
+ height: 0.875rem;
1747
+ color: var(--color-text-secondary);
1748
+ flex-shrink: 0;
1749
+ }
1750
+ .session-actions-submenu-label {
1751
+ flex: 1;
1752
+ min-width: 0;
1753
+ overflow: hidden;
1754
+ text-overflow: ellipsis;
1755
+ white-space: nowrap;
1756
+ }
1757
+ .session-actions-submenu-check {
1758
+ color: var(--color-accent-primary);
1759
+ font-size: 0.75rem;
1760
+ flex-shrink: 0;
1761
+ }
1762
+ .session-actions-submenu-item:hover {
1763
+ background: var(--color-bg-hover);
1764
+ }
1765
+ .session-actions-submenu-item:hover .session-actions-submenu-icon {
1766
+ color: var(--color-text-primary);
1767
+ }
1768
+ .session-actions-submenu-divider {
1769
+ height: 1px;
1770
+ background: var(--color-border-secondary);
1771
+ margin: 0.25rem 0;
1772
+ }
1773
+ .session-actions-submenu-hint {
1774
+ padding: 0.375rem 0.625rem;
1775
+ font-size: 0.75rem;
1776
+ color: var(--color-text-tertiary);
1777
+ }
1778
+
1680
1779
  @keyframes fadeIn {
1681
1780
  from { opacity: 0; transform: translateY(-0.25rem); }
1682
1781
  to { opacity: 1; transform: translateY(0); }
@@ -1805,7 +1904,7 @@ body {
1805
1904
  opacity: 1;
1806
1905
  }
1807
1906
  .task-item.active {
1808
- background: var(--color-accent-soft);
1907
+ background: var(--color-bg-hover);
1809
1908
  }
1810
1909
  .task-item.active::before {
1811
1910
  content: "";
@@ -2802,7 +2901,7 @@ body {
2802
2901
  position: absolute;
2803
2902
  top: 0.5rem;
2804
2903
  right: 0.5rem;
2805
- z-index: 8;
2904
+ z-index: 100;
2806
2905
  display: inline-flex;
2807
2906
  align-items: center;
2808
2907
  justify-content: center;
@@ -7425,7 +7524,7 @@ body {
7425
7524
  font-size: 0.625rem;
7426
7525
  font-weight: 500;
7427
7526
  padding: 2px 0.4375rem;
7428
- border-radius: 10px;
7527
+ border-radius: 4px;
7429
7528
  letter-spacing: 0.3px;
7430
7529
  flex-shrink: 0;
7431
7530
  }
@@ -7908,6 +8007,27 @@ body {
7908
8007
  text-align: center;
7909
8008
  padding: 1.5rem 0;
7910
8009
  }
8010
+ .extensions-load-more {
8011
+ display: block;
8012
+ width: 100%;
8013
+ padding: 0.6rem;
8014
+ margin-top: 0.5rem;
8015
+ background: var(--color-bg-secondary);
8016
+ border: 1px solid var(--color-border-primary);
8017
+ border-radius: 8px;
8018
+ color: var(--color-text-secondary);
8019
+ font-size: 0.8125rem;
8020
+ cursor: pointer;
8021
+ transition: border-color .15s, color .15s;
8022
+ }
8023
+ .extensions-load-more:hover:not(:disabled) {
8024
+ border-color: var(--color-text-muted);
8025
+ color: var(--color-text-primary);
8026
+ }
8027
+ .extensions-load-more:disabled {
8028
+ opacity: 0.6;
8029
+ cursor: default;
8030
+ }
7911
8031
  .extension-card {
7912
8032
  background: var(--color-bg-secondary);
7913
8033
  border: 1px solid var(--color-border-primary);
@@ -7982,6 +8102,29 @@ body {
7982
8102
  border-radius: 4px;
7983
8103
  padding: 0.0625rem 0.375rem;
7984
8104
  }
8105
+ .extension-verified {
8106
+ font-size: 0.625rem;
8107
+ color: var(--color-success, #16a34a);
8108
+ background: var(--color-success-bg, rgba(22,163,74,0.12));
8109
+ border-radius: 4px;
8110
+ padding: 0.2rem 0.375rem;
8111
+ }
8112
+ .extension-unverified-banner {
8113
+ font-size: 0.75rem;
8114
+ color: var(--color-warning-text, #92400e);
8115
+ background: var(--color-warning-bg, #fffbeb);
8116
+ border: 1px solid var(--color-warning-border, #fcd34d);
8117
+ border-radius: 8px;
8118
+ padding: 0.5rem 0.75rem;
8119
+ line-height: 1.4;
8120
+ display: flex;
8121
+ align-items: center;
8122
+ gap: 0.5rem;
8123
+ }
8124
+ .extension-unverified-icon {
8125
+ flex-shrink: 0;
8126
+ color: var(--color-warning, #d97706);
8127
+ }
7985
8128
  .extension-desc {
7986
8129
  font-size: 0.75rem;
7987
8130
  color: var(--color-text-secondary);
@@ -8462,8 +8605,7 @@ body {
8462
8605
  opacity: 0.5;
8463
8606
  cursor: not-allowed;
8464
8607
  }
8465
- .btn-brand-use,
8466
- .btn-skill-use {
8608
+ .btn-brand-use {
8467
8609
  background: transparent;
8468
8610
  border: 1px solid var(--color-success-border);
8469
8611
  border-radius: 6px;
@@ -8475,10 +8617,24 @@ body {
8475
8617
  transition: background .15s;
8476
8618
  white-space: nowrap;
8477
8619
  }
8478
- .btn-brand-use:hover,
8479
- .btn-skill-use:hover {
8620
+ .btn-brand-use:hover {
8480
8621
  background: var(--color-success-bg);
8481
8622
  }
8623
+ .btn-skill-use {
8624
+ background: transparent;
8625
+ border: 1px solid var(--color-accent-primary);
8626
+ border-radius: 6px;
8627
+ color: var(--color-accent-primary);
8628
+ cursor: pointer;
8629
+ font-size: 0.75rem;
8630
+ font-weight: 500;
8631
+ padding: 0.3125rem 0.75rem;
8632
+ transition: background .15s;
8633
+ white-space: nowrap;
8634
+ }
8635
+ .btn-skill-use:hover {
8636
+ background: var(--color-accent-soft);
8637
+ }
8482
8638
 
8483
8639
  /* ── Delete button ────────────────────────────────────────────────────────── */
8484
8640
  .btn-skill-delete {
@@ -10381,6 +10537,7 @@ body.setup-mode[data-theme="dark"] {
10381
10537
  letter-spacing: 0.03em;
10382
10538
  transition: color .15s;
10383
10539
  line-height: 1;
10540
+ text-decoration: none;
10384
10541
  }
10385
10542
  /* Highlight version text when badge is actionable and btn is hovered */
10386
10543
  .version-badge:hover .version-text { color: var(--color-text-tertiary); }
@@ -10535,17 +10692,21 @@ body.setup-mode[data-theme="dark"] {
10535
10692
  }
10536
10693
  .vup-btn-primary:hover { background: var(--color-button-primary-hover); }
10537
10694
  .vup-btn-primary:active { transform: scale(.97); }
10538
- .vup-btn-cancel {
10539
- padding: 0.4375rem 0.75rem;
10695
+ .vup-btn-changelog {
10696
+ flex: 1;
10697
+ padding: 0.4375rem 0;
10540
10698
  background: transparent;
10541
- color: var(--color-text-muted);
10542
- border: 1px solid var(--color-border-primary);
10699
+ color: var(--color-accent-primary);
10700
+ border: 1px solid var(--color-accent-primary);
10543
10701
  border-radius: 6px;
10544
10702
  font-size: 0.75rem;
10703
+ font-weight: 500;
10704
+ text-decoration: none;
10705
+ text-align: center;
10545
10706
  cursor: pointer;
10546
- transition: background .15s, color .15s;
10707
+ transition: background .15s, opacity .15s;
10547
10708
  }
10548
- .vup-btn-cancel:hover { background: var(--color-bg-hover); color: var(--color-text-secondary); }
10709
+ .vup-btn-changelog:hover { background: var(--color-accent-primary); color: var(--color-button-primary-text); }
10549
10710
 
10550
10711
  /* Progress state */
10551
10712
  .vup-progress-header {
@@ -11549,6 +11710,42 @@ body.setup-mode[data-theme="dark"] {
11549
11710
  gap: 0.625rem;
11550
11711
  }
11551
11712
 
11713
+ /* ── Segmented Control (reusable compact tab selector) ──────────────────── */
11714
+ .segmented-control {
11715
+ display: flex;
11716
+ gap: 2px;
11717
+ background: var(--color-bg-hover);
11718
+ border-radius: 8px;
11719
+ padding: 3px;
11720
+ }
11721
+ .segmented-control__btn {
11722
+ padding: 0.3125rem 0.75rem;
11723
+ border: none;
11724
+ background: transparent;
11725
+ color: var(--color-text-secondary);
11726
+ font-size: 0.8125rem;
11727
+ cursor: pointer;
11728
+ border-radius: 6px;
11729
+ transition: all 0.15s ease;
11730
+ white-space: nowrap;
11731
+ }
11732
+ .segmented-control__btn:hover:not(.active) {
11733
+ color: var(--color-text-primary);
11734
+ }
11735
+ .segmented-control__btn.active {
11736
+ background: var(--color-bg-secondary);
11737
+ color: var(--color-text-primary);
11738
+ font-weight: 500;
11739
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08), 0 1px 2px rgba(0, 0, 0, 0.06);
11740
+ }
11741
+ [data-theme="dark"] .segmented-control {
11742
+ background: var(--color-bg-primary);
11743
+ }
11744
+ [data-theme="dark"] .segmented-control__btn.active {
11745
+ background: var(--color-bg-hover);
11746
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
11747
+ }
11748
+
11552
11749
  /* ═════════════════════════════════════════════════════════════════════════
11553
11750
  * BILLING PANEL
11554
11751
  * ═════════════════════════════════════════════════════════════════════════ */
@@ -11636,39 +11833,9 @@ body.setup-mode[data-theme="dark"] {
11636
11833
  border-radius: 6px;
11637
11834
  }
11638
11835
 
11639
- /* ── Period Button Group ─────────────────────────────────────────────── */
11640
- .billing-period-group {
11641
- display: flex;
11642
- background: var(--color-bg-secondary);
11643
- border: 1px solid var(--color-border-primary);
11644
- border-radius: 8px;
11645
- overflow: hidden;
11646
- }
11647
- .billing-period-btn {
11648
- padding: 0.4375rem 0.75rem;
11649
- border: none;
11650
- background: transparent;
11651
- color: var(--color-text-secondary);
11652
- font-size: 0.8125rem;
11653
- cursor: pointer;
11654
- transition: all 0.15s ease;
11655
- }
11656
- .billing-period-btn:not(:last-child) {
11657
- border-right: 1px solid var(--color-border-primary);
11658
- }
11659
- .billing-period-btn:hover {
11660
- background: var(--color-bg-hover);
11661
- color: var(--color-text-primary);
11662
- }
11663
- .billing-period-btn.active {
11664
- background: var(--color-accent-primary);
11665
- color: #ffffff;
11666
- font-weight: 500;
11667
- }
11668
-
11669
11836
  /* ── Model Filter ────────────────────────────────────────────────────── */
11670
11837
  .billing-model-filter {
11671
- padding: 0.4375rem 1.75rem 0.4375rem 0.75rem;
11838
+ padding: 0.5375rem 1.75rem 0.5375rem 0.75rem;
11672
11839
  border: 1px solid var(--color-border-primary);
11673
11840
  border-radius: 8px;
11674
11841
  background: var(--color-bg-secondary);
@@ -11693,28 +11860,6 @@ body.setup-mode[data-theme="dark"] {
11693
11860
  }
11694
11861
 
11695
11862
  /* ── Action Buttons ──────────────────────────────────────────────────── */
11696
- .billing-clear-container {
11697
- position: relative;
11698
- }
11699
- .billing-clear-btn {
11700
- width: 32px;
11701
- height: 32px;
11702
- display: inline-flex;
11703
- align-items: center;
11704
- justify-content: center;
11705
- border: 1px solid var(--color-border-primary);
11706
- border-radius: 8px;
11707
- background: var(--color-bg-secondary);
11708
- color: var(--color-text-secondary);
11709
- font-size: 0.875rem;
11710
- cursor: pointer;
11711
- transition: all 0.15s ease;
11712
- }
11713
- .billing-clear-btn:hover {
11714
- background: var(--color-bg-tertiary);
11715
- border-color: #ef4444;
11716
- color: #ef4444;
11717
- }
11718
11863
  .billing-share-btn {
11719
11864
  display: inline-flex;
11720
11865
  align-items: center;
@@ -11735,43 +11880,6 @@ body.setup-mode[data-theme="dark"] {
11735
11880
  color: var(--color-text-primary);
11736
11881
  border-color: var(--color-accent-primary);
11737
11882
  }
11738
- .billing-clear-popup {
11739
- position: absolute;
11740
- top: 100%;
11741
- right: 0;
11742
- margin-top: 0.25rem;
11743
- display: flex;
11744
- flex-direction: column;
11745
- gap: 0.25rem;
11746
- background: var(--color-bg-secondary);
11747
- border: 1px solid var(--color-border-primary);
11748
- border-radius: 8px;
11749
- padding: 0.375rem;
11750
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
11751
- z-index: 100;
11752
- min-width: 120px;
11753
- }
11754
- .billing-clear-option {
11755
- padding: 0.4375rem 0.75rem;
11756
- border: none;
11757
- border-radius: 6px;
11758
- background: transparent;
11759
- color: var(--color-text-primary);
11760
- font-size: 0.8125rem;
11761
- cursor: pointer;
11762
- text-align: left;
11763
- white-space: nowrap;
11764
- transition: background 0.15s ease;
11765
- }
11766
- .billing-clear-option:hover {
11767
- background: var(--color-bg-tertiary);
11768
- }
11769
- .billing-clear-danger {
11770
- color: #ef4444;
11771
- }
11772
- .billing-clear-danger:hover {
11773
- background: rgba(239, 68, 68, 0.08) !important;
11774
- }
11775
11883
 
11776
11884
  /* ── Stats Row ───────────────────────────────────────────────────────── */
11777
11885
  .billing-stats-row {
@@ -11901,11 +12009,6 @@ body.setup-mode[data-theme="dark"] {
11901
12009
  }
11902
12010
 
11903
12011
  /* ── Cost Trend Line Chart ───────────────────────────────────────────── */
11904
- .billing-trend-total {
11905
- font-size: 0.75rem;
11906
- font-weight: 500;
11907
- color: var(--color-accent-primary);
11908
- }
11909
12012
  .billing-trend-chart {
11910
12013
  flex: 1;
11911
12014
  min-height: 0;
@@ -14050,11 +14153,23 @@ body.setup-mode[data-theme="dark"] {
14050
14153
  }
14051
14154
 
14052
14155
  /* ── Section-level collapse ────────────────────────────────────────────────── */
14156
+ #projects-section-header {
14157
+ cursor: pointer;
14158
+ padding: 0.25rem 0.5rem;
14159
+ margin-top: 0.5rem;
14160
+ border-radius: var(--radius-sm);
14161
+ transition: background var(--transition-fast);
14162
+ }
14163
+ #projects-section-header:hover {
14164
+ background: var(--color-bg-hover);
14165
+ }
14166
+ #projects-section-header:hover .btn-icon-sm:hover {
14167
+ background: var(--color-border-primary);
14168
+ }
14053
14169
  .projects-section-title {
14054
14170
  display: inline-flex;
14055
14171
  align-items: center;
14056
14172
  gap: 3px;
14057
- cursor: pointer;
14058
14173
  }
14059
14174
  .projects-section-chevron {
14060
14175
  flex-shrink: 0;
@@ -14078,8 +14193,8 @@ body.setup-mode[data-theme="dark"] {
14078
14193
  .project-group-header {
14079
14194
  display: flex;
14080
14195
  align-items: center;
14081
- gap: 0.375rem;
14082
- padding: 0.3125rem 0.625rem;
14196
+ gap: 0.575rem;
14197
+ padding: 0.3325rem 0.625rem;
14083
14198
  border-radius: var(--radius-sm);
14084
14199
  cursor: pointer;
14085
14200
  user-select: none;
@@ -14095,7 +14210,7 @@ body.setup-mode[data-theme="dark"] {
14095
14210
  overflow: hidden;
14096
14211
  text-overflow: ellipsis;
14097
14212
  white-space: nowrap;
14098
- font-size: 0.8125rem;
14213
+ font-size: 0.875rem;
14099
14214
  color: var(--color-text-primary);
14100
14215
  }
14101
14216
 
@@ -14130,117 +14245,25 @@ body.setup-mode[data-theme="dark"] {
14130
14245
 
14131
14246
  /* ── Session group (indented children) ────────────────────────────────────── */
14132
14247
  .project-session-group {
14133
- padding-left: 0.875rem;
14134
14248
  margin-top: 0.08rem;
14135
14249
  }
14136
14250
 
14137
- .project-sessions-empty {
14138
- padding: 0.25rem 0.5rem 0.25rem 0.625rem;
14139
- font-size: 0.75rem;
14140
- color: var(--color-text-muted);
14251
+ .project-session-group .session-item {
14252
+ padding-left: 2.2rem;
14141
14253
  }
14142
14254
 
14143
- /* ── Project hover tooltip ─────────────────────────────────────────────────── */
14144
- .project-tooltip {
14145
- position: fixed;
14146
- z-index: 1200;
14147
- background: var(--color-bg-secondary);
14148
- border: 1px solid var(--color-border-primary);
14149
- border-radius: 10px;
14150
- box-shadow: 0 8px 24px rgba(0,0,0,.10), 0 2px 8px rgba(0,0,0,.06);
14151
- padding: 0.75rem 0.875rem 0.75rem 1.125rem; /* extra left padding = visual gap */
14152
- min-width: 13rem;
14153
- max-width: 18rem;
14154
- animation: fadeIn 0.12s ease;
14155
- }
14156
- /* Transparent bridge on the left side fills the gap between sidebar and tooltip */
14157
- .project-tooltip::before {
14158
- content: "";
14159
- position: absolute;
14160
- top: 0;
14161
- left: -8px;
14162
- width: 8px;
14163
- height: 100%;
14164
- }
14165
- [data-theme="dark"] .project-tooltip {
14166
- box-shadow: 0 8px 28px rgba(0,0,0,.55), 0 2px 8px rgba(0,0,0,.35);
14167
- }
14168
-
14169
- .project-tooltip-header {
14170
- display: flex;
14171
- align-items: center;
14172
- gap: 0.4rem;
14173
- margin-bottom: 0.75rem;
14174
- }
14175
- .project-tooltip-icon {
14176
- flex-shrink: 0;
14177
- display: flex;
14178
- align-items: center;
14179
- justify-content: center;
14180
- color: var(--color-text-secondary);
14181
- line-height: 0;
14182
- }
14183
- .project-tooltip-icon svg {
14184
- display: block;
14185
- flex-shrink: 0;
14186
- }
14187
- .project-tooltip-name {
14188
- flex: 1;
14189
- min-width: 0;
14190
- font-size: 0.8125rem;
14191
- font-weight: 500;
14192
- color: var(--color-text-primary);
14193
- overflow: hidden;
14194
- text-overflow: ellipsis;
14195
- white-space: nowrap;
14196
- }
14197
- .project-tooltip-rows {
14198
- display: flex;
14199
- flex-direction: column;
14200
- gap: 0.3rem;
14201
- }
14202
- .project-tooltip-row {
14203
- display: flex;
14204
- align-items: center;
14205
- gap: 0.4rem;
14206
- font-size: 0.75rem;
14207
- color: var(--color-text-secondary);
14208
- min-width: 0;
14209
- }
14210
- .project-tooltip-row--clickable {
14211
- cursor: pointer;
14212
- border-radius: 4px;
14213
- margin: 0 -0.25rem;
14214
- padding: 0.15rem 0.25rem;
14215
- transition: background var(--transition-fast);
14216
- }
14217
- .project-tooltip-row--clickable:hover {
14255
+ .project-session-group .session-item.active {
14218
14256
  background: var(--color-bg-hover);
14219
14257
  }
14220
14258
 
14221
- .project-tooltip-divider {
14222
- height: 1px;
14223
- background: var(--color-border-primary);
14224
- margin: 0.25rem 0;
14259
+ .project-session-group .session-item.active::before {
14260
+ display: none;
14225
14261
  }
14226
14262
 
14227
- .project-tooltip-row-icon {
14228
- flex-shrink: 0;
14263
+ .project-sessions-empty {
14264
+ padding: 0.25rem 0.5rem 0.25rem 0.625rem;
14265
+ font-size: 0.75rem;
14229
14266
  color: var(--color-text-muted);
14230
- display: flex;
14231
- align-items: center;
14232
- line-height: 0;
14233
- }
14234
- .project-tooltip-row-icon svg {
14235
- display: block;
14236
- flex-shrink: 0;
14237
- }
14238
- .project-tooltip-row-text {
14239
- min-width: 0;
14240
- overflow: hidden;
14241
- text-overflow: ellipsis;
14242
- white-space: nowrap;
14243
- line-height: 1.4;
14244
14267
  }
14245
14268
 
14246
14269
  /* ── Project context menu (rename / delete) ────────────────────────────────── */
@@ -14258,7 +14281,9 @@ body.setup-mode[data-theme="dark"] {
14258
14281
  box-shadow: 0 8px 24px rgba(0,0,0,.5), 0 2px 6px rgba(0,0,0,.3);
14259
14282
  }
14260
14283
  .project-actions-menu-item {
14261
- display: block;
14284
+ display: flex;
14285
+ align-items: center;
14286
+ gap: 0.5rem;
14262
14287
  width: 100%;
14263
14288
  padding: 0.375rem 0.625rem;
14264
14289
  border: none;
@@ -14267,17 +14292,43 @@ body.setup-mode[data-theme="dark"] {
14267
14292
  cursor: pointer;
14268
14293
  color: var(--color-text-primary);
14269
14294
  font-size: 0.8125rem;
14295
+ line-height: 1.4;
14270
14296
  text-align: left;
14271
14297
  transition: background .12s ease, color .12s ease;
14272
14298
  }
14299
+ .project-actions-menu-icon {
14300
+ display: inline-flex;
14301
+ align-items: center;
14302
+ justify-content: center;
14303
+ width: 0.875rem;
14304
+ height: 0.875rem;
14305
+ flex: 0 0 0.875rem;
14306
+ color: var(--color-text-secondary);
14307
+ transition: color .12s ease;
14308
+ }
14309
+ .project-actions-menu-icon svg {
14310
+ display: block;
14311
+ flex-shrink: 0;
14312
+ }
14313
+ .project-actions-menu-label {
14314
+ min-width: 0;
14315
+ flex: 1;
14316
+ }
14273
14317
  .project-actions-menu-item:hover {
14274
14318
  background: var(--color-bg-hover);
14275
14319
  }
14320
+ .project-actions-menu-item:hover .project-actions-menu-icon {
14321
+ color: var(--color-text-primary);
14322
+ }
14276
14323
  .project-actions-menu-item.danger {
14277
14324
  color: var(--color-error);
14278
14325
  margin-top: 0.25rem;
14279
14326
  position: relative;
14280
14327
  }
14328
+ .project-actions-menu-item.danger .project-actions-menu-icon,
14329
+ .project-actions-menu-item.danger:hover .project-actions-menu-icon {
14330
+ color: var(--color-error);
14331
+ }
14281
14332
  .project-actions-menu-item.danger::before {
14282
14333
  content: "";
14283
14334
  position: absolute;
@@ -14406,6 +14457,13 @@ body.setup-mode[data-theme="dark"] {
14406
14457
  margin-top: 0.75rem;
14407
14458
  }
14408
14459
 
14460
+ .create-project-folder-hint {
14461
+ font-size: 0.72rem;
14462
+ color: var(--color-text-muted);
14463
+ margin-top: 0.35rem;
14464
+ line-height: 1.4;
14465
+ }
14466
+
14409
14467
  .create-project-folder-label {
14410
14468
  font-size: 0.78rem;
14411
14469
  font-weight: 500;
@@ -14603,4 +14661,3 @@ body.setup-mode[data-theme="dark"] {
14603
14661
  .project-picker-done-btn:hover {
14604
14662
  background: var(--color-bg-hover);
14605
14663
  }
14606
-