clauddy 1.22.0 → 1.23.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.
@@ -56,10 +56,12 @@ body {
56
56
 
57
57
  #controls {
58
58
  position: absolute;
59
- top: 6px;
60
- right: 7px;
59
+ top: 0;
60
+ right: 8px;
61
+ height: 38px;
62
+ align-items: center;
61
63
  display: flex;
62
- gap: 5px;
64
+ gap: 4px;
63
65
  opacity: 1;
64
66
  z-index: 10;
65
67
  -webkit-app-region: no-drag;
@@ -67,10 +69,11 @@ body {
67
69
  #controls button {
68
70
  width: 19px;
69
71
  height: 19px;
70
- border: none;
72
+ border: 1px solid rgba(255, 255, 255, 0.035);
71
73
  border-radius: 50%;
72
- background: rgba(255, 255, 255, 0.12);
73
- color: rgba(255, 255, 255, 0.6);
74
+ background: linear-gradient(rgba(255, 255, 255, 0.043), rgba(255, 255, 255, 0.012));
75
+ box-shadow: inset 0 0.5px 0 rgba(255, 255, 255, 0.03);
76
+ color: #ab9886;
74
77
  font-size: 12px;
75
78
  line-height: 1;
76
79
  cursor: pointer;
@@ -93,14 +96,6 @@ body {
93
96
  #min {
94
97
  font-size: 16px;
95
98
  }
96
- #usage svg {
97
- stroke: currentColor;
98
- stroke-width: 2.6;
99
- fill: none;
100
- stroke-linecap: round;
101
- stroke-linejoin: round;
102
- pointer-events: none;
103
- }
104
99
  #gear {
105
100
  font-size: 10px;
106
101
  }
@@ -136,25 +131,31 @@ body.has-update #gear::after {
136
131
  opacity: 1;
137
132
  }
138
133
  }
134
+ /* inline lucide glyphs: one stroke treatment for the whole control row */
135
+ .ic {
136
+ width: 9px;
137
+ height: 9px;
138
+ pointer-events: none;
139
+ stroke: currentColor;
140
+ stroke-width: 2.4;
141
+ fill: none;
142
+ stroke-linecap: round;
143
+ stroke-linejoin: round;
144
+ }
145
+ #gear .ic {
146
+ width: 10px;
147
+ height: 10px;
148
+ stroke-width: 2.2;
149
+ }
139
150
  /* minimize icon swaps to an "expand" icon when collapsed */
140
151
  .ic-max {
141
152
  display: none;
142
- width: 8px;
143
- height: 8px;
144
- pointer-events: none;
145
153
  }
146
154
  body.collapsed #min .ic-min {
147
155
  display: none;
148
156
  }
149
157
  body.collapsed #min .ic-max {
150
- display: inline-block;
151
- }
152
- .ic-max path {
153
- stroke: currentColor;
154
- stroke-width: 2.4;
155
- fill: none;
156
- stroke-linecap: round;
157
- stroke-linejoin: round;
158
+ display: block;
158
159
  }
159
160
  body.collapsed #gear,
160
161
  body.collapsed #usage {
@@ -164,18 +165,18 @@ body.collapsed #usage {
164
165
  /* logged-in account chip (top-left, mirrors #controls) */
165
166
  #account-chip {
166
167
  position: absolute;
167
- top: 6px;
168
+ top: 0;
168
169
  left: 10px;
169
170
  z-index: 10;
170
171
  display: flex;
171
172
  align-items: center;
172
- gap: 3px;
173
- height: 19px; /* match #controls buttons so text centers on the same line */
173
+ gap: 5px;
174
+ height: 38px; /* the title band — centres the chip against #controls */
174
175
  /* #controls starts at ~154px: stop short of it, the pill has padding too */
175
176
  max-width: 142px;
176
- font-size: 9.5px;
177
+ font-size: 9px;
177
178
  line-height: 1;
178
- color: var(--muted);
179
+ color: #c7b8a7;
179
180
  }
180
181
  #account-chip[hidden] {
181
182
  display: none;
@@ -188,7 +189,7 @@ body.collapsed #usage {
188
189
  padding: 0 5px 0 6px;
189
190
  margin-left: -6px; /* the text stays where it has always been */
190
191
  border-radius: 10px;
191
- background: rgba(255, 255, 255, 0.05);
192
+ background: transparent;
192
193
  transition:
193
194
  background 0.15s,
194
195
  color 0.15s;
@@ -210,18 +211,9 @@ body.collapsed #usage {
210
211
  stroke-linecap: round;
211
212
  stroke-linejoin: round;
212
213
  }
213
- /* a single account keeps the pill, minus the affordance: nothing to switch to.
214
- The email then takes the width the chevron leaves behind. */
215
- body.one-account #account-chip {
216
- cursor: default;
217
- }
218
- body.one-account #account-chip:hover {
219
- background: rgba(255, 255, 255, 0.05);
220
- color: var(--muted);
221
- }
222
- body.one-account .ac-caret {
223
- display: none;
224
- }
214
+ /* a single account still opens the menu — that is how a second one is added */
215
+ /* the chevron stays even with a single account — it is the only hint that the
216
+ menu exists at all, and that is where another account gets added */
225
217
  /* the widget is mostly a drag region, and those swallow clicks before the page
226
218
  ever sees them — so an invisible sheet under the menu catches them instead */
227
219
  #acc-backdrop {
@@ -236,18 +228,18 @@ body.one-account .ac-caret {
236
228
  /* dropdown under the chip; it overlays the pet rather than resizing the window */
237
229
  #acc-menu {
238
230
  position: absolute;
239
- top: 24px;
231
+ top: 33px;
240
232
  left: 8px;
241
233
  z-index: 20;
242
- min-width: 118px;
243
- max-width: 176px;
244
- max-height: 120px;
234
+ min-width: 150px;
235
+ max-width: 190px;
236
+ max-height: 132px;
245
237
  overflow-y: auto;
246
- padding: 3px;
247
- border: 0.5px solid rgba(255, 210, 180, 0.1);
248
- border-radius: 7px;
249
- background: #221a15;
250
- box-shadow: 0 4px 14px rgba(0, 0, 0, 0.5);
238
+ padding: 7px;
239
+ border: 1px solid rgba(255, 255, 255, 0.08);
240
+ border-radius: 8px;
241
+ background: #30251e;
242
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.33);
251
243
  -webkit-app-region: no-drag;
252
244
  }
253
245
  #acc-menu[hidden] {
@@ -258,15 +250,19 @@ body.one-account .ac-caret {
258
250
  }
259
251
  /* the add entry closes the list: it belongs to no account */
260
252
  #acc-menu .acc-add {
261
- margin-top: 2px;
262
- padding-top: 6px;
263
- border-top: 0.5px solid var(--hair);
253
+ margin-top: 3px;
254
+ padding: 9px 4px 0;
255
+ border-top: 1px solid var(--hair);
264
256
  border-radius: 0;
265
- color: var(--coral-soft);
257
+ color: #cb8a67;
266
258
  /* no .who inside this one, so it needs the row font itself */
267
- font-size: 9.5px;
259
+ font-size: 10px;
268
260
  white-space: nowrap;
269
261
  }
262
+ #acc-menu .acc-add:hover {
263
+ background: transparent;
264
+ color: #e3b193;
265
+ }
270
266
  #acc-menu .acc-add:hover {
271
267
  background: none;
272
268
  color: var(--coral);
@@ -274,18 +270,19 @@ body.one-account .ac-caret {
274
270
  /* tighter than the dropdown-less list it replaced: it floats over the pet */
275
271
  #acc-menu .acc-item {
276
272
  gap: 6px;
277
- padding: 4px 6px;
273
+ padding: 5px 4px;
278
274
  border-radius: 5px;
279
275
  }
280
276
  #acc-menu .acc-item .who {
281
- font-size: 9.5px;
277
+ font-size: 10px;
282
278
  }
