clauddy 1.26.0 → 1.28.0

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.
@@ -2311,6 +2311,29 @@ body.dual #harness-tabs {
2311
2311
  border-color: #a7baa14d;
2312
2312
  background: #a7baa11c;
2313
2313
  }
2314
+ #harness-tabs #tab-cursor[aria-selected="true"] {
2315
+ border-color: #a9b8d64d;
2316
+ background: #a9b8d61c;
2317
+ }
2318
+ #harness-tabs button[hidden] {
2319
+ display: none;
2320
+ }
2321
+ /* three services: logo and % only; the name stays for screen readers */
2322
+ body.trio #harness-tabs button {
2323
+ justify-content: center;
2324
+ gap: 6px;
2325
+ }
2326
+ body.trio #harness-tabs button > span:not(.tab-value):not(.tab-alert) {
2327
+ position: absolute;
2328
+ width: 1px;
2329
+ height: 1px;
2330
+ overflow: hidden;
2331
+ clip-path: inset(50%);
2332
+ white-space: nowrap;
2333
+ }
2334
+ body.trio #harness-tabs .tab-value {
2335
+ margin-left: 0;
2336
+ }
2314
2337
  #harness-tabs button:hover {
2315
2338
  border-color: #ffffff2b;
2316
2339
  color: var(--text);
@@ -2332,6 +2355,9 @@ body.dual #harness-tabs {
2332
2355
  #tab-codex .tab-logo {
2333
2356
  color: #b9c8b0;
2334
2357
  }
2358
+ #tab-cursor .tab-logo {
2359
+ color: #b8c4dc;
2360
+ }
2335
2361
  #harness-tabs button.active .tab-logo {
2336
2362
  opacity: 1;
2337
2363
  }
@@ -2410,6 +2436,26 @@ body.view-codex .sq.lv4 {
2410
2436
  background: #c2c994;
2411
2437
  }
2412
2438
 
2439
+ /* the Cursor view: a monthly budget, read from its dashboard — steel blue */
2440
+ body.view-cursor #live-tag,
2441
+ body.view-cursor #session-proj,
2442
+ body.view-cursor #details-toggle,
2443
+ body.view-cursor #usage-details {
2444
+ display: none;
2445
+ }
2446
+ body.view-cursor #session-fill,
2447
+ body.view-cursor #week-fill {
2448
+ background: #9fb2d6;
2449
+ }
2450
+ body.view-cursor #session-fill.mid,
2451
+ body.view-cursor #week-fill.mid {
2452
+ background: #e5b55d;
2453
+ }
2454
+ body.view-cursor #session-fill.hot,
2455
+ body.view-cursor #week-fill.hot {
2456
+ background: #ee705e;
2457
+ }
2458
+
2413
2459
  /* collapsed with both: one line per service instead of the ring, never an average */
2414
2460
  #mini-dual {
2415
2461
  display: none;
@@ -2499,6 +2545,12 @@ body.collapsed.dual #mini-dual {
2499
2545
  .mini-source[data-provider="codex"] {
2500
2546
  --src: #b9c8b0;
2501
2547
  }
2548
+ .mini-source[data-provider="cursor"] {
2549
+ --src: #b8c4dc;
2550
+ }
2551
+ .mini-source[hidden] {
2552
+ display: none;
2553
+ }
2502
2554
  .mini-logo {
2503
2555
  grid-column: 1;
2504
2556
  grid-row: 1;
@@ -2571,11 +2623,102 @@ body.collapsed.dual #mini-reset {
2571
2623
  #mini-codex-bar {
2572
2624
  background: #a7baa1;
2573
2625
  }
2626
+ #mini-cursor-bar {
2627
+ background: #9fb2d6;
2628
+ }
2574
2629
  .mini-track i.hot,
2575
- #mini-codex-bar.hot {
2630
+ #mini-codex-bar.hot,
2631
+ #mini-cursor-bar.hot {
2576
2632
  background: #ee705e;
