claude-code-kanban 7.17.0 → 7.19.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
@@ -834,6 +834,111 @@ body::before {
834
834
  padding: 0 14px 12px;
835
835
  }
836
836
 
837
+ .sessions-list.zen {
838
+ --zen-dot: var(--border);
839
+ display: flex;
840
+ flex-direction: column;
841
+ }
842
+
843
+ .sessions-list.zen[data-zen-state='working'] {
844
+ --zen-dot: color-mix(in srgb, var(--success) 45%, var(--border));
845
+ }
846
+
847
+ .sessions-list.zen[data-zen-state='waiting'] {
848
+ --zen-dot: color-mix(in srgb, var(--warning) 55%, var(--border));
849
+ }
850
+
851
+ /* The spacers fill the free space. Centered, they split it 1:2, so a growing panel moves the card up by a third of the growth, not a half. With no free space they are 0 and the list scrolls from the top. */
852
+ .sessions-list.zen::after,
853
+ .sessions-list.zen.zen-centered::before {
854
+ content: '';
855
+ flex: 1 0 0;
856
+ }
857
+
858
+ /* Dots unless the hub's zenPattern setting names another pattern. Line patterns use a lighter color, because a line has more ink than a dot. */
859
+ .sessions-list.zen {
860
+ --zen-line: color-mix(in srgb, var(--zen-dot) 50%, transparent);
861
+ --zen-fill: radial-gradient(circle, var(--zen-dot) 1px, transparent 1.5px) 0 0 / 20px 20px;
862
+ --zen-glow-y: 0;
863
+ }
864
+
865
+ .sessions-list.zen[data-zen-pattern='diagonal'] {
866
+ --zen-fill: repeating-linear-gradient(-45deg, var(--zen-line) 0 1px, transparent 1px 14px);
867
+ }
868
+
869
+ .sessions-list.zen[data-zen-pattern='rings'] {
870
+ --zen-fill: radial-gradient(circle, transparent 2.5px, var(--zen-line) 3px 3.5px, transparent 4px) 0 0 / 28px 28px;
871
+ }
872
+
873
+ .sessions-list.zen[data-zen-pattern='grid'] {
874
+ --zen-fill:
875
+ linear-gradient(var(--zen-line) 1px, transparent 1px) 0 0 / 24px 24px,
876
+ linear-gradient(90deg, var(--zen-line) 1px, transparent 1px) 0 0 / 24px 24px;
877
+ }
878
+
879
+ /* The pattern glows out from the card. The glow has a fixed height, so it looks the same in a short space and a tall one. */
880
+ .sessions-list.zen:not([data-zen-pattern='none'])::after,
881
+ .sessions-list.zen.zen-centered:not([data-zen-pattern='none'])::before {
882
+ background: var(--zen-fill);
883
+ mask-image: radial-gradient(110% 260px at 50% var(--zen-glow-y), rgb(0 0 0 / 0.9), transparent);
884
+ }
885
+
886
+ .sessions-list.zen.zen-centered::before {
887
+ --zen-glow-y: 100%;
888
+ }
889
+
890
+ .sessions-list.zen.zen-centered::after {
891
+ flex-grow: 2;
892
+ }
893
+
894
+ .sessions-list.zen > * {
895
+ flex-shrink: 0;
896
+ }
897
+
898
+ /* After the ::after spacer, so the agents sit at the bottom of the free space. */
899
+ .zen-agents {
900
+ order: 1;
901
+ display: flex;
902
+ flex-direction: column;
903
+ gap: 2px;
904
+ margin-top: 6px;
905
+ }
906
+ .zen-agents:empty {
907
+ display: none;
908
+ }
909
+ .zen-agent {
910
+ display: grid;
911
+ grid-template-columns: 5px 1fr auto;
912
+ align-items: center;
913
+ gap: 8px;
914
+ padding: 5px 8px;
915
+ background: none;
916
+ border: none;
917
+ border-radius: 6px;
918
+ font: inherit;
919
+ font-size: 12px;
920
+ text-align: left;
921
+ cursor: pointer;
922
+ }
923
+ .zen-agent:hover {
924
+ background: var(--bg-hover);
925
+ }
926
+ .zen-agent-text {
927
+ min-width: 0;
928
+ }
929
+ .zen-agent-task {
930
+ display: block;
931
+ overflow: hidden;
932
+ text-overflow: ellipsis;
933
+ white-space: nowrap;
934
+ color: var(--text-primary);
935
+ }
936
+ .zen-agent-time {
937
+ font-size: 10.5px;
938
+ font-variant-numeric: tabular-nums;
939
+ color: var(--text-tertiary);
940
+ }
941
+
837
942
  .session-item {
838
943
  position: relative;
839
944
  display: block;
@@ -4953,7 +5058,7 @@ body.show-resizing iframe {
4953
5058
  color: var(--accent);
4954
5059
  }
4955
5060
 
4956
- .pane-view.frame-focus .pane-keys {
5061
+ .pane-view.frame-focus:not(.keys-bridged) .pane-keys {
4957
5062
  display: flex;
4958
5063
  }
4959
5064
 
@@ -1,4 +1,4 @@
1
- // claude-hub-sdk 1.6.0 (sha256 71a58022516d). Copied by npm run sdk:sync in claude-code-hub. Do not edit.
1
+ // claude-hub-sdk 1.8.0 (sha256 9a67dd2aa534). Copied by npm run sdk:sync in claude-code-hub. Do not edit.
2
2
  // Claude Code Hub SDK: the one rule that names a key press, shared by the hub page, client.js and
3
3
  // stub.js. The hub serves it to its page as /sdk/keys.js; mount() and sdk:sync put it in front of
4
4
  // client.js and stub.js, so an app still loads one file.
@@ -33,7 +33,21 @@ var ClaudeHubKeys = (() => {
33
33
  return combo.split('+').map((k) => mods[k] ?? named[k] ?? (k.length === 1 ? k.toUpperCase() : k));
34
34
  }
35
35
 
36
- return { comboOf, keyParts };
36
+ // A host claim (protocol §5.2) names a press by its physical code, or by its character when the layout
37
+ // moves the key: {ctrlKey?, altKey?, shiftKey?, metaKey?, code, key: 'Unidentified'} or {…, key, code: ''}.
38
+ // A press matches a claim when one of its two signatures is the claim's first. AltGr types a
39
+ // character, so its press matches by character only. cck's frames use the same format.
40
+ function keySigs(e) {
41
+ const mods = [e.ctrlKey && 'ctrl', e.altKey && 'alt', e.shiftKey && 'shift', e.metaKey && 'meta']
42
+ .filter(Boolean)
43
+ .join('+');
44
+ return [
45
+ e.code && !e.getModifierState?.('AltGraph') && `${mods}|c:${e.code}`,
46
+ typeof e.key === 'string' && e.key !== 'Unidentified' && `${mods}|k:${e.key.toLowerCase()}`,
47
+ ].filter(Boolean);
48
+ }
49
+
50
+ return { comboOf, keyParts, keySigs };
37
51
  })();
38
52
 
39
53
  if (typeof module === 'object' && module.exports) module.exports = ClaudeHubKeys;
@@ -60,6 +74,8 @@ if (typeof module === 'object' && module.exports) module.exports = ClaudeHubKeys
60
74
  status: 'standalone',
61
75
  themes: [],
62
76
  inHub: false,
77
+ settings: null,
78
+ onSettings: () => off,
63
79
  onStatus: () => off,
64
80
  onActive: () => off,
65
81
  onThemes: () => off,
@@ -67,9 +83,10 @@ if (typeof module === 'object' && module.exports) module.exports = ClaudeHubKeys
67
83
  bindTheme: () => off,
68
84
  handle() {},
69
85
  publish() {},
70
- invoke(action, params = {}) {
86
+ invoke(action, params = {}, opts = {}) {
71
87
  const target = standaloneFn(action)?.(params);
72
88
  if (!target) return Promise.resolve({ ok: false, reason: 'unhandled' });
89
+ if (opts.open === 'pane') return Promise.resolve({ ok: true, handledBy: 'standalone', url: target });
73
90
  win.open(target, '_blank', 'noopener');
74
91
  return Promise.resolve({ ok: true, handledBy: 'standalone' });
75
92
  },