283
279
  .ac-dot {
284
280
  flex: none;
285
- width: 6px;
286
- height: 6px;
281
+ width: 4px;
282
+ height: 4px;
287
283
  border-radius: 50%;
288
- background: var(--pixel);
284
+ background: #a1b786;
285
+ box-shadow: 0 0 8px rgba(161, 183, 134, 0.19);
289
286
  }
290
287
  #ac-email {
291
288
  /* line-height:1 leaves the ascender inside the box, so the text reads a hair
@@ -299,13 +296,15 @@ body.one-account .ac-caret {
299
296
  }
300
297
  .plan-badge {
301
298
  flex: none;
302
- padding: 1.5px 5px;
303
- border-radius: 6px;
299
+ text-transform: lowercase;
300
+ padding: 2px 3px;
301
+ border-radius: 3px;
304
302
  font-size: 8px;
305
- font-weight: 700;
306
- letter-spacing: 0.3px;
307
- color: var(--coral-soft);
308
- background: rgba(217, 119, 87, 0.16);
303
+ font-weight: 400;
304
+ letter-spacing: 0;
305
+ color: #c6a385;
306
+ border: 1px solid rgba(181, 144, 109, 0.15);
307
+ background: rgba(181, 144, 109, 0.04);
309
308
  }
310
309
  .plan-badge[hidden] {
311
310
  display: none;
@@ -329,10 +328,116 @@ body.collapsed #mini-acct-name {
329
328
  }
330
329
 
331
330
  /* settings panel */
331
+ /* stays in flow so the card keeps a height the window can be sized to (pet.js
332
+ measures #card) — it still reads as an overlay because the stage, the content
333
+ and the mini line all sit this screen out. The negative margins bleed its
334
+ background to the card's edges, past the card's own padding. */
332
335
  #settings {
333
336
  display: none;
334
- margin-top: 8px;
337
+ margin: 24px -18px -14px;
338
+ padding: 12px 16px;
339
+ background: linear-gradient(145deg, #2c221c, #17120f);
340
+ -webkit-app-region: no-drag;
341
+ }
342
+ /* panel heading: gives the screen a title instead of opening cold on a form */
343
+ .settings-heading {
344
+ display: flex;
345
+ justify-content: space-between;
346
+ align-items: center;
347
+ min-height: 38px;
348
+ }
349
+ .settings-heading h3 {
350
+ font-size: 16px;
351
+ letter-spacing: -0.4px;
352
+ font-weight: 500;
353
+ color: #e7cfb8;
354
+ }
355
+ .settings-heading p {
356
+ font-size: 10px;
357
+ color: #a48b75;
358
+ margin-top: 4px;
359
+ }
360
+ .sh-ico {
361
+ width: 18px;
362
+ height: 18px;
363
+ color: var(--text);
364
+ stroke-width: 2;
365
+ }
366
+ /* group label above a cluster of rows */
367
+ .settings-label {
368
+ display: block;
369
+ font-size: 10px;
370
+ color: #ac9177;
371
+ margin-bottom: 6px;
372
+ }
373
+ .threshold-label {
374
+ margin-top: 15px;
375
+ }
376
+ .settings-segment {
377
+ height: 28px;
378
+ }
379
+ /* connected account: avatar + who + plan, as one bordered block */
380
+ .connect-block {
381
+ display: flex;
382
+ align-items: center;
383
+ gap: 8px;
384
+ margin: 11px 0 13px;
385
+ padding: 8px;
386
+ border: 1px solid rgba(255, 255, 255, 0.043);
387
+ border-radius: 7px;
388
+ background: rgba(255, 255, 255, 0.012);
389
+ }
390
+ .connect-block > div {
391
+ flex: 1;
392
+ display: flex;
393
+ flex-direction: column;
394
+ gap: 5px;
395
+ min-width: 0;
396
+ }
397
+ .cb-out {
398
+ display: flex;
399
+ align-items: center;
400
+ padding: 3px;
401
+ background: none;
402
+ border: 0;
403
+ border-radius: 5px;
404
+ color: #8d7b6c;
405
+ cursor: pointer;
335
406
  -webkit-app-region: no-drag;
407
+ transition:
408
+ color 0.15s,
409
+ background 0.15s;
410
+ }
411
+ .cb-out .ic {
412
+ width: 12px;
413
+ height: 12px;
414
+ stroke-width: 1.9;
415
+ }
416
+ .cb-out:hover {
417
+ color: #e0a184;
418
+ background: rgba(255, 255, 255, 0.05);
419
+ }
420
+ .connect-block b {
421
+ font-size: 10px;
422
+ font-weight: 400;
423
+ overflow: hidden;
424
+ text-overflow: ellipsis;
425
+ white-space: nowrap;
426
+ }
427
+ .connect-block > div > span {
428
+ font-size: 9px;
429
+ color: #a28a73;
430
+ }
431
+ .account-avatar {
432
+ width: 24px;
433
+ height: 24px;
434
+ flex: none;
435
+ display: grid;
436
+ place-items: center;
437
+ border-radius: 50%;
438
+ background: rgba(177, 132, 94, 0.13);
439
+ font-size: 13px;
440
+ color: #d5a07b;
336
441
  }
337
442
  body.settings-open #content,
338
443
  body.settings-open #mini {
@@ -340,16 +445,65 @@ body.settings-open #mini {
340
445
  }
341
446
  body.settings-open #settings {
342
447
  display: block;
343
- animation: set-in 0.18s ease;
448
+ animation: set-in 0.78s cubic-bezier(0.22, 1, 0.36, 1);
449
+ }
450
+ /* the panel covers the card, so the stage keeps its normal height behind it */
451
+ body.settings-open #stage {
452
+ display: none;
344
453
  }
345
454
  @keyframes set-in {
346
455
  from {
347
456
  opacity: 0;
348
- transform: translateY(4px);
457
+ transform: translateX(102%);
349
458
  }
350
459
  to {
351
460
  opacity: 1;
352
- transform: none;
461
+ transform: translateX(0);
462
+ }
463
+ }
464
+ /* leaving settings: the panel rides back out to the right. It goes absolute for
465
+ those frames so the card is already at its home height while it plays. */
466
+ body.settings-closing #settings {
467
+ display: block;
468
+ position: absolute;
469
+ inset: 38px 0 0;
470
+ margin: 0;
471
+ z-index: 6;
472
+ overflow: hidden;
473
+ pointer-events: none;
474
+ animation: set-out 0.58s cubic-bezier(0.5, 0, 0.75, 0) forwards;
475
+ }
476
+ @keyframes set-out {
477
+ from {
478
+ opacity: 1;
479
+ transform: translateX(0);
480
+ }
481
+ to {
482
+ opacity: 0;
483
+ transform: translateX(102%);
484
+ }
485
+ }
486
+ /* home comes back in from the other side, so the two screens read as a pair */
487
+ body.settings-closing #content,
488
+ body.settings-closing #stage {
489
+ animation: home-in 0.7s cubic-bezier(0.22, 1, 0.36, 1);
490
+ }
491
+ @keyframes home-in {
492
+ from {
493
+ opacity: 0;
494
+ transform: translateX(-9%);
495
+ }
496
+ to {
497
+ opacity: 1;
498
+ transform: translateX(0);
499
+ }
500
+ }
501
+ @media (prefers-reduced-motion: reduce) {
502
+ body.settings-open #settings,
503
+ body.settings-closing #settings,
504
+ body.settings-closing #content,
505
+ body.settings-closing #stage {
506
+ animation: none;
353
507
  }
354
508
  }
355
509
  .set-hint {
@@ -363,29 +517,6 @@ body.settings-open #settings {
363
517
  text-align: left;
364
518
  margin: -3px 0 9px;
365
519
  }
366
- .set-field {
367
- display: block;
368
- font-size: 9.5px;
369
- color: var(--muted);
370
- margin-bottom: 8px;
371
- }
372
- .set-field input,
373
- .set-field select {
374
- width: 100%;
375
- margin-top: 3px;
376
- background: rgba(255, 255, 255, 0.08);
377
- border: 0.5px solid var(--hair);
378
- border-radius: 7px;
379
- color: var(--text);
380
- font-size: 12px;
381
- padding: 5px 8px;
382
- outline: none;
383
- font-variant-numeric: tabular-nums;
384
- }
385
- .set-field input:focus,
386
- .set-field select:focus {
387
- border-color: var(--coral);
388
- }
389
520
  /* hide the ugly native number spinners (custom ones below) */