2577
2633
  }
2578
2634
 
2635
+ /* Settings → Connections: a row of service tiles; the open one shows its card */
2636
+ #conn-tiles {
2637
+ display: grid;
2638
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2639
+ gap: 8px;
2640
+ margin: 7px 0 18px;
2641
+ }
2642
+ body:has(#connections > .open) #conn-tiles {
2643
+ margin-bottom: 8px;
2644
+ }
2645
+ .conn-tile {
2646
+ display: flex;
2647
+ flex-direction: column;
2648
+ align-items: center;
2649
+ gap: 5px;
2650
+ min-width: 0;
2651
+ padding: 10px 4px 9px;
2652
+ border: 1px solid var(--hair);
2653
+ border-radius: 10px;
2654
+ background: #ffffff03;
2655
+ color: var(--muted);
2656
+ font: inherit;
2657
+ cursor: pointer;
2658
+ -webkit-app-region: no-drag;
2659
+ transition:
2660
+ border-color 0.15s,
2661
+ background 0.15s;
2662
+ }
2663
+ .conn-tile:hover {
2664
+ border-color: #ffffff24;
2665
+ background: #ffffff07;
2666
+ }
2667
+ .conn-tile[aria-expanded="true"] {
2668
+ border-color: #ffffff38;
2669
+ background: #ffffff0a;
2670
+ }
2671
+ .conn-tile .connection-avatar {
2672
+ position: relative;
2673
+ display: grid;
2674
+ place-items: center;
2675
+ width: 30px;
2676
+ height: 30px;
2677
+ border-radius: 8px;
2678
+ }
2679
+ /* not connected yet: the logo waits in grey */
2680
+ .conn-tile:not(.on) .connection-avatar {
2681
+ filter: grayscale(1);
2682
+ opacity: 0.6;
2683
+ }
2684
+ .conn-check {
2685
+ position: absolute;
2686
+ right: -5px;
2687
+ bottom: -5px;
2688
+ display: grid;
2689
+ place-items: center;
2690
+ width: 14px;
2691
+ height: 14px;
2692
+ border-radius: 50%;
2693
+ background: #8fc58a;
2694
+ color: #17201a;
2695
+ font-size: 9px;
2696
+ font-style: normal;
2697
+ font-weight: 700;
2698
+ line-height: 1;
2699
+ box-shadow: 0 0 0 2px var(--card-bg, #1e1a17);
2700
+ }
2701
+ .conn-check[hidden] {
2702
+ display: none;
2703
+ }
2704
+ .conn-name {
2705
+ font-size: 11px;
2706
+ color: var(--text);
2707
+ }
2708
+ .conn-state {
2709
+ font-size: 10px;
2710
+ line-height: 1.3;
2711
+ }
2712
+ .conn-tile.on .conn-state:not(.plan-badge) {
2713
+ color: #a9c7a2;
2714
+ }
2715
+ #connections > .conn-panel:not(.open) {
2716
+ display: none;
2717
+ }
2718
+ #connections > .open {
2719
+ margin: 0 0 18px;
2720
+ }
2721
+
2579
2722
  /* Settings → Connections: Claude and Codex share one card shape */
2580
2723
  .connections-label {
2581
2724
  margin-top: 18px;
@@ -2586,7 +2729,7 @@ body.collapsed.dual #mini-reset {
2586
2729
  }
2587
2730
  #codex-settings {
2588
2731
  display: flex;
2589
- margin: 0 0 18px;
2732
+ margin: 0 0 8px;
2590
2733
  }
2591
2734
  .codex-actions {
2592
2735
  display: flex;
@@ -2629,6 +2772,27 @@ body.codex-setup #codex-connect {
2629
2772
  body.codex-on #codex-disconnect {
2630
2773
  display: grid;
2631
2774
  }
