claude-code-kanban 4.29.0 → 4.31.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.
package/public/style.css CHANGED
@@ -16,7 +16,7 @@
16
16
  --text-muted: #7d808a;
17
17
  --accent: #e86f33;
18
18
  --accent-text: #f0a070;
19
- --accent-dim: rgba(232, 111, 51, 0.22);
19
+ --accent-dim: rgba(232, 111, 51, 0.25);
20
20
  --accent-glow: rgba(232, 111, 51, 0.55);
21
21
  --gold: #d9b667;
22
22
  --success: #3ecf8e;
@@ -456,14 +456,14 @@ body::before {
456
456
  gap: 8px;
457
457
  padding: 14px 16px 10px 20px;
458
458
  font-size: 11px;
459
- font-weight: 500;
460
- text-transform: uppercase;
461
- letter-spacing: 0.12em;
462
459
  color: var(--text-muted);
463
460
  }
464
461
 
465
462
  .section-header-label {
466
463
  flex: 0 0 auto;
464
+ font-weight: 500;
465
+ text-transform: uppercase;
466
+ letter-spacing: 0.12em;
467
467
  }
468
468
 
469
469
  /* Non-default filters, spelled out in the header so folding them into the popover
@@ -475,9 +475,7 @@ body::before {
475
475
  white-space: nowrap;
476
476
  text-overflow: ellipsis;
477
477
  font-size: 10px;
478
- font-weight: 400;
479
478
  letter-spacing: 0.02em;
480
- text-transform: none;
481
479
  color: var(--accent-text);
482
480
  }
483
481
 
@@ -545,15 +543,6 @@ body::before {
545
543
  display: block;
546
544
  }
547
545
 
548
- .filter-row {
549
- display: flex;
550
- gap: 5px;
551
- }
552
-
553
- .filter-row + .filter-row {
554
- margin-top: 5px;
555
- }
556
-
557
546
  .filter-dropdown {
558
547
  flex: 1;
559
548
  appearance: none;
@@ -577,28 +566,182 @@ body::before {
577
566
  border-color: var(--border);
578
567
  }
579
568
 
580
- /* A filter holding a non-default value tints toward the ember, so it reads as "active"
581
- before you read the value. Border and text only — the fill never floods. */
582
- .filter-dropdown.non-default {
583
- color: var(--accent-text);
584
- border-color: color-mix(in srgb, var(--accent) 40%, transparent);
569
+ .filter-dropdown option {
570
+ background: var(--bg-surface);
571
+ color: var(--text-primary);
585
572
  }
586
573
 
587
- .filter-dropdown.non-default:hover {
588
- border-color: color-mix(in srgb, var(--accent) 60%, transparent);
574
+ .filter-dropdown:focus,
575
+ .pf-field:focus-within {
576
+ outline: none;
577
+ border-color: var(--accent);
578
+ box-shadow: 0 0 0 2px var(--accent-dim);
589
579
  }
590
580
 
591
- .filter-dropdown option {
592
- background: var(--bg-surface);
581
+ /* The project box: path field with the 24h switch set into its right end. */
582
+ .pf-field {
583
+ display: flex;
584
+ align-items: center;
585
+ gap: 6px;
586
+ padding: 0 4px 0 9px;
587
+ background: var(--bg-deep);
588
+ border: 1px solid transparent;
589
+ border-radius: 6px;
590
+ }
591
+
592
+ .pf-icon {
593
+ flex: none;
594
+ width: 14px;
595
+ height: 14px;
596
+ color: var(--text-muted);
597
+ }
598
+
599
+ .pf-input {
600
+ flex: 1;
601
+ min-width: 0;
602
+ padding: 8px 0;
603
+ background: none;
604
+ border: none;
605
+ outline: none;
606
+ font-family: var(--mono);
607
+ font-size: 12px;
593
608
  color: var(--text-primary);
594
609
  }
595
610
 
596
- .filter-dropdown:focus {
611
+ .pf-input::placeholder {
612
+ color: var(--text-muted);
613
+ }
614
+
615
+ .pf-recent {
616
+ flex: none;
617
+ padding: 3px 7px;
618
+ background: none;
619
+ border: 1px solid var(--border);
620
+ border-radius: 4px;
621
+ font-family: var(--mono);
622
+ font-size: 10.5px;
623
+ color: var(--text-muted);
624
+ cursor: pointer;
625
+ }
626
+
627
+ .pf-recent:hover {
628
+ color: var(--text-secondary);
629
+ }
630
+
631
+ .pf-recent[aria-pressed='true'] {
632
+ background: var(--accent-dim);
633
+ border-color: transparent;
634
+ color: var(--accent-text);
635
+ }
636
+
637
+ .pf-recent:focus-visible,
638
+ .pf-seg button:focus-visible {
597
639
  outline: none;
598
- border-color: var(--accent);
599
640
  box-shadow: 0 0 0 2px var(--accent-dim);
600
641
  }
601
642
 
643
+ /* Name first, folder after it, age last. The folder clips from its left end, so the part
644
+ next to the name stays readable. */
645
+ .pf-list {
646
+ list-style: none;
647
+ margin: 4px 0 0;
648
+ padding: 0;
649
+ }
650
+
651
+ .pf-opt {
652
+ position: relative;
653
+ display: grid;
654
+ grid-template-columns: auto minmax(0, 1fr) auto;
655
+ align-items: baseline;
656
+ gap: 8px;
657
+ padding: 5px 8px;
658
+ border-radius: 5px;
659
+ font-family: var(--mono);
660
+ cursor: pointer;
661
+ }
662
+
663
+ .pf-opt:hover,
664
+ .pf-opt.hl {
665
+ background: var(--bg-hover);
666
+ }
667
+
668
+ .pf-name {
669
+ font-size: 12px;
670
+ color: var(--text-primary);
671
+ white-space: nowrap;
672
+ }
673
+
674
+ .pf-dir,
675
+ .pf-age {
676
+ font-size: 10.5px;
677
+ color: var(--text-muted);
678
+ white-space: nowrap;
679
+ }
680
+
681
+ .pf-dir {
682
+ overflow: hidden;
683
+ text-overflow: ellipsis;
684
+ direction: rtl;
685
+ text-align: left;
686
+ }
687
+
688
+ .pf-opt mark {
689
+ background: none;
690
+ color: var(--accent-text);
691
+ text-decoration: underline;
692
+ text-decoration-thickness: 1px;
693
+ text-underline-offset: 3px;
694
+ }
695
+
696
+ .pf-opt[aria-selected='true']::before {
697
+ content: '';
698
+ position: absolute;
699
+ top: 5px;
700
+ bottom: 5px;
701
+ left: 0;
702
+ width: 2px;
703
+ background: var(--accent);
704
+ }
705
+
706
+ .pf-opt[aria-selected='true'] .pf-name {
707
+ color: var(--accent-text);
708
+ }
709
+
710
+ .pf-empty {
711
+ padding: 8px;
712
+ font-size: 11.5px;
713
+ color: var(--text-muted);
714
+ }
715
+
716
+ .pf-seg {
717
+ display: grid;
718
+ grid-template-columns: 1fr 1fr;
719
+ gap: 4px;
720
+ margin-top: 6px;
721
+ padding-top: 6px;
722
+ border-top: 1px solid var(--border);
723
+ }
724
+
725
+ .pf-seg button {
726
+ padding: 6px;
727
+ background: none;
728
+ border: none;
729
+ border-radius: 5px;
730
+ font-family: var(--mono);
731
+ font-size: 11.5px;
732
+ color: var(--text-muted);
733
+ cursor: pointer;
734
+ }
735
+
736
+ .pf-seg button:hover {
737
+ color: var(--text-secondary);
738
+ }
739
+
740
+ .pf-seg button[aria-checked='true'] {
741
+ background: var(--bg-deep);
742
+ color: var(--text-primary);
743
+ }
744
+
602
745
  /* #endregion */
603
746
 
604
747
  /* #region COLLAPSIBLE */
@@ -904,34 +1047,6 @@ body.booting .boot-splash {
904
1047
  text-overflow: ellipsis;
905
1048
  }
906
1049
 
907
- /* inline-flex so only the text takes the click — a full-width row would swallow clicks
908
- meant for the card itself */
909
- .session-goal {
910
- display: inline-flex;
911
- align-items: baseline;
912
- max-width: 100%;
913
- font-size: 10px;
914
- margin-top: var(--card-gap-tight);
915
- white-space: nowrap;
916
- overflow: hidden;
917
- text-overflow: ellipsis;
918
- cursor: pointer;
919
- color: var(--warning);
920
- }
921
- .session-goal .session-goal-icon {
922
- margin-right: 3px;
923
- font-weight: 700;
924
- flex-shrink: 0;
925
- }
926
- .session-goal .session-goal-text {
927
- overflow: hidden;
928
- text-overflow: ellipsis;
929
- }
930
- .session-goal:hover .session-goal-text {
931
- text-decoration: underline;
932
- text-underline-offset: 2px;
933
- }
934
-
935
1050
  .session-item.plan-reveal {
936
1051
  outline: 1.5px solid var(--plan);
937
1052
  background: var(--plan-dim);
@@ -1189,6 +1304,28 @@ body.booting .boot-splash {
1189
1304
  color: var(--text-secondary);
1190
1305
  }
1191
1306
 
1307
+ .sidebar-footer .footer-version {
1308
+ display: inline-flex;
1309
+ align-items: center;
1310
+ gap: 6px;
1311
+ }
1312
+
1313
+ .sidebar-footer .footer-plugin-warning {
1314
+ padding: 0;
1315
+ border: none;
1316
+ background: none;
1317
+ font: inherit;
1318
+ font-size: 11px;
1319
+ line-height: 1;
1320
+ color: var(--warning);
1321
+ cursor: pointer;
1322
+ }
1323
+
1324
+ .sidebar-footer .footer-plugin-warning:hover,
1325
+ .sidebar-footer .footer-plugin-warning:focus-visible {
1326
+ filter: brightness(1.2);
1327
+ }
1328
+
1192
1329
  .sidebar.collapsed {
1193
1330
  width: 48px;
1194
1331
  }
@@ -1231,14 +1368,140 @@ body.booting .boot-splash {
1231
1368
  color: var(--text-muted);
1232
1369
  }
1233
1370
 
1234
- .empty-state svg {
1235
- width: 48px;
1236
- height: 48px;
1371
+ .idle-board {
1372
+ position: relative;
1373
+ overflow: hidden;
1374
+ isolation: isolate;
1375
+ }
1376
+
1377
+ .idle-ghost {
1378
+ position: absolute;
1379
+ inset: 0;
1380
+ z-index: -1;
1381
+ display: grid;
1382
+ grid-template-columns: repeat(3, 1fr);
1383
+ gap: 20px;
1384
+ padding: 28px;
1385
+ opacity: 0.55;
1386
+ mask-image: radial-gradient(ellipse 70% 65% at 50% 50%, transparent 25%, #000 75%);
1387
+ }
1388
+
1389
+ .idle-ghost > div {
1390
+ display: flex;
1391
+ flex-direction: column;
1392
+ gap: 10px;
1393
+ padding: 44px 12px 12px;
1394
+ border: 1px dashed var(--border);
1395
+ border-radius: 12px;
1396
+ }
1397
+
1398
+ .idle-ghost span {
1399
+ height: 64px;
1400
+ border: 1px solid var(--border);
1401
+ border-radius: 9px;
1402
+ background: var(--bg-surface);
1403
+ }
1404
+
1405
+ .idle-ghost span:nth-child(2n) {
1406
+ height: 92px;
1407
+ }
1408
+
1409
+ .idle-glow {
1410
+ position: absolute;
1411
+ inset: 0;
1412
+ z-index: -1;
1413
+ pointer-events: none;
1414
+ }
1415
+
1416
+ .idle-glow span {
1417
+ position: absolute;
1418
+ width: 460px;
1419
+ height: 460px;
1420
+ border-radius: 50%;
1421
+ background: radial-gradient(circle, var(--accent-dim), transparent 65%);
1422
+ animation: idle-drift 22s ease-in-out infinite alternate;
1423
+ }
1424
+
1425
+ .idle-glow span:first-child {
1426
+ top: 12%;
1427
+ left: 18%;
1428
+ }
1429
+
1430
+ .idle-glow span + span {
1431
+ right: 14%;
1432
+ bottom: 8%;
1433
+ width: 360px;
1434
+ height: 360px;
1435
+ animation-duration: 28s;
1436
+ animation-direction: alternate-reverse;
1437
+ }
1438
+
1439
+ @keyframes idle-drift {
1440
+ to {
1441
+ transform: translate(90px, 50px) scale(1.15);
1442
+ }
1443
+ }
1444
+
1445
+ .idle-content {
1446
+ display: flex;
1447
+ flex-direction: column;
1448
+ align-items: center;
1449
+ gap: 10px;
1450
+ }
1451
+
1452
+ .idle-clawd {
1453
+ position: relative;
1454
+ padding-bottom: 10px;
1455
+ margin-bottom: 6px;
1456
+ }
1457
+
1458
+ .idle-clawd .clawd {
1459
+ display: block;
1460
+ animation: idle-float 3.2s ease-in-out infinite;
1461
+ }
1462
+
1463
+ .idle-clawd::after {
1464
+ content: '';
1465
+ position: absolute;
1466
+ left: 50%;
1467
+ bottom: 0;
1468
+ width: 44px;
1469
+ height: 6px;
1470
+ margin-left: -22px;
1471
+ border-radius: 50%;
1472
+ background: var(--text-muted);
1473
+ opacity: 0.25;
1474
+ animation: idle-shadow 3.2s ease-in-out infinite;
1475
+ }
1476
+
1477
+ @keyframes idle-float {
1478
+ 50% {
1479
+ transform: translateY(-6px);
1480
+ }
1481
+ }
1482
+
1483
+ @keyframes idle-shadow {
1484
+ 50% {
1485
+ transform: scaleX(0.75);
1486
+ opacity: 0.15;
1487
+ }
1488
+ }
1489
+
1490
+ .idle-title {
1491
+ font-size: 14px;
1492
+ color: var(--text-secondary);
1493
+ }
1494
+
1495
+ .idle-hint span {
1237
1496
  opacity: 0.5;
1238
1497
  }
1239
1498
 
1240
- .empty-state p {
1241
- font-size: 13px;
1499
+ @media (prefers-reduced-motion: reduce) {
1500
+ .idle-glow span,
1501
+ .idle-clawd .clawd,
1502
+ .idle-clawd::after {
1503
+ animation: none;
1504
+ }
1242
1505
  }
1243
1506
 
1244
1507
  /* #endregion */
@@ -1681,12 +1944,6 @@ body.booting .boot-splash {
1681
1944
  color: var(--text-tertiary);
1682
1945
  }
1683
1946
 
1684
- .task-session {
1685
- font-size: 12px;
1686
- color: var(--accent);
1687
- margin-top: 4px;
1688
- }
1689
-
1690
1947
  .task-active {
1691
1948
  display: flex;
1692
1949
  align-items: center;
@@ -2613,35 +2870,6 @@ body.booting .boot-splash {
2613
2870
  border-top: 1px solid var(--border);
2614
2871
  }
2615
2872
 
2616
- .info-goal-card {
2617
- margin: 12px 0;
2618
- padding: 10px 14px;
2619
- background: var(--bg-elevated);
2620
- border: 1px solid var(--border);
2621
- border-radius: 8px;
2622
- }
2623
- .info-goal-head {
2624
- display: flex;
2625
- align-items: center;
2626
- gap: 6px;
2627
- font-size: 11px;
2628
- font-weight: 600;
2629
- text-transform: uppercase;
2630
- letter-spacing: 0.5px;
2631
- color: var(--text-muted);
2632
- }
2633
- .info-goal-icon {
2634
- color: var(--warning);
2635
- }
2636
- .info-goal-text {
2637
- margin-top: 6px;
2638
- font-size: 13px;
2639
- line-height: 1.45;
2640
- color: var(--text-primary);
2641
- white-space: pre-wrap;
2642
- word-break: break-word;
2643
- }
2644
-
2645
2873
  .info-grid {
2646
2874
  display: grid;
2647
2875
  grid-template-columns: auto 1fr auto;
@@ -3002,6 +3230,16 @@ body.booting .boot-splash {
3002
3230
  .message-panel.msg-expanded-wide {
3003
3231
  width: 60vw;
3004
3232
  }
3233
+ .message-panel.full-width {
3234
+ left: var(--sidebar-edge, 0);
3235
+ width: auto;
3236
+ }
3237
+ .message-panel.full-width .panel-resize-handle {
3238
+ display: none;
3239
+ }
3240
+ #message-panel-full-btn.active {
3241
+ color: var(--accent);
3242
+ }
3005
3243
  .message-panel-header {
3006
3244
  padding: 16px 20px;
3007
3245
  display: flex;
@@ -3421,6 +3659,28 @@ body.booting .boot-splash {
3421
3659
  opacity: 1;
3422
3660
  transform: translateY(0);
3423
3661
  }
3662
+ .toast.has-action.visible {
3663
+ pointer-events: auto;
3664
+ display: flex;
3665
+ align-items: center;
3666
+ gap: 10px;
3667
+ max-width: min(480px, calc(100vw - 32px));
3668
+ overflow-wrap: anywhere;
3669
+ }
3670
+ .toast-action {
3671
+ flex-shrink: 0;
3672
+ font: inherit;
3673
+ font-weight: 600;
3674
+ color: var(--accent-text);
3675
+ background: transparent;
3676
+ border: 1px solid var(--accent);
3677
+ border-radius: 4px;
3678
+ padding: 2px 10px;
3679
+ cursor: pointer;
3680
+ }
3681
+ .toast-action:hover {
3682
+ background: var(--accent-dim);
3683
+ }
3424
3684
  .toast.toast-success {
3425
3685
  border-color: var(--success);
3426
3686
  color: var(--success);
@@ -4499,6 +4759,21 @@ body.booting .boot-splash {
4499
4759
  text-decoration-style: dashed;
4500
4760
  }
4501
4761
 
4762
+ .linked-doc-item.is-url .linked-doc-link {
4763
+ flex-shrink: 1;
4764
+ min-width: 0;
4765
+ overflow: hidden;
4766
+ text-overflow: ellipsis;
4767
+ white-space: nowrap;
4768
+ }
4769
+
4770
+ .linked-doc-external {
4771
+ flex-shrink: 0;
4772
+ color: var(--text-muted);
4773
+ font-size: 10px;
4774
+ margin-left: -4px;
4775
+ }
4776
+
4502
4777
  /* A section of the session panel: linked documents, artifacts. */
4503
4778
  .panel-section {
4504
4779
  margin-bottom: 16px;
@@ -4879,11 +5154,11 @@ body.light {
4879
5154
  --session-active-bg: var(--bg-elevated);
4880
5155
  --border: #cfcbc4;
4881
5156
  --text-primary: #0a0a0a;
4882
- --text-secondary: #444444;
4883
- --text-tertiary: #666666;
4884
- --text-muted: #888888;
5157
+ --text-secondary: #2c2c2c;
5158
+ --text-tertiary: #565656;
5159
+ --text-muted: #767676;
4885
5160
  --accent-text: #a0501c;
4886
- --accent-dim: rgba(232, 111, 51, 0.18);
5161
+ --accent-dim: rgba(184, 90, 32, 0.18);
4887
5162
  --accent-glow: rgba(232, 111, 51, 0.5);
4888
5163
  --gold: #a8842f;
4889
5164
  --success: #1a8a5a;
@@ -5749,6 +6024,10 @@ select.form-input option:checked {
5749
6024
  color: var(--text-primary);
5750
6025
  }
5751
6026
 
6027
+ .sp-row:not(.outside) + .sp-row.outside {
6028
+ margin-top: 8px;
6029
+ }
6030
+
5752
6031
  .sp-row.current .sp-name {
5753
6032
  color: var(--accent-text);
5754
6033
  }
@@ -6467,10 +6746,11 @@ select.form-input option:checked {
6467
6746
  --session-active-bg: var(--bg-elevated);
6468
6747
  --border: #cfcbc4;
6469
6748
  --text-primary: #0a0a0a;
6470
- --text-secondary: #444444;
6471
- --text-tertiary: #666666;
6472
- --text-muted: #888888;
6473
- --accent-dim: rgba(232, 111, 51, 0.18);
6749
+ --text-secondary: #2c2c2c;
6750
+ --text-tertiary: #565656;
6751
+ --text-muted: #767676;
6752
+ --accent-text: #a0501c;
6753
+ --accent-dim: rgba(184, 90, 32, 0.18);
6474
6754
  --accent-glow: rgba(232, 111, 51, 0.5);
6475
6755
  --gold: #a8842f;
6476
6756
  --success: #1a8a5a;
@@ -7024,8 +7304,10 @@ pre.mermaid svg {
7024
7304
  cursor: pointer;
7025
7305
  }
7026
7306
 
7027
- .sg-menu-item:hover {
7307
+ .sg-menu-item:hover,
7308
+ .sg-menu-item:focus-visible {
7028
7309
  background: var(--bg-hover);
7310
+ outline: none;
7029
7311
  }
7030
7312
 
7031
7313
  .sg-menu-remove {
package/public/sw.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const CACHE_NAME = 'cc-kanban-v2';
2
- const PRECACHE_URLS = ['/', '/style.css', '/app.js'];
2
+ const PRECACHE_URLS = ['/', '/style.css', '/project-match.js', '/link-url.js', '/app.js'];
3
3
 
4
4
  let cachePromise = null;
5
5
  function getCache() {
package/public/themes.css CHANGED
@@ -38,6 +38,55 @@ body.light .theme-swatch-vitesse { --sw-bg: #f7f7f7; --sw-accent: #1c6b48; --sw-
38
38
  .theme-swatch-synthwave { --sw-bg: #262335; --sw-accent: #ff7edb; --sw-ink: #ffffff; --sw-border: #495495; }
39
39
  body.light .theme-swatch-synthwave { --sw-bg: #efecf6; --sw-accent: #c936a6; --sw-ink: #241b2f; --sw-border: #c5bcdd; }
40
40
 
41
+ /* Ember */
42
+ body:not([data-color-theme]):not(.light) {
43
+ --accent: #e86f33;
44
+ --accent-text: #f0a070;
45
+ --accent-dim: rgba(232,111,51,0.25);
46
+ --accent-glow: rgba(232, 111, 51, 0.55);
47
+ --bg-deep: #101114;
48
+ --bg-surface: #16181c;
49
+ --bg-elevated: #1e2025;
50
+ --bg-hover: #282a30;
51
+ --border: #363840;
52
+ --text-primary: #f0f1f3;
53
+ --text-secondary: #c2c4c9;
54
+ --text-tertiary: #9a9da5;
55
+ --text-muted: #7d808a;
56
+ }
57
+ body.light:not([data-color-theme]) {
58
+ --accent: #e86f33;
59
+ --accent-text: #a0501c;
60
+ --accent-dim: rgba(184,90,32,0.18);
61
+ --accent-glow: rgba(232, 111, 51, 0.5);
62
+ --bg-deep: #e8e6e3;
63
+ --bg-surface: #efede9;
64
+ --bg-elevated: #fbfaf9;
65
+ --bg-hover: #d2d0cc;
66
+ --border: #cfcbc4;
67
+ --text-primary: #0a0a0a;
68
+ --text-secondary: #2c2c2c;
69
+ --text-tertiary: #565656;
70
+ --text-muted: #767676;
71
+ }
72
+ @media (prefers-color-scheme: light) {
73
+ body:not(.dark-forced):not([data-color-theme]) {
74
+ --accent: #e86f33;
75
+ --accent-text: #a0501c;
76
+ --accent-dim: rgba(184,90,32,0.18);
77
+ --accent-glow: rgba(232, 111, 51, 0.5);
78
+ --bg-deep: #e8e6e3;
79
+ --bg-surface: #efede9;
80
+ --bg-elevated: #fbfaf9;
81
+ --bg-hover: #d2d0cc;
82
+ --border: #cfcbc4;
83
+ --text-primary: #0a0a0a;
84
+ --text-secondary: #2c2c2c;
85
+ --text-tertiary: #565656;
86
+ --text-muted: #767676;
87
+ }
88
+ }
89
+
41
90
  /* Gruvbox */
42
91
  body[data-color-theme="gruvbox"]:not(.light) {
43
92
  --accent: #fe8019;