390
521
  input[type="number"]::-webkit-inner-spin-button,
391
522
  input[type="number"]::-webkit-outer-spin-button {
@@ -396,18 +527,23 @@ input[type="number"]::-webkit-outer-spin-button {
396
527
  /* display-mode segmented control (floating pet | menu bar) */
397
528
  .seg {
398
529
  display: flex;
399
- gap: 4px;
400
- margin-top: 4px;
530
+ gap: 3px;
531
+ height: 31px;
532
+ padding: 3px;
533
+ border: 0.5px solid rgba(255, 255, 255, 0.035);
534
+ background: rgba(15, 16, 23, 0.43);
535
+ border-radius: 6px;
401
536
  }
402
537
  .seg-btn {
403
538
  flex: 1;
404
- padding: 6px 4px;
539
+ padding: 0 4px;
405
540
  font-size: 11px;
406
- color: var(--muted);
407
- background: rgba(255, 255, 255, 0.06);
408
- border: 0.5px solid var(--hair);
409
- border-radius: 7px;
541
+ color: #938996;
542
+ background: none;
543
+ border: 0;
544
+ border-radius: 4px;
410
545
  cursor: pointer;
546
+ white-space: nowrap;
411
547
  transition:
412
548
  background 0.15s,
413
549
  color 0.15s,
@@ -417,9 +553,11 @@ input[type="number"]::-webkit-outer-spin-button {
417
553
  color: var(--text);
418
554
  }
419
555
  .seg-btn.on {
420
- background: var(--coral);
421
- border-color: var(--coral);
422
- color: #fff;
556
+ background: rgba(193, 177, 176, 0.1);
557
+ box-shadow:
558
+ 0 1px 4px rgba(0, 0, 0, 0.13),
559
+ inset 0 1px 0 rgba(255, 255, 255, 0.04);
560
+ color: #eadccf;
423
561
  }
424
562
  /* menu-bar mode: the popover auto-sizes, so the minimize control is redundant */
425
563
  body.is-menubar #min {
@@ -436,51 +574,27 @@ body.is-menubar #min {
436
574
  align-items: center;
437
575
  justify-content: space-between;
438
576
  gap: 8px;
439
- min-height: 34px;
440
- border-bottom: 0.5px solid var(--hair);
441
- }
442
- /* the threshold pair lives in an inset card under its toggle row */
443
- .set-row:has(+ .set-subgroup) {
444
- border-bottom: none;
577
+ font-size: 11px;
578
+ color: #cdb49b;
579
+ margin-top: 11px;
445
580
  }
446
- /* flat, but visibly nested: a soft coral guide bar ties the pair to the
447
- toggle above, and each label hugs its own stepper */
448
- .set-subgroup {
581
+ /* the stepper rows stack, so they read as a group at a tighter pitch than the
582
+ reference's 14px — the steppers already carry their own height */
583
+ .set-row:has(.num) {
584
+ margin-top: 5px;
585
+ } /* flat,
586
+ but visibly nested: a soft coral guide bar ties the pair to the
587
+ toggle above {
449
588
  position: relative;
450
589
  padding-left: 14px;
451
590
  border-bottom: 0.5px solid var(--hair);
452
591
  padding-bottom: 3px;
453
592
  transition: opacity 0.15s;
454
593
  }
455
- .set-subgroup::before {
456
- content: "";
457
- position: absolute;
458
- left: 3px;
459
- top: 5px;
460
- bottom: 10px;
461
- width: 2px;
462
- border-radius: 1px;
463
- background: var(--coral);
464
- opacity: 0.35;
465
- }
466
- .set-subgroup .set-row {
467
- border-bottom: none;
468
- justify-content: flex-end;
469
- gap: 10px;
470
- }
471
594
  .set-row-label {
472
595
  font-size: 11px;
473
- font-weight: 600;
474
- color: var(--text);
475
- }
476
- .set-row-hint {
477
- display: block;
478
- white-space: nowrap;
479
- font-style: normal;
480
596
  font-weight: 400;
481
- font-size: 9px;
482
- color: var(--muted);
483
- margin-top: 2px;
597
+ color: #cdb49b;
484
598
  }
485
599
  .set-row.set-sub {
486
600
  min-height: 31px;
@@ -490,7 +604,7 @@ body.is-menubar #min {
490
604
  font-size: 10.5px;
491
605
  color: var(--muted);
492
606
  }
493
- #set-rows.alerts-off .set-subgroup {
607
+ #set-rows.alerts-off .set-sub {
494
608
  opacity: 0.35;
495
609
  pointer-events: none;
496
610
  }
@@ -507,10 +621,10 @@ body.is-menubar #min {
507
621
  appearance: none;
508
622
  -webkit-appearance: none;
509
623
  margin: 0;
510
- width: 30px;
511
- height: 18px;
512
- border-radius: 9px;
513
- background: rgba(255, 255, 255, 0.14);
624
+ width: 29px;
625
+ height: 16px;
626
+ border-radius: 10px;
627
+ background: #5c5146;
514
628
  position: relative;
515
629
  cursor: pointer;
516
630
  -webkit-app-region: no-drag;
@@ -521,8 +635,8 @@ body.is-menubar #min {
521
635
  position: absolute;
522
636
  top: 2px;
523
637
  left: 2px;
524
- width: 14px;
525
- height: 14px;
638
+ width: 12px;
639
+ height: 12px;
526
640
  border-radius: 50%;
527
641
  background: #fff;
528
642
  opacity: 0.85;
@@ -531,34 +645,36 @@ body.is-menubar #min {
531
645
  opacity 0.18s;
532
646
  }
533
647
  .set-toggle:checked {
534
- background: var(--coral);
648
+ background: #ae7954;
535
649
  }
536
650
  .set-toggle:checked::after {
537
- left: 14px;
651
+ left: 15px;
538
652
  opacity: 1;
539
653
  }
540
654
  /* number field: minus / value% / plus */
541
655
  .num {
542
656
  display: flex;
543
657
  align-items: center;
544
- gap: 4px;
545
658
  flex: none;
659
+ border: 0.5px solid var(--hair);
660
+ background: rgba(255, 255, 255, 0.012);
661
+ border-radius: 4px;
662
+ overflow: hidden;
546
663
  }
547
664
  .num-val {
548
665
  position: relative;
549
- width: 54px;
666
+ width: 38px;
550
667
  }
551
668
  .num-val input {
552
669
  width: 100%;
553
- background: rgba(255, 255, 255, 0.06);
554
- border: 0.5px solid var(--hair);
555
- border-radius: 7px;
670
+ background: none;
671
+ border: 0;
556
672
  color: var(--text);
557
- font-size: 12px;
558
- font-weight: 600;
673
+ font-size: 11px;
674
+ font-weight: 400;
559
675
  font-variant-numeric: tabular-nums;
560
676
  text-align: right;
561
- padding: 4px 20px 4px 6px;
677
+ padding: 4px 15px 4px 0;
562
678
  outline: none;
563
679
  transition:
564
680
  border-color 0.15s,
@@ -570,22 +686,22 @@ body.is-menubar #min {
570
686
  }
571
687
  .num-val i {
572
688
  position: absolute;
573
- right: 7px;
689
+ right: 3px;
574
690
  top: 50%;
575
691
  transform: translateY(-50%);
576
692
  font-style: normal;
577
- font-size: 10px;
578
- color: var(--muted);
693
+ font-size: 9px;
694
+ color: #a1876b;
579
695
  pointer-events: none;
580
696
  }
581
697
  .num-btn {
582
698
  -webkit-app-region: no-drag;
583
699
  border: none;
584
- background: rgba(255, 255, 255, 0.1);
585
- color: var(--muted);
586
- width: 20px;
587
- height: 20px;
588
- border-radius: 6px;
700
+ background: none;
701
+ color: #ceb194;
702
+ width: 22px;
703
+ height: 22px;
704
+ border-radius: 0;
589
705
  font-size: 12px;
590
706
  line-height: 1;
591
707
  display: flex;
@@ -604,26 +720,18 @@ body.is-menubar #min {
604
720
  .num-btn:active {
605
721
  transform: scale(0.9);
606
722
  }
607
- .set-check {
608
- display: flex;
609
- align-items: center;
610
- gap: 6px;
611
- font-size: 11px;
612
- color: var(--text);
613
- margin-bottom: 9px;
614
- }
615
723
  .set-actions {
616
724
  display: flex;
617
725
  gap: 8px;
618
- margin-top: 4px;
726
+ margin-top: 17px;
619
727
  }
620
728
  .set-actions button {
621
729
  flex: 1;
622
- border: none;
623
- border-radius: 8px;
624
- padding: 6px;
730
+ border: 1px solid rgba(255, 255, 255, 0.082);
731
+ border-radius: 5px;
732
+ padding: 7px;
625
733
  font-size: 11px;
626
- font-weight: 600;
734
+ font-weight: 400;
627
735
  cursor: pointer;
628
736
  transition:
629
737
  background 0.18s,
@@ -633,15 +741,16 @@ body.is-menubar #min {
633
741
  transform: scale(0.97);
634
742
  }
635
743
  #set-cancel {
636
- background: rgba(255, 255, 255, 0.12);
744
+ background: none;
637
745
  color: var(--text);
638
746
  }
639
747
  #set-cancel:hover {
640
748
  background: rgba(255, 255, 255, 0.2);
641
749
  }
642
750
  #set-save {
643
- background: rgba(255, 255, 255, 0.12); /* rests like Cancel; dirty lights it */
644
- color: var(--text);
751
+ background: #ce926d;
752
+ border-color: #ce926d;
753
+ color: #261a12;
645
754
  }
646
755
  #set-save:disabled {
647
756
  opacity: 0.45;
@@ -649,14 +758,17 @@ body.is-menubar #min {
649
758
  }