2775
+ #cursor-settings {
2776
+ display: flex;
2777
+ margin: 0 0 18px;
2778
+ }
2779
+ #cursor-disconnect,
2780
+ body.cursor-on #cursor-hint,
2781
+ body.cursor-on #cursor-connect,
2782
+ body.cursor-setup #cursor-connect {
2783
+ display: none;
2784
+ }
2785
+ body.cursor-on #cursor-disconnect {
2786
+ display: grid;
2787
+ }
2788
+ #cursor-setup:not([hidden]) {
2789
+ display: inline-flex;
2790
+ align-items: center;
2791
+ gap: 4px;
2792
+ }
2793
+ body.view-cursor .ac-caret {
2794
+ display: none;
2795
+ }
2632
2796
  body.view-codex .mrow .mname::before {
2633
2797
  background: #a7baa1;
2634
2798
  }
@@ -2669,6 +2833,13 @@ body.view-codex {
2669
2833
  --panel-border: #b4c6ac20;
2670
2834
  --settings-bg: linear-gradient(150deg, #283028, #1b211c);
2671
2835
  }
2836
+ body.view-cursor {
2837
+ --panel-bg:
2838
+ radial-gradient(130% 110% at 20% 0%, #5f6d8a30, transparent 60%),
2839
+ linear-gradient(158deg, #23262d, #1a1d23 55%, #14161b);
2840
+ --panel-border: #b6c2dc20;
2841
+ --settings-bg: linear-gradient(150deg, #272b33, #1a1d23);
2842
+ }
2672
2843
  #details-toggle {
2673
2844
  display: flex;
2674
2845
  align-items: center;
@@ -2703,7 +2874,8 @@ body.view-codex {
2703
2874
 
2704
2875
  #acc-connected.connection-card,
2705
2876
  #acc-intro.connection-card,
2706
- #codex-settings.connection-card {
2877
+ #codex-settings.connection-card,
2878
+ #cursor-settings.connection-card {
2707
2879
  align-items: center;
2708
2880
  gap: 10px;
2709
2881
  min-height: 64px;
@@ -2713,7 +2885,8 @@ body.view-codex {
2713
2885
  background: #ffffff03;
2714
2886
  }
2715
2887
  #acc-connected.connection-card,
2716
- body.codex-on #codex-settings.connection-card {
2888
+ body.codex-on #codex-settings.connection-card,
2889
+ body.cursor-on #cursor-settings.connection-card {
2717
2890
  height: 64px;
2718
2891
  }
2719
2892
  .connection-card .connection-avatar {
@@ -2732,8 +2905,13 @@ body.codex-on #codex-settings.connection-card {
2732
2905
  background: #9eaf9614;
2733
2906
  color: #b9c8b0;
2734
2907
  }
2908
+ .cursor-avatar {
2909
+ background: #a9b8d614;
2910
+ color: #b8c4dc;
2911
+ }
2735
2912
  .connection-logo,
2736
- .codex-logo {
2913
+ .codex-logo,
2914
+ .cursor-logo {
2737
2915
  fill: currentColor;
2738
2916
  }
2739
2917
  .connection-avatar svg {
@@ -2790,6 +2968,12 @@ body.codex-on #codex-settings.connection-card {
2790
2968
  body.codex-on #codex-connected-caption {
2791
2969
  display: block;
2792
2970
  }
2971
+ #cursor-connected-caption {
2972
+ display: none;
2973
+ }
2974
+ body.cursor-on #cursor-connected-caption {
2975
+ display: block;
2976
+ }
2793
2977
  .connection-card .connection-remove {
2794
2978
  flex: none;
2795
2979
  align-items: center;
@@ -3093,6 +3277,9 @@ body.collapsed.dual #mini-reminder {
3093
3277
  #companion-notice[data-provider="codex"] {
3094
3278
  color: #c1d1b8;
3095
3279
  }
3280
+ #companion-notice[data-provider="cursor"] {
3281
+ color: #c3cde2;
3282
+ }
3096
3283
  #companion-notice[hidden],
3097
3284
  body.settings-open #companion-notice {
3098
3285
  display: none;
@@ -3118,6 +3305,16 @@ body.collapsed.pet-only #stage {
3118
3305
  margin: 0;
3119
3306
  background: none;
3120
3307
  }
3308
+ /* three readings need a wider glance: the card grows, the pet stays centred */
3309
+ body.collapsed.pet-only.trio #card {
3310
+ width: 188px;
3311
+ }
3312
+ body.collapsed.pet-only.trio #stage {
3313
+ right: 43px;
3314
+ }
3315
+ body.collapsed.pet-only.trio #pet-activity:not([hidden]) {
3316
+ right: 22px;
3317
+ }
3121
3318
  body.collapsed.pet-only #pet {
