claude-code-marketplace 0.2.0 → 0.2.1

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/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A web-based dashboard for browsing, installing, and managing [Claude Code](https://docs.anthropic.com/en/docs/claude-code) plugins across multiple marketplaces.
4
4
 
5
+ [![npm](https://img.shields.io/npm/v/claude-code-marketplace)](https://www.npmjs.com/package/claude-code-marketplace)
6
+
5
7
  <p align="center">
6
8
  <img src="assets/main-dark.png" alt="Marketplace — dark theme" width="100%">
7
9
  </p>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-code-marketplace",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Web UI for browsing and managing Claude Code marketplace plugins",
5
5
  "main": "server.js",
6
6
  "bin": {
package/public/app.js CHANGED
@@ -101,10 +101,10 @@ document.addEventListener('DOMContentLoaded', () => {
101
101
  });
102
102
 
103
103
  const savedTheme = localStorage.getItem('theme');
104
- if (savedTheme === 'light') {
105
- document.body.classList.add('light');
106
- } else if (savedTheme === 'dark') {
104
+ if (savedTheme === 'dark') {
107
105
  document.body.classList.add('dark-forced');
106
+ } else {
107
+ document.body.classList.add('light');
108
108
  }
109
109
  syncHljsTheme();
110
110
 
@@ -225,7 +225,9 @@ function renderTree() {
225
225
  return;
226
226
  }
227
227
 
228
- let html = '';
228
+ const allIds = marketplaces.map((m) => `m_${safeId(m.name)}`);
229
+ const allExpanded = allIds.length > 0 && allIds.every((id) => expandedNodes.has(id));
230
+ let html = `<div class="tree-expand-toggle" id="toggleExpandBtn" onclick="toggleExpandAll()">${allExpanded ? 'Collapse All' : 'Expand All'}</div>`;
229
231
 
230
232
  for (const m of marketplaces) {
231
233
  const mid = safeId(m.name);
@@ -810,6 +812,17 @@ function toggleChildren(id) {
810
812
  }
811
813
  }
812
814
 
815
+ function toggleExpandAll() {
816
+ const allIds = marketplaces.map((m) => `m_${safeId(m.name)}`);
817
+ const collapse = allIds.length > 0 && allIds.every((id) => expandedNodes.has(id));
818
+ for (const id of allIds) {
819
+ if (collapse) expandedNodes.delete(id);
820
+ else expandedNodes.add(id);
821
+ }
822
+ saveExpandedNodes();
823
+ renderTree();
824
+ }
825
+
813
826
  function findPlugin(id) {
814
827
  for (const m of marketplaces) {
815
828
  const p = m.plugins.find((p) => p.fullId === id);
@@ -998,6 +1011,12 @@ function handleKeydown(e) {
998
1011
  return;
999
1012
  }
1000
1013
 
1014
+ if (matchKey(e, 'e')) {
1015
+ e.preventDefault();
1016
+ toggleExpandAll();
1017
+ return;
1018
+ }
1019
+
1001
1020
  if (matchKey(e, 'r')) {
1002
1021
  e.preventDefault();
1003
1022
  refresh();
package/public/index.html CHANGED
@@ -110,6 +110,7 @@
110
110
  <tr><td><kbd>?</kbd></td><td>Show keyboard shortcuts</td></tr>
111
111
  <tr><td><kbd>/</kbd></td><td>Focus search</td></tr>
112
112
  <tr><td><kbd>S</kbd></td><td>Focus scope filter</td></tr>
113
+ <tr><td><kbd>E</kbd></td><td>Expand / Collapse all</td></tr>
113
114
  <tr><td><kbd>R</kbd></td><td>Refresh data</td></tr>
114
115
  <tr><td><kbd>Esc</kbd></td><td>Close panel / blur input</td></tr>
115
116
  </table>
package/public/style.css CHANGED
@@ -31,8 +31,8 @@
31
31
  --scope-user-dim: rgba(196, 149, 106, 0.18);
32
32
  --scope-project: #7ab5a0;
33
33
  --scope-project-dim: rgba(122, 181, 160, 0.18);
34
- --scope-local: #f0b429;
35
- --scope-local-dim: rgba(240, 180, 41, 0.18);
34
+ --scope-local: #8a9bb5;
35
+ --scope-local-dim: rgba(138, 155, 181, 0.18);
36
36
  }
37
37
 
38
38
  body.light {
@@ -57,43 +57,12 @@ body.light {
57
57
  --plan: #5a7a5a;
58
58
  --plan-dim: rgba(90, 122, 90, 0.15);
59
59
 
60
- --scope-user: #9a6d3a;
61
- --scope-user-dim: rgba(154, 109, 58, 0.15);
60
+ --scope-user: #8a7055;
61
+ --scope-user-dim: rgba(138, 112, 85, 0.12);
62
62
  --scope-project: #4d8a72;
63
63
  --scope-project-dim: rgba(77, 138, 114, 0.15);
64
- --scope-local: #b07d0a;
65
- --scope-local-dim: rgba(176, 125, 10, 0.15);
66
- }
67
-
68
- @media (prefers-color-scheme: light) {
69
- body:not(.dark-forced) {
70
- --bg-deep: #e8e6e3;
71
- --bg-surface: #f4f3f1;
72
- --bg-elevated: #dddbd8;
73
- --bg-hover: #d2d0cc;
74
- --border: #a09b94;
75
- --text-primary: #0a0a0a;
76
- --text-secondary: #444444;
77
- --text-tertiary: #666666;
78
- --text-muted: #888888;
79
- --accent-text: #b85a20;
80
- --accent-dim: rgba(232, 111, 51, 0.18);
81
- --accent-glow: rgba(232, 111, 51, 0.5);
82
- --success: #1a8a5a;
83
- --success-dim: rgba(26, 138, 90, 0.15);
84
- --warning: #b07d0a;
85
- --warning-dim: rgba(176, 125, 10, 0.15);
86
- --error: #c53030;
87
- --error-dim: rgba(197, 48, 48, 0.15);
88
- --plan: #5a7a5a;
89
- --plan-dim: rgba(90, 122, 90, 0.15);
90
- --scope-user: #9a6d3a;
91
- --scope-user-dim: rgba(154, 109, 58, 0.15);
92
- --scope-project: #4d8a72;
93
- --scope-project-dim: rgba(77, 138, 114, 0.15);
94
- --scope-local: #b07d0a;
95
- --scope-local-dim: rgba(176, 125, 10, 0.15);
96
- }
64
+ --scope-local: #6b7d96;
65
+ --scope-local-dim: rgba(107, 125, 150, 0.12);
97
66
  }
98
67
 
99
68
  /* === RESET === */
@@ -110,7 +79,7 @@ body {
110
79
  background: var(--bg-deep);
111
80
  color: var(--text-primary);
112
81
  line-height: 1.5;
113
- height: 100vh;
82
+ height: calc(100vh / 1.2);
114
83
  display: flex;
115
84
  zoom: 1.2;
116
85
  flex-direction: column;
@@ -303,6 +272,7 @@ body {
303
272
  .main-layout {
304
273
  display: flex;
305
274
  flex: 1;
275
+ min-height: 0;
306
276
  overflow: hidden;
307
277
  }
308
278
 
@@ -316,8 +286,22 @@ body {
316
286
  min-width: 400px;
317
287
  }
318
288
 
289
+ .tree-expand-toggle {
290
+ padding: 4px 12px;
291
+ font-size: 10px;
292
+ color: var(--text-muted);
293
+ cursor: pointer;
294
+ text-transform: uppercase;
295
+ letter-spacing: 0.5px;
296
+ font-family: var(--mono);
297
+ }
298
+ .tree-expand-toggle:hover {
299
+ color: var(--accent);
300
+ }
301
+
319
302
  .tree-container {
320
303
  flex: 1;
304
+ min-height: 0;
321
305
  overflow-y: auto;
322
306
  overflow-x: hidden;
323
307
  }
@@ -459,65 +443,51 @@ body {
459
443
  border-color: rgba(196, 149, 106, 0.4);
460
444
  color: rgba(196, 149, 106, 0.5);
461
445
  }
462
- .scope-toggle.user.active {
463
- background: var(--scope-user-dim);
464
- color: var(--scope-user);
465
- border-color: var(--scope-user);
466
- }
446
+ .scope-toggle.user.active,
467
447
  .scope-toggle.user.disabled {
468
448
  background: var(--scope-user-dim);
469
449
  color: var(--scope-user);
470
450
  border-color: var(--scope-user);
471
- opacity: 0.4;
472
- text-decoration: line-through;
473
451
  }
474
452
 
475
453
  .scope-toggle.project {
476
454
  border-color: rgba(122, 181, 160, 0.4);
477
455
  color: rgba(122, 181, 160, 0.5);
478
456
  }
479
- .scope-toggle.project.active {
480
- background: var(--scope-project-dim);
481
- color: var(--scope-project);
482
- border-color: var(--scope-project);
483
- }
457
+ .scope-toggle.project.active,
484
458
  .scope-toggle.project.disabled {
485
459
  background: var(--scope-project-dim);
486
460
  color: var(--scope-project);
487
461
  border-color: var(--scope-project);
488
- opacity: 0.4;
489
- text-decoration: line-through;
490
462
  }
491
463
 
492
464
  .scope-toggle.local {
493
- border-color: rgba(240, 180, 41, 0.4);
494
- color: rgba(240, 180, 41, 0.5);
495
- }
496
- .scope-toggle.local.active {
497
- background: var(--scope-local-dim);
498
- color: var(--scope-local);
499
- border-color: var(--scope-local);
465
+ border-color: rgba(138, 155, 181, 0.4);
466
+ color: rgba(138, 155, 181, 0.5);
500
467
  }
468
+ .scope-toggle.local.active,
501
469
  .scope-toggle.local.disabled {
502
470
  background: var(--scope-local-dim);
503
471
  color: var(--scope-local);
504
472
  border-color: var(--scope-local);
473
+ }
474
+ .scope-toggle.disabled {
505
475
  opacity: 0.4;
506
476
  text-decoration: line-through;
507
477
  }
508
478
 
509
479
  /* Light theme: boost inactive scope contrast further */
510
480
  body.light .scope-toggle.user {
511
- border-color: rgba(154, 109, 58, 0.5);
512
- color: rgba(154, 109, 58, 0.6);
481
+ border-color: rgba(138, 112, 85, 0.4);
482
+ color: rgba(138, 112, 85, 0.5);
513
483
  }
514
484
  body.light .scope-toggle.project {
515
485
  border-color: rgba(77, 138, 114, 0.5);
516
486
  color: rgba(77, 138, 114, 0.6);
517
487
  }
518
488
  body.light .scope-toggle.local {
519
- border-color: rgba(176, 125, 10, 0.5);
520
- color: rgba(176, 125, 10, 0.6);
489
+ border-color: rgba(107, 125, 150, 0.4);
490
+ color: rgba(107, 125, 150, 0.5);
521
491
  }
522
492
 
523
493
  /* === BADGES === */
@@ -652,7 +622,7 @@ body.light .scope-toggle.local {
652
622
  .tree-desc-inline {
653
623
  font-size: 11px;
654
624
  color: var(--text-muted);
655
- opacity: 0.8;
625
+ opacity: 0.95;
656
626
  white-space: nowrap;
657
627
  overflow: hidden;
658
628
  text-overflow: ellipsis;