650
759
  #set-save.dirty,
651
760
  #set-save.dirty:hover {
652
- color: #fff;
761
+ color: #261a12; /* filled coral now — dark text, not white */
653
762
  }
654
763
  #set-save.dirty:hover {
655
- background: #e2876a;
764
+ background: #e2a07f;
765
+ border-color: #e2a07f;
656
766
  }
657
767
  /* unsaved changes: light up and pulse so you don't forget to save */
658
768
  #set-save.dirty {
659
- background: var(--coral);
769
+ background: #ce926d;
770
+ border-color: #ce926d;
771
+ color: #261a12;
660
772
  animation: save-pulse 1.6s ease-in-out infinite;
661
773
  }
662
774
  @keyframes save-pulse {
@@ -675,9 +787,9 @@ body.is-menubar #min {
675
787
  align-items: center;
676
788
  justify-content: space-between;
677
789
  gap: 8px;
678
- margin-top: 11px;
679
- padding-top: 9px;
680
- border-top: 0.5px solid var(--hair);
790
+ margin-top: 12px;
791
+ font-size: 8px;
792
+ color: #8f755e;
681
793
  }
682
794
  .upd-ver {
683
795
  font-size: 10px;
@@ -699,14 +811,24 @@ body.is-menubar #min {
699
811
  color: var(--coral);
700
812
  }
701
813
  /* compact update button — lighter than the full-width .acc-btn */
814
+ /* once an update is offered, the button says it — the check link is redundant
815
+ and the three of them would not fit the footer on one line */
816
+ body.has-update #upd-check {
817
+ display: none;
818
+ }
819
+ .set-updates .upd-ver,
820
+ .upd-btn,
821
+ #upd-check {
822
+ white-space: nowrap;
823
+ }
702
824
  .upd-btn {
703
- border: none;
704
- border-radius: 7px;
705
- padding: 4px 9px;
706
- font-size: 10px;
707
- font-weight: 600;
708
- color: #fff;
709
- background: var(--coral);
825
+ border: 1px solid rgba(206, 146, 109, 0.35);
826
+ border-radius: 4px;
827
+ padding: 4px 8px;
828
+ font-size: 9px;
829
+ font-weight: 400;
830
+ color: #e3b193;
831
+ background: rgba(206, 146, 109, 0.09);
710
832
  cursor: pointer;
711
833
  -webkit-app-region: no-drag;
712
834
  transition:
@@ -714,7 +836,8 @@ body.is-menubar #min {
714
836
  transform 0.1s;
715
837
  }
716
838
  .upd-btn:hover {
717
- background: #e2876a;
839
+ background: rgba(206, 146, 109, 0.2);
840
+ border-color: rgba(206, 146, 109, 0.55);
718
841
  }
719
842
  .upd-btn:active {
720
843
  transform: scale(0.97);
@@ -732,33 +855,45 @@ body.live .live-only {
732
855
  display: inline;
733
856
  }
734
857
  #live-tag {
735
- color: var(--green);
736
- font-weight: 600;
858
+ margin-left: auto;
859
+ font-size: 8px;
860
+ letter-spacing: 0.4px;
861
+ font-weight: 400;
862
+ padding: 3px 5px;
863
+ color: #abbd96;
864
+ border: 1px solid rgba(161, 183, 134, 0.13);
865
+ background: rgba(161, 183, 134, 0.03);
866
+ border-radius: 3px;
737
867
  }
738
868
 
739
869
  /* account / auth */
740
870
  #account {
741
- margin-bottom: 10px;
742
- padding-bottom: 10px;
743
- border-bottom: 0.5px solid var(--hair); /* divider before the first section */
871
+ margin-bottom: 0;
744
872
  }
745
873
  .acc-btn {
746
874
  width: 100%;
747
- border: none;
748
- border-radius: 8px;
749
- padding: 7px;
875
+ display: flex;
876
+ align-items: center;
877
+ justify-content: center;
878
+ gap: 6px;
879
+ border: 1px solid rgba(206, 146, 109, 0.35);
880
+ border-radius: 5px;
881
+ padding: 9px;
750
882
  font-size: 11px;
751
- font-weight: 600;
883
+ font-weight: 400;
752
884
  cursor: pointer;
753
- background: var(--coral);
754
- color: #fff;
885
+ background: rgba(206, 146, 109, 0.09);
886
+ color: #e3b193;
755
887
  -webkit-app-region: no-drag;
888
+ /* the glyph rides at the text's weight, not heavier */
889
+ stroke-width: 1.8;
756
890
  transition:
757
891
  background 0.18s,
758
892
  transform 0.1s;
759
893
  }
760
894
  .acc-btn:hover:not(:disabled) {
761
- background: #e2876a;
895
+ background: rgba(206, 146, 109, 0.2);
896
+ border-color: rgba(206, 146, 109, 0.55);
762
897
  }
763
898
  .acc-btn:active:not(:disabled) {
764
899
  transform: scale(0.98);
@@ -786,9 +921,9 @@ body.live .live-only {
786
921
  text-decoration: underline;
787
922
  }
788
923
  .acc-ok {
789
- color: var(--green);
790
- font-size: 11px;
791
- font-weight: 600;
924
+ color: var(--text);
925
+ font-size: 9px;
926
+ font-weight: 400;
792
927
  flex: 1;
793
928
  min-width: 0;
794
929
  overflow: hidden;
@@ -816,23 +951,24 @@ body.live .live-only {
816
951
  color 0.15s;
817
952
  }
818
953
  .acc-item:hover {
819
- background: rgba(255, 255, 255, 0.06);
954
+ background: rgba(255, 255, 255, 0.04);
820
955
  color: var(--text);
821
956
  }
822
957
  .acc-item.active {
823
- background: rgba(217, 119, 87, 0.14);
824
- color: var(--text);
958
+ background: transparent;
959
+ color: #e7d6c5;
825
960
  cursor: default;
826
961
  }
827
962
  .acc-item .dot {
828
- width: 5px;
829
- height: 5px;
963
+ width: 4px;
964
+ height: 4px;
830
965
  border-radius: 50%;
831
966
  background: rgba(255, 255, 255, 0.22); /* logged out: a row with no usage yet */
832
967
  flex: none;
833
968
  }
834
969
  .acc-item.connected .dot {
835
- background: var(--green);
970
+ background: #a1b786;
971
+ box-shadow: 0 0 8px rgba(161, 183, 134, 0.19);
836
972
  }
837
973
  .acc-item .who {
838
974
  flex: 1;
@@ -934,7 +1070,8 @@ body.awaiting #acc-intro {
934
1070
  display: none;
935
1071
  }
936
1072
  #acc-disconnected {
937
- margin-top: 10px;
1073
+ margin-top: 8px;
1074
+ margin-bottom: 13px;
938
1075
  }
939
1076
 
940
1077
  /* just logged in: a short-lived green cheer at the top of the home panel */
@@ -948,16 +1085,26 @@ body.awaiting #acc-intro {
948
1085
  }