3122
3319
  zoom: 1.05;
3123
3320
  transform: none;
@@ -3143,7 +3340,7 @@ body.collapsed.pet-only #pet-glance {
3143
3340
  transform: translateX(-50%);
3144
3341
  bottom: 2px;
3145
3342
  min-height: 32px;
3146
- padding: 2px 5px;
3343
+ padding: 2px 5px 2px 10px;
3147
3344
  border: 1px solid transparent;
3148
3345
  border-radius: 10px;
3149
3346
  font-size: 10px;
@@ -3267,6 +3464,9 @@ body.collapsed.dual:has(#companion-notice:not([hidden])) #mini-acct {
3267
3464
  .activity-logos [data-provider="codex"] {
3268
3465
  color: #b9c8b0;
3269
3466
  }
3467
+ .activity-logos [data-provider="cursor"] {
3468
+ color: #b8c4dc;
3469
+ }
3270
3470
  .activity-logos svg {
3271
3471
  display: block;
3272
3472
  width: 11px;
package/renderer/voice.js CHANGED
@@ -162,25 +162,26 @@
162
162
  return line(`${text}.`, `Fresh window! ${fmt(tokens)} last time.`)
163
163
  }
164
164
 
165
- // Codex speaks through the same pet, so its lines always say whose they are
166
- function codexFireLine(pct, resetMs, fmtDur) {
165
+ // Codex and Cursor speak through the same pet, so their lines always say whose they are
166
+ function codexFireLine(pct, resetMs, fmtDur, name = 'Codex') {
167
167
  const p = Math.round(pct)
168
168
  const text =
169
169
  resetMs != null
170
- ? `Codex is at ${p}% now. It resets in ${fmtDur(resetMs)}.`
171
- : `Codex is at ${p}% now.`
172
- return line(text, `Codex at ${p}%!`)
170
+ ? `${name} is at ${p}% now. It resets in ${fmtDur(resetMs)}.`
171
+ : `${name} is at ${p}% now.`
172
+ return line(text, `${name} at ${p}%!`)
173
173
  }
174
- function codexMaxedLine(resetAt) {
174
+ function codexMaxedLine(resetAt, name = 'Codex') {
175
175
  return line(
176
- resetAt ? `Codex is maxed out. It's back at ${resetAt}.` : 'Codex is maxed out.',
177
- 'Codex is maxed out.',
176
+ resetAt ? `${name} is maxed out. It's back at ${resetAt}.` : `${name} is maxed out.`,
177
+ `${name} is maxed out.`,
178
178
  )
179
179
  }
180
- function codexResetLine(was) {
180
+ // Cursor's window is its billing month
181
+ function codexResetLine(was, name = 'Codex', span = 'window') {
181
182
  return line(
182
- `Codex has a fresh window! The last one closed at ${Math.round(was)}%.`,
183
- 'Codex: fresh window!',
183
+ `${name} has a fresh ${span}! The last one closed at ${Math.round(was)}%.`,
184
+ `${name}: fresh ${span}!`,
184
185
  )
185
186
  }
186
187