949
1086
 
950
1087
  /* limits: real meters when connected, a "connect" prompt otherwise */
1088
+ /* the connect prompt draws its own frame, so the rules on either side of it
1089
+ would box a box. It is `.live` that decides whether it shows — being logged
1090
+ in is not enough, the usage fetch has to have landed — so that is what these
1091
+ have to key off, not `.auth-on`. */
1092
+ body:not(.live) #statusline {
1093
+ border-bottom: 0;
1094
+ }
1095
+ body:not(.live) #bymodel {
1096
+ border-top: 0;
1097
+ }
951
1098
  #limits-connect {
952
1099
  display: flex;
953
1100
  align-items: center;
954
- gap: 11px;
1101
+ gap: 9px;
955
1102
  width: 100%;
956
1103
  text-align: left;
957
- border: 0.5px solid var(--hair);
958
- border-radius: 10px;
959
- background: rgba(255, 255, 255, 0.04);
960
- padding: 11px 13px;
1104
+ border: 1px solid rgba(206, 146, 109, 0.22);
1105
+ border-radius: 7px;
1106
+ background: rgba(206, 146, 109, 0.055);
1107
+ padding: 10px 11px;
961
1108
  cursor: pointer;
962
1109
  -webkit-app-region: no-drag;
963
1110
  transition:
@@ -965,15 +1112,15 @@ body.awaiting #acc-intro {
965
1112
  border-color 0.2s;
966
1113
  }
967
1114
  #limits-connect:hover {
968
- background: rgba(217, 119, 87, 0.1);
969
- border-color: rgba(217, 119, 87, 0.5);
1115
+ background: rgba(206, 146, 109, 0.13);
1116
+ border-color: rgba(206, 146, 109, 0.42);
970
1117
  }
971
1118
  .lc-ico {
972
1119
  flex: 0 0 auto;
973
- width: 17px;
974
- height: 17px;
975
- stroke: var(--coral);
976
- stroke-width: 2;
1120
+ width: 14px;
1121
+ height: 14px;
1122
+ stroke: #cb8a67;
1123
+ stroke-width: 1.8;
977
1124
  fill: none;
978
1125
  stroke-linecap: round;
979
1126
  stroke-linejoin: round;
@@ -985,14 +1132,14 @@ body.awaiting #acc-intro {
985
1132
  line-height: 1.25;
986
1133
  }
987
1134
  .lc-text b {
988
- font-size: 11.5px;
989
- font-weight: 600;
990
- color: var(--text);
1135
+ font-size: 11px;
1136
+ font-weight: 400;
1137
+ color: #e3cdb8;
991
1138
  }
992
1139
  .lc-text i {
993
- font-size: 9.5px;
1140
+ font-size: 9px;
994
1141
  font-style: normal;
995
- color: var(--muted);
1142
+ color: #a28a73;
996
1143
  }
997
1144
  body.live #limits-connect {
998
1145
  display: none;
@@ -1101,23 +1248,8 @@ body.collapsed #pet {
1101
1248
  }
1102
1249
  /* hide minimize while settings are open (toggling it bugs the layout) */
1103
1250
  body.settings-open #min {
1104
- display: none;
1105
- }
1106
-
1107
- /* pet */
1108
- /* expanded: a little night scene */
1109
- body.settings-open #stage {
1110
- height: 100px;
1111
- }
1112
- /* the ground layers stretch to fill the stage; while it's shortened, pin them
1113
- at their natural height so the gears stay round — the top just clips away.
1114
- #scene keeps stretching (dots and stars tolerate it) so its frame rows stay
1115
- at the edges; the blocky clouds don't, so they sit this screen out. */
1116
- body.settings-open #gears {
1117
- top: auto;
1118
- bottom: 0;
1119
- height: 132px;
1120
- }
1251
+ display: none;
1252
+ } /* pet */
1121
1253
  body.settings-open .cloud {
1122
1254
  display: none;
1123
1255
  }
@@ -1127,7 +1259,7 @@ body.settings-open #pet {
1127
1259
  #stage {
1128
1260
  position: relative;
1129
1261
  height: 132px;
1130
- margin-top: 16px;
1262
+ margin-top: 24px; /* the title band is 38px; the card already pads 14 of it */
1131
1263
  border-radius: 12px;
1132
1264
  background: radial-gradient(125% 145% at 50% 36%, #050505 52%, #150e0a 100%);
1133
1265
  box-shadow: 0 0 22px 7px rgba(6, 5, 4, 0.7);
@@ -1173,15 +1305,12 @@ body.collapsed #stage {
1173
1305
  }
1174
1306
  body.collapsed #scene {
1175
1307
  display: none;
1176
- }
1177
- /* minimized = just the pet's face: hide all activity scenery + props */
1308
+ } /* minimized = just the pet's face: hide all activity scenery + props */
1178
1309
  body.collapsed #desk,
1179
1310
  body.collapsed #plant,
1180
1311
  body.collapsed #mug,
1181
1312
  body.collapsed #reading,
1182
- body.collapsed #terminal,
1183
- body.collapsed #gears,
1184
- body.collapsed #glasses {
1313
+ body.collapsed #terminal {
1185
1314
  display: none;
1186
1315
  }
1187
1316
  /* collapsed: the pet sits a bit high, so the % fits under it inside the ring */
@@ -1293,47 +1422,11 @@ body.collapsed #shadow {
1293
1422
  transform-box: fill-box;
1294
1423
  transform-origin: center;
1295
1424
  animation: blink 5.5s infinite;
1296
- }
1297
- /* mechanic mode (settings): hard hat + screwdriver on the pet, loose gears
1298
- turning behind it. Hidden otherwise. */
1299
- #robot {
1300
- opacity: 0;
1301
- pointer-events: none;
1302
- transition: opacity 0.2s ease;
1303
- }
1304
- /* hard hat colors live inline (built pixel-by-pixel in pet.js buildHat) */
1305
- .dr-handle {
1306
- fill: #c0392b;
1307
- }
1308
- .dr-handle-hi {
1309
- fill: #e0685a;
1310
- }
1311
- .dr-collar {
1312
- fill: #9a9a9a;
1313
- }
1314
- .dr-tip,
1315
- .dr-shaft {
1316
- fill: #d0d0d0;
1317
- }
1318
- .dr-hi {
1319
- fill: #f2f2f2;
1320
- }
1321
- #gears {
1322
- position: absolute;
1323
- inset: 0;
1324
- width: 100%;
1325
- height: 100%;
1326
- z-index: 1;
1327
- fill: #7a6a5c;
1425
+ } /* mechanic mode (settings): hard hat + screwdriver on the pet {
1328
1426
  opacity: 0;
1329
1427
  pointer-events: none;
1330
1428
  transition: opacity 0.2s ease;
1331
- }
1332
- body.settings-open #robot,
1333
- body.settings-open #gears {
1334
- opacity: 1;
1335
- }
1336
- /* declutter the scene while configuring: mood marks AND activity props —
1429
+ }/* declutter the scene while configuring: mood marks AND activity props —
1337
1430
  the shortened stage only fits the pet and its gears */
1338
1431
  body.settings-open #zzz,
1339
1432
  body.settings-open #flames,
@@ -1342,8 +1435,7 @@ body.settings-open #terminal,
1342
1435
  body.settings-open #reading,
1343
1436
  body.settings-open #mug,
1344
1437
  body.settings-open #desk,
1345
- body.settings-open #plant,
1346
- body.settings-open #glasses {
1438
+ body.settings-open #plant {
1347
1439
  display: none;
1348
1440
  }
1349
1441
  /* reading mode: an open book with a magnifying glass scanning the lines */
@@ -1361,89 +1453,9 @@ body.settings-open #glasses {
1361
1453
  body.act-reading #reading {
1362
1454
  opacity: 1;
1363
1455
  }
1364
- /* reading glasses on the pet */
1365
- #glasses {
1366
- opacity: 0;
1367
- pointer-events: none;
1368
- transition: opacity 0.2s ease;
1369
- }
1370
- .gl-lens {
1371
- fill: rgba(190, 225, 255, 0.16);
1372
- stroke: #241c17;
1373
- stroke-width: 2.4;
1374
- }
1375
- .gl-bridge,
1376
- .gl-arm {
1377
- fill: none;
1378
- stroke: #241c17;
1379
- stroke-width: 2.4;
1380
- stroke-linecap: round;
1381
- }
1382
- body.act-reading #glasses {
1383
- opacity: 1;
1384
- }
1385
- .dc-card {
1386
- fill: #191d23; /* dark markdown viewer — easier to read on the dark scene */
1387
- }
1388
- .dc-ico {
1389
- fill: none;
1390
- stroke: #8a9098;
1391
- stroke-width: 1.1;
1392
- }
1393
- .dc-ico-fold {
1394
- fill: #8a9098;
1395
- }
1396
- .dc-title {
1397
- fill: #e2e5ea;
1398
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
1399
- font-size: 7px;
1400
- font-weight: 700;
1401
- }
1402
1456
  #dc-fname {
1403
1457
  transition: opacity 0.25s ease;
1404
1458
  }
1405
- .dc-divider {
1406
- stroke: rgba(255, 255, 255, 0.1);
1407
- stroke-width: 1;
1408
- }
1409
- .dc-h {
1410
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
1411
- font-size: 6.5px;
1412
- font-weight: 700;
1413
- }
1414
- .dc-h1 {
1415
- fill: #c39cf0; /* purple */
1416
- }
1417
- .dc-g {
1418
- fill: #7ed07e; /* green */
1419
- }
1420
- .dc-b {
1421
- fill: #6fb3f2; /* blue */
1422
- }
1423
- .dc-a {
1424
- fill: #e0b46a; /* amber */
1425
- }
1426
- .dc-body {
1427
- fill: #626b76; /* muted body text */
1428
- }
1429
- /* each heading lights up in turn (a "being read" pulse) */
1430
- body.act-reading .dc-h {
1431
- animation: dc-read 4s ease-in-out infinite;
1432
- }
1433
- @keyframes dc-read {
1434
- 0% {
1435
- opacity: 0.5;
1436
- }
1437
- 7% {
1438
- opacity: 1;
1439
- }
1440
- 24% {
1441
- opacity: 0.5;
1442
- }
1443
- 100% {
1444
- opacity: 0.5;
1445
- }
1446
- }
1447
1459
  /* editing mode: a coding desk (laptop with colorful code, coffee, plant) */
1448
1460
  #desk {
1449
1461
  position: absolute;
@@ -1491,31 +1503,6 @@ body.act-reading:not(.collapsed) #pet {
1491
1503
  body.act-running:not(.collapsed) #pet {
1492
1504
  left: 27px;
1493
1505
  }
1494
- .dk-desk {
1495
- fill: #262626;
1496
- }
1497
- .dk-keys {
1498
- fill: #4d4d4d;
1499
- }
1500
- .mug-body {
1501
- fill: #d8cbaf;
1502
- }
1503
- .mug-rim {
1504
- fill: #c6b896;
1505
- }
1506
- .mug-handle {
1507
- fill: none;
1508
- stroke: #d8cbaf;
1509
- stroke-width: 2.8;
1510
- stroke-linecap: round;
1511
- }
1512
- .mug-code {
1513
- fill: none;
1514
- stroke: #2a211a;
1515
- stroke-width: 1.7;
1516
- stroke-linecap: square;
1517
- stroke-linejoin: miter;
1518
- }
1519
1506
  .dk-wisp {
1520
1507
  fill: none;
1521
1508
  stroke: #c9c9c9;
@@ -1524,36 +1511,6 @@ body.act-running:not(.collapsed) #pet {
1524
1511
  opacity: 0;
1525
1512
  vector-effect: non-scaling-stroke;
1526
1513
  }
1527
- .dk-deck2 {
1528
- fill: #3a3a3a;
1529
- }
1530
- .dk-screen {
1531
- fill: #1c1c1c;
1532
- }
1533
- .dk-glass {
1534
- fill: #0b0b0b;
1535
- }
1536
- .c-grn {
1537
- fill: #6fcf6f;
1538
- }
1539
- .c-yel {
1540
- fill: #e2c46a;
1541
- }
1542
- .c-blu {
1543
- fill: #6fb3f2;
1544
- }
1545
- .c-cur {
1546
- fill: #cdeccf;
1547
- }
1548
- .dk-pot {
1549
- fill: #b98a5e;
1550
- }
1551
- .dk-leaf {
1552
- fill: #3f9150;
1553
- }
1554
- .dk-leaf-c {
1555
- fill: #57a95f;
1556
- }
1557
1514
  /* shared potted plant (editing + reading desks) */
1558
1515
  #plant {
1559
1516
  position: absolute;
@@ -1568,24 +1525,11 @@ body.act-running:not(.collapsed) #pet {
1568
1525
  body.act-editing #plant {
1569
1526
  opacity: 1;
1570
1527
  }
1571
- body.act-editing .c-cur {
1572
- animation: cursor-blink 1s steps(1, end) infinite;
1573
- }
1574
1528
  body.act-editing .dk-wisp,
1575
1529
  body.act-reading .dk-wisp {
1576
1530
  transform-box: view-box;
1577
1531
  animation: steam 2.6s ease-in-out infinite;
1578
1532
  }
1579
- @keyframes cursor-blink {
1580
- 0%,
1581
- 50% {
1582
- opacity: 1;
1583
- }
1584
- 51%,
1585
- 100% {
1586
- opacity: 0;
1587
- }
1588
- }
1589
1533
  @keyframes steam {
1590
1534
  0% {
1591
1535
  opacity: 0;
@@ -1824,187 +1768,16 @@ body.act-running #claude {
1824
1768
  body.act-running #terminal {
1825
1769
  opacity: 1;
1826
1770
  }
1827
- .tm-win {
1828
- fill: #14161a;
1829
- }
1830
- .tm-border {
1831
- fill: none;
1832
- stroke: rgba(255, 255, 255, 0.14);
1833
- stroke-width: 0.7;
1834
- }
1835
- .tm-bar {
1836
- fill: #262a30;
1837
- }
1838
- .tm-d1 {
1839
- fill: #ff5f57;
1840
- }
1841
- .tm-d2 {
1842
- fill: #febc2e;
1843
- }
1844
- .tm-d3 {
1845
- fill: #28c840;
1846
- }
1847
- .tm-prompt-c {
1848
- fill: #6fcf6f;
1849
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
1850
- font-size: 7.5px;
1851
- font-weight: 700;
1852
- }
1853
- .tm-head {
1854
- fill: #d6d9de;
1855
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
1856
- font-size: 7px;
1857
- font-weight: 600;
1858
- }
1859
- .tm-txt {
1860
- fill: #cfd3d8;
1861
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
1862
- font-size: 6.5px;
1863
- }
1864
- .tm-dots {
1865
- fill: #8a9098;
1866
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
1867
- font-size: 7px;
1868
- font-weight: 700;
1869
- }
1870
- .tm-cursor {
1871
- fill: #6fcf6f;
1872
- }
1873
- .tm-check {
1874
- fill: none;
1875
- stroke: #28c840;
1876
- stroke-width: 1.5;
1877
- stroke-linecap: round;
1878
- stroke-linejoin: round;
1879
- }
1880
- .tm-spin {
1881
- fill: none;
1882
- stroke: #cfd3d8;
1883
- stroke-width: 1.6;
1884
- stroke-linecap: round;
1885
- transform-box: view-box;
1886
- transform-origin: 8px 54px; /* the spinner's own centre */
1887
- }
1888
- .tm-done-txt {
1889
- fill: #6fcf6f;
1890
- font-family: "SF Mono", ui-monospace, Menlo, monospace;
1891
- font-size: 6.5px;
1892
- font-weight: 600;
1893
- }
1894
- /* task log lifecycle (5s): lines stream in → Waiting spins → ✓ Done → restart */
1895
- .tskA,
1896
- .tskB,
1897
- .tskC,
1898
- .tskWait,
1899
- .tskDone {
1900
- opacity: 0;
1901
- }
1902
- body.act-running .tskA {
1903
- animation: tskA 5s linear infinite;
1904
- }
1905
- body.act-running .tskB {
1906
- animation: tskB 5s linear infinite;
1907
- }
1908
- body.act-running .tskC {
1909
- animation: tskC 5s linear infinite;
1910
- }
1911
- body.act-running .tskWait {
1912
- animation: tskWait 5s linear infinite;
1913
- }
1914
- body.act-running .tskDone {
1915
- animation: tskDone 5s linear infinite;
1916
- }
1917
- body.act-running .tm-spin {
1918
- animation: tm-spin-rot 0.8s linear infinite;
1919
- }
1920
- body.act-running .tm-cursor {
1921
- animation: cursor-blink 1s steps(1, end) infinite;
1922
- }
1923
- @keyframes tm-spin-rot {
1924
- to {
1925
- transform: rotate(360deg);
1926
- }
1927
- }
1928
- @keyframes tskA {
1929
- 0%,
1930
- 4% {
1931
- opacity: 0;
1932
- }
1933
- 8%,
1934
- 90% {
1935
- opacity: 1;
1936
- }
1937
- 96%,
1938
- 100% {
1939
- opacity: 0;
1940
- }
1941
- }
1942
- @keyframes tskB {
1943
- 0%,
1944
- 16% {
1945
- opacity: 0;
1946
- }
1947
- 20%,
1948
- 90% {
1949
- opacity: 1;
1950
- }
1951
- 96%,
1952
- 100% {
1953
- opacity: 0;
1954
- }
1955
- }
1956
- @keyframes tskC {
1957
- 0%,
1958
- 30% {
1959
- opacity: 0;
1960
- }
1961
- 34%,
1962
- 90% {
1963
- opacity: 1;
1964
- }
1965
- 96%,
1966
- 100% {
1967
- opacity: 0;
1968
- }
1969
- }
1970
- @keyframes tskWait {
1971
- 0%,
1972
- 6% {
1973
- opacity: 0;
1974
- }
1975
- 10%,
1976
- 46% {
1977
- opacity: 1;
1978
- }
1979
- 52%,
1980
- 100% {
1981
- opacity: 0;
1982
- }
1983
- }
1984
- @keyframes tskDone {
1985
- 0%,
1986
- 52% {
1987
- opacity: 0;
1988
- }
1989
- 58%,
1990
- 90% {
1991
- opacity: 1;
1992
- }
1993
- 96%,
1994
- 100% {
1995
- opacity: 0;
1996
- }
1997
- }
1998
1771
 
1999
1772
  /* status */
2000
1773
  #statusline {
2001
- margin-top: 2px;
2002
- font-size: 11.5px;
2003
- color: var(--muted);
2004
1774
  display: flex;
2005
1775
  align-items: center;
2006
- justify-content: center;
2007
1776
  gap: 6px;
1777
+ padding: 11px 0 12px; /* clear the stage's edge — the live pill sat on it */
1778
+ border-bottom: 1px solid var(--hair);
1779
+ font-size: 11px;
1780
+ color: #c4b29f;
2008
1781
  }
2009
1782
  #statusline .sep {
2010
1783
  opacity: 0.4;
@@ -2020,6 +1793,8 @@ body.act-running .tm-cursor {
2020
1793
  color: var(--text);
2021
1794
  }
2022
1795
  #rate {
1796
+ font-size: 10px;
1797
+ color: #978572;
2023
1798
  font-variant-numeric: tabular-nums;
2024
1799
  }
2025
1800
  body.state-working #status-dot {
@@ -2046,8 +1821,8 @@ body.state-tired #status-text {
2046
1821
  .sub {
2047
1822
  /* small enough that "resets in 69h 15m (Fri 7:01 AM) · 1.02B tokens" stays on one line */
2048
1823
  font-size: 9px;
2049
- color: var(--muted);
2050
- margin-top: 4px;
1824
+ color: #96816d;
1825
+ margin-top: 5px;
2051
1826
  letter-spacing: 0px;
2052
1827
  white-space: nowrap;
2053
1828
  overflow: hidden;
@@ -2068,120 +1843,146 @@ body.state-tired #status-text {
2068
1843
 
2069
1844
  /* 30-day map */
2070
1845
  #heat {
2071
- margin-top: 12px;
1846
+ padding-top: 0; /* #heat-meta draws its own rule and padding, like a .sec */
2072
1847
  }
2073
1848
  #heat-row {
2074
1849
  display: flex;
2075
1850
  gap: 2px;
2076
- height: 14px;
1851
+ height: 7px;
1852
+ margin-top: 7px;
2077
1853
  }
1854
+ /* a warm ramp that climbs in lightness AND saturation at once: opacity alone
1855
+ collapses the low steps into one smudge against the dark card, so the busy
1856
+ days and the quiet ones have to differ in colour, not just in strength */
2078
1857
  .sq {
2079
1858
  flex: 1;
2080
- border-radius: 2px;
2081
- background: rgba(255, 255, 255, 0.07);
1859
+ border-radius: 1.5px;
1860
+ background: rgba(255, 255, 255, 0.05); /* no activity */
2082
1861
  transition: background 0.4s;
2083
1862
  }
2084
1863
  .sq.lv1 {
2085
- background: #8fbf6e;
1864
+ background: #6b4430;
2086
1865
  }
2087
1866
  .sq.lv2 {
2088
- background: #d8c25f;
1867
+ background: #9c6340;
2089
1868
  }
2090
1869
  .sq.lv3 {
2091
- background: #d98f52;
1870
+ background: #cf8b52;
2092
1871
  }
2093
1872
  .sq.lv4 {
2094
- background: #cf5b46;
1873
+ background: #f0b464;
2095
1874
  }
2096
1875
  #heat-meta {
2097
1876
  display: flex;
2098
1877
  justify-content: space-between;
2099
- font-size: 9.5px;
2100
- color: var(--muted);
2101
- margin-top: 5px;
2102
- letter-spacing: 0.2px;
1878
+ font-size: 9px;
1879
+ color: #a58d77;
1880
+ border-top: 1px solid var(--hair);
1881
+ padding-top: 9px;
1882
+ margin-top: 0;
1883
+ letter-spacing: 0;
2103
1884
  }
2104
1885
  #month-total {
2105
- font-weight: 600;
2106
- color: var(--text);
1886
+ font-weight: 400;
1887
+ color: #a58d77;
2107
1888
  font-variant-numeric: tabular-nums;
2108
1889
  }
2109
1890
 
2110
- /* divider */
2111
- .divider {
2112
- height: 0.5px;
2113
- background: var(--hair);
2114
- margin: 12px 0;
2115
- }
2116
-
2117
1891
  /* meters */
1892
+ #limits-meters {
1893
+ padding: 0 0 12px;
1894
+ }
1895
+ .meter {
1896
+ margin-top: 12px;
1897
+ }
2118
1898
  .meter + .meter,
2119
1899
  #scoped-meters .meter {
2120
- margin-top: 9px;
1900
+ margin-top: 12px;
2121
1901
  }
2122
1902
  .meter-top {
2123
1903
  display: flex;
2124
1904
  justify-content: space-between;
2125
- font-size: 10px;
2126
- color: var(--muted);
2127
- margin-bottom: 4px;
1905
+ align-items: center;
1906
+ font-size: 11px;
1907
+ color: #cbb9a7;
1908
+ margin-bottom: 0;
2128
1909
  }
2129
1910
  .meter-top i {
2130
1911
  font-style: italic;
2131
1912
  opacity: 0.5;
2132
1913
  font-size: 9px;
2133
1914
  }
1915
+ /* the number is plain while there is nothing to worry about — colour is the
1916
+ warning, so spending it at 5% leaves nothing to say at 90% */
2134
1917
  .meter-top span:last-child {
2135
- font-weight: 600;
1918
+ font-size: 12px;
1919
+ font-weight: 500;
2136
1920
  color: var(--text);
2137
1921
  font-variant-numeric: tabular-nums;
1922
+ transition: color 0.6s;
2138
1923
  }
2139
1924
  .track {
2140
1925
  width: 100%;
2141
- height: 6px;
2142
- background: var(--track);
2143
- border-radius: 6px;
1926
+ height: 4px;
1927
+ background: rgba(255, 255, 255, 0.035);
1928
+ border-radius: 4px;
2144
1929
  overflow: hidden;
1930
+ margin-top: 7px;
2145
1931
  }
2146
1932
  .fill {
2147
1933
  height: 100%;
2148
1934
  width: 0%;
2149
- background: linear-gradient(90deg, var(--coral-soft), var(--coral));
2150
- border-radius: 6px;
1935
+ background: var(--coral);
1936
+ border-radius: 4px;
2151
1937
  transition:
2152
- width 0.7s cubic-bezier(0.4, 0, 0.2, 1),
2153
- background 0.4s;
1938
+ width 0.7s cubic-bezier(0.22, 1, 0.36, 1),
1939
+ background 0.7s;
2154
1940
  }
2155
1941
  .fill.week {
2156
- background: linear-gradient(90deg, #c98a6e, var(--coral-soft));
1942
+ background: var(--coral);
1943
+ }
1944
+ /* the ramp, shared by the bars and their numbers */
1945
+ .fill.mid {
1946
+ background: #e5b55d;
1947
+ }
1948
+ .fill.hot,
1949
+ .fill.high.hot {
1950
+ background: #ee705e;
2157
1951
  }
2158
- .fill.high {
2159
- background: linear-gradient(90deg, #e98a68, #d8442f);
1952
+ .meter-top span:last-child.mid {
1953
+ color: #e5b55d;
1954
+ }
1955
+ .meter-top span:last-child.hot {
1956
+ color: #ee705e;
2160
1957
  }
2161
1958
 
2162
1959
  /* by model / by project — collapsible sections */
1960
+ .sec {
1961
+ border-top: 1px solid var(--hair);
1962
+ padding: 9px 0;
1963
+ }
2163
1964
  .sec-head {
2164
1965
  display: flex;
2165
1966
  align-items: center;
2166
1967
  justify-content: space-between;
2167
1968
  width: 100%;
2168
1969
  padding: 0;
2169
- margin-bottom: 6px;
1970
+ margin-bottom: 0;
2170
1971
  background: none;
2171
1972
  border: 0;
2172
1973
  cursor: pointer;
2173
1974
  font: inherit;
2174
- font-size: 9.5px;
2175
- color: var(--muted);
2176
- letter-spacing: 0.3px;
1975
+ font-size: 10px;
1976
+ color: #a38c78;
1977
+ letter-spacing: 0;
2177
1978
  -webkit-app-region: no-drag;
2178
1979
  }
2179
1980
  .sec-head:hover {
2180
1981
  color: var(--text);
2181
1982
  }
2182
1983
  .sec-chev {
2183
- width: 12px;
2184
- height: 12px;
1984
+ width: 10px;
1985
+ height: 10px;
2185
1986
  fill: none;
2186
1987
  stroke: currentColor;
2187
1988
  stroke-width: 2.2;
@@ -2192,52 +1993,81 @@ body.state-tired #status-text {
2192
1993
  .sec.folded .sec-chev {
2193
1994
  transform: rotate(-90deg);
2194
1995
  }
1996
+ /* 0fr -> 1fr is the only way a height-to-content box can be animated; the inner
1997
+ wrapper is what actually clips, so the rows never reflow mid-slide */
1998
+ .sec-body {
1999
+ display: grid;
2000
+ grid-template-rows: 1fr;
2001
+ transition: grid-template-rows 0.42s cubic-bezier(0.22, 1, 0.36, 1);
2002
+ }
2003
+ .sec-body > div {
2004
+ min-height: 0;
2005
+ overflow: hidden;
2006
+ }
2195
2007
  .sec.folded .sec-body {
2196
- display: none;
2008
+ grid-template-rows: 0fr;
2197
2009
  }
2198
2010
  .sec.folded .sec-head {
2199
2011
  margin-bottom: 0;
2200
2012
  }
2201
2013
  .mrow {
2202
- display: flex;
2014
+ display: grid;
2015
+ grid-template-columns: 1fr 40px 44px;
2203
2016
  align-items: center;
2204
2017
  gap: 7px;
2205
- font-size: 11px;
2206
- color: var(--text);
2207
- margin-bottom: 5px;
2018
+ font-size: 10px;
2019
+ color: #c7b19a;
2020
+ margin-top: 7px;
2021
+ margin-bottom: 0;
2208
2022
  }
2209
2023
  .mrow .mname {
2210
- /* one width for the whole list, measured at render time — the bars are only
2211
- comparable if every track starts at the same x */
2212
- flex: 0 0 var(--name-w, 64px);
2213
- font-weight: 500;
2024
+ /* the grid now fixes the bar column, so every track starts at the same x
2025
+ without measuring the names */
2026
+ display: flex;
2027
+ align-items: center;
2028
+ gap: 5px;
2029
+ font-weight: 400;
2214
2030
  overflow: hidden;
2215
2031
  text-overflow: ellipsis;
2216
2032
  white-space: nowrap;
2217
2033
  }
2218
- /* project names are paths, not four-letter families — give them room and clip
2219
- the rest, with the full name on the row's title attribute */
2220
- #byproject .mrow {
2221
- font-size: 10px;
2034
+ /* a rank dot, so a row reads as an entry rather than a bare label */
2035
+ .mrow .mname::before {
2036
+ content: "";
2037
+ flex: none;
2038
+ width: 3px;
2039
+ height: 3px;
2040
+ border-radius: 50%;
2041
+ background: #b1967c;
2042
+ }
2043
+ .mrow:nth-child(1) .mname::before {
2044
+ background: var(--coral);
2045
+ }
2046
+ .mrow:nth-child(2) .mname::before {
2047
+ background: #c8a475;
2222
2048
  }
2049
+ .mrow:nth-child(3) .mname::before {
2050
+ background: #807769;
2051
+ }
2052
+ /* project names are paths, not four-letter families — the grid's first column
2053
+ takes the slack and clips the rest, full name on the row's title attribute */
2223
2054
  .mrow .mbar {
2224
- flex: 1;
2225
- height: 4px;
2226
- background: var(--track);
2227
- border-radius: 3px;
2055
+ height: 3px;
2056
+ background: rgba(255, 255, 255, 0.024);
2057
+ border-radius: 2px;
2228
2058
  overflow: hidden;
2229
2059
  }
2230
2060
  .mrow .mbar > i {
2231
2061
  display: block;
2232
2062
  height: 100%;
2233
- background: var(--coral);
2234
- border-radius: 3px;
2063
+ background: #c2865e;
2064
+ border-radius: 2px;
2235
2065
  transition: width 0.6s ease;
2236
2066
  }
2237
2067
  .mrow .mval {
2238
- flex: 0 0 auto;
2068
+ text-align: right;
2239
2069
  font-size: 10px;
2240
- color: var(--muted);
2070
+ color: #a48b74;
2241
2071
  font-variant-numeric: tabular-nums;
2242
2072
  }
2